Merge branch 'release' into merge-release-into-dev
This commit is contained in:
commit
b885e5698c
11 changed files with 132 additions and 25 deletions
|
|
@ -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
26
dev/recreate-seeds.js
Normal 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')
|
||||||
|
}
|
||||||
|
|
@ -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']},
|
||||||
|
|
|
||||||
|
|
@ -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']]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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, ' '))
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ p {
|
||||||
|
|
||||||
.lamassuAdminMain {
|
.lamassuAdminMain {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
height: 100%;
|
||||||
margin-bottom: 40px;
|
margin-bottom: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue