diff --git a/lib/new-admin/admin-server.js b/lib/new-admin/admin-server.js index 0837ade1..4fd66b8f 100644 --- a/lib/new-admin/admin-server.js +++ b/lib/new-admin/admin-server.js @@ -11,14 +11,13 @@ const cookieParser = require('cookie-parser') const { ApolloServer, AuthenticationError } = require('apollo-server-express') const _ = require('lodash/fp') -const T = require('../time') +const { typeDefs, resolvers } = require('./graphql/schema') +const login = require('./modules/login') +const register = require('./routes/authentication') + const options = require('../options') -const login = require('./login') -const { typeDefs, resolvers } = require('./graphql/schema') - const devMode = require('minimist')(process.argv.slice(2)).dev -const NEVER = new Date(Date.now() + 100 * T.years) const idPhotoCardBasedir = _.get('idPhotoCardDir', options) const frontCameraBasedir = _.get('frontCameraDir', options) @@ -66,35 +65,7 @@ app.use(cors({ credentials: true, origin: devMode && 'https://localhost:3001' }) app.use('/id-card-photo', serveStatic(idPhotoCardBasedir, { index: false })) app.use('/front-camera-photo', serveStatic(frontCameraBasedir, { index: false })) - -app.get('/api/register', (req, res, next) => { - const otp = req.query.otp - const ua = req.headers['user-agent'] - const ip = req.ip - - if (!otp) return next() - - return login.register(otp, ua, ip) - .then(r => { - if (r.expired) return res.status(401).send('OTP expired, generate new registration link') - - // Maybe user is using old registration key, attempt to authenticate - if (!r.success) return next() - - const cookieOpts = { - httpOnly: true, - secure: true, - domain: hostname, - sameSite: true, - expires: NEVER - } - - const token = r.token - req.token = token - res.cookie('token', token, cookieOpts) - res.sendStatus(200) - }) -}) +app.use('/', register) // Everything not on graphql or api/register is redirected to the front-end app.get('*', (req, res) => res.sendFile(path.resolve(__dirname, '..', '..', 'public', 'index.html'))) diff --git a/lib/new-admin/graphql/schema.js b/lib/new-admin/graphql/schema.js index 44d098be..015dda26 100644 --- a/lib/new-admin/graphql/schema.js +++ b/lib/new-admin/graphql/schema.js @@ -7,7 +7,7 @@ const DataLoader = require('dataloader') const machineLoader = require('../../machine-loader') const customers = require('../../customers') -const { machineAction } = require('../machines') +const { machineAction } = require('../modules/machines') const logs = require('../../logs') const settingsLoader = require('../../new-settings-loader') // const tokenManager = require('../../token-manager') @@ -19,14 +19,14 @@ const bills = require('../bills') const anonymous = require('../../constants').anonymousCustomer const serverVersion = require('../../../package.json').version -const transactions = require('../transactions') -const funding = require('../funding') -const forex = require('../../forex') -const supervisor = require('../supervisor') -const serverLogs = require('../server-logs') -const pairing = require('../pairing') -const plugins = require('../../plugins') +const transactions = require('../modules/transactions') +const funding = require('../modules/funding') +const forex = require('../../forex') +const supervisor = require('../modules/supervisor') +const serverLogs = require('../modules/server-logs') +const pairing = require('../modules/pairing') +const plugins = require('../../plugins') const { accounts: accountsConfig, coins, diff --git a/lib/new-admin/funding.js b/lib/new-admin/modules/funding.js similarity index 66% rename from lib/new-admin/funding.js rename to lib/new-admin/modules/funding.js index 9531a68b..aaf72fc7 100644 --- a/lib/new-admin/funding.js +++ b/lib/new-admin/modules/funding.js @@ -1,11 +1,11 @@ const _ = require('lodash/fp') -const BN = require('../bn') -const settingsLoader = require('../new-settings-loader') -const configManager = require('../new-config-manager') -const wallet = require('../wallet') -const ticker = require('../ticker') -const coinUtils = require('../coin-utils') -const logger = require('../logger') +const BN = require('../../bn') +const settingsLoader = require('../../new-settings-loader') +const configManager = require('../../new-config-manager') +const wallet = require('../../wallet') +const ticker = require('../../ticker') +const coinUtils = require('../../coin-utils') +const logger = require('../../logger') function allScopes (cryptoScopes, machineScopes) { const scopes = [] @@ -70,23 +70,23 @@ function getSingleCoinFunding (settings, fiatCode, cryptoCode) { } // Promise.allSettled not running on current version of node -const reflect = p => p.then(value => ({value, status: "fulfilled" }), error => ({error: error.toString(), status: "rejected" })) +const reflect = p => p.then(value => ({ value, status: 'fulfilled' }), error => ({ error: error.toString(), status: 'rejected' })) function getFunding () { return settingsLoader.loadLatest().then(settings => { - const cryptoCodes = configManager.getAllCryptoCurrencies(settings.config) - const fiatCode = configManager.getGlobalLocale(settings.config).fiatCurrency - const pareCoins = c => _.includes(c.cryptoCode, cryptoCodes) - const cryptoCurrencies = coinUtils.cryptoCurrencies() - const cryptoDisplays = _.filter(pareCoins, cryptoCurrencies) + const cryptoCodes = configManager.getAllCryptoCurrencies(settings.config) + const fiatCode = configManager.getGlobalLocale(settings.config).fiatCurrency + const pareCoins = c => _.includes(c.cryptoCode, cryptoCodes) + const cryptoCurrencies = coinUtils.cryptoCurrencies() + const cryptoDisplays = _.filter(pareCoins, cryptoCurrencies) - const promises = cryptoDisplays.map(it => getSingleCoinFunding(settings, fiatCode, it.cryptoCode)) - return Promise.all(promises.map(reflect)) - .then((response) => { - const mapped = response.map(it => _.merge({ errorMsg: it.error }, it.value)) - return _.toArray(_.merge(mapped, cryptoDisplays)) - }) - }) + const promises = cryptoDisplays.map(it => getSingleCoinFunding(settings, fiatCode, it.cryptoCode)) + return Promise.all(promises.map(reflect)) + .then((response) => { + const mapped = response.map(it => _.merge({ errorMsg: it.error }, it.value)) + return _.toArray(_.merge(mapped, cryptoDisplays)) + }) + }) } module.exports = { getFunding } diff --git a/lib/new-admin/login.js b/lib/new-admin/modules/login.js similarity index 97% rename from lib/new-admin/login.js rename to lib/new-admin/modules/login.js index 4f58c3d3..bffb56d3 100644 --- a/lib/new-admin/login.js +++ b/lib/new-admin/modules/login.js @@ -1,6 +1,6 @@ const crypto = require('crypto') -const db = require('../db') +const db = require('../../db') function generateOTP (name) { const otp = crypto.randomBytes(32).toString('hex') diff --git a/lib/new-admin/machines.js b/lib/new-admin/modules/machines.js similarity index 92% rename from lib/new-admin/machines.js rename to lib/new-admin/modules/machines.js index 78e2f46a..9a612935 100644 --- a/lib/new-admin/machines.js +++ b/lib/new-admin/modules/machines.js @@ -1,4 +1,4 @@ -const machineLoader = require('../machine-loader') +const machineLoader = require('../../machine-loader') const { UserInputError } = require('apollo-server-express') function getMachine (machineId) { diff --git a/lib/new-admin/pairing.js b/lib/new-admin/modules/pairing.js similarity index 89% rename from lib/new-admin/pairing.js rename to lib/new-admin/modules/pairing.js index a91800b9..ffe2ceed 100644 --- a/lib/new-admin/pairing.js +++ b/lib/new-admin/modules/pairing.js @@ -4,9 +4,9 @@ const readFile = pify(fs.readFile) const crypto = require('crypto') const baseX = require('base-x') -const options = require('../options') -const db = require('../db') -const pairing = require('../pairing') +const options = require('../../options') +const db = require('../../db') +const pairing = require('../../pairing') const ALPHA_BASE = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:' const bsAlpha = baseX(ALPHA_BASE) diff --git a/lib/new-admin/server-logs.js b/lib/new-admin/modules/server-logs.js similarity index 93% rename from lib/new-admin/server-logs.js rename to lib/new-admin/modules/server-logs.js index 3717551a..80d93c7f 100644 --- a/lib/new-admin/server-logs.js +++ b/lib/new-admin/modules/server-logs.js @@ -1,7 +1,7 @@ const _ = require('lodash/fp') const uuid = require('uuid') -const db = require('../db') +const db = require('../../db') function getServerLogs (from = new Date(0).toISOString(), until = new Date().toISOString(), limit = null, offset = 0) { const sql = `select id, log_level, timestamp, message from server_logs diff --git a/lib/new-admin/supervisor.js b/lib/new-admin/modules/supervisor.js similarity index 97% rename from lib/new-admin/supervisor.js rename to lib/new-admin/modules/supervisor.js index 09710eb4..30e6b3c0 100644 --- a/lib/new-admin/supervisor.js +++ b/lib/new-admin/modules/supervisor.js @@ -1,5 +1,5 @@ const xmlrpc = require('xmlrpc') -const logger = require('../logger') +const logger = require('../../logger') const { promisify } = require('util') // TODO new-admin: add the following to supervisor config diff --git a/lib/new-admin/transactions.js b/lib/new-admin/modules/transactions.js similarity index 91% rename from lib/new-admin/transactions.js rename to lib/new-admin/modules/transactions.js index c7208961..c2e4f0d7 100644 --- a/lib/new-admin/transactions.js +++ b/lib/new-admin/modules/transactions.js @@ -1,11 +1,11 @@ const _ = require('lodash/fp') const pgp = require('pg-promise')() -const db = require('../db') -const machineLoader = require('../machine-loader') -const tx = require('../tx') -const cashInTx = require('../cash-in/cash-in-tx') -const { REDEEMABLE_AGE } = require('../cash-out/cash-out-helper') +const db = require('../../db') +const machineLoader = require('../../machine-loader') +const tx = require('../../tx') +const cashInTx = require('../../cash-in/cash-in-tx') +const { REDEEMABLE_AGE } = require('../../cash-out/cash-out-helper') const NUM_RESULTS = 1000 @@ -64,16 +64,10 @@ function batch (from = new Date(0).toISOString(), until = new Date().toISOString order by created desc limit $4 offset $5` return Promise.all([ - db.any(cashInSql, [ - cashInTx.PENDING_INTERVAL, - from, - until, - limit, - offset, - id - ]), + db.any(cashInSql, [cashInTx.PENDING_INTERVAL, from, until, limit, offset, id]), db.any(cashOutSql, [REDEEMABLE_AGE, from, until, limit, offset, id]) - ]).then(packager) + ]) + .then(packager) } function getCustomerTransactionsBatch (ids) { @@ -116,10 +110,10 @@ function getCustomerTransactionsBatch (ids) { db.any(cashInSql, [_.map(pgp.as.text, ids).join(','), cashInTx.PENDING_INTERVAL, NUM_RESULTS]), db.any(cashOutSql, [_.map(pgp.as.text, ids).join(','), NUM_RESULTS, REDEEMABLE_AGE]) ]) - .then(packager).then(transactions => { - const transactionMap = _.groupBy('customerId', transactions) - return ids.map(id => transactionMap[id]) - }) + .then(packager).then(transactions => { + const transactionMap = _.groupBy('customerId', transactions) + return ids.map(id => transactionMap[id]) + }) } function single (txId) { diff --git a/lib/new-admin/routes/authentication.js b/lib/new-admin/routes/authentication.js new file mode 100644 index 00000000..cc2e2f3b --- /dev/null +++ b/lib/new-admin/routes/authentication.js @@ -0,0 +1,42 @@ +const express = require('express') +const router = express.Router() + +const login = require('../modules/login') +const options = require('../../options') +const T = require('../../time') + +const NEVER = new Date(Date.now() + 100 * T.years) +const hostname = options.hostname + +const register = (req, res, next) => { + const otp = req.query.otp + const ua = req.headers['user-agent'] + const ip = req.ip + + if (!otp) return next() + + return login.register(otp, ua, ip) + .then(r => { + if (r.expired) return res.status(401).send('OTP expired, generate new registration link') + + // Maybe user is using old registration key, attempt to authenticate + if (!r.success) return next() + + const cookieOpts = { + httpOnly: true, + secure: true, + domain: hostname, + sameSite: true, + expires: NEVER + } + + const token = r.token + req.token = token + res.cookie('token', token, cookieOpts) + res.sendStatus(200) + }) +} + +router.get('/api/register', register) + +module.exports = router