diff --git a/Exchange/ExchangeAPI.js b/Exchange/ExchangeAPI.js index 53d193851..8f66ff4f2 100644 --- a/Exchange/ExchangeAPI.js +++ b/Exchange/ExchangeAPI.js @@ -28,9 +28,12 @@ function getTicker(pMarket, callBackFunction) { + let authToken = window.localStorage.getItem('auth0Token'); + let path = "ExchangeAPI" + "/" + + CURRENT_BOT_CODE_NAME + "/" + "getTicker" + "/" - + window.SESSION_TOKEN + + authToken ; callServer(undefined, path + "/NO-LOG", onServerResponse); @@ -46,9 +49,12 @@ function getOpenPositions(pMarket, callBackFunction) { + let authToken = window.localStorage.getItem('auth0Token'); + let path = "ExchangeAPI" + "/" + + CURRENT_BOT_CODE_NAME + "/" + "getOpenPositions" + "/" - + window.SESSION_TOKEN + + authToken ; callServer(undefined, path + "/NO-LOG", onServerResponse); @@ -64,9 +70,12 @@ function getExecutedTrades(pPositionId, callBackFunction) { + let authToken = window.localStorage.getItem('auth0Token'); + let path = "ExchangeAPI" + "/" + + CURRENT_BOT_CODE_NAME + "/" + "getExecutedTrades" + "/" - + window.SESSION_TOKEN + "/" + + authToken + "/" + pPositionId ; @@ -83,9 +92,12 @@ function putPosition(pMarket, pType, pRate, pAmountA, pAmountB, callBackFunction) { + let authToken = window.localStorage.getItem('auth0Token'); + let path = "ExchangeAPI" + "/" + + CURRENT_BOT_CODE_NAME + "/" + "putPosition" + "/" - + window.SESSION_TOKEN + "/" + + authToken + "/" + pType + "/" + pRate + "/" + pAmountA + "/" @@ -105,9 +117,12 @@ function movePosition(pPositionId, pNewRate, pPositionAmountB, callBackFunction) { + let authToken = window.localStorage.getItem('auth0Token'); + let path = "ExchangeAPI" + "/" + + CURRENT_BOT_CODE_NAME + "/" + "movePosition" + "/" - + window.SESSION_TOKEN + "/" + + authToken + "/" + pPositionId + "/" + pNewRate + "/" + pPositionAmountB @@ -126,9 +141,12 @@ function getPublicTradeHistory(pMarket, startTime, endTime, callBackFunction) { + let authToken = window.localStorage.getItem('auth0Token'); + let path = "ExchangeAPI" + "/" + + CURRENT_BOT_CODE_NAME + "/" + "getPublicTradeHistory" + "/" - + window.SESSION_TOKEN + "/" + + authToken + "/" + startTime + "/" + endTime ; diff --git a/Project.njsproj b/Project.njsproj index 570516c25..099cc7bf6 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -4,6 +4,7 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) Project browser + Debug|Any CPU diff --git a/Server/Exchange/ExchangeAPI.js b/Server/Exchange/ExchangeAPI.js index 7748c4095..fe3c75257 100644 --- a/Server/Exchange/ExchangeAPI.js +++ b/Server/Exchange/ExchangeAPI.js @@ -1,4 +1,4 @@ -exports.newExchangeAPI = function newExchangeAPI() { +exports.newExchangeAPI = function newExchangeAPI(botDisplayName, authToken) { /* @@ -7,6 +7,7 @@ */ const _ = require('lodash'); const isValidOrder = require('./exchangeUtils').isValidOrder; + const graphqlClient = require('graphql-client') let MODULE_NAME = "Exchange API"; @@ -31,18 +32,73 @@ if (CONSOLE_LOG === true) { console.log("[INFO] ExchangeAPI -> initialize -> Entering function."); } - let exchange = global.EXCHANGE_NAME.toLowerCase() + 'Client.js'; + //TODO From financial beings we get the exchange the bot is trading + let botExchange = 'Poloniex'; + let exchange = botExchange.toLowerCase() + 'Client.js'; let api = require('./Wrappers/' + exchange); - apiClient = api.newAPIClient(global.EXCHANGE_KEYS[global.EXCHANGE_NAME].Key, global.EXCHANGE_KEYS[global.EXCHANGE_NAME].Secret); - callBackFunction(global.DEFAULT_OK_RESPONSE); + if (!authToken) { + console.log("[ERROR] Exchange API -> initialize -> User Not Logged In."); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } else { + let keyVaultAPI = createKeyVaultAPIClient(authToken) + apiClient = api.newAPIClient(keyVaultAPI); + callBackFunction(global.DEFAULT_OK_RESPONSE); + } } catch (err) { console.log("[ERROR] ExchangeAPI -> initialize -> err = " + err.message); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } + function createKeyVaultAPIClient(authToken) { + if (CONSOLE_LOG === true) { console.log("[INFO] createKeyVaultAPIClient -> Entering function."); } + + const keyVaultAPI = graphqlClient({ + url: 'https://keyvault-api.advancedalgos.net/graphql', + headers: { + Authorization: 'Bearer ' + authToken + } + }); + + keyVaultAPI.signTransaction = function (transaction, next) { + let variables = { + botId: botDisplayName, + transaction: transaction + } + + keyVaultAPI.query(` + mutation($botId: String, $transaction: String!){ + signTransaction(botId: $botId, transaction: $transaction){ + key, + signature, + date + } + }`, variables, function (req, res) { + if (res.status === 401) { + next(undefined, 'Error from graphql: Not authorized'); + } + }).then(res => { + if (res.errors) { + next(undefined, 'Error from graphql: ' + res.errors); + } else { + let signature = { + Key: res.data.signTransaction.key, + Sign: res.data.signTransaction.signature + } + next(signature) + } + }).catch(error => { + next(undefined, 'Error signing the message on the key vault: ' + error.message); + }); + } + + if (CONSOLE_LOG === true) { console.log("[INFO] createKeyVaultAPIClient -> Returning graphql client."); } + + return keyVaultAPI; + } + /* * Position Object = { * id, String diff --git a/Server/Exchange/Wrappers/poloniex.js b/Server/Exchange/Wrappers/poloniex.js index b486342b3..dc48c5802 100644 --- a/Server/Exchange/Wrappers/poloniex.js +++ b/Server/Exchange/Wrappers/poloniex.js @@ -5,8 +5,7 @@ module.exports = (function () { 'use strict'; // Module dependencies - var crypto = require('crypto'), - request = require('request'), + var request = require('request'), nonce = require('nonce')(); // Constants @@ -27,27 +26,18 @@ module.exports = (function () { } // Constructor - function Poloniex(key, secret) { + function Poloniex(keyVaultAPI) { // Generate headers signed by this user's key and secret. // The secret is encapsulated and never exposed - this._getPrivateHeaders = function (parameters) { + this._getPrivateHeaders = function (parameters, next) { var paramString, signature; - if (!key || !secret) { - throw 'Poloniex: Error. API key and secret required'; - } - // Convert to `arg1=foo&arg2=bar` paramString = Object.keys(parameters).map(function (param) { return encodeURIComponent(param) + '=' + encodeURIComponent(parameters[param]); }).join('&'); - signature = crypto.createHmac('sha512', secret).update(paramString).digest('hex'); - - return { - Key: key, - Sign: signature - }; + keyVaultAPI.signTransaction(paramString, next); }; } @@ -123,11 +113,22 @@ module.exports = (function () { options = { method: 'POST', url: PRIVATE_API_URL, - form: parameters, - headers: this._getPrivateHeaders(parameters) + form: parameters }; - return this._request(options, callback); + let headers = this._getPrivateHeaders(parameters, next) + + let thisObject = this + + function next(pHeaders, error) { + if (!error) { + options.headers = pHeaders; + return thisObject._request(options, callback); + } else { + callback(error); + } + + } }, ///// @@ -436,4 +437,4 @@ module.exports = (function () { Poloniex.prototype.myTradeHistory = Poloniex.prototype.returnTradeHistory; return Poloniex; -})(); \ No newline at end of file +})(); diff --git a/Server/Exchange/Wrappers/poloniexClient.js b/Server/Exchange/Wrappers/poloniexClient.js index 175cc8951..eb26a7f66 100644 --- a/Server/Exchange/Wrappers/poloniexClient.js +++ b/Server/Exchange/Wrappers/poloniexClient.js @@ -1,4 +1,4 @@ -exports.newAPIClient = function newAPIClient(pKey, pSecret) { +exports.newAPIClient = function newAPIClient(keyVaultAPI) { /* /* ATENTION: This Library is used both a the cloud (AACloud) and also at the AAWeb on the server side without any modifications. @@ -44,7 +44,7 @@ 'ETIMEDOUT' ]; - let API = new Poloniex(pKey, pSecret); + let API = new Poloniex(keyVaultAPI); let thisObject = { getTicker: getTicker, diff --git a/TopSpace/Login.js b/TopSpace/Login.js index df39b411f..24d84b25c 100644 --- a/TopSpace/Login.js +++ b/TopSpace/Login.js @@ -21,20 +21,6 @@ function newLogin() { container.isDraggeable = false; container.isClickeable = true; - const AUTH0_CLIENT_ID = 'WQTnXt20a0t2WGl64mEcOyP4Ippo37nB'; - const AUTH0_DOMAIN = 'advancedalgos.eu.auth0.com'; - - const LOGIN_URL = "https://" + AUTH0_DOMAIN + "/authorize" + - "?state=" + - "&client_id=" + AUTH0_CLIENT_ID + - "&response_type=id_token" + - "&redirect_uri=" + location.href + "index.html" + - "&scope=openid" + - "&nonce=CALCULATESOMENONCE"; - - const LOGOUT_URL = "/"; - - let currentURL; let currentLabel; let Auth0; @@ -46,14 +32,15 @@ function newLogin() { let parameters = { domain: 'advancedalgos.eu.auth0.com', + clientID: 'WQTnXt20a0t2WGl64mEcOyP4Ippo37nB', redirectUri: window.location.href, - clientID: 'WQTnXt20a0t2WGl64mEcOyP4Ippo37nB' + audience: 'https://auth-dev.advancedalgos.net', }; Auth0 = new auth0.WebAuth(parameters); userAuthorization = window.location.hash.substr(1); // What comes after the # on the URL. - + let sessionToken = window.localStorage.getItem('sessionToken'); if (sessionToken !== null && sessionToken !== "") { @@ -76,16 +63,11 @@ function newLogin() { } else { - console.log(userAuthorization); - Auth0.parseHash({ hash: window.location.hash }, function (err, authResult) { if (err) { return console.log("Parse Hash Error", err); } - console.log("Auth0 Error", err); - console.log("Auth0 Result", authResult); - // The contents of authResult depend on which authentication parameters were used. // It can include the following: // authResult.accessToken - access token for the API specified by `audience` @@ -96,6 +78,9 @@ function newLogin() { let authId = authResult.idTokenPayload.sub; + // We store the token so we can identify the user + window.localStorage.setItem('auth0Token', authResult.accessToken); + /* Now we connect to the users module to get the users alias, first, middle and last names. */ const apolloClient = new Apollo.lib.ApolloClient({ @@ -174,7 +159,7 @@ function newLogin() { Auth0.authorize({ scope: 'openid profile', - responseType: 'id_token' + responseType: 'token id_token' }); } else { diff --git a/package-lock.json b/package-lock.json index 3ad82c383..dcab42f22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,9 +29,12 @@ } }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "2.1.2" + } }, "assert-plus": { "version": "1.0.0", @@ -54,9 +57,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "azure-storage": { "version": "2.8.2", @@ -74,12 +77,72 @@ "validator": "9.4.1", "xml2js": "0.2.8", "xmlbuilder": "0.4.3" + }, + "dependencies": { + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.7", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.20", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "stringstream": "0.0.6", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + } + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + } + } } }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -114,9 +177,9 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { "delayed-stream": "1.0.0" } @@ -166,12 +229,21 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.24" } }, "extend": { @@ -206,7 +278,17 @@ "requires": { "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "2.1.20" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } + } } }, "getpass": { @@ -217,15 +299,31 @@ "assert-plus": "1.0.0" } }, + "graphql": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", + "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "requires": { + "iterall": "1.2.2" + } + }, + "graphql-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/graphql-client/-/graphql-client-2.0.1.tgz", + "integrity": "sha512-XXdjUD3mwsBDcUB7g+iXQeRt+3gmIbvA/Yx1nE5aq2RQmaJwiH4hEoYw27AW8cDR90pCrPlHJAb1jJq3zUMbZA==", + "requires": { + "isomorphic-fetch": "2.2.1" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { "ajv": "5.5.2", "har-schema": "2.0.0" @@ -263,7 +361,15 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.14.1" + "sshpk": "1.14.2" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": "2.1.2" } }, "inherits": { @@ -291,11 +397,25 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "3.0.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -356,16 +476,16 @@ } }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "requires": { - "mime-db": "1.33.0" + "mime-db": "1.36.0" } }, "ms": { @@ -373,15 +493,24 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, "nonce": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nonce/-/nonce-1.0.4.tgz", "integrity": "sha1-7nMCrejBvvR28wG4yR9cxRpIdhI=" }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "performance-now": { "version": "2.1.0", @@ -393,6 +522,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -417,38 +551,41 @@ } }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { "aws-sign2": "0.7.0", - "aws4": "1.7.0", + "aws4": "1.8.0", "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", + "combined-stream": "1.0.7", + "extend": "3.0.2", "forever-agent": "0.6.1", "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", + "har-validator": "5.1.0", "http-signature": "1.2.0", "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", + "mime-types": "2.1.20", + "oauth-sign": "0.9.0", "performance-now": "2.1.0", "qs": "6.5.2", "safe-buffer": "5.1.2", - "stringstream": "0.0.6", - "tough-cookie": "2.3.4", + "tough-cookie": "2.4.3", "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "uuid": "3.3.2" }, "dependencies": { "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" } } }, @@ -462,6 +599,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -476,17 +618,18 @@ } }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "0.2.3", + "asn1": "0.2.4", "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", + "bcrypt-pbkdf": "1.0.2", "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", + "ecc-jsbn": "0.1.2", "getpass": "0.1.7", "jsbn": "0.1.1", + "safer-buffer": "2.1.2", "tweetnacl": "0.14.5" } }, @@ -501,10 +644,11 @@ "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { + "psl": "1.1.29", "punycode": "1.4.1" } }, @@ -557,6 +701,11 @@ "extsprintf": "1.3.0" } }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, "xml2js": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", diff --git a/package.json b/package.json index d9b08caf1..031336605 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,11 @@ "@octokit/rest": "^14.0.9", "atob": "^2.1.1", "azure-storage": "^2.8.2", + "graphql": "^14.0.2", + "graphql-client": "^2.0.1", "lodash": "^4.17.11", "nonce": "^1.0.4", + "request": "^2.88.0", "retry": "^0.12.0" } } diff --git a/server.js b/server.js index b3084637f..d315bec6b 100644 --- a/server.js +++ b/server.js @@ -728,31 +728,17 @@ function onBrowserRequest(request, response) { /* We are going to let access the exchange only to authenticated users, that measn that we need the a valid session token. */ - let sessionToken = requestParameters[3]; - - let session = sessionManager.getSession(sessionToken); - - if (session !== undefined) { - - let exchangeKey = session.exchangeKeys[0].key; // 0 because we only deal with one exchange for now. - let exchangeSecret = session.exchangeKeys[0].secret; - - global.EXCHANGE_NAME = "Poloniex"; + let botDisplayName = requestParameters[2]; + let authToken = requestParameters[4]; + if (authToken !== undefined) { global.MARKET = { assetA: "USDT", assetB: "BTC" }; - - global.EXCHANGE_KEYS = { - "Poloniex": { - "Key": exchangeKey, - "Secret": exchangeSecret - } - } - - const EXCHANGE_API = require('./Server/Exchange/' + 'ExchangeAPI'); - let exchangeAPI = EXCHANGE_API.newExchangeAPI(); + + const EXCHANGE_API = require('./Server/Exchange/ExchangeAPI'); + let exchangeAPI = EXCHANGE_API.newExchangeAPI(botDisplayName, authToken); exchangeAPI.initialize(onInizialized); @@ -779,7 +765,7 @@ function onBrowserRequest(request, response) { } function callExchangeAPIMethod() { - switch (requestParameters[2]) { + switch (requestParameters[3]) { case "getTicker": { exchangeAPI.getTicker(global.MARKET, onExchangeResponse); @@ -792,22 +778,22 @@ function onBrowserRequest(request, response) { } case "getExecutedTrades": { - exchangeAPI.getExecutedTrades(requestParameters[4], onExchangeResponse); + exchangeAPI.getExecutedTrades(requestParameters[5], onExchangeResponse); break; } case "putPosition": { - exchangeAPI.putPosition(global.MARKET, requestParameters[4], requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); + exchangeAPI.putPosition(global.MARKET, requestParameters[5], requestParameters[6], requestParameters[7], requestParameters[8], onExchangeResponse); break; } case "movePosition": { - exchangeAPI.moveOrder(requestParameters[4], requestParameters[5], requestParameters[6], onExchangeResponse); + exchangeAPI.moveOrder(requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); break; } case "getPublicTradeHistory": { - exchangeAPI.getPublicTradeHistory(global.MARKET, requestParameters[4], requestParameters[5], requestParameters[6], onExchangeResponse); + exchangeAPI.getPublicTradeHistory(global.MARKET, requestParameters[5], requestParameters[6], requestParameters[7], onExchangeResponse); break; } @@ -823,7 +809,7 @@ function onBrowserRequest(request, response) { /* Delete these secrets before they get logged. */ - requestParameters[3] = ""; + requestParameters[4] = ""; if (err.result === global.DEFAULT_OK_RESPONSE.result) respondWithContent(JSON.stringify(exchangeResponse), response); else @@ -837,7 +823,7 @@ function onBrowserRequest(request, response) { let customResponse = { result: global.CUSTOM_FAIL_RESPONSE.result, - message: "Your session has expired. Please login again." + message: "You are not logged in." }; respondWithContent(JSON.stringify(customResponse), response);