diff --git a/src/server/admin/pwdmanager.js b/src/server/admin/pwdmanager.js index e69de29..fd711fb 100644 --- a/src/server/admin/pwdmanager.js +++ b/src/server/admin/pwdmanager.js @@ -0,0 +1,27 @@ +/* +* myevent - pwdmanager.js +* +* Created by Janis Hutz 03/26/2023, Licensed under the GPL V3 License +* https://janishutz.com, development@janishutz.com +* +* +*/ + +/* + These functions are required to verify user login and to create new users + and to hash new passwords (if user changes password.) This here is only + used for the admin panel, another one is used for the normal user accounts + to separate the two for additional security. +*/ + +// import and init +const bcrypt = require( 'bcrypt' ); +const db = require( '../backend/db/db.js' ); + +module.exports.checkpassword = function checkpassword ( username, password ) { + return new Promise( resolve => { + db.getData( 'admin', username ).then( data => { + resolve( bcrypt.compareSync( password, data ) ); + } ); + } ); +}; \ No newline at end of file diff --git a/src/server/admin/routes.js b/src/server/admin/routes.js index 096e7ec..9f09355 100644 --- a/src/server/admin/routes.js +++ b/src/server/admin/routes.js @@ -8,10 +8,45 @@ */ const path = require( 'path' ); +const pwdmanager = require( './pwdmanager.js' ); + module.exports = ( app, settings ) => { + /* + Static routes for files like login screen, css, js and assets. Js and assets require login + */ app.get( '/admin/login', ( request, response ) => { - response.sendFile( path.join( __dirname + '/ui/login.html' ) ); + if ( request.session.loggedIn ) { + response.redirect( '/admin' ); + } else { + response.sendFile( path.join( __dirname + '/ui/login.html' ) ); + } + } ); + + app.get( '/admin/loginLangPack', ( request, response ) => { + response.sendFile( path.join( __dirname + '/ui/js/loginLangPack.js' ) ); + } ); + + app.get( '/admin/css/:file', ( request, response ) => { + response.sendFile( path.join( __dirname + '/ui/css/' + request.params.file ) ); + } ); + + /* + Admin login route that checks the password and, if enabled in settings, redirects to 2fa page or directly to admin panel + */ + app.post( '/admin/auth', ( request, response ) => { + pwdmanager.checkpassword( request.body.mail, request.body.pwd ).then( data => { + if ( data ) { + if ( settings.twoFA ) { + response.sendFile( path.join( __dirname + '../admin/ui/2fa.html' ) ); + } else { + request.session.loggedIn = true; + response.redirect( '/admin' ); + } + } else { + response.send( 'Password wrong' ); + } + } ); } ); /* diff --git a/src/server/admin/ui/css/loginstyle.css b/src/server/admin/ui/css/loginstyle.css new file mode 100644 index 0000000..ce11022 --- /dev/null +++ b/src/server/admin/ui/css/loginstyle.css @@ -0,0 +1,98 @@ +:root, :root.light { + --background-color: rgb(202, 223, 255); + --secondary-background: white; + --primary-color: black; + --secondary-color: blue; + --secondary-hover: darkblue; +} + +:root.dark { + --background-color: rgb(42, 44, 56); + --secondary-background: rgb(19, 20, 32); + --primary-color: white; + --secondary-color: rgb(94, 94, 226); + --secondary-hover: rgb(155, 155, 255); +} + +@media ( prefers-color-scheme: dark ) { + :root { + --background-color: rgb(42, 44, 56); + --secondary-background: rgb(19, 20, 32); + --primary-color: white; + --secondary-color: rgb(94, 94, 226); + --secondary-hover: rgb(155, 155, 255); + } +} + +body { + background-color: var(--background-color); + font-family: sans-serif; + font-size: calc(12pt + 0.35vw); +} + +.content { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.login-app { + border-radius: 50px; + margin-top: 2%; + background-color: var(--secondary-background); + color: var(--primary-color); + width: 60%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.form { + width: 80%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: 4%; + margin-bottom: 4%; +} + +.button { + text-decoration: none; + color: var(--primary-color); + background-color: var(--secondary-color); + padding: 15px; + border-radius: 30px; + transition: 1s; + cursor: pointer; +} + +.button:hover { + transition: ease-in-out 0.2s; + background-color: var(--secondary-hover); + border-radius: 5px; +} + +.input { + padding: 1%; + width: 80%; + margin-bottom: 3%; + border-radius: 10px; +} + +.top-bar { + width: 100%; + display: flex; + align-items: end; + justify-content: end; +} + +.selector { + background-color: lightblue; + border-radius: 20px; + padding: 0.5%; + border-style: solid; + border-color: blue; +} \ No newline at end of file diff --git a/src/server/admin/ui/js/loginLangPack.js b/src/server/admin/ui/js/loginLangPack.js new file mode 100644 index 0000000..5c8dfec --- /dev/null +++ b/src/server/admin/ui/js/loginLangPack.js @@ -0,0 +1,32 @@ +let themeSelector2 = document.getElementById( 'theme' ); +let languageSelector = document.getElementById( 'lang' ); +let mailLabel = document.getElementById( 'mailLabel' ); +let pwdLabel = document.getElementById( 'pwdLabel' ); +let login = document.getElementById( 'login' ); + +languageSelector.value = sessionStorage.getItem( 'lang' ); + +function langUpdate () { + if ( sessionStorage.getItem( 'lang' ) === 'de' ) { + themeSelector2.options[0].innerHTML = 'Automatisch'; + themeSelector2.options[1].innerHTML = 'Hellmodus'; + themeSelector2.options[2].innerHTML = 'Dunkelmodus'; + mailLabel.innerHTML = 'Email - Adresse'; + pwdLabel.innerHTML = 'Passwort'; + login.value = 'Anmelden'; + } else { + themeSelector2.options[0].innerHTML = 'System theme'; + themeSelector2.options[1].innerHTML = 'Light'; + themeSelector2.options[2].innerHTML = 'Dark'; + mailLabel.innerHTML = 'Email address'; + pwdLabel.innerHTML = 'Password'; + login.value = 'Log in'; + } +} + +function changeLang () { + sessionStorage.setItem( 'lang', languageSelector.value ); + langUpdate(); +} + +langUpdate(); \ No newline at end of file diff --git a/src/server/admin/ui/login.html b/src/server/admin/ui/login.html index 2ffef05..1ef0900 100644 --- a/src/server/admin/ui/login.html +++ b/src/server/admin/ui/login.html @@ -5,88 +5,17 @@