Merge pull request #241 from RafaelTaranto/merge-release-into-dev

Merge release into dev
This commit is contained in:
Josh Harvey 2018-12-30 15:57:16 +01:00 committed by GitHub
commit 5c74e8d17c
11 changed files with 132 additions and 25 deletions

View file

@ -49,7 +49,7 @@ fi
decho "updating node" decho "updating node"
npm install n -g >> ${LOG_FILE} 2>&1 npm install n -g >> ${LOG_FILE} 2>&1
n lts >> ${LOG_FILE} 2>&1 n 8 >> ${LOG_FILE} 2>&1
decho "version installed $(node -v)" decho "version installed $(node -v)"
export NPM_BIN=$(npm -g bin) export NPM_BIN=$(npm -g bin)

26
dev/recreate-seeds.js Normal file
View file

@ -0,0 +1,26 @@
#!/usr/bin/env node
'use strict'
const fs = require('fs')
const path = require('path')
const os = require('os')
const bip39 = require('bip39')
const options = require('../lib/options-loader')()
if (options.opts.mnemonicPath && !options.opts.seedPath) {
const mnemonic = fs.readFileSync(options.opts.mnemonicPath, 'utf8')
const seed = bip39.mnemonicToEntropy(mnemonic.split('\n').join(' ').trim()).toString('hex')
options.opts.seedPath = path.resolve(os.homedir(), '.lamassu', 'seeds', 'seed.txt')
if (!fs.existsSync(path.dirname(options.opts.seedPath))) {
fs.mkdirSync(path.dirname(options.opts.seedPath))
}
if (!fs.existsSync(options.opts.seedPath)) {
fs.writeFileSync(options.opts.seedPath, seed, 'utf8')
}
fs.writeFileSync(options.path, JSON.stringify(options.opts, null, '\t'), 'utf8')
}

View file

@ -181,7 +181,7 @@ function fetchData () {
{code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']}, {code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC']}, {code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC']},
{code: 'quadrigacx', display: 'QuadrigaCX', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']}, {code: 'quadrigacx', display: 'QuadrigaCX', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'mock-ticker', display: 'Mock ticker', class: 'ticker', cryptos: ALL_CRYPTOS}, {code: 'mock-ticker', display: 'Mock (Caution!)', class: 'ticker', cryptos: ALL_CRYPTOS},
{code: 'bitcoind', display: 'bitcoind', class: 'wallet', cryptos: ['BTC']}, {code: 'bitcoind', display: 'bitcoind', class: 'wallet', cryptos: ['BTC']},
{code: 'no-layer2', display: 'No Layer 2', class: 'layer2', cryptos: ALL_CRYPTOS}, {code: 'no-layer2', display: 'No Layer 2', class: 'layer2', cryptos: ALL_CRYPTOS},
{code: 'infura', display: 'Infura', class: 'wallet', cryptos: ['ETH']}, {code: 'infura', display: 'Infura', class: 'wallet', cryptos: ['ETH']},

View file

@ -25,12 +25,12 @@ const BINARIES = {
dir: 'bitcoin-0.16.3/bin' dir: 'bitcoin-0.16.3/bin'
}, },
ETH: { ETH: {
url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.15-89451f7c.tar.gz', url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.19-dae82f09.tar.gz',
dir: 'geth-linux-amd64-1.8.15-89451f7c' dir: 'geth-linux-amd64-1.8.19-dae82f09'
}, },
ZEC: { ZEC: {
url: 'https://z.cash/downloads/zcash-2.0.0-linux64.tar.gz', url: 'https://z.cash/downloads/zcash-2.0.2-linux64.tar.gz',
dir: 'zcash-2.0.0/bin' dir: 'zcash-2.0.2/bin'
}, },
DASH: { DASH: {
url: 'https://github.com/dashpay/dash/releases/download/v0.12.3.3/dashcore-0.12.3.3-x86_64-linux-gnu.tar.gz', url: 'https://github.com/dashpay/dash/releases/download/v0.12.3.3/dashcore-0.12.3.3-x86_64-linux-gnu.tar.gz',
@ -41,8 +41,8 @@ const BINARIES = {
dir: 'litecoin-0.16.3/bin' dir: 'litecoin-0.16.3/bin'
}, },
BCH: { BCH: {
url: 'https://download.bitcoinabc.org/0.18.2/linux/bitcoin-abc-0.18.2-x86_64-linux-gnu.tar.gz', url: 'https://download.bitcoinabc.org/0.18.5/linux/bitcoin-abc-0.18.5-x86_64-linux-gnu.tar.gz',
dir: 'bitcoin-abc-0.18.2/bin', dir: 'bitcoin-abc-0.18.5/bin',
files: [['bitcoind', 'bitcoincashd'], ['bitcoin-cli', 'bitcoincash-cli']] files: [['bitcoind', 'bitcoincashd'], ['bitcoin-cli', 'bitcoincash-cli']]
} }
} }

View file

@ -156,5 +156,5 @@ function update (info) {
} }
function computeOperatorId (masterSeed) { function computeOperatorId (masterSeed) {
return hkdf(masterSeed, 32, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex') return hkdf(masterSeed, 16, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex')
} }

View file

@ -1,10 +1,19 @@
const _ = require('lodash/fp') const _ = require('lodash/fp')
const fs = require('fs') const fs = require('fs')
const makeDir = require('make-dir') const makeDir = require('make-dir')
const path = require('path')
const load = require('./options-loader') const load = require('./options-loader')
module.exports = {run, mapKeyValuesDeep} // current path of lamassu-server project
const currentBasePath = path.dirname(__dirname)
// get path as array of path components
const paths = _.wrap(_.split, path.sep)
// find the index of the lamassu-server directory
// /usr/lib/node_modules/lamassu-server/certs/Lamassu_OP.pem => 3
const indexOfLs = _.flow(paths, _.wrap(_.indexOf, 'lamassu-server'))
module.exports = {run, mapKeyValuesDeep, updateOptionBasepath}
function mapKeyValuesDeep (cb, obj, key) { function mapKeyValuesDeep (cb, obj, key) {
if (_.isArray(obj)) { if (_.isArray(obj)) {
@ -16,6 +25,32 @@ function mapKeyValuesDeep (cb, obj, key) {
} }
} }
function updateOptionBasepath (result, optionName) {
const currentPath = _.get(optionName, result)
// process only keys that contains
// lamassu-server dir in its path
const i = indexOfLs(currentPath)
if (i === -1) {
return
}
// workout the relative path
// /usr/lib/node_modules/lamassu-server/certs/Lamassu_OP.pem => certs/Lamassu_OP.pem
const rPath = _.drop(i + 1, paths(currentPath))
// prepend the current lamassu-server path
// certs/Lamassu_OP.pem => /usr/local/lib/node_modules/lamassu-server/certs/Lamassu_OP.pem
const newPath = _.join(path.sep, _.concat([currentBasePath], rPath))
// update this option
// if the value has changed
if (!_.isEqual(currentPath, newPath)) {
console.log(`Migrating option ${optionName} to new path ${newPath}`)
result[optionName] = newPath
}
}
async function run () { async function run () {
// load defaults // load defaults
const defaultOpts = require('../lamassu-default') const defaultOpts = require('../lamassu-default')
@ -26,6 +61,19 @@ async function run () {
// check if there are new options to add // check if there are new options to add
let result = _.mergeAll([defaultOpts, currentOpts]) let result = _.mergeAll([defaultOpts, currentOpts])
// get all the options
// that ends with "Path" suffix
console.log(`Detected lamassu-server basepath: ${currentBasePath}`)
_.each(_.wrap(updateOptionBasepath, result),
[
'seedPath',
'caPath',
'certPath',
'keyPath',
'lamassuCaPath'
])
const shouldMigrate = !_.isEqual(result, currentOpts) || _.has('lamassuServerPath', result) const shouldMigrate = !_.isEqual(result, currentOpts) || _.has('lamassuServerPath', result)
// write the resulting lamassu.json // write the resulting lamassu.json
@ -33,8 +81,18 @@ async function run () {
// remove old lamassuServerPath config // remove old lamassuServerPath config
result = _.omit('lamassuServerPath', result) result = _.omit('lamassuServerPath', result)
const newOpts = _.pick(_.difference(_.keys(result), _.keys(currentOpts)), result) // find keys for which values
console.log('Adding options', newOpts) // have been changed
const differentValue = _.wrap(_.filter, key => !_.isEqual(result[key], currentOpts[key]))
// output affected options
const newOpts = _.pick(_.union(
// find change keys
differentValue(_.keys(result)),
// find new opts
_.difference(_.keys(result), _.keys(currentOpts))
), result)
console.log('Updating options', newOpts)
// store new lamassu.json file // store new lamassu.json file
fs.writeFileSync(options.path, JSON.stringify(result, null, ' ')) fs.writeFileSync(options.path, JSON.stringify(result, null, ' '))

View file

@ -74,14 +74,7 @@ function isPaired (deviceId) {
const sql = 'select device_id, name from devices where device_id=$1 and paired=TRUE' const sql = 'select device_id, name from devices where device_id=$1 and paired=TRUE'
return db.oneOrNone(sql, [deviceId]) return db.oneOrNone(sql, [deviceId])
.then(row => { .then(row => row && row.device_id === deviceId ? row.name : false)
const deviceName = row.name
const isDevicePaired = row && row.device_id === deviceId
return {
deviceName: deviceName,
isDevicePaired: isDevicePaired
}
})
} }
module.exports = {pair, unpair, authorizeCaDownload, isPaired} module.exports = {pair, unpair, authorizeCaDownload, isPaired}

View file

@ -311,10 +311,10 @@ function authorize (req, res, next) {
const deviceId = req.deviceId const deviceId = req.deviceId
return pairing.isPaired(deviceId) return pairing.isPaired(deviceId)
.then(r => { .then(deviceName => {
if (r.isDevicePaired) { if (deviceName) {
req.deviceId = deviceId req.deviceId = deviceId
req.deviceName = r.deviceName req.deviceName = deviceName
return next() return next()
} }

View file

@ -25,7 +25,7 @@ function httpError (msg, code) {
} }
function computeSeed (masterSeed) { function computeSeed (masterSeed) {
return hkdf(masterSeed, 32, { salt: 'lamassu-server-salt', info: 'wallet-seed' }).toString('hex') return hkdf(masterSeed, 32, {salt: 'lamassu-server-salt', info: 'wallet-seed'})
} }
function fetchWallet (settings, cryptoCode) { function fetchWallet (settings, cryptoCode) {

View file

@ -21,6 +21,7 @@ p {
.lamassuAdminMain { .lamassuAdminMain {
display: flex; display: flex;
height: 100%;
margin-bottom: 40px; margin-bottom: 40px;
} }

View file

@ -1,7 +1,10 @@
import test from 'ava' import test from 'ava'
import _ from 'lodash/fp' import _ from 'lodash/fp'
import path from 'path'
import {mapKeyValuesDeep} from '../../lib/migrate-options' import {mapKeyValuesDeep, updateOptionBasepath} from '../../lib/migrate-options'
const currentBasePath = path.dirname(path.dirname(__dirname))
test('mapKeyValuesDeep', t => { test('mapKeyValuesDeep', t => {
const test = { const test = {
@ -33,3 +36,29 @@ test('mapKeyValuesDeep', t => {
t.deepEqual(result, expected) t.deepEqual(result, expected)
}) })
test('updateOptionBasepath', t => {
const test = {
someBooleanOption: true,
someStringOption: 'my-custom-option',
customExternalPath: '/usr/lib/node_modules/ava',
seedPath: '/etc/lamassu/seeds/seed.txt',
caPath: '/usr/lib/node_modules/lamassu-server/certs/Lamassu_OP_Root_CA.pem'
}
const expected = {
someBooleanOption: true,
someStringOption: 'my-custom-option',
customExternalPath: '/usr/lib/node_modules/ava',
seedPath: '/etc/lamassu/seeds/seed.txt',
caPath: path.join(currentBasePath, 'certs/Lamassu_OP_Root_CA.pem')
}
let result = _.clone(test)
_.each(
_.wrap(updateOptionBasepath, result),
_.keys(test)
)
t.deepEqual(result, expected)
})