diff --git a/Project.njsproj b/Project.njsproj index 5666a0e54..7b7e5e06b 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -54,7 +54,7 @@ Code - + Code @@ -82,6 +82,9 @@ Code + + Code + Code diff --git a/Server/Permissions.js b/Server/Permissions.js deleted file mode 100644 index d9c18ef55..000000000 --- a/Server/Permissions.js +++ /dev/null @@ -1,47 +0,0 @@ -exports.newPermissions = function newPermissions() { - - let thisObject = { - initialize: initialize - } - - return thisObject; - - function initialize(pEcosystemObject, callBackFunction) { - - readStoragePermissions(); - - function readStoragePermissions() { - - let filePath; - - try { - let fs = require('fs'); - filePath = '../' + 'Connection-Strings' + '/' + 'Storage.Permissions.json'; - pEcosystemObject.STORAGE_PERMISSIONS = JSON.parse(fs.readFileSync(filePath, 'utf8')); - - readPermissions(); - } - catch (err) { - console.log("[ERROR] readStoragePermissions -> err = " + err.message); - console.log("[HINT] readStoragePermissions -> You need to have a file at this path -> " + filePath); - } - } - - function readPermissions() { - - try { - let fs = require('fs'); - let filePath = '../' + 'Permissions' + '/' + 'Secrets' + '.json'; - - let permissioins = JSON.parse(fs.readFileSync(filePath, 'utf8')); - callBackFunction(permissioins); - } - catch (err) { - console.log("[ERROR] readPermissions -> err = " + err.message); - console.log("[HINT] You need to have a file at this path -> " + filePath); - - callBackFunction(); - } - } - } -} \ No newline at end of file diff --git a/Server/SessionManager.js b/Server/SessionManager.js new file mode 100644 index 000000000..c7ce0c800 --- /dev/null +++ b/Server/SessionManager.js @@ -0,0 +1,48 @@ +exports.newSessionManager = function newSessionManager() { + + let thisObject = { + getSession: getSession, + initialize: initialize + } + + let activeSessions = new Map(); + + return thisObject; + + function initialize(callBackFunction) { + + readSessions(); + + function readSessions() { + + try { + let fs = require('fs'); + let filePath = '../' + 'Sessions' + '/' + 'Open.Sessions' + '.json'; + + let sessions = JSON.parse(fs.readFileSync(filePath, 'utf8')); + + for (let i = 0; i < sessions.lenght; i++) { + + let session = sessions[i]; + + activeSessions.set(session.sessionToken, session); + + } + + callBackFunction(); + } + catch (err) { + console.log("[ERROR] readSessions -> err = " + err.message); + console.log("[HINT] You need to have a file at this path -> " + filePath); + + callBackFunction(); + } + } + } + + function getSession(pSessionToken) { + + return activeSessions.get(pSessionToken); + + } +} \ No newline at end of file diff --git a/Server/StorageAccessManager.js b/Server/StorageAccessManager.js new file mode 100644 index 000000000..a2630363f --- /dev/null +++ b/Server/StorageAccessManager.js @@ -0,0 +1,112 @@ +exports.newStorageAccessManager = function newStorageAccessManager() { + + let thisObject = { + getPermissions: getPermissions, + initialize: initialize + } + + let permissions; + + return thisObject; + + function initialize(callBackFunction) { + + readStoragePermissions(); + + function readStoragePermissions() { + + let filePath; + + try { + let fs = require('fs'); + filePath = '../' + 'Storage' + '/' + 'Storage.Permissions.json'; + permissions = JSON.parse(fs.readFileSync(filePath, 'utf8')); + + callBackFunction(); + + } + catch (err) { + console.log("[ERROR] readStoragePermissions -> err = " + err.message); + console.log("[HINT] readStoragePermissions -> You need to have a file at this path -> " + filePath); + + callBackFunction(); + } + } + } + + function getPermissions(pTeams) { + + let azure = require('azure-storage'); + let blobService = azure.createBlobService(permissions.connectionString); + + let startDate = new Date(); + startDate.setDate(startDate.getDate() - 1); + + let expiryDate = new Date(startDate); + expiryDate.setDate(startDate.getDate() + 3); + + for (let i = 0; i < pTeams.length; i++) { + + let team = pTeams[i]; + + if (team.readConnectionString !== undefined) { + + let azurePermissions = azure.BlobUtilities.SharedAccessPermissions.READ; + + let container = team.codeName; + let blobName = undefined; + + let sharedAccessPolicy = { + AccessPolicy: { + Permissions: azurePermissions, + Start: startDate, + Expiry: expiryDate + } + }; + + let sasToken = blobService.generateSharedAccessSignature(container, blobName, sharedAccessPolicy); + team.readConnectionString = "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=" + sasToken + ""; + } + + if (team.writeConnectionString !== undefined) { + + let azurePermissions = azure.BlobUtilities.SharedAccessPermissions.WRITE; + + let container = team.codeName; + let blobName = undefined; + + let sharedAccessPolicy = { + AccessPolicy: { + Permissions: azurePermissions, + Start: startDate, + Expiry: expiryDate + } + }; + + let sasToken = blobService.generateSharedAccessSignature(container, blobName, sharedAccessPolicy); + team.readConnectionString = "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=" + sasToken + ""; + } + } + + return pTeams; + } +} + + +/* + + "Develop": { + "aaplatform": { + "readConnectionString": "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=st=2018-05-21T07%3A16%3A54Z&se=2018-08-19T07%3A16%3A54Z&sp=r&sv=2017-07-29&sr=c&sig=YzkqXqAaXsbyn5hOgHCLDjKL8xcSkjBa0e9E1nNdoEI%3D" + }, + "aamasters": { + "readConnectionString": "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=st=2018-05-18T11%3A46%3A36Z&se=2018-08-16T11%3A46%3A36Z&sp=r&sv=2017-07-29&sr=c&sig=XHpklrDCK3Ta7Zp2F1S6UWkKgd2Sf0wTUUWcrykhh%2FA%3D", + "writeConnectionString": "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=st=2018-05-18T11%3A47%3A35Z&se=2018-08-16T11%3A47%3A35Z&sp=w&sv=2017-07-29&sr=c&sig=MENzxltuTVcXCgM%2BCtgfGkNtEULelIEHk0ke1nFCr6E%3D" + }, + "aabash": { + "readConnectionString": "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=st=2018-06-10T17%3A12%3A13Z&se=2018-09-08T17%3A12%3A13Z&sp=r&sv=2017-07-29&sr=c&sig=zb1JWz2Fl1baO2VjFFP4qKzobV85%2F79c2dXWX4fuBLc%3D", + "writeConnectionString": "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=st=2018-06-10T17%3A13%3A51Z&se=2018-09-08T17%3A13%3A51Z&sp=w&sv=2017-07-29&sr=c&sig=OCrxZggKIQS0Vm8wKA1SAhhTbSlq%2BRd7VqQhp8NUhF8%3D" + } + } + +*/ \ No newline at end of file diff --git a/server.js b/server.js index 59cd0c015..272e7aba3 100644 --- a/server.js +++ b/server.js @@ -49,7 +49,7 @@ let isHttpServerStarted = false; const STORAGE = require('./Server/Storage'); let storage = STORAGE.newStorage(); -let authenticatedSession; // We do not send these keys to the browser, instead they are kept here for when they are needed. +let sessionManager; // This module have all authenticated active sessions. initialize(); @@ -90,25 +90,31 @@ function initialize() { function onLoadCompeted(pHTMLCloudScripts) { - const PERMISSIONS = require('./Server/Permissions'); - let permissions = PERMISSIONS.newPermissions(); + const SESSION_MANAGER = require('./Server/SessionManager'); + sessionManager = SESSION_MANAGER.newSessionManager(); - permissions.initialize(ecosystemObject, onInitialized); + sessionManager.initialize(onInitialized); - function onInitialized(pPermissionsSecrets) { + function onInitialized() { - authenticatedSession = pPermissionsSecrets; + const STORAGE_ACCESS_MANAGER = require('./Server/StorageAccessManager'); + storageAccessManager = STORAGE_ACCESS_MANAGER.newStorageAccessManager(); - const BOT_SCRIPTS = require('./Server/BotsScripts'); - botScripts = BOT_SCRIPTS.newBotScripts(); - - botScripts.initialize(serverConfig, onInitialized); + storageAccessManager.initialize(onInitialized); function onInitialized() { - HTMLCloudScripts = pHTMLCloudScripts; - startHtttpServer(); + const BOT_SCRIPTS = require('./Server/BotsScripts'); + botScripts = BOT_SCRIPTS.newBotScripts(); + botScripts.initialize(serverConfig, onInitialized); + + function onInitialized() { + + HTMLCloudScripts = pHTMLCloudScripts; + startHtttpServer(); + + } } } } @@ -584,67 +590,75 @@ function onBrowserRequest(request, response) { let sessionToken = requestParameters[3]; - for (let i = 0; i < authenticatedSession.length; i++) { + let session = sessionManager.getSession(sessionToken); - let session = authenticatedSession[i]; + if (session !== undefined) { - if (session.sessionToken === sessionToken) { + let exchangeKey = session.exchangeKeys[0].key; // 0 because we only deal with one exchange for now. + let exchangeSecret = session.exchangeKeys[0].secret; - let exchangeKey = session.exchangeKeys[0].key; // 0 because we only deal with one exchange for now. - let exchangeSecret = session.exchangeKeys[0].secret; + const POLONIEX_CLIENT_MODULE = require('./Exchanges/' + 'PoloniexAPIClient'); + let poloniexApiClient = POLONIEX_CLIENT_MODULE.newPoloniexAPIClient(exchangeKey, exchangeSecret); - const POLONIEX_CLIENT_MODULE = require('./Exchanges/' + 'PoloniexAPIClient'); - let poloniexApiClient = POLONIEX_CLIENT_MODULE.newPoloniexAPIClient(exchangeKey, exchangeSecret); + switch (requestParameters[2]) { - switch (requestParameters[2]) { - - case "returnOpenOrders": { - poloniexApiClient.API.returnOpenOrders(requestParameters[4], requestParameters[5], onExchangeResponse); - break; - } - - case "returnOrderTrades": { - poloniexApiClient.API.returnOrderTrades(requestParameters[4], onExchangeResponse); - break; - } - - case "buy": { - poloniexApiClient.API.buy(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); - break; - } - - case "sell": { - poloniexApiClient.API.sell(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); - break; - } - - case "moveOrder": { - poloniexApiClient.API.moveOrder(requestParameters[4], requestParameters[5], requestParameters[6], onExchangeResponse); - break; - } - - case "returnTicker": { - poloniexApiClient.API.returnTicker(onExchangeResponse); - break; - } + case "returnOpenOrders": { + poloniexApiClient.API.returnOpenOrders(requestParameters[4], requestParameters[5], onExchangeResponse); + break; } - function onExchangeResponse(err, exchangeResponse) { - - /* Delete these secrets before they get logged. */ - - requestParameters[3] = ""; - - let serverResponse = { - err: err, - exchangeResponse: exchangeResponse - } - - respondWithContent(JSON.stringify(serverResponse), response); + case "returnOrderTrades": { + poloniexApiClient.API.returnOrderTrades(requestParameters[4], onExchangeResponse); + break; } - return; + case "buy": { + poloniexApiClient.API.buy(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); + break; + } + + case "sell": { + poloniexApiClient.API.sell(requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); + break; + } + + case "moveOrder": { + poloniexApiClient.API.moveOrder(requestParameters[4], requestParameters[5], requestParameters[6], onExchangeResponse); + break; + } + + case "returnTicker": { + poloniexApiClient.API.returnTicker(onExchangeResponse); + break; + } } + + function onExchangeResponse(err, exchangeResponse) { + + /* Delete these secrets before they get logged. */ + + requestParameters[3] = ""; + + let serverResponse = { + err: err, + exchangeResponse: exchangeResponse + } + + respondWithContent(JSON.stringify(serverResponse), response); + } + + return; + } + + else { + + let customResponse = { + result: global.CUSTOM_FAIL_RESPONSE.result, + message: "Your session has expired. Please login again." + }; + + respondWithContent(JSON.stringify(customResponse), response); + } } break;