diff --git a/src/app.js b/src/app.js index 0d18032..cda9589 100644 --- a/src/app.js +++ b/src/app.js @@ -49,12 +49,9 @@ module.exports = function App(secret, DB) { next(); }) - //get code for login or signup + //get code for login app.get('/get-login-code', Request.getLoginCode); - //signup request - //app.post('/signup', Request.SignUp); Removing need for signup - //login request app.post('/login', Request.Login); diff --git a/src/market.js b/src/market.js index 8e68fb3..3dde029 100644 --- a/src/market.js +++ b/src/market.js @@ -10,6 +10,24 @@ const { var DB, assetList; //container for database and allowed assets +function login(floID, proxyKey) { + return new Promise((resolve, reject) => { + DB.query("INSERT INTO UserSession (floID, proxyKey) VALUE (?, ?) " + + "ON DUPLICATE KEY UPDATE session_time=DEFAULT, proxyKey=?", + [floID, proxyKey, proxyKey]) + .then(result => resolve("Login Successful")) + .catch(error => reject(error)) + }) +} + +function logout(floID) { + return new Promise((resolve, reject) => { + DB.query("DELETE FROM UserSession WHERE floID=?", [floID]) + .then(result => resolve("Logout successful")) + .catch(error => reject(error)) + }) +} + const getAssetBalance = (floID, asset) => new Promise((resolve, reject) => { let promises = (asset === floGlobals.currency) ? [ DB.query("SELECT SUM(balance) AS balance FROM Cash WHERE floID=?", [floID]), @@ -516,6 +534,8 @@ function blockchainReCheck() { } module.exports = { + login, + logout, get rates() { return coupling.price.currentRates; }, diff --git a/src/request.js b/src/request.js index d1a4738..c2cd73c 100644 --- a/src/request.js +++ b/src/request.js @@ -78,12 +78,211 @@ validateRequest.checkIfSignUsed = sign => new Promise((resolve, reject) => { }).catch(error => reject(error)) }); -function storeRequest(floID, req_str, sign, proxy = false) { +function logRequest(floID, req_str, sign, proxy = false) { //console.debug(floID, req_str); DB.query("INSERT INTO RequestLog (floID, request, sign, proxy) VALUES (?,?,?, ?)", [floID, req_str, sign, proxy]) .then(_ => null).catch(error => console.error(error)); } +function processRequest(res, rText, validateObj, sign, floID, pubKey, marketFn) { + validateRequest(validateObj, sign, floID, pubKey).then(req_str => { + marketFn().then(result => { + logRequest(data.floID, req_str, data.sign, !data.pubKey); + res.send(result); + }).catch(error => { + if (error instanceof INVALID) + res.status(INVALID.e_code).send(error.message); + else { + console.error(error); + res.status(INTERNAL.e_code).send(rText + " failed! Try again later!"); + } + }) + }).catch(error => { + if (error instanceof INVALID) + res.status(INVALID.e_code).send(error.message); + else { + console.error(error); + res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); + } + }) +} + +/* User Requests */ + +function Account(req, res) { + let data = req.body; + validateRequest({ + type: "get_account", + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey).then(req_str => { + market.getAccountDetails(data.floID).then(result => { + result.sinkID = global.sinkID; + if (trustedIDs.includes(data.floID)) + result.subAdmin = true; + res.send(result); + }); + }).catch(error => { + if (error instanceof INVALID) + res.status(INVALID.e_code).send(error.message); + else { + console.error(error); + res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); + } + }); +} + +function Login(req, res) { + let data = req.body; + if (!data.code || data.hash != Crypto.SHA1(data.code + secret)) + res.status(INVALID.e_code).send("Invalid Code"); + else if (!data.pubKey) + res.status(INVALID.e_code).send("Public key missing"); + else + processRequest(res, "Login", { + type: "login", + random: data.code, + proxyKey: data.proxyKey, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.login(data.floID, data.proxyKey) + ); +} + +function Logout(req, res) { + let data = req.body; + processRequest(res, "Logout", { + type: "logout", + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.logout(data.floID) + ); +} + +function PlaceSellOrder(req, res) { + let data = req.body; + processRequest(res, "Sell order placement", { + type: "sell_order", + asset: data.asset, + quantity: data.quantity, + min_price: data.min_price, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.addSellOrder(data.floID, data.asset, data.quantity, data.min_price) + ); +} + +function PlaceBuyOrder(req, res) { + let data = req.body; + processRequest(res, "Buy order placement", { + type: "buy_order", + asset: data.asset, + quantity: data.quantity, + max_price: data.max_price, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.addBuyOrder(data.floID, data.asset, data.quantity, data.max_price) + ); +} + +function CancelOrder(req, res) { + let data = req.body; + processRequest(res, "Order cancellation", { + type: "cancel_order", + order: data.orderType, + id: data.orderID, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.cancelOrder(data.orderType, data.orderID, data.floID) + ); +} + +function TransferToken(req, res) { + let data = req.body; + processRequest(res, "Token Transfer", { + type: "transfer_token", + receiver: JSON.stringify(data.receiver), + token: data.token, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.transferToken(data.floID, data.receiver, data.token) + ); +} + +function DepositFLO(req, res) { + let data = req.body; + processRequest(res, "Deposit FLO", { + type: "deposit_flo", + txid: data.txid, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.depositFLO(data.floID, data.txid) + ); +} + +function WithdrawFLO(req, res) { + let data = req.body; + processRequest(res, "Withdraw FLO", { + type: "withdraw_flo", + amount: data.amount, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.withdrawFLO(data.floID, data.amount) + ); +} + +function DepositToken(req, res) { + let data = req.body; + processRequest(res, "Deposit Token", { + type: "deposit_token", + txid: data.txid, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.depositToken(data.floID, data.txid) + ); +} + +function WithdrawToken(req, res) { + let data = req.body; + processRequest(res, "Withdraw Token", { + type: "withdraw_token", + token: data.token, + amount: data.amount, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.withdrawToken(data.floID, data.token, data.amount) + ); +} + +function addUserTag(req, res) { + let data = req.body; + if (!trustedIDs.includes(data.floID)) + res.status(INVALID.e_code).send("Access Denied"); + else processRequest(res, "Add user-tag", { + type: "add_tag", + user: data.user, + tag: data.tag, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.group.addTag(data.user, data.tag) + ); +} + +function removeUserTag(req, res) { + let data = req.body; + if (!trustedIDs.includes(data.floID)) + res.status(INVALID.e_code).send("Access Denied"); + else processRequest(res, "Remove user-tag", { + type: "remove_tag", + user: data.user, + tag: data.tag, + timestamp: data.timestamp + }, data.sign, data.floID, data.pubKey, + () => market.group.removeTag(data.user, data.tag) + ); +} + +/* Public Requests */ + function getLoginCode(req, res) { if (!serving) return res.status(INVALID.e_code).send(INVALID_SERVER_MSG); @@ -95,211 +294,6 @@ function getLoginCode(req, res) { }); } -/* -function SignUp(req, res) { - if (!serving) - return res.status(INVALID.e_code).send(INVALID_SERVER_MSG); - let data = req.body; - if (floCrypto.getFloID(data.pubKey) !== data.floID) - return res.status(INVALID.e_code).send("Invalid Public Key"); - if (!data.code || data.hash != Crypto.SHA1(data.code + secret)) - return res.status(INVALID.e_code).send("Invalid Code"); - let req_str = validateRequest_X({ - type: "create_account", - random: data.code, - timestamp: data.timestamp - }, data.sign, data.pubKey); - if (req_str instanceof INVALID) - return res.status(INVALID.e_code).send(req_str.message); - let txQueries = []; - txQueries.push(["INSERT INTO Users(floID, pubKey) VALUES (?, ?)", [data.floID, data.pubKey]]); - txQueries.push(["INSERT INTO Cash (floID) Values (?)", [data.floID]]); - DB.transaction(txQueries).then(_ => { - storeRequest(data.floID, req_str, data.sign); - res.send("Account Created"); - }).catch(error => { - if (error.code === "ER_DUP_ENTRY") - res.status(INVALID.e_code).send("Account already exist"); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Account creation failed! Try Again Later!"); - } - }); -} -*/ - -function Login(req, res) { - let data = req.body; - if (!data.code || data.hash != Crypto.SHA1(data.code + secret)) - return res.status(INVALID.e_code).send("Invalid Code"); - if (!data.pubKey) - return res.status(INVALID.e_code).send("Public key missing"); - validateRequest({ - type: "login", - random: data.code, - proxyKey: data.proxyKey, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - DB.query("INSERT INTO UserSession (floID, proxyKey) VALUE (?, ?) " + - "ON DUPLICATE KEY UPDATE session_time=DEFAULT, proxyKey=?", - [data.floID, data.proxyKey, data.proxyKey]).then(_ => { - storeRequest(data.floID, req_str, data.sign); - res.send("Login Successful"); - }).catch(error => { - console.error(error); - res.status(INTERNAL.e_code).send("Login failed! Try again later!"); - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Login failed! Try again later!"); - } - }) -} - -function Logout(req, res) { - let data = req.body; - validateRequest({ - type: "logout", - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - DB.query("DELETE FROM UserSession WHERE floID=?", [data.floID]).then(_ => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send('Logout successful'); - }).catch(error => { - console.error(error); - res.status(INTERNAL.e_code).send("Logout failed! Try again later! Contact support if this error occurs frequently"); - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function PlaceSellOrder(req, res) { - let data = req.body; - validateRequest({ - type: "sell_order", - asset: data.asset, - quantity: data.quantity, - min_price: data.min_price, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.addSellOrder(data.floID, data.asset, data.quantity, data.min_price).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Order placement failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function PlaceBuyOrder(req, res) { - let data = req.body; - validateRequest({ - type: "buy_order", - asset: data.asset, - quantity: data.quantity, - max_price: data.max_price, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.addBuyOrder(data.floID, data.asset, data.quantity, data.max_price).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Order placement failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function CancelOrder(req, res) { - let data = req.body; - validateRequest({ - type: "cancel_order", - order: data.orderType, - id: data.orderID, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.cancelOrder(data.orderType, data.orderID, data.floID).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Order cancellation failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function TransferToken(req, res) { - let data = req.body; - validateRequest({ - type: "transfer_token", - receiver: JSON.stringify(data.receiver), - token: data.token, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.transferToken(data.floID, data.receiver, data.token).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Token Transfer failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - function ListSellOrders(req, res) { //TODO: Limit size (best) DB.query("SELECT * FROM SellOrder ORDER BY time_placed") @@ -358,206 +352,8 @@ function getTransaction(req, res) { } } -function Account(req, res) { - let data = req.body; - validateRequest({ - type: "get_account", - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.getAccountDetails(data.floID).then(result => { - result.sinkID = global.sinkID; - if (trustedIDs.includes(data.floID)) - result.subAdmin = true; - res.send(result); - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function DepositFLO(req, res) { - let data = req.body; - validateRequest({ - type: "deposit_flo", - txid: data.txid, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.depositFLO(data.floID, data.txid).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function WithdrawFLO(req, res) { - let data = req.body; - validateRequest({ - type: "withdraw_flo", - amount: data.amount, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.withdrawFLO(data.floID, data.amount).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function DepositToken(req, res) { - let data = req.body; - validateRequest({ - type: "deposit_token", - txid: data.txid, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.depositToken(data.floID, data.txid).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function WithdrawToken(req, res) { - let data = req.body; - validateRequest({ - type: "withdraw_token", - token: data.token, - amount: data.amount, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.withdrawToken(data.floID, data.token, data.amount).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function addUserTag(req, res) { - let data = req.body; - if (!trustedIDs.includes(data.floID)) - res.status(INVALID.e_code).send("Access Denied"); - else validateRequest({ - type: "add_tag", - user: data.user, - tag: data.tag, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.group.addTag(data.user, data.tag).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - -function removeUserTag(req, res) { - let data = req.body; - if (!trustedIDs.includes(data.floID)) - res.status(INVALID.e_code).send("Access Denied"); - else validateRequest({ - type: "remove_tag", - user: data.user, - tag: data.tag, - timestamp: data.timestamp - }, data.sign, data.floID, data.pubKey).then(req_str => { - market.group.removeTag(data.user, data.tag).then(result => { - storeRequest(data.floID, req_str, data.sign, !data.pubKey); - res.send(result); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); - }).catch(error => { - if (error instanceof INVALID) - res.status(INVALID.e_code).send(error.message); - else { - console.error(error); - res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); - } - }); -} - module.exports = { getLoginCode, - //SignUp, Login, Logout, PlaceBuyOrder,