-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaccountSystem.js
More file actions
157 lines (142 loc) · 4.06 KB
/
accountSystem.js
File metadata and controls
157 lines (142 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
const mongoose = require('mongoose');
const crypto = require('crypto');
let Schema = mongoose.Schema;
let Accounts;
var accountSchema = new Schema({
"username": {
"type": String,
"unique": true
},
"password": {
"salt": String,
"passwordHash": String
},
"name": String,
"email": {
"type": String,
"unique": true
},
"teams": [],
"title": {
"type": String,
"default": "User"
},
"power": {
"type": Number,
"default": 1
},
"emailValidated": {
"type": Boolean,
"default": false
},
"member": {
"type": Boolean,
"default": false
}
});
module.exports = function (db) {
Accounts = db.model("accounts", accountSchema);
}
module.exports.setDatabase = function (db) {
Accounts = db.model("accounts", accountSchema);
}
module.exports.createAccount = function (data) {
return new Promise((resolve, reject) => {
//set password hash
data.username = data.username.toLowerCase();
let salt = getRandomString(16);
let saltedPass = saltPassword(data.password, salt);
data.password = {
"salt": salt,
"passwordHash": saltedPass
};
console.log(data);
let newUser = new Accounts(data);
newUser.save((err) => {
console.log("DEBUG: " + "Error creating account" + err);
reject("Error creating account" + err);
});
resolve();
});
}
module.exports.getAccounts = function () {
return new Promise((resolve, reject) => {
Accounts.find().select({ 'password': 0 }).exec()
.then((data) => {
resolve(data);
})
.catch((err) => {
reject(err);
})
});
}
module.exports.updateAccount = function (data) {
return new Promise((resolve, reject) => {
Accounts.update({ "username": data.username }, { $set: data }, { multi: false })
.then(() => {
resolve();
})
.catch((err) => {
reject(err);
});
});
}
module.exports.getUserByUsername = function (username) {
return new Promise((resolve, reject) => {
Accounts.findOne({ "username": username }).exec()
.then((data) => {
resolve(data);
})
.catch((err) => {
reject(err);
});
});
}
var getAccountPassword = function (username) {
return new Promise((resolve, reject) => {
Accounts.findOne({ "username": username }, "password").exec()
.then((data) => {
resolve(data);
})
.catch((err) => {
reject(err);
});
});
}
module.exports.removeUser = function (username) {
return new Promise((resolve, reject) => {
Accounts.remove({ "username": username }).exec()
.then((data) => {
resolve();
})
.catch((err) => {
reject(err);
});
});
}
//resolves with user data if password is right or it returns null
module.exports.checkPassword = function (user, pass) {
return new Promise((resolve, reject) => {
this.getUserByUsername(user).then((accData) => {
if (accData != null) {
let inPass = saltPassword(pass, accData.password.salt);
if (inPass === accData.password.passwordHash)
resolve(accData);
else
reject("Wrong password");
}
else
reject("No such user");
});
});
}
var saltPassword = function (password, salt) {
var hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */
hash.update(password);
return hash.digest('hex');
};
var getRandomString = function (length) {
return crypto.randomBytes(Math.ceil(length / 2))
.toString('hex') /** convert to hexadecimal format */
.slice(0, length); /** return required number of characters */
};