diff --git a/src/server/admin/api/postHandler.js b/src/server/admin/api/postHandler.js index 99bb3cc..e41a368 100644 --- a/src/server/admin/api/postHandler.js +++ b/src/server/admin/api/postHandler.js @@ -9,13 +9,11 @@ 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' ); const spm = require( '../startPageManager.js' ); const startPageManager = new spm(); -const letters = [ ',', '{' ]; + class POSTHandler { constructor ( settings ) { @@ -154,18 +152,7 @@ class POSTHandler { this.settings[ 'currency' ] = data.currency; this.settings[ 'payments' ] = data.payments; this.settings[ 'ticketTimeout' ] = data.ticketTimeout; - const settingsString = JSON.stringify( this.settings ); - let settingsToSave = ''; - for ( let letter in settingsString ) { - if ( letters.includes( settingsString[ letter ] ) ) { - settingsToSave += settingsString[ letter ] + '\n\t'; - } else if ( settingsString[ letter ] === '}' ) { - settingsToSave += '\n' + settingsString[ letter ]; - } else { - settingsToSave += settingsString[ letter ]; - } - } - fs.writeFileSync( path.join( __dirname + '/../../config/settings.config.json' ), settingsToSave ); + db.saveSettings( this.settings ); db.getJSONData( 'events' ).then( dat => { let updated = dat; for ( let event in updated ) { diff --git a/src/server/admin/appApiRoutes.js b/src/server/admin/appApiRoutes.js index 9a0e555..25ee6ce 100644 --- a/src/server/admin/appApiRoutes.js +++ b/src/server/admin/appApiRoutes.js @@ -39,7 +39,8 @@ module.exports = ( app ) => { if ( tickets[ event ] ) { if ( tickets[ event ][ ticket ] ) { if ( !tickets[ event ][ ticket ][ 'invalidated' ] ) { - // TODO: invalidate ticket! + tickets[ event ][ ticket ][ 'invalidated' ] = true; + db.writeDataSimple( 'orders', 'order_name', req.body.ticketID.slice( 0, req.body.ticketID.indexOf( '_' ) ), { 'tickets': JSON.stringify( tickets ) } ); res.send( 'ticketValid' ); } else { res.send( 'ticketInvalid' ); diff --git a/src/server/admin/startPageManager.js b/src/server/admin/startPageManager.js index b6f4d28..2392085 100644 --- a/src/server/admin/startPageManager.js +++ b/src/server/admin/startPageManager.js @@ -11,6 +11,7 @@ let createSSRApp = require( 'vue' ).createSSRApp; let renderToString = require( 'vue/server-renderer' ).renderToString; const fs = require( 'fs' ); const path = require( 'path' ); +const db = require( '../backend/db/db.js' ); class StartPageManager { constructor ( settings ) { @@ -42,7 +43,7 @@ class StartPageManager { setActiveStartPage( startPageName ) { this.settings[ 'startPage' ] = startPageName; - fs.writeFileSync( path.join( __dirname + '/../config/settings.config.json' ), JSON.stringify( this.settings ) ); + db.saveSettings( this.settings ); } async renderStartPage( startPageName ) { diff --git a/src/server/app.js b/src/server/app.js index 892b674..21edf53 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -15,6 +15,7 @@ const cookieParser = require( 'cookie-parser' ); const http = require( 'http' ); const fs = require( 'fs' ); const token = require( './backend/token.js' ); +const db = require( './backend/db/db.js' ); console.log( ` @@ -58,7 +59,12 @@ if ( settings.setupDone ) { } ); } -// TODO: If no init, initialize DB. +if ( !settings.init ) { + db.initDB(); + let mutSettings = settings; + mutSettings[ 'init' ] = true; + db.saveSettings( mutSettings ); +} // Set up static routes for static file serving (performance wise not diff --git a/src/server/backend/db/db.js b/src/server/backend/db/db.js index c4cd3c8..7676246 100644 --- a/src/server/backend/db/db.js +++ b/src/server/backend/db/db.js @@ -14,6 +14,8 @@ const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../con const dbRef = { 'user': 'libreevent_users', 'admin': 'libreevent_admin', 'order': 'libreevent_orders', 'users': 'libreevent_users', 'orders': 'libreevent_orders', 'temp': 'libreevent_temp' }; +const letters = [ ',', '{' ]; + let dbh; if ( settings.db === 'mysql' ) { @@ -26,6 +28,14 @@ if ( settings.db === 'mysql' ) { dbh.connect(); } +module.exports.initDB = () => { + ( async() => { + console.log( '[ DB ] Setting up...' ); + await dbh.setupDB(); + console.log( '[ DB ] Setting up complete!' ); + } )(); +}; + module.exports.getDataSimple = ( db, column, searchQuery ) => { return new Promise( ( resolve, reject ) => { dbh.query( { 'command': 'getFilteredData', 'property': column, 'searchQuery': searchQuery }, dbRef[ db ] ).then( data => { @@ -185,6 +195,21 @@ module.exports.deleteJSONDataSimple = ( db, identifier ) => { } ); }; +module.exports.saveSettings = ( settings ) => { + const settingsString = JSON.stringify( settings ); + let settingsToSave = ''; + for ( let letter in settingsString ) { + if ( letters.includes( settingsString[ letter ] ) ) { + settingsToSave += settingsString[ letter ] + '\n\t'; + } else if ( settingsString[ letter ] === '}' ) { + settingsToSave += '\n' + settingsString[ letter ]; + } else { + settingsToSave += settingsString[ letter ]; + } + } + fs.writeFileSync( path.join( __dirname + '/../../config/settings.config.json' ), settingsToSave ); +}; + const gc = () => { // this function acts as the database garbage collector. TicketTimeout can be changed from the GUI. this.getData( 'temp' ).then( tempData => { diff --git a/src/server/backend/db/jsondb.js b/src/server/backend/db/jsondb.js index 5dca7f3..6f0ba5f 100644 --- a/src/server/backend/db/jsondb.js +++ b/src/server/backend/db/jsondb.js @@ -22,7 +22,10 @@ class JSONDB { let data = {}; try { JSON.parse( fs.readFileSync( path.join( __dirname + '/data/db.json' ) ) ); - } catch ( err ) {} + } catch ( err ) { + console.error( '[ JSON-DB ] CRITICAL INITIALIZATION FAILURE!' + err ); + throw ( 'JSONDB failed to start!' ); + } this.db = data[ 'db' ] ?? { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} }; this.dbIndex = data[ 'index' ] ?? { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0 }; this.db[ 'libreevent_temp' ] = {}; diff --git a/src/server/config/settings.config.json b/src/server/config/settings.config.json index 657801e..3d6a25a 100644 --- a/src/server/config/settings.config.json +++ b/src/server/config/settings.config.json @@ -1,17 +1,17 @@ { - "init":false, - "setupDone": true, - "twoFA":"enforce", - "twoFAMode":"enhanced", - "db":"mysql", - "payments":"stripe", - "name":"libreevent", - "yourDomain":"http://localhost:8080", - "mailSender":"libreevent ", - "maxTickets":10, - "currency":"CHF", - "gcInterval":300, - "ticketTimeout":900, - "startPage":"default", - "version":"1.0.0" + "init":true, + "setupDone":true, + "twoFA":"enforce", + "twoFAMode":"enhanced", + "db":"mysql", + "payments":"stripe", + "name":"libreevent", + "yourDomain":"http://localhost:8080", + "mailSender":"libreevent ", + "maxTickets":10, + "currency":"CHF", + "gcInterval":300, + "ticketTimeout":900, + "startPage":"default", + "version":"1.0.0" } \ No newline at end of file diff --git a/src/server/setup/setupRoutes.js b/src/server/setup/setupRoutes.js index a1a1bd8..1cc8982 100644 --- a/src/server/setup/setupRoutes.js +++ b/src/server/setup/setupRoutes.js @@ -7,7 +7,9 @@ * */ -let db = null; +// let db = null; +let db = require( '../backend/db/db.js' ); +const pwm = require( '../admin/pwdmanager.js' ); const fs = require( 'fs' ); const path = require( 'path' ); const bodyParser = require( 'body-parser' ); @@ -30,7 +32,38 @@ module.exports = ( app, settings ) => { if ( req.session.setupKeyOk ) { res.send( 'ok' ); } else { - res.status( 403 ).send( 'not authorized' ); + res.status( 403 ).send( 'unauthorized' ); + } + } ); + + app.post( '/setup/saveBasicSettings', bodyParser.json(), ( req, res ) => { + if ( req.session.setupKeyOk ) { + fs.writeFileSync( path.join( __dirname + '/../config/db.config.json' ), JSON.stringify( req.body.db ) ); + fs.writeFileSync( path.join( __dirname + '/../config/mail.config.json' ), JSON.stringify( req.body.email ) ); + if ( db === null ) { + db = require( '../backend/db/db.js' ); + } + let updatedSettings = settings; + updatedSettings[ 'name' ] = req.body.websiteName; + updatedSettings[ 'mailSender' ] = req.body.mailDisplay; + db.saveSettings( updatedSettings ); + res.send( 'ok' ); + } else { + res.status( 403 ).send( 'unauthorized' ); + } + } ); + + app.post( '/setup/saveRootAccount', bodyParser.json(), ( req, res ) => { + if ( req.session.setupKeyOk ) { + pwm.hashPassword( req.body.password ).then( hash => { + db.writeJSONData( 'rootAccount', { 'pass': hash, 'email': req.body.mail } ); + let updatedSettings = settings; + updatedSettings[ 'setupDone' ] = true; + db.saveSettings( updatedSettings ); + res.send( 'ok' ); + } ); + } else { + res.status( 403 ).send( 'unauthorized' ); } } ); diff --git a/src/webapp/setup/src/views/AdminLoginView.vue b/src/webapp/setup/src/views/AdminLoginView.vue index dc5ba20..db487dc 100644 --- a/src/webapp/setup/src/views/AdminLoginView.vue +++ b/src/webapp/setup/src/views/AdminLoginView.vue @@ -5,7 +5,7 @@ -