diff --git a/models/user.js b/models/user.js index 3e1a1c48..c52bd864 100644 --- a/models/user.js +++ b/models/user.js @@ -17,10 +17,7 @@ class User extends Model { email: DataTypes.STRING, avatar: DataTypes.STRING, password: { - type: DataTypes.STRING, - set(val) { - this.setDataValue('password', bcrypt.hashSync(val, 10)) - } + type: DataTypes.STRING }, settings: { type: DataTypes.TEXT, diff --git a/routes/index.js b/routes/index.js index 9444387c..dbc4d0a8 100644 --- a/routes/index.js +++ b/routes/index.js @@ -41,12 +41,26 @@ router.post( } }) - if (req.body.username && req.body.password) { - if (!user || !user.verifyPassword(req.body.password)) { + if (!user) { + return res.status(403).json({ + status: 'error', + result: 'Invalid username or password!' + }) + } + + if (user.password !== null) { + if (req.body.password === null || req.body.password === '' || !req.body.password) { return res.status(403).json({ status: 'error', - result: 'invalid_user' + result: 'Invalid username or password!' }) + } else { + if (!user.verifyPassword(req.body.password)) { + return res.status(403).json({ + status: 'error', + result: 'Invalid username or password!' + }) + } } } @@ -89,7 +103,7 @@ router.post( ) /** - * Login endpoint + * Logout endpoint */ router.get( '/logout', diff --git a/routes/items.js b/routes/items.js index 392f11eb..5f1e57dc 100644 --- a/routes/items.js +++ b/routes/items.js @@ -55,7 +55,7 @@ router.get( router.post( '/', errorHandler(async (req, res, next) => { - if (!req.user) { + if (!req.user || req.user.level === User.READ_ONLY) { return res.status(401).json({ status: 'error', result: 'unauthorized' @@ -121,7 +121,7 @@ router.post( router.put( '/:id', errorHandler(async (req, res, next) => { - if (!req.user) { + if (!req.user || req.user.level === User.READ_ONLY) { return res.status(401).json({ status: 'error', result: 'unauthorized' @@ -203,7 +203,7 @@ router.put( router.delete( '/:id', errorHandler(async (req, res, next) => { - if (!req.user) { + if (!req.user || req.user.level === User.READ_ONLY) { return res.status(401).json({ status: 'error', result: 'unauthorized' diff --git a/routes/users.js b/routes/users.js index 68270cb4..3f7634cb 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,6 +1,7 @@ const express = require('express') const router = express.Router() const { User, Setting } = require('../models/index') +const bcrypt = require('bcrypt') const _ = require('lodash') const Speakeasy = require('speakeasy') const QRCode = require('qrcode') @@ -71,7 +72,7 @@ router.post( result: 'unauthorized' }) } - + //Only admins can create users if (usersCount > 0 && req.user.level !== User.ADMIN) { delete req.body.level } @@ -88,8 +89,18 @@ router.post( result: 'username_exists' }) } + let pass = null + if (req.body.password) { + pass = bcrypt.hashSync(req.body.password, 10) + } - const user = await User.create(req.body) + const user = await User.create({ + username: req.body.username, + password: pass, + email: req.body.email, + level: req.body.level, + settings: req.body.settings + }) return res.json({ status: 'ok', @@ -117,7 +128,7 @@ router.put( } // only admins can edit other users - if (req.user.id !== req.params.id && req.user.level !== User.ADMIN) { + if (req.user.id.toString() !== req.params.id && req.user.level !== User.ADMIN) { return res.status(401).json({ status: 'error', result: 'unauthorized' @@ -130,15 +141,19 @@ router.put( } }) - if (req.body.currentPassword) { - if (!user.verifyPassword(req.body.currentPassword)) { - return res.status(400).json({ - status: 'error', - result: 'incorrect_password' + if (req.body.updatePass) { + if (req.body.password) { + let pass = bcrypt.hashSync(req.body.password, 10) + user.update({ + password: pass + }) + } else { + user.update({ + password: null }) } - } else { - // If we didn't pass up the current password, don't submit a new password + delete req.body.password + } else if (!req.body.updatePass) { delete req.body.password } @@ -158,7 +173,6 @@ router.put( label: user.username }) const qrcode = await QRCode.toDataURL(url, { scale: 6 }) - user.update({ totpSecret: secret.base32 }) @@ -177,7 +191,9 @@ router.put( window: 0 }) ) { - user.update({ multifactorEnabled: true }) + user.update({ + multifactorEnabled: true + }) return res.json({ status: 'ok' @@ -196,7 +212,6 @@ router.put( return res.json({ status: 'ok' }) } - await user.update(req.body) return res.json({ @@ -219,8 +234,8 @@ router.put( }) } - // only admins can edit other users - if (req.user.id !== req.params.id && req.user.level !== User.ADMIN) { + // users can only change their avatar + if (req.user.id.toString() !== req.params.id && req.user.level !== User.ADMIN) { return res.status(401).json({ status: 'error', result: 'unauthorized' diff --git a/src/components/EditUser.vue b/src/components/EditUser.vue index da5f92f4..c3cd97a8 100644 --- a/src/components/EditUser.vue +++ b/src/components/EditUser.vue @@ -45,14 +45,19 @@ - + + + + {{ user.id ? $t('update_pass_tooltip') : $t('create_pass_tooltip') }} + + + -