Skip to content

Commit 83fd5a8

Browse files
committed
fix(accounts): security enhancement
1 parent 012d0ea commit 83fd5a8

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

src/controllers/api/v1/routes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ module.exports = function (middleware, router, controllers) {
122122
router.delete('/api/v1/groups/:id', apiv1, canUser('groups:delete'), apiCtrl.groups.deleteGroup)
123123

124124
// Users
125+
router.put('/api/v1/profile', apiv1, apiCtrl.users.profileUpdate)
125126
router.get('/api/v1/users', apiv1, canUser('accounts:view'), apiCtrl.users.getWithLimit)
126127
router.post('/api/v1/users/create', apiv1, canUser('accounts:create'), apiCtrl.users.create)
127128
router.get('/api/v1/users/notifications', apiv1, apiCtrl.users.getNotifications)

src/controllers/api/v1/users.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,104 @@ apiUsers.createPublicAccount = function (req, res) {
384384
)
385385
}
386386

387+
apiUsers.profileUpdate = function (req, res) {
388+
if (!req.user) return res.status(400).json({ success: false, error: 'Invalid Post Data' })
389+
const username = req.user.username
390+
if (_.isNull(username) || _.isUndefined(username))
391+
return res.status(400).json({ success: false, error: 'Invalid Post Data' })
392+
393+
const data = req.body
394+
let passwordUpdated = false
395+
396+
const obj = {
397+
fullname: data.aFullname,
398+
title: data.aTitle,
399+
password: data.aPassword,
400+
passconfirm: data.aPassConfirm,
401+
email: data.aEmail
402+
}
403+
404+
let passwordComplexityEnabled = true
405+
406+
async.series(
407+
{
408+
settings: function (done) {
409+
const SettingUtil = require('../../../settings/settingsUtil')
410+
SettingUtil.getSettings(function (err, content) {
411+
if (err) return done(err)
412+
413+
const settings = content.data.settings
414+
passwordComplexityEnabled = settings.accountsPasswordComplexity.value
415+
416+
return done()
417+
})
418+
},
419+
user: function (done) {
420+
UserSchema.getUserByUsername(username, function (err, user) {
421+
if (err) return done(err)
422+
if (!user) return done('Invalid User Object')
423+
424+
obj._id = user._id
425+
426+
if (
427+
!_.isUndefined(obj.password) &&
428+
!_.isEmpty(obj.password) &&
429+
!_.isUndefined(obj.passconfirm) &&
430+
!_.isEmpty(obj.passconfirm)
431+
) {
432+
if (obj.password === obj.passconfirm) {
433+
if (passwordComplexityEnabled) {
434+
// check Password Complexity
435+
const passwordComplexity = require('../../../settings/passwordComplexity')
436+
if (!passwordComplexity.validate(obj.password)) return done('Password does not meet requirements')
437+
}
438+
439+
user.password = obj.password
440+
passwordUpdated = true
441+
}
442+
}
443+
444+
if (!_.isUndefined(obj.fullname) && obj.fullname.length > 0) user.fullname = obj.fullname
445+
if (!_.isUndefined(obj.email) && obj.email.length > 0) user.email = obj.email
446+
if (!_.isUndefined(obj.title) && obj.title.length > 0) user.title = obj.title
447+
448+
user.save(function (err, nUser) {
449+
if (err) return done(err)
450+
451+
nUser.populate('role', function (err, populatedUser) {
452+
if (err) return done(err)
453+
const resUser = stripUserFields(populatedUser)
454+
455+
return done(null, resUser)
456+
})
457+
})
458+
})
459+
},
460+
groups: function (done) {
461+
groupSchema.getAllGroupsOfUser(obj._id, done)
462+
}
463+
},
464+
async function (err, results) {
465+
if (err) {
466+
winston.debug(err)
467+
return res.status(400).json({ success: false, error: err })
468+
}
469+
470+
const user = results.user.toJSON()
471+
user.groups = results.groups.map(function (g) {
472+
return { _id: g._id, name: g.name }
473+
})
474+
475+
if (passwordUpdated) {
476+
const Session = require('../../../models/session')
477+
await Session.destroy(user._id)
478+
}
479+
480+
return res.json({ success: true, user: user })
481+
}
482+
)
483+
}
484+
387485
/**
388486
* @api {put} /api/v1/users/:username Update User
389487
* @apiName updateUser

src/public/js/angularjs/controllers/profile.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ define([
7474
}
7575

7676
$http
77-
.put('/api/v1/users/' + data.username, {
77+
.put('/api/v1/profile/', {
7878
aId: id,
7979
aFullname: data.fullname,
8080
aPass: data.password,

0 commit comments

Comments
 (0)