From b37c6c36352c629fa06ecce2d79f20b068585ec3 Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 9 Nov 2023 14:20:04 +0100 Subject: [PATCH] some more progress on backend integration --- backend/app.js | 32 +++++++++++++---- backend/authorizationKey.txt | 0 frontend/package-lock.json | 69 +++++++++++++++++++++++------------- frontend/package.json | 1 + frontend/src/app.js | 54 ++++++++++++++++++++++++---- 5 files changed, 119 insertions(+), 37 deletions(-) create mode 100644 backend/authorizationKey.txt diff --git a/backend/app.js b/backend/app.js index aa78d1d..5d9cc42 100644 --- a/backend/app.js +++ b/backend/app.js @@ -6,6 +6,9 @@ const fs = require( 'fs' ); const bodyParser = require( 'body-parser' ); const cookieParser = require( 'cookie-parser' ) const favicon = require( 'serve-favicon' ); +const static = require( 'express-static' ); + +const authKey = '' + fs.readFileSync( path.join( __dirname + '/authorizationKey.txt' ) ); app.use( expressSession ( { secret: 'akgfsdkgfösdolfgslöodfvolwseifvoiwefö', @@ -16,16 +19,33 @@ app.use( bodyParser.urlencoded( { extended: false } ) ); app.use( bodyParser.json() ); app.use( cookieParser() ); app.use( favicon( path.join( __dirname + '' ) ) ); +app.use( static() ); + + +app.post( '/connect', ( request, response ) => { + if ( request.session.authorized ) { + response.send( 'Already authenticated' ); + } else { + if ( request.body.authKey === authKey ) { + request.session.authorized = true; + response.send( 'Handshake OK' ); + } else { + response.status( 403 ).send( 'AuthKey wrong' ); + } + } +} ); + +app.post( '/statusUpdate/:update', ( req, res ) => { + if ( req.session.authorized ) { + res.send( 'thanks' ); + } else { + res.status( 403 ).send( 'Unauthorized' ); + } +} ); app.use( ( request, response, next ) => { response.sendFile( path.join( __dirname + '' ) ) } ); - -app.get( '/', ( request, response ) => { - -} ); - - const PORT = process.env.PORT || 8080; http.createServer( app ).listen( PORT ); \ No newline at end of file diff --git a/backend/authorizationKey.txt b/backend/authorizationKey.txt new file mode 100644 index 0000000..e69de29 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d4d4ba6..90bf055 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,6 +10,7 @@ "hasInstallScript": true, "license": "GPL-3.0-or-later", "dependencies": { + "axios": "^1.6.1", "core-js": "^3.8.3", "cors": "^2.8.5", "csv-parser": "^3.0.0", @@ -3871,8 +3872,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -3934,11 +3934,13 @@ "dev": true }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/babel-loader": { @@ -5048,7 +5050,6 @@ "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5930,7 +5931,6 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -7270,7 +7270,6 @@ "version": "4.0.0", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9452,7 +9451,6 @@ "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -9461,7 +9459,6 @@ "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -9817,6 +9814,14 @@ "node": ">=12" } }, + "node_modules/node-musickit-api/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz", @@ -11084,6 +11089,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", @@ -17681,8 +17691,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "at-least-node": { "version": "1.0.0", @@ -17726,11 +17735,13 @@ "dev": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "babel-loader": { @@ -18641,7 +18652,6 @@ "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -19331,8 +19341,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "depd": { "version": "2.0.0", @@ -20447,7 +20456,6 @@ "version": "4.0.0", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -22205,14 +22213,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -22490,6 +22496,16 @@ "requires": { "axios": "^0.21.4", "jsonwebtoken": "^8.5.1" + }, + "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + } } }, "node-releases": { @@ -23406,6 +23422,11 @@ } } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 792b0fe..edd57d9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -26,6 +26,7 @@ }, "main": "background.js", "dependencies": { + "axios": "^1.6.1", "core-js": "^3.8.3", "cors": "^2.8.5", "csv-parser": "^3.0.0", diff --git a/frontend/src/app.js b/frontend/src/app.js index 6a62f1b..b4ff33e 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -7,6 +7,7 @@ const bodyParser = require( 'body-parser' ); const dialog = require( 'electron' ).dialog; const session = require( 'express-session' ); const indexer = require( './indexer.js' ); +const axios = require( 'axios' ); app.use( bodyParser.urlencoded( { extended: false } ) ); @@ -19,6 +20,36 @@ app.use( session( { } ) ); +// TODO: Import from config +const remoteURL = 'https://music.janishutz.com'; +const hasConnected = false; + +const connect = () => { + if ( authKey !== '' ) { + axios.post( remoteURL + '/connect', { 'authKey': authKey } ).then( res => { + if ( res.status === 200 ) { + console.log( '[ BACKEND INTEGRATION ] Connection successful' ); + hasConnected = true; + } else { + console.error( '[ BACKEND INTEGRATION ] Connection error occurred' ); + } + } ).catch( err => { + console.error( err ); + } ); + return 'connecting'; + } else { + return 'noAuthKey'; + } +}; + +let authKey = ''; +try { + authKey = '' + fs.readFileSync( path.join( __dirname + '/config/authKey.txt' ) ); +} catch( err ) {}; + +connect(); + + let connectedClients = {}; let changedStatus = []; @@ -33,11 +64,16 @@ let currentDetails = { let connectedMain = {}; // TODO: Add backend integration - app.get( '/', ( request, response ) => { response.sendFile( path.join( __dirname + '/client/showcase.html' ) ); } ); +app.get( '/openSongs', ( req, res ) => { + // res.send( '{ "data": [ "/home/janis/Music/KB2022" ] }' ); + // res.send( '{ "data": [ "/mnt/storage/SORTED/Music/audio/KB2022" ] }' ); + res.send( { 'data': dialog.showOpenDialogSync( { properties: [ 'openDirectory' ], title: 'Open music library folder' } ) } ); +} ); + app.get( '/showcase.js', ( req, res ) => { res.sendFile( path.join( __dirname + '/client/showcase.js' ) ); } ); @@ -86,6 +122,16 @@ const sendUpdate = ( update ) => { for ( let client in connectedClients ) { connectedClients[ client ].write( 'data: ' + JSON.stringify( { 'type': update, 'data': currentDetails[ update ] } ) + '\n\n' ); } + // TODO: Check if connected and if not, try to authenticate with data from authKey file + // TODO: reduce request count by bundling and sending more in one go to reduce load + + if ( hasConnected ) { + axios.post( remoteURL + '/statusUpdate', { 'data': 'hello' } ).then( res => { + console.log( res ); + } ).catch( err => { + console.error( err ); + } ); + } } const allowedTypes = [ 'playingSong', 'isPlaying', 'songQueue', 'pos', 'queuePos' ]; @@ -113,12 +159,6 @@ app.get( '/clientStatusUpdate/:status', ( req, res ) => { } } ); -app.get( '/openSongs', ( req, res ) => { - // res.send( '{ "data": [ "/home/janis/Music/KB2022" ] }' ); - res.send( '{ "data": [ "/mnt/storage/SORTED/Music/audio/KB2022" ] }' ); - // res.send( { 'data': dialog.showOpenDialogSync( { properties: [ 'openDirectory' ], title: 'Open music library folder' } ) } ); -} ); - app.get( '/indexDirs', ( req, res ) => { if ( req.query.dir ) { indexer.index( req ).then( dirIndex => {