Skip to content

Commit f977a03

Browse files
Merge pull request #4 from martinbedouret/master
0.0.2
2 parents add2aba + f382e30 commit f977a03

File tree

12 files changed

+999
-460
lines changed

12 files changed

+999
-460
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ node_modules
3434
config/runtime.yaml
3535

3636
# Netbeans project
37-
nbproject/
37+
nbproject/
38+
39+
# Env
40+
config/env/development.js

api/controllers/user.js

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ module.exports = {
1010
removeUser: removeUser,
1111
getUser: getUser,
1212
updateUser: updateUser,
13-
loginUser: loginUser
13+
loginUser: loginUser,
14+
logoutUser: logoutUser
1415
};
1516

1617
function createUser(req, res) {
@@ -40,7 +41,7 @@ function createUser(req, res) {
4041
}
4142
});
4243

43-
res.status(200).json({
44+
return res.status(200).json({
4445
success: 1,
4546
message: 'An email has been sent to you. Please check it to verify your account.'
4647
});
@@ -63,7 +64,7 @@ function activateUser(req, res) {
6364
message: 'ERROR: sending confirmation email FAILED ' + info
6465
});
6566
}
66-
res.status(200).json({
67+
return res.status(200).json({
6768
success: 1,
6869
message: 'CONFIRMED!'
6970
});
@@ -144,27 +145,78 @@ function updateUser(req, res) {
144145
return res.status(200).json(users);
145146
});
146147
}
147-
function loginUser(args, res) {
148-
var role = args.swagger.params.role.value;
149-
var username = args.body.username;
150-
var password = args.body.password;
151-
console.log(role + username + password);
148+
function loginUser(req, res) {
149+
var role = req.swagger.params.role.value;
150+
var username = req.body.username;
151+
var password = req.body.password;
152152

153153
if (role !== "user" && role !== "admin") {
154154
return res.status(400).json({
155155
message: "Error: Role must be either admin or user"
156156
});
157157
}
158-
159-
if (username === "cboard_robot" && password === "youNIC4$" && role) {
158+
User.authenticate(username, password, function (error, user) {
159+
if (error || !user) {
160+
return res.status(401).json({
161+
message: "Wrong email or password."
162+
});
163+
} else {
164+
req.session.userId = user._id;
160165
var tokenString = auth.issueToken(username, role);
161-
res.status(200).json({
166+
user.authToken = tokenString;
167+
user.save(function (err, user) {
168+
if (err) {
169+
return res.status(500).json({
170+
message: 'Error saving user ' + err
171+
});
172+
}
173+
if (!user) {
174+
return res.status(404).json({
175+
message: 'Unable to find user. User id: ' + user._id
176+
});
177+
}
178+
});
179+
return res.status(200).json({
162180
token: tokenString,
163181
message: "Token successfully generated"
164182
});
165-
} else {
166-
res.status(403).json({
167-
message: "Error: Credentials incorrect"
183+
}
184+
});
185+
}
186+
function logoutUser(req, res) {
187+
var username = req.body.username;
188+
var password = req.body.password;
189+
User.authenticate(username, password, function (error, user) {
190+
if (error || !user) {
191+
return res.status(401).json({
192+
message: "Wrong email or password."
193+
});
194+
}
195+
if (req.session) {
196+
// delete session object
197+
req.session.destroy(function (err) {
198+
if (err) {
199+
return res.status(500).json({
200+
message: 'Error removing session ' + err
201+
});
202+
}
203+
});
204+
}
205+
user.authToken = '';
206+
user.save(function (err, user) {
207+
if (err) {
208+
return res.status(500).json({
209+
message: 'Error saving user ' + err
210+
});
211+
}
212+
if (!user) {
213+
return res.status(404).json({
214+
message: 'Unable to find user. User id: ' + user._id
215+
});
216+
}
217+
});
218+
return res.status(200).json({
219+
message: "User successfully logout"
168220
});
169-
}
170-
}
221+
});
222+
}

api/mail/index.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ module.exports = function (locale) {
4444

4545
// emailing options
4646
transportOptions: {
47-
service: 'Gmail',
47+
48+
host: 'smtp.sendgrid.net',
49+
port: 465,
50+
secure: true,
51+
service: 'Sendgrid',
4852
auth: {
49-
50-
pass: 'pisco32065'
53+
user: 'apikey',
54+
pass: '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'
5155
}
5256
},
5357
verifyMailOptions: {

api/models/User.js

Lines changed: 71 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22

33
var mongoose = require('mongoose');
4-
const crypto = require('crypto');
4+
var bcrypt = require('bcrypt');
5+
56

67
var Schema = mongoose.Schema;
78

@@ -14,14 +15,44 @@ const oAuthTypes = [
1415
];
1516

1617
const userSchema = new Schema({
17-
name: {type: String, default: ''},
18-
email: {type: String, default: ''},
19-
username: {type: String, default: ''},
20-
provider: {type: String, default: ''},
21-
locale: {type: String, default: 'en'},
22-
password: {type: String, default: ''},
23-
authToken: {type: String, default: ''},
24-
lastlogin: {type: Date, default: Date.now},
18+
name: {
19+
type: String,
20+
default: ''
21+
},
22+
email: {
23+
type: String,
24+
unique: true,
25+
required: true,
26+
trim: true
27+
},
28+
username: {
29+
type: String,
30+
unique: true,
31+
required: true,
32+
trim: true,
33+
default: ''
34+
},
35+
provider: {
36+
type: String,
37+
default: ''
38+
},
39+
locale: {
40+
type: String,
41+
default: 'en'
42+
},
43+
password: {
44+
type: String,
45+
required: true,
46+
default: ''
47+
},
48+
authToken: {
49+
type: String,
50+
default: ''
51+
},
52+
lastlogin: {
53+
type: Date,
54+
default: Date.now
55+
},
2556
facebook: {
2657
id: String,
2758
token: String,
@@ -104,50 +135,6 @@ userSchema.pre('save', function (next) {
104135

105136
userSchema.methods = {
106137

107-
/**
108-
* Authenticate - check if the passwords are the same
109-
*
110-
* @param {String} plainText
111-
* @return {Boolean}
112-
* @api public
113-
*/
114-
115-
authenticate: function (plainText) {
116-
return this.encryptPassword(plainText) === this.hashed_password;
117-
},
118-
119-
/**
120-
* Make salt
121-
*
122-
* @return {String}
123-
* @api public
124-
*/
125-
126-
makeSalt: function () {
127-
return Math.round((new Date().valueOf() * Math.random())) + '';
128-
},
129-
130-
/**
131-
* Encrypt password
132-
*
133-
* @param {String} password
134-
* @return {String}
135-
* @api public
136-
*/
137-
138-
encryptPassword: function (password) {
139-
if (!password)
140-
return '';
141-
try {
142-
return crypto
143-
.createHmac('sha1', this.salt)
144-
.update(password)
145-
.digest('hex');
146-
} catch (err) {
147-
return '';
148-
}
149-
},
150-
151138
/**
152139
* Validation is not required if using OAuth
153140
*/
@@ -176,8 +163,37 @@ userSchema.statics = {
176163
return this.findOne(options.criteria)
177164
.select(options.select)
178165
.exec(cb);
179-
}
180-
};
166+
},
167+
168+
/**
169+
* Authenticate input against database
170+
*
171+
* @param {String} username
172+
* @param {String} password
173+
* @param {Function} callback
174+
* @api private
175+
*/
176+
177+
authenticate: function (username, password, callback) {
178+
this.findOne({ username: username })
179+
.exec(function (err, user) {
180+
if (err) {
181+
return callback(err);
182+
} else if (!user) {
183+
var err = new Error('User not found.');
184+
err.status = 401;
185+
return callback(err);
186+
}
187+
bcrypt.compare(password, user.password, function (err, result) {
188+
if (result === true) {
189+
return callback(null, user);
190+
} else {
191+
return callback();
192+
}
193+
});
194+
});
195+
}
196+
};
181197

182198
var User = mongoose.model('User', userSchema);
183199

api/swagger/swagger.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,33 @@ paths:
230230
description: Error
231231
schema:
232232
$ref: "#/definitions/ErrorResponse"
233+
/user/logout:
234+
x-swagger-router-controller: user
235+
post:
236+
operationId: logoutUser
237+
description: Destroys user session and authentication token.
238+
security:
239+
- Bearer: []
240+
x-security-scopes:
241+
- admin
242+
- user
243+
parameters:
244+
- name: info
245+
description: User properties
246+
in: body
247+
required: true
248+
schema:
249+
$ref: "#/definitions/User"
250+
responses:
251+
"200":
252+
description: Success
253+
schema:
254+
$ref: "#/definitions/LogoutResponse"
255+
default:
256+
description: Error
257+
schema:
258+
$ref: "#/definitions/ErrorResponse"
259+
233260
# complex objects have schema definitions
234261
definitions:
235262
User:
@@ -304,5 +331,11 @@ definitions:
304331
properties:
305332
token:
306333
type: string
334+
message:
335+
type: string
336+
LogoutResponse:
337+
required:
338+
- message
339+
properties:
307340
message:
308341
type: string

0 commit comments

Comments
 (0)