mirror of
https://github.com/janishutz/libreevent.git
synced 2026-04-29 14:29:25 +02:00
Restructuring for new way of installing libreevent
This commit is contained in:
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
* libreevent - 2fa.js
|
||||
*
|
||||
* Created by Janis Hutz 07/11/2023, Licensed under the GPL V3 License
|
||||
* https://janishutz.com, development@janishutz.com
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
const token = require( '../token.js' );
|
||||
let createSSRApp = require( 'vue' ).createSSRApp;
|
||||
let renderToString = require( 'vue/server-renderer' ).renderToString;
|
||||
const fs = require( 'fs' );
|
||||
const path = require( 'path' );
|
||||
|
||||
class TwoFA {
|
||||
constructor () {
|
||||
this.tokenStore = {};
|
||||
this.references = {};
|
||||
this.pwdChangeTokens = {};
|
||||
}
|
||||
|
||||
registerStandardAuthentication () {
|
||||
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( 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 };
|
||||
}
|
||||
|
||||
storeTokenReference ( token, sessionID ) {
|
||||
this.references[ token ] = sessionID;
|
||||
}
|
||||
|
||||
getTokenReference ( token ) {
|
||||
return this.references[ token ];
|
||||
}
|
||||
|
||||
verifyEnhanced ( token, number = '' ) {
|
||||
if ( this.tokenStore[ token ]?.mode === 'standard' ) return true;
|
||||
else if ( this.tokenStore[ token ]?.mode === 'enhanced' ) {
|
||||
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' ) {
|
||||
delete this.tokenStore[ token ];
|
||||
return 'standard';
|
||||
} else if ( this.tokenStore[ token ]?.mode === 'enhanced' ) return 'enhanced';
|
||||
else return 'invalid';
|
||||
}
|
||||
|
||||
async generateTwoFAMail ( token, ip, domain, pageName ) {
|
||||
const app = createSSRApp( {
|
||||
data() {
|
||||
return {
|
||||
token: token,
|
||||
ip: ip,
|
||||
host: domain,
|
||||
pageName: pageName,
|
||||
};
|
||||
},
|
||||
template: '' + fs.readFileSync( path.join( __dirname + '/twoFAMail.html' ) )
|
||||
} );
|
||||
|
||||
return await renderToString( app );
|
||||
}
|
||||
|
||||
async generateSignupEmail ( token, domain, pageName ) {
|
||||
const app = createSSRApp( {
|
||||
data() {
|
||||
return {
|
||||
token: token,
|
||||
host: domain,
|
||||
pageName: pageName,
|
||||
};
|
||||
},
|
||||
template: '' + fs.readFileSync( path.join( __dirname + '/../../ui/en/signup/signupMail.html' ) )
|
||||
} );
|
||||
|
||||
return await renderToString( app );
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = TwoFA;
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
* libreevent - pwdmanager.js
|
||||
*
|
||||
* Created by Janis Hutz 07/11/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.)
|
||||
*/
|
||||
|
||||
// import and init
|
||||
const bcrypt = require( 'bcrypt' );
|
||||
const db = require( '../db/db.js' );
|
||||
const mm = require( '../mail/mailSender.js' );
|
||||
const mailManager = new mm();
|
||||
const fs = require( 'fs' );
|
||||
const path = require( 'path' );
|
||||
const token = require( '../token.js' );
|
||||
let createSSRApp = require( 'vue' ).createSSRApp;
|
||||
let renderToString = require( 'vue/server-renderer' ).renderToString;
|
||||
|
||||
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
|
||||
|
||||
module.exports.checkpassword = function checkpassword ( email, password ) {
|
||||
return new Promise( resolve => {
|
||||
db.getDataSimple( 'user', 'email', email ).then( data => {
|
||||
if ( data ) {
|
||||
if ( data[ 0 ] ) {
|
||||
bcrypt.compare( password, data[ 0 ].pass ).then( res => {
|
||||
resolve( { 'status': res, 'twoFA': data[ 0 ].two_fa } );
|
||||
} );
|
||||
} else {
|
||||
resolve( false );
|
||||
}
|
||||
} else {
|
||||
resolve( false );
|
||||
}
|
||||
} );
|
||||
} );
|
||||
};
|
||||
|
||||
module.exports.hashPassword = ( password ) => {
|
||||
return new Promise( resolve => {
|
||||
resolve( bcrypt.hashSync( password, 10 ) );
|
||||
} );
|
||||
};
|
||||
|
||||
module.exports.resetPassword = ( email ) => {
|
||||
return new Promise( ( resolve, reject ) => {
|
||||
db.checkDataAvailability( 'users', 'email', email ).then( dat => {
|
||||
if ( dat ) {
|
||||
const newPW = token.generateToken( 20 );
|
||||
this.hashPassword( newPW ).then( hash => {
|
||||
( async () => {
|
||||
db.writeDataSimple( 'users', 'email', email, { 'pass': hash } );
|
||||
const app = createSSRApp( {
|
||||
data() {
|
||||
return {
|
||||
password: newPW,
|
||||
host: settings.yourDomain
|
||||
};
|
||||
},
|
||||
template: '' + fs.readFileSync( path.join( __dirname + '/../../ui/en/signup/pwReset.html' ) )
|
||||
} );
|
||||
|
||||
mailManager.sendMail( email, await renderToString( app ), 'Password reset', settings.mailSender );
|
||||
resolve( 'ok' );
|
||||
} )();
|
||||
} );
|
||||
} else {
|
||||
reject( { 'code': 404, 'message': 'ERR_USER_NOT_FOUND' } );
|
||||
}
|
||||
} );
|
||||
} );
|
||||
};
|
||||
@@ -1,70 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Two-Factor Authentication</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
width: 100%;
|
||||
height: 800px;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.content {
|
||||
width: 80%;
|
||||
height: 90%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.ip {
|
||||
color: rgb(94, 94, 94);
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 70vw;
|
||||
}
|
||||
|
||||
.verify {
|
||||
padding: 20px 30px;
|
||||
background-color: rgb(0, 7, 87);
|
||||
text-decoration: none;
|
||||
color: white;
|
||||
transition: 0.5s all;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.verify:hover {
|
||||
background-color: rgb(0, 12, 139);
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 999px) {
|
||||
.logo {
|
||||
width: 20vw;
|
||||
}
|
||||
|
||||
.content {
|
||||
width: 40vw;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="content">
|
||||
<img :src="host + '/otherAssets/logo.png'" alt="Logo" class="logo">
|
||||
<h1>Welcome back!</h1>
|
||||
<p>It looks like someone is trying to sign in to your account at {{ pageName }}. If it was you, please click the button below to confirm the login. If not, please change your password immediately.</p>
|
||||
<p class="ip">Logging in from IP {{ ip }}.</p>
|
||||
<a :href="host + '/user/2fa?token=' + token" class="verify">Verify</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user