From 9f5d5a3be3442109364c5dd10e9ac46b45a23b35 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Thu, 13 Jul 2023 09:58:43 +0200 Subject: [PATCH] two fa almost complete --- src/server/backend/credentials/2fa.js | 26 +++-- src/server/backend/userRoutes.js | 13 ++- src/server/config/settings.config.json | 2 +- src/server/ui/en/2fa/2faEnhanced.html | 120 ++++++++++++++++++++++++ src/server/ui/en/2fa/2faInvalid.html | 38 ++++++++ src/server/ui/en/2fa/2faSimple.html | 38 ++++++++ src/server/ui/en/2faEnhanced.html | 11 --- src/server/ui/en/2faInvalid.html | 11 --- src/server/ui/en/2faSimple.html | 11 --- src/webapp/src/views/user/LoginView.vue | 11 ++- src/webapp/src/views/user/TwoFA.vue | 64 ++++++++++++- 11 files changed, 293 insertions(+), 52 deletions(-) create mode 100644 src/server/ui/en/2fa/2faEnhanced.html create mode 100644 src/server/ui/en/2fa/2faInvalid.html create mode 100644 src/server/ui/en/2fa/2faSimple.html delete mode 100644 src/server/ui/en/2faEnhanced.html delete mode 100644 src/server/ui/en/2faInvalid.html delete mode 100644 src/server/ui/en/2faSimple.html diff --git a/src/server/backend/credentials/2fa.js b/src/server/backend/credentials/2fa.js index 71638bb..53b44b9 100644 --- a/src/server/backend/credentials/2fa.js +++ b/src/server/backend/credentials/2fa.js @@ -8,6 +8,8 @@ */ const token = require( '../token.js' ); +// let createSSRApp = require( 'vue' ).createSSRApp; +// let renderToString = require( 'vue/server-renderer' ).renderToString; class TwoFA { constructor () { @@ -15,14 +17,20 @@ class TwoFA { } registerStandardAuthentication () { - let tok = token.generateToken( 61 ); + let tok = token.generateToken( 60 ); + while ( this.tokenStore[ tok ] ) { + tok = token.generateToken( 60 ); + } this.tokenStore[ tok ] = { 'mode': 'standard' }; return { 'token': tok }; } registerEnhancedAuthentication () { - let tok = token.generateToken( 61 ); - let code = token.generateNumber( 7 ); + let tok = token.generateToken( 60 ); + while ( this.tokenStore[ tok ] ) { + tok = token.generateToken( 60 ); + } + let code = token.generateNumber( 6 ); this.tokenStore[ tok ] = { 'mode': 'enhanced', 'code': code }; return { 'code': code, 'token': tok }; } @@ -30,14 +38,18 @@ class TwoFA { verifyEnhanced ( token, number = '' ) { if ( this.tokenStore[ token ]?.mode === 'standard' ) return true; else if ( this.tokenStore[ token ]?.mode === 'enhanced' ) { - if ( this.tokenStore[ token ].code == number ) return true; - else return false; + if ( this.tokenStore[ token ].code == number ) { + delete this.tokenStore[ token ]; + return true; + } else return false; } else return false; } verifySimple ( token ) { - if ( this.tokenStore[ token ]?.mode === 'standard' ) return 'standard'; - else if ( this.tokenStore[ token ]?.mode === 'enhanced' ) return 'enhanced'; + if ( this.tokenStore[ token ]?.mode === 'standard' ) { + delete this.tokenStore[ token ]; + return 'standard'; + } else if ( this.tokenStore[ token ]?.mode === 'enhanced' ) return 'enhanced'; else return 'invalid'; } } diff --git a/src/server/backend/userRoutes.js b/src/server/backend/userRoutes.js index b00debc..d55d731 100644 --- a/src/server/backend/userRoutes.js +++ b/src/server/backend/userRoutes.js @@ -46,15 +46,20 @@ module.exports = ( app, settings ) => { // TODO: Add multi language let tokType = twoFA.verifySimple( request.query.token ); if ( tokType === 'standard' ) { - response.sendFile( path.join( __dirname + '/../ui/en/2faSimple.html' ) ); + request.session.loggedInUser = true; + response.sendFile( path.join( __dirname + '/../ui/en/2fa/2faSimple.html' ) ); } else if ( tokType === 'enhanced' ) { - response.sendFile( path.join( __dirname + '/../ui/en/2faEnhanced.html' ) ); + response.sendFile( path.join( __dirname + '/../ui/en/2fa/2faEnhanced.html' ) ); } else { - response.sendFile( path.join( __dirname + '/../ui/en/2faInvalid.html' ) ); + response.sendFile( path.join( __dirname + '/../ui/en/2fa/2faInvalid.html' ) ); } } ); app.post( '/user/2fa/verify', ( request, response ) => { - + let verified = twoFA.verifyEnhanced( request.body.token, request.body.code ); + if ( verified ) { + request.session.loggedInUser = true; + response.send( 'ok' ); + } else response.send( 'wrong' ); } ); }; \ No newline at end of file diff --git a/src/server/config/settings.config.json b/src/server/config/settings.config.json index 9f3ed22..acbab79 100644 --- a/src/server/config/settings.config.json +++ b/src/server/config/settings.config.json @@ -1,4 +1,4 @@ { "init": false, - "twoFA": "disabled" + "twoFA": "enhanced" } \ No newline at end of file diff --git a/src/server/ui/en/2fa/2faEnhanced.html b/src/server/ui/en/2fa/2faEnhanced.html new file mode 100644 index 0000000..db0aed9 --- /dev/null +++ b/src/server/ui/en/2fa/2faEnhanced.html @@ -0,0 +1,120 @@ + + + + + + Two Factor Authentication Invalid + + + +
+

Two-Factor Authen­tication

+

Please enter the code displayed on the login page down below to finish the Two-Factor Authentication.

+
+
+ +
+ + +
+ +
+
+
+ + + + \ No newline at end of file diff --git a/src/server/ui/en/2fa/2faInvalid.html b/src/server/ui/en/2fa/2faInvalid.html new file mode 100644 index 0000000..40490b4 --- /dev/null +++ b/src/server/ui/en/2fa/2faInvalid.html @@ -0,0 +1,38 @@ + + + + + + Two Factor Authentication Invalid + + + +
+

Two-Factor Authen­tication Token invalid

+

The token you have specified is invalid. Please check that the link used is correct. If nothing helps, please try logging in again.

+
+ + \ No newline at end of file diff --git a/src/server/ui/en/2fa/2faSimple.html b/src/server/ui/en/2fa/2faSimple.html new file mode 100644 index 0000000..54ef4e6 --- /dev/null +++ b/src/server/ui/en/2fa/2faSimple.html @@ -0,0 +1,38 @@ + + + + + + Two Factor Authentication Invalid + + + +
+

Two-Factor Authen­tication Successful

+

Your two-factor authentication has been completed successfully. You were redirected automatically. You may now close this tab and return to the original browser tab.

+
+ + \ No newline at end of file diff --git a/src/server/ui/en/2faEnhanced.html b/src/server/ui/en/2faEnhanced.html deleted file mode 100644 index b8e6424..0000000 --- a/src/server/ui/en/2faEnhanced.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Two Factor Authentication - - -

2fa+

- - \ No newline at end of file diff --git a/src/server/ui/en/2faInvalid.html b/src/server/ui/en/2faInvalid.html deleted file mode 100644 index 8d786d0..0000000 --- a/src/server/ui/en/2faInvalid.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Two Factor Authentication Invalid - - -

2fa invalid

- - \ No newline at end of file diff --git a/src/server/ui/en/2faSimple.html b/src/server/ui/en/2faSimple.html deleted file mode 100644 index 460f002..0000000 --- a/src/server/ui/en/2faSimple.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Two Factor Authentication - - -

2fa

- - \ No newline at end of file diff --git a/src/webapp/src/views/user/LoginView.vue b/src/webapp/src/views/user/LoginView.vue index d5e0107..fe5fa18 100644 --- a/src/webapp/src/views/user/LoginView.vue +++ b/src/webapp/src/views/user/LoginView.vue @@ -54,15 +54,18 @@ } }; fetch( localStorage.getItem( 'url' ) + '/user/login', fetchOptions ).then( res => { - res.text().then( text => { - console.log( text ); - if ( text === 'ok' ) { + res.json().then( json => { + if ( json.status === 'ok' ) { this.userStore.setUserAuth( true ); this.$router.push( sessionStorage.getItem( 'redirect' ) ? sessionStorage.getItem( 'redirect' ) : '/account' ); sessionStorage.removeItem( 'redirect' ); - } else if ( text === '2fa' ) { + } else if ( json.status === '2fa' ) { this.userStore.setUser2fa( true ); this.$router.push( '/twoFactors' ); + } else if ( json.status === '2fa+' ) { + this.userStore.setUser2fa( true ); + sessionStorage.setItem( '2faCode', json.code ); + this.$router.push( '/twoFactors' ); } else { this.$refs.notification.createNotification( 'The credentials you provided do not match our records.', 5, 'error', 'normal' ); } diff --git a/src/webapp/src/views/user/TwoFA.vue b/src/webapp/src/views/user/TwoFA.vue index 18ad2f7..42f4dc8 100644 --- a/src/webapp/src/views/user/TwoFA.vue +++ b/src/webapp/src/views/user/TwoFA.vue @@ -1,6 +1,64 @@ \ No newline at end of file + + + + + \ No newline at end of file