-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathusers.js
More file actions
127 lines (110 loc) · 2.96 KB
/
users.js
File metadata and controls
127 lines (110 loc) · 2.96 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
// user = {
// id: "doortts"
// name: "nekure",
// email: "nekure@racooncity.com"
// passwd: "1234"
// }
// users = {
// doortts : {
// id: "doortts"
// name: "nekure",
// email: "nekure@racooncity.com"
// passwd: "1234"
// },
// ...
// }
var HASH = new(require('jshashes').SHA512)();
var config = require('./config');
var util = require('./util');
var User = function() {
var users = {};
var init = function() {
users = config.get('users') || {};
for (var key in users) {
try {
util.parseTimezone(users[key].timezone);
} catch (err) {
users[key].timezone =
util.convertOffsetToTimezone(new Date().getTimezoneOffset());
}
}
};
var add = function(user) {
user.password = _encodePassword(user.password, user.id);
if (users[user.id]) {
throw new Error("Already existed id: " + user.id);
}
users[user.id] = user;
save(user);
};
var getTotal = function() {
return Object.keys(users).length;
};
var findAll = function() {
return users;
};
var findUserById = function(id) {
return users[id];
};
var remove = function(user) {
delete users[user.id];
};
var removeAll = function() {
users = {};
};
/**
* 입력받은 패스워드를 암호화 한다.
* @param pass 입력받은 패스워드 문구
* @param salt 암호용 소금으로 사용자의 id를 사용한다.
* @return {*}
* @private
*/
var _encodePassword = function(pass, salt) {
return HASH.b64_hmac(pass, salt);
};
var changePassword = function(previousPassword, newPassword, user) {
var findUser = findUserById(user.id);
if (findUser === undefined) {
throw new Error("User does not exits!");
}
if (findUser.password !== _encodePassword(previousPassword, user.id)) {
throw new Error("Entered previous password is incorrect!");
}
findUser.password = _encodePassword(newPassword, user.id);
return save(findUser);
};
var save = function(user) {
if (user === undefined || user.id === undefined) {
throw new Error("Invalid User Information!");
}
users[user.id] = user;
config.set('users', users);
return true;
};
var login = function(user, callback) {
var findUser = findUserById(user.id);
var err;
if (findUser === undefined) {
err = new Error("User id or password is not valid!");
return callback(err, findUser);
}
if (findUser.password !== _encodePassword(user.password, user.id)) {
err = new Error("Password is not valid!");
return callback(err, null);
}
callback(null, findUser);
};
init(); // 최초 생성시 관리자 계정 생성등을 수행한다.
return {
add: add,
getTotal: getTotal,
findAll: findAll,
findUserById: findUserById,
removeAll: removeAll,
remove: remove,
changePassword: changePassword,
save: save,
login: login
};
};
exports.User = new User();