diff --git a/.gitignore b/.gitignore index 402b59b95..d9043d22a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,8 @@ bin/* *.cache node_modules/* exchange/Auth0.js +configs/Email.Config.json + +configs/User.Profile.json +configs/Execution.Config.json +configs/Secret.Keys.json diff --git a/Project.njsproj b/Project.njsproj index 516525a6d..c6a345349 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -68,6 +68,7 @@ Code + Code diff --git a/Run.js b/Run.js index 937991c36..f930cb063 100644 --- a/Run.js +++ b/Run.js @@ -1,9 +1,7 @@  global.CURRENT_ENVIRONMENT = "Develop"; -global.CURRENT_EXECUTION_AT = "Browser"; +global.CURRENT_EXECUTION_AT = "Cloud"; global.SHALL_BOT_STOP = false; -global.USER_LOGGED_IN = "Ciencias"; -global.DEV_TEAM = "AAMasters"; global.AT_BREAKPOINT = false; // This is used only when running at the browser. /* Default parameters can be changed by the execution configuration */ @@ -49,25 +47,53 @@ function readStoragePermissions() { console.log( "[INFO] Run -> readStoragePermissions -> Entering function. "); let fs = require('fs'); - filePath = '../' + 'User-Profile' + '/' + 'User.Profile.json'; + filePath = './' + 'configs' + '/' + 'User.Profile.json'; global.USER_PROFILE = JSON.parse(fs.readFileSync(filePath, 'utf8')); + /* Dinamically generating the azure storage permissions for the bot to run */ - /* Here we will rearrange the storage permissions array into a map, so that it can be easily consumed when needed. */ + const MAX_STORAGE_PERMISSION_DAYS = 10; + const STORAGE_ACCESS_MANAGER = require('./StorageAccessManager'); + storageAccessManager = STORAGE_ACCESS_MANAGER.newStorageAccessManager(); - let permissionsMap = new Map; + storageAccessManager.initialize(global.USER_PROFILE.connectionString, onInitialized); - for (i = 0; i < global.USER_PROFILE.storagePermissions.length; i++) { + function onInitialized() { - let permission = global.USER_PROFILE.storagePermissions[i]; + /* Here we will rearrange the storage permissions array into a map, so that it can be easily consumed when needed. */ - permissionsMap.set(permission[0], permission[1]); + let permissionsMap = new Map; + + let containers = ["AAPlatform", "AAVikings", global.USER_PROFILE.teamName] + let container; + let key; + let value; + + for (let i = 0; i < containers.length; i++) { + + container = containers[i]; + let readPermission = storageAccessManager.getPermission(container.toLowerCase(), "READ", MAX_STORAGE_PERMISSION_DAYS); + + key = container + ".READ"; + value = readPermission; + + permissionsMap.set(key, value); + + } + + let writePermission = storageAccessManager.getPermission(container.toLowerCase(), "WRITE", MAX_STORAGE_PERMISSION_DAYS); + + key = container + ".WRITE"; + value = writePermission; + + permissionsMap.set(key, value); + + global.USER_PROFILE.storagePermissions = permissionsMap; + global.USER_PROFILE.connectionString = ""; + + readEmailConfiguration(); } - - global.USER_PROFILE.storagePermissions = permissionsMap; - - readEmailConfiguration(); } catch (err) { console.log("[ERROR] Run -> readStoragePermissions -> err = " + err.message); @@ -83,7 +109,7 @@ function readEmailConfiguration() { console.log( "Run : [INFO] readEmailConfiguration -> Entering function. "); let fs = require('fs'); - filePath = '../' + 'Email-Config' + '/' + 'Email.Config.json'; + filePath = './' + 'configs' + '/' + 'Email.Config.json'; global.EMAIL_CONFIG = JSON.parse(fs.readFileSync(filePath, 'utf8')); readExecutionConfiguration(); @@ -98,9 +124,10 @@ function readExecutionConfiguration() { let filePath; try { let fs = require('fs'); - filePath = '../Execution-Config/Execution.Config.json'; + filePath = './configs/Execution.Config.json'; let executionProperties = JSON.parse(fs.readFileSync(filePath, 'utf8')); global.DEV_TEAM = executionProperties.devTeam; + global.USER_LOGGED_IN = executionProperties.userName; global.EXCHANGE_NAME = executionProperties.exchangeName; global.MARKET = executionProperties.market; global.EXECUTION_CONFIG = { @@ -123,7 +150,7 @@ function readExchangeAPIKey() { console.log( "[INFO] Run -> readExchangeAPIKey -> Entering function. "); let fs = require('fs'); - let filePath = '../' + 'Exchange-Keys' + '/' + 'Secret.Keys' + '.json'; + let filePath = './configs/Secret.Keys' + '.json'; global.EXCHANGE_KEYS = JSON.parse(fs.readFileSync(filePath, 'utf8')); startRoot(); diff --git a/StorageAccessManager.js b/StorageAccessManager.js new file mode 100644 index 000000000..ae4ad9a67 --- /dev/null +++ b/StorageAccessManager.js @@ -0,0 +1,63 @@ +exports.newStorageAccessManager = function newStorageAccessManager() { + + let thisObject = { + getPermission: getPermission, + initialize: initialize + } + + let connectionString; + + return thisObject; + + function initialize(pConnectionString, callBackFunction) { + + connectionString = pConnectionString; + + callBackFunction(); + } + + function getPermission(pContainer, pType, pDays) { + + let azure = require('azure-storage'); + let blobService = azure.createBlobService(connectionString); + + let startDate = new Date(); + startDate.setDate(startDate.getDate() - 1); + + let expiryDate = new Date(startDate); + expiryDate.setDate(startDate.getDate() + pDays); + + let azurePermissions; + + switch (pType) { + case "READ": { + azurePermissions = azure.BlobUtilities.SharedAccessPermissions.READ; + break; + } + case "WRITE": { + azurePermissions = azure.BlobUtilities.SharedAccessPermissions.WRITE; + break; + } + case "DELETE": { + azurePermissions = azure.BlobUtilities.SharedAccessPermissions.DELETE; + break; + } + } + + let blobName = undefined; + + let sharedAccessPolicy = { + AccessPolicy: { + Permissions: azurePermissions, + Start: startDate, + Expiry: expiryDate + } + }; + + let sasToken = blobService.generateSharedAccessSignature(pContainer, blobName, sharedAccessPolicy); + + return "BlobEndpoint=https://aadevelop.blob.core.windows.net;SharedAccessSignature=" + sasToken + ""; + + } +} + diff --git a/this.config.json b/this.config.json index 3a23977c8..d4a37b864 100644 --- a/this.config.json +++ b/this.config.json @@ -14,35 +14,35 @@ "repo": "AAMariam-Trading-Bot" }, { - "enabled": "true", + "enabled": "false", "devTeam": "AAMasters", "bot": "AACharly", "process": "Poloniex-Live-Trades", "repo": "AACharly-Extraction-Bot" }, { - "enabled": "true", + "enabled": "false", "devTeam": "AAMasters", "bot": "AACharly", "process": "Poloniex-Hole-Fixing", "repo": "AACharly-Extraction-Bot" }, { - "enabled": "true", + "enabled": "false", "devTeam": "AAMasters", "bot": "AABruce", "process": "One-Min-Daily-Candles-Volumes", "repo": "AABruce-Indicator-Bot" }, { - "enabled": "true", + "enabled": "false", "devTeam": "AAMasters", "bot": "AAOlivia", "process": "Multi-Period-Daily", "repo": "AAOlivia-Indicator-Bot" }, { - "enabled": "true", + "enabled": "false", "devTeam": "AAMasters", "bot": "AAOlivia", "process": "Multi-Period-Market",