diff --git a/lib/coinatmradar/coinatmradar.js b/lib/coinatmradar/coinatmradar.js index be4eec28..55fbf5c6 100644 --- a/lib/coinatmradar/coinatmradar.js +++ b/lib/coinatmradar/coinatmradar.js @@ -1,17 +1,16 @@ const axios = require('axios') const _ = require('lodash/fp') -const hkdf = require('futoin-hkdf') const pify = require('pify') const fs = pify(require('fs')) const db = require('../db') -const mnemonicHelpers = require('../mnemonic-helpers') const configManager = require('../new-config-manager') const complianceTriggers = require('../compliance-triggers') const options = require('../options') const logger = require('../logger') const plugins = require('../plugins') +const { getOperatorId } = require('../operator') const TIMEOUT = 10000 const MAX_CONTENT_LENGTH = 2000 @@ -133,10 +132,10 @@ function sendRadar (data) { function mapRecord (rates, settings) { const timestamp = new Date().toISOString() - return Promise.all([getMachines(rates, settings), fs.readFile(options.mnemonicPath, 'utf8')]) - .then(([machines, mnemonic]) => { + return Promise.all([getMachines(rates, settings), getOperatorId()]) + .then(([machines, operatorId]) => { return { - operatorId: computeOperatorId(mnemonicHelpers.toEntropyBuffer(mnemonic)), + operatorId: operatorId, operator: { name: null, phone: null, @@ -157,7 +156,3 @@ function update (rates, settings) { .then(sendRadar) .catch(err => logger.error(`Failure to update CoinATMRadar`, err)) } - -function computeOperatorId (masterSeed) { - return hkdf(masterSeed, 16, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex') -} diff --git a/lib/middlewares/operatorId.js b/lib/middlewares/operatorId.js index 0dceb527..04548aaf 100644 --- a/lib/middlewares/operatorId.js +++ b/lib/middlewares/operatorId.js @@ -1,34 +1,15 @@ -const pify = require('pify') -const fs = pify(require('fs')) -const hkdf = require('futoin-hkdf') - -const state = require('./state') -const mnemonicHelpers = require('../mnemonic-helpers') -const options = require('../options') -const logger = require('../logger') - -function computeOperatorId (masterSeed) { - return hkdf(masterSeed, 16, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex') -} - -function getMnemonic () { - if (state.mnemonic) return Promise.resolve(state.mnemonic) - return fs.readFile(options.mnemonicPath, 'utf8').then(mnemonic => { - state.mnemonic = mnemonic - return mnemonic - }) -} +const { getOperatorId } = require('../operator') function findOperatorId (req, res, next) { - return getMnemonic().then(mnemonic => { - return computeOperatorId(mnemonicHelpers.toEntropyBuffer(mnemonic)) - }).then(id => { - res.locals.operatorId = id - return next() - }).catch(e => { - logger.error('Error while computing operator id\n' + e) - next(e) - }) + return getOperatorId() + .then(({ id }) => { + res.locals.operatorId = id + return next() + }) + .catch(e => { + console.error('Error while computing operator id\n' + e) + next(e) + }) } module.exports = findOperatorId diff --git a/lib/operator.js b/lib/operator.js new file mode 100644 index 00000000..a39eaeed --- /dev/null +++ b/lib/operator.js @@ -0,0 +1,8 @@ +const db = require('./db') + +function getOperatorId () { + const sql = `SELECT id FROM operator_ids WHERE description = 'mnemonic'` + return db.oneOrNone(sql) +} + +module.exports = { getOperatorId } diff --git a/migrations/1623413776161-create-operator-ids.js b/migrations/1623413776161-create-operator-ids.js new file mode 100644 index 00000000..d48fcb1e --- /dev/null +++ b/migrations/1623413776161-create-operator-ids.js @@ -0,0 +1,55 @@ +var db = require('./db') +const pify = require('pify') +const fs = pify(require('fs')) +const hkdf = require('futoin-hkdf') + +const state = require('../lib/middlewares/state') +const mnemonicHelpers = require('../lib/mnemonic-helpers') +const options = require('../lib/options') + +function computeOperatorId (masterSeed) { + return hkdf(masterSeed, 16, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex') +} + +function getMnemonic () { + if (state.mnemonic) return Promise.resolve(state.mnemonic) + return fs.readFile(options.mnemonicPath, 'utf8').then(mnemonic => { + state.mnemonic = mnemonic + return mnemonic + }) +} + +function generateOperatorId () { + return getMnemonic().then(mnemonic => { + return computeOperatorId(mnemonicHelpers.toEntropyBuffer(mnemonic)) + }).then(id => { + return id + }).catch(e => { + console.error('Error while computing operator id\n' + e) + throw e + }) +} + +exports.up = function (next) { + const sql = + [ + `CREATE TABLE operator_ids ( + id TEXT PRIMARY KEY, + description TEXT NOT NULL)` + ] + generateOperatorId() + .then(operatorId => { + const sql2 = `INSERT INTO operator_ids (id, description) VALUES ('${operatorId}','mnemonic' )` + sql.push(sql2) + db.multi(sql, next) + .then(() => next()) + }) + .catch(e => { + db.multi(sql, next) + .then(() => next()) + }) +} + +exports.down = function (next) { + next() +}