From 043aa171ca64bdd395894686ebd363d65dc82a4b Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Fri, 1 Sep 2023 17:16:52 +0200 Subject: [PATCH] root login + admin account settings --- src/server/admin/adminRoutes.js | 11 +- src/server/admin/api/postHandler.js | 35 +++-- src/server/admin/pwdmanager.js | 2 +- src/server/backend/db/data/rootAccount.json | 4 + .../main/src/views/admin/AdminLoginView.vue | 2 +- .../main/src/views/admin/SettingsView.vue | 120 ++++++++++++++---- 6 files changed, 136 insertions(+), 38 deletions(-) diff --git a/src/server/admin/adminRoutes.js b/src/server/admin/adminRoutes.js index 5e67174..4a4261a 100644 --- a/src/server/admin/adminRoutes.js +++ b/src/server/admin/adminRoutes.js @@ -9,6 +9,7 @@ // const db = require( './db/db.js' ); const pwdmanager = require( './pwdmanager.js' ); +const db = require( '../backend/db/db.js' ); const auth = require( './2fa.js' ); const twoFA = new auth(); const path = require( 'path' ); @@ -44,7 +45,15 @@ module.exports = ( app, settings ) => { let res = twoFA.registerEnhancedAuthentication(); let ipRetrieved = request.headers[ 'x-forwarded-for' ]; let ip = ipRetrieved ? ipRetrieved.split( /, / )[ 0 ] : request.connection.remoteAddress; - mailManager.sendMail( request.body.mail, await twoFA.generateTwoFAMail( res.token, ip, settings.yourDomain, settings.name ), 'Verify admin account login', settings.mailSender ); + if ( request.body.mail === 'root' ) { + db.getJSONDataSimple( 'rootAccount', 'email' ).then( email => { + ( async () => { + mailManager.sendMail( email, await twoFA.generateTwoFAMail( res.token, ip, settings.yourDomain, settings.name ), 'Verify admin account login', settings.mailSender ); + } )(); + } ); + } else { + mailManager.sendMail( request.body.mail, await twoFA.generateTwoFAMail( res.token, ip, settings.yourDomain, settings.name ), 'Verify admin account login', settings.mailSender ); + } request.session.token = res.token; response.send( { 'status': '2fa+', 'code': res.code } ); } )(); diff --git a/src/server/admin/api/postHandler.js b/src/server/admin/api/postHandler.js index 52684d8..9857373 100644 --- a/src/server/admin/api/postHandler.js +++ b/src/server/admin/api/postHandler.js @@ -8,6 +8,7 @@ */ const db = require( '../../backend/db/db.js' ); +const pwdmanager = require( '../pwdmanager.js' ); const fs = require( 'fs' ); const path = require( 'path' ); const pm = require( '../../backend/plugins/manager.js' ); @@ -113,17 +114,33 @@ class POSTHandler { reject( { 'code': 500, 'error': error } ); } ); } else if ( call === 'createAdminAccount' ) { - db.writeDataSimple( 'admin', 'email', data.email, data ).then( resp => { - resolve( resp ); - } ).catch( error => { - reject( { 'code': 500, 'error': error } ); + let dat = data; + pwdmanager.hashPassword( dat.pass ).then( hash => { + dat[ 'pass' ] = hash; + db.writeDataSimple( 'admin', 'email', data.email, dat ).then( resp => { + resolve( resp ); + } ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); } ); } else if ( call === 'updateAdminAccount' ) { - db.writeDataSimple( 'admin', 'email', data.email, data ).then( resp => { - resolve( resp ); - } ).catch( error => { - reject( { 'code': 500, 'error': error } ); - } ); + if ( data.pass ) { + let dat = data; + pwdmanager.hashPassword( data.pass ).then( hash => { + dat[ 'pass' ] = hash; + db.writeDataSimple( 'admin', 'email', data.email, dat ).then( resp => { + resolve( resp ); + } ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); + } ); + } else { + db.writeDataSimple( 'admin', 'email', data.email, data ).then( resp => { + resolve( resp ); + } ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); + } } else if ( call === 'deleteAdminAccount' ) { db.deleteDataSimple( 'admin', 'email', data.email ).then( resp => { resolve( resp ); diff --git a/src/server/admin/pwdmanager.js b/src/server/admin/pwdmanager.js index 8193c89..5f8f9ae 100644 --- a/src/server/admin/pwdmanager.js +++ b/src/server/admin/pwdmanager.js @@ -23,7 +23,7 @@ module.exports.checkpassword = ( username, password ) => { if ( username === 'root' ) { db.getJSONData( 'rootAccount' ).then( account => { bcrypt.compare( password, account.pass ).then( res => { - resolve( { 'status': res, 'twoFA': true } ); + resolve( { 'status': res, 'twoFA': 'enhanced' } ); } ); } ); } else { diff --git a/src/server/backend/db/data/rootAccount.json b/src/server/backend/db/data/rootAccount.json index e69de29..6d5c77a 100644 --- a/src/server/backend/db/data/rootAccount.json +++ b/src/server/backend/db/data/rootAccount.json @@ -0,0 +1,4 @@ +{ + "pass": "$2b$10$56u70OdMWo/Jv5lrqaNq8OV7TxTDOPGC9tP8Ea.1zhGluHYTzuTd.", + "email": "development@janishutz.com" +} \ No newline at end of file diff --git a/src/webapp/main/src/views/admin/AdminLoginView.vue b/src/webapp/main/src/views/admin/AdminLoginView.vue index 715a112..2b082a8 100644 --- a/src/webapp/main/src/views/admin/AdminLoginView.vue +++ b/src/webapp/main/src/views/admin/AdminLoginView.vue @@ -57,7 +57,7 @@ res.json().then( json => { if ( json.status === 'ok' ) { this.userStore.setAdminAuth( true ); - this.$router.push( sessionStorage.getItem( 'redirect' ) ? sessionStorage.getItem( 'redirect' ) : '/account' ); + this.$router.push( '/admin' ); sessionStorage.removeItem( 'redirect' ); } else if ( json.status === '2fa' ) { this.userStore.setAdmin2fa( true ); diff --git a/src/webapp/main/src/views/admin/SettingsView.vue b/src/webapp/main/src/views/admin/SettingsView.vue index d1a7400..126ac63 100644 --- a/src/webapp/main/src/views/admin/SettingsView.vue +++ b/src/webapp/main/src/views/admin/SettingsView.vue @@ -35,7 +35,7 @@

Before setting or editing permissions here, please read the corresponding section of the documentation here.

Usually, the permissions automatically set by the system on account creation should be appropriate. (TIP: Right click for more options)

-