Merge branch 'dev' into feat/lam-1291/stress-testing

* dev: (85 commits)
  chore: console.log debug leftovers
  fix: third level navigation links
  fix: show subheader on refresh
  fix: machines/:id routing
  fix: customer route
  chore: update wallet nodes
  feat: shorten long addresses in funding page
  feat: shorten long addresses
  refactor: support copied text different from presented text
  chore: udpate react, downshift and routing
  refactor: use Wizard component on first route
  fix: autocomplete component rendering
  feat: skip2fa option on .env
  fix: drop contraint before dropping index
  chore: stop using alias imports
  fix: re-instate urlResolver
  chore: server code formatting
  chore: reformat code
  chore: adding eslint and prettier config
  chore: typo
  ...
This commit is contained in:
siiky 2025-05-20 11:57:32 +01:00
commit e10493abc6
1398 changed files with 60329 additions and 157527 deletions

View file

@ -0,0 +1,38 @@
const fs = require('fs')
const path = require('path')
const setEnvVariable = require('./set-env-var')
fs.copyFileSync(
path.resolve(__dirname, '../.sample.env'),
path.resolve(__dirname, '../.env'),
)
setEnvVariable('NODE_ENV', 'development')
setEnvVariable('POSTGRES_USER', 'postgres')
setEnvVariable('POSTGRES_PASSWORD', 'postgres123')
setEnvVariable('POSTGRES_HOST', 'localhost')
setEnvVariable('POSTGRES_PORT', '5432')
setEnvVariable('POSTGRES_DB', 'lamassu')
setEnvVariable('CA_PATH', `${process.env.PWD}/certs/Lamassu_OP_Root_CA.pem`)
setEnvVariable('CERT_PATH', `${process.env.PWD}/certs/Lamassu_OP.pem`)
setEnvVariable('KEY_PATH', `${process.env.PWD}/certs/Lamassu_OP.key`)
setEnvVariable(
'MNEMONIC_PATH',
`${process.env.HOME}/.lamassu/mnemonics/mnemonic.txt`,
)
setEnvVariable('BLOCKCHAIN_DIR', `${process.env.PWD}/blockchains`)
setEnvVariable('OFAC_DATA_DIR', `${process.env.HOME}/.lamassu/ofac`)
setEnvVariable('ID_PHOTO_CARD_DIR', `${process.env.HOME}/.lamassu/idphotocard`)
setEnvVariable('FRONT_CAMERA_DIR', `${process.env.HOME}/.lamassu/frontcamera`)
setEnvVariable('OPERATOR_DATA_DIR', `${process.env.HOME}/.lamassu/operatordata`)
setEnvVariable('BTC_NODE_LOCATION', 'remote')
setEnvVariable('BTC_WALLET_LOCATION', 'local')
setEnvVariable('HOSTNAME', 'localhost')
setEnvVariable('LOG_LEVEL', 'debug')

View file

@ -0,0 +1,87 @@
#!/usr/bin/env bash
set -e
export LOG_FILE=/tmp/install.log
CONFIG_DIR=/lamassu-data
# certs
CERT_DIR=$CONFIG_DIR/certs
KEY_DIR=$CONFIG_DIR/private
LAMASSU_CA_PATH=$CERT_DIR/Lamassu_CA.pem
CA_KEY_PATH=$KEY_DIR/Lamassu_OP_Root_CA.key
CA_PATH=$CERT_DIR/Lamassu_OP_Root_CA.pem
SERVER_KEY_PATH=$KEY_DIR/Lamassu_OP.key
SERVER_CERT_PATH=$CERT_DIR/Lamassu_OP.pem
# other
MNEMONIC_DIR=$CONFIG_DIR/mnemonics
MNEMONIC_FILE=$MNEMONIC_DIR/mnemonic.txt
OFAC_DATA_DIR=$CONFIG_DIR/ofac
decho () {
echo `date +"%H:%M:%S"` $1
}
IP=$HOSTNAME
NODE_MODULES=$(npm -g root)
NPM_BIN=$(npm -g bin)
decho "Generating mnemonic..."
mkdir -p $MNEMONIC_DIR
SEED=$(openssl rand -hex 32)
MNEMONIC=$(/lamassu-server/bin/bip39 $SEED)
echo "$MNEMONIC" > $MNEMONIC_FILE
mkdir -p $CERT_DIR
mkdir -p $KEY_DIR
decho "Generating SSL certificates..."
sed -i '/RANDFILE/d' /etc/ssl/openssl.cnf
openssl genrsa \
-out $CA_KEY_PATH \
4096
openssl req \
-x509 \
-sha256 \
-new \
-nodes \
-key $CA_KEY_PATH \
-days 3650 \
-out $CA_PATH \
-subj "/C=IS/ST=/L=Reykjavik/O=Lamassu Operator CA/CN=operator.lamassu.is"
openssl genrsa \
-out $SERVER_KEY_PATH \
4096
openssl req -new \
-key $SERVER_KEY_PATH \
-out /tmp/Lamassu_OP.csr.pem \
-subj "/C=IS/ST=/L=Reykjavik/O=Lamassu Operator/CN=$IP" \
-reqexts SAN \
-sha256 \
-config <(cat /etc/ssl/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=IP.1:$IP"))
openssl x509 \
-req -in /tmp/Lamassu_OP.csr.pem \
-CA $CA_PATH \
-CAkey $CA_KEY_PATH \
-CAcreateserial \
-out $SERVER_CERT_PATH \
-extfile <(cat /etc/ssl/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=IP.1:$IP")) \
-extensions SAN \
-days 3650
rm /tmp/Lamassu_OP.csr.pem
mkdir -p $OFAC_DATA_DIR
decho "Copying Lamassu certificate authority..."
LAMASSU_CA_FILE=/lamassu-server/Lamassu_CA.pem
cp $LAMASSU_CA_FILE $LAMASSU_CA_PATH

View file

@ -0,0 +1,58 @@
const fs = require('fs')
const path = require('path')
const argv = require('minimist')(process.argv.slice(2))
const _ = require('lodash/fp')
const setEnvVariable = require('./set-env-var')
const requiredParams = ['db-password', 'hostname']
if (!_.isEqual(_.intersection(_.keys(argv), requiredParams), requiredParams)) {
console.error(
'Usage: node tools/build-prod-env.js --db-password <DB_PASSWORD> --hostname <IP>',
)
process.exit(2)
}
fs.copyFileSync(
path.resolve(__dirname, '../.sample.env'),
path.resolve('/etc', 'lamassu', '.env'),
)
setEnvVariable('NODE_ENV', 'production')
setEnvVariable('POSTGRES_USER', 'lamassu_pg')
setEnvVariable('POSTGRES_PASSWORD', `${argv['db-password']}`)
setEnvVariable('POSTGRES_HOST', 'localhost')
setEnvVariable('POSTGRES_PORT', '5432')
setEnvVariable('POSTGRES_DB', 'lamassu')
setEnvVariable('CA_PATH', `/etc/ssl/certs/Lamassu_OP_Root_CA.pem`)
setEnvVariable('CERT_PATH', `/etc/ssl/certs/Lamassu_OP.pem`)
setEnvVariable('KEY_PATH', `/etc/ssl/private/Lamassu_OP.key`)
setEnvVariable('MNEMONIC_PATH', `/etc/lamassu/mnemonics/mnemonic.txt`)
setEnvVariable('BLOCKCHAIN_DIR', `/mnt/blockchains`)
setEnvVariable('OFAC_DATA_DIR', `/var/lamassu/ofac`)
setEnvVariable('ID_PHOTO_CARD_DIR', `/opt/lamassu-server/idphotocard`)
setEnvVariable('FRONT_CAMERA_DIR', `/opt/lamassu-server/frontcamera`)
setEnvVariable('OPERATOR_DATA_DIR', `/opt/lamassu-server/operatordata`)
setEnvVariable('COIN_ATM_RADAR_URL', `https://coinatmradar.info/api/lamassu/`)
setEnvVariable('BTC_NODE_LOCATION', 'local')
setEnvVariable('BTC_WALLET_LOCATION', 'local')
setEnvVariable('BCH_NODE_LOCATION', 'local')
setEnvVariable('BCH_WALLET_LOCATION', 'local')
setEnvVariable('LTC_NODE_LOCATION', 'local')
setEnvVariable('LTC_WALLET_LOCATION', 'local')
setEnvVariable('DASH_NODE_LOCATION', 'local')
setEnvVariable('DASH_WALLET_LOCATION', 'local')
setEnvVariable('ZEC_NODE_LOCATION', 'local')
setEnvVariable('ZEC_WALLET_LOCATION', 'local')
setEnvVariable('XMR_NODE_LOCATION', 'local')
setEnvVariable('XMR_WALLET_LOCATION', 'local')
setEnvVariable('HOSTNAME', `${argv.hostname}`)
setEnvVariable('LOG_LEVEL', 'info')

View file

@ -0,0 +1,95 @@
#!/usr/bin/env bash
# This is for setting up cryptographic certificates for a development environment
set -e
DOMAIN=localhost
[ ! -z "$1" ] && DOMAIN=$1
CONFIG_DIR=$HOME/.lamassu
LOG_FILE=/tmp/cert-gen.log
CERT_DIR=$PWD/certs
KEY_DIR=$PWD/certs
LAMASSU_CA_PATH=$PWD/Lamassu_CA.pem
POSTGRES_PASS=postgres123
OFAC_DATA_DIR=$CONFIG_DIR/ofac
IDPHOTOCARD_DIR=$CONFIG_DIR/idphotocard
FRONTCAMERA_DIR=$CONFIG_DIR/frontcamera
OPERATOR_DIR=$CONFIG_DIR/operatordata
mkdir -p $CERT_DIR
mkdir -p $CONFIG_DIR >> $LOG_FILE 2>&1
echo "Generating mnemonic..."
MNEMONIC_DIR=$CONFIG_DIR/mnemonics
MNEMONIC_FILE=$MNEMONIC_DIR/mnemonic.txt
mkdir -p $MNEMONIC_DIR >> $LOG_FILE 2>&1
SEED=$(openssl rand -hex 32)
MNEMONIC=$($PWD/bin/bip39 $SEED)
echo "$MNEMONIC" > $MNEMONIC_FILE
echo "Generating SSL certificates..."
CA_KEY_PATH=$KEY_DIR/Lamassu_OP_Root_CA.key
CA_PATH=$CERT_DIR/Lamassu_OP_Root_CA.pem
SERVER_KEY_PATH=$KEY_DIR/Lamassu_OP.key
SERVER_CERT_PATH=$CERT_DIR/Lamassu_OP.pem
red=`tput setaf 1`
reset=`tput sgr0`
OPENSSL_ERROR_HINT="Make sure that you have installed openssl 1.0 version"
print_error () {
echo "${red}Error: ${reset} $1"
echo $2 # hint
}
{
openssl genrsa \
-out $CA_KEY_PATH \
4096 >> $LOG_FILE 2>&1
} || { print_error "openssl genrsa to CA_KEY_PATH failed" "$OPENSSL_ERROR_HINT"; exit 1; }
{
openssl req \
-x509 \
-sha256 \
-new \
-nodes \
-key $CA_KEY_PATH \
-days 3560 \
-out $CA_PATH \
-subj "/C=IS/ST=/L=Reykjavik/O=Lamassu Operator CA/CN=lamassu-operator.is" \
>> $LOG_FILE 2>&1
} || { print_error "openssl req with CA_KEY_PATH failed" "$OPENSSL_ERROR_HINT"; exit 1; }
{
openssl genrsa \
-out $SERVER_KEY_PATH \
4096 >> $LOG_FILE 2>&1
} || { print_error "openssl genrsa SERVER_KEY_PATH failed" "$OPENSSL_ERROR_HINT"; exit 1; }
{
openssl req -new \
-key $SERVER_KEY_PATH \
-out /tmp/Lamassu_OP.csr.pem \
-subj "/C=IS/ST=/L=Reykjavik/O=Lamassu Operator/CN=$DOMAIN" \
>> $LOG_FILE 2>&1
} || { print_error "openssl req with SERVER_KEY_PATH failed" "$OPENSSL_ERROR_HINT"; exit 1; }
{
openssl x509 \
-req -in /tmp/Lamassu_OP.csr.pem \
-CA $CA_PATH \
-CAkey $CA_KEY_PATH \
-CAcreateserial \
-out $SERVER_CERT_PATH \
-days 3650 >> $LOG_FILE 2>&1
} || { print_error "openssl x509 failed" "$OPENSSL_ERROR_HINT"; exit 1; }
rm /tmp/Lamassu_OP.csr.pem
mkdir -p $OFAC_DATA_DIR/sources
touch $OFAC_DATA_DIR/etags.json
node tools/build-dev-env.js
echo "Done."

View file

@ -0,0 +1,74 @@
#!/bin/bash
set -e
if [ $# -eq 0 ]
then
echo "usage: bash createblockstorage.sh [droplet-name] [token]" && exit 1
fi
DROPLET_NAME=$1
TOKEN=$2
#Install doctl
echo "Installing doctl..."
sudo snap install doctl
#Create config folder as suggested in doctl documentation
sudo mkdir -p ~/.config
#Access doctl account
echo "Accessing digital ocean account..."
doctl auth init --access-token $TOKEN
#Get droplet region and id
echo "Fetching droplet information..."
DROPLET_INFO=$(doctl compute droplet get $DROPLET_NAME --format "ID, Region")
DROPLET_ID=$(echo $DROPLET_INFO | awk '{ print $3; }')
REGION=$(echo $DROPLET_INFO | awk '{ print $4; }')
#Create a new volume and attach it to the droplet
echo "Creating a new volume..."
VOLUME_ID=$(doctl compute volume create --region $REGION --size 10GiB lamassu-data --format "ID" | sed -n 2p)
echo "Attaching to the droplet..."
doctl compute volume-action attach $VOLUME_ID $DROPLET_ID
#Create partition and format
echo
echo "Creating a new partition..."
echo
sudo apt-get update
yes | sudo apt-get install parted
sudo parted /dev/disk/by-id/scsi-0DO_Volume_lamassu-data mklabel gpt
sudo parted -a opt /dev/disk/by-id/scsi-0DO_Volume_lamassu-data mkpart primary ext4 0% 100%
echo
echo "Formatting the new volume..."
echo
sleep 4
sudo mkfs.ext4 -L lamassudata /dev/disk/by-id/scsi-0DO_Volume_lamassu-data-part1
#Mounting the new volume
echo
echo "Mounting the new volume..."
echo
sudo mkdir -p /mnt/lamassu-data
sudo mount -o defaults,nofail,discard,noatime /dev/disk/by-id/scsi-0DO_Volume_lamassu-data-part1 /mnt/lamassu-data
#Persistent mounting
echo "/dev/disk/by-id/scsi-0DO_Volume_lamassu-data-part1 /mnt/lamassu-data ext4 defaults,nofail,discard,noatime 0 2" | sudo tee -a /etc/fstab
echo
echo "New block storage volume successfully installed!"
echo "Can be accessed at: /mnt/lamassu-data"
echo

View file

@ -0,0 +1,124 @@
#!/bin/bash
set -e
echo
echo "Initializing data migration to the new block storage volume..."
echo
NEW_VOLUME_MOUNTING_POINT=/mnt/lamassu-data
CERT_DIR=/etc/ssl/certs
KEY_DIR=/etc/ssl/private
CONFIG_DIR=/etc/lamassu
LAMASSU_CA_PATH=$CERT_DIR/Lamassu_CA.pem
CA_KEY_PATH=$KEY_DIR/Lamassu_OP_Root_CA.key
CA_PATH=$CERT_DIR/Lamassu_OP_Root_CA.pem
SERVER_KEY_PATH=$KEY_DIR/Lamassu_OP.key
SERVER_CERT_PATH=$CERT_DIR/Lamassu_OP.pem
MNEMONIC_DIR=$CONFIG_DIR/mnemonics
MNEMONIC_FILE=$MNEMONIC_DIR/mnemonic.txt
BACKUP_DIR=/var/backups/postgresql
BLOCKCHAIN_DIR=/mnt/blockchains
OFAC_DATA_DIR=/var/lamassu/ofac
ID_PHOTO_CARD_DIR=/opt/lamassu-server/idphotocard
FRONTCAMERA_DIR=/opt/lamassu-server/frontcamera
mkdir -p $NEW_VOLUME_MOUNTING_POINT/ssl/certs
mkdir -p $NEW_VOLUME_MOUNTING_POINT/ssl/private
mkdir -p $NEW_VOLUME_MOUNTING_POINT/mnemonics
mkdir -p $NEW_VOLUME_MOUNTING_POINT/backups
mkdir -p $NEW_VOLUME_MOUNTING_POINT/blockchains
mkdir -p $NEW_VOLUME_MOUNTING_POINT/lamassu
mkdir -p $NEW_VOLUME_MOUNTING_POINT/lamassu-server
if [ -f $LAMASSU_CA_PATH ];
then
cp $LAMASSU_CA_PATH $NEW_VOLUME_MOUNTING_POINT/ssl/certs
echo "Successfully migrated $LAMASSU_CA_PATH"
else
echo "Failed to migrate $LAMASSU_CA_PATH, file doesn't exist!"
fi
if [ -f $CA_KEY_PATH ];
then
cp $CA_KEY_PATH $NEW_VOLUME_MOUNTING_POINT/ssl/private
echo "Successfully migrated $CA_KEY_PATH"
else
echo "Failed to migrate $CA_KEY_PATH, file doesn't exist!"
fi
if [ -f $CA_PATH ];
then
cp $CA_PATH $NEW_VOLUME_MOUNTING_POINT/ssl/certs
echo "Successfully migrated $CA_PATH"
else
echo "Failed to migrate $CA_PATH, file doesn't exist!"
fi
if [ -f $SERVER_KEY_PATH ];
then
cp $SERVER_KEY_PATH $NEW_VOLUME_MOUNTING_POINT/ssl/private
echo "Successfully migrated $SERVER_KEY_PATH"
else
echo "Failed to migrate $SERVER_KEY_PATH, file doesn't exist!"
fi
if [ -f $SERVER_CERT_PATH ];
then
cp $SERVER_CERT_PATH $NEW_VOLUME_MOUNTING_POINT/ssl/certs
echo "Successfully migrated $SERVER_CERT_PATH"
else
echo "Failed to migrate $SERVER_CERT_PATH, file doesn't exist!"
fi
if [ -f $MNEMONIC_FILE ];
then
cp $MNEMONIC_FILE $NEW_VOLUME_MOUNTING_POINT/mnemonics
echo "Successfully migrated $MNEMONIC_FILE"
else
echo "Failed to migrate $MNEMONIC_FILE, file doesn't exist!"
fi
if [ -d $BACKUP_DIR ];
then
cp -r $BACKUP_DIR $NEW_VOLUME_MOUNTING_POINT/backups
echo "Successfully migrated $BACKUP_DIR"
else
echo "Failed to migrate $BACKUP_DIR, directory doesn't exist!"
fi
if [ -d $BLOCKCHAIN_DIR ];
then
cp -r $BLOCKCHAIN_DIR $NEW_VOLUME_MOUNTING_POINT/blockchains
echo "Successfully migrated $BLOCKCHAIN_DIR"
else
echo "Failed to migrate $BLOCKCHAIN_DIR, directory doesn't exist!"
fi
if [ -d $OFAC_DATA_DIR ];
then
cp -r $OFAC_DATA_DIR $NEW_VOLUME_MOUNTING_POINT/lamassu
echo "Successfully migrated $OFAC_DATA_DIR"
else
echo "Failed to migrate $OFAC_DATA_DIR, directory doesn't exist!"
fi
if [ -d $ID_PHOTO_CARD_DIR ];
then
cp -r $ID_PHOTO_CARD_DIR $NEW_VOLUME_MOUNTING_POINT/lamassu-server
echo "Successfully migrated $ID_PHOTO_CARD_DIR"
else
echo "Failed to migrate $ID_PHOTO_CARD_DIR, directory doesn't exist!"
fi
if [ -d $FRONTCAMERA_DIR ];
then
cp -r $FRONTCAMERA_DIR $NEW_VOLUME_MOUNTING_POINT/lamassu-server
echo "Successfully migrated $FRONTCAMERA_DIR"
else
echo "Failed to migrate $FRONTCAMERA_DIR, directory doesn't exist!"
fi
echo "Migration completed!"

View file

@ -0,0 +1,2 @@
#!/usr/bin/env node
require('../tests/stress')(process.argv.slice(2))

View file

@ -0,0 +1,35 @@
const fs = require('fs')
const path = require('path')
const _ = require('lodash/fp')
const setEnvVariable = require('./set-env-var')
const ENV_PATH =
process.env.NODE_ENV === 'production'
? path.resolve('/etc', 'lamassu', '.env')
: path.resolve(__dirname, '../.env')
const BACKUP_TIMESTAMP = Date.now()
const BACKUP_PATH = `${ENV_PATH}-${BACKUP_TIMESTAMP}`
const migrateEnv = newVars => {
try {
fs.copyFileSync(ENV_PATH, BACKUP_PATH)
_.forEach(it => {
setEnvVariable(it[0], it[1], { ENV_PATH })
}, newVars)
fs.unlinkSync(BACKUP_PATH)
console.log('Environment migration successful')
} catch (e) {
// Rollback the migration and restore the backup file
if (fs.existsSync(BACKUP_PATH)) {
console.log('Rolling back the environment migration...')
fs.copyFileSync(BACKUP_PATH, ENV_PATH)
fs.unlinkSync(BACKUP_PATH)
console.log('Rollback finished')
}
console.log('Environment migration failed')
throw e
}
}
module.exports = migrateEnv

View file

@ -0,0 +1,30 @@
const fs = require('fs')
const os = require('os')
const path = require('path')
const _ = require('lodash/fp')
const setEnvVariable = (key, value, opts) => {
const ENV_PATH = !_.isNil(opts?.ENV_PATH)
? opts.ENV_PATH
: path.resolve(__dirname, '../.env')
const ENV_VARIABLES = fs.readFileSync(ENV_PATH, 'utf-8').split(os.EOL)
const target = ENV_VARIABLES.indexOf(
ENV_VARIABLES.find(line => line.match(new RegExp(`^${key}=`))),
)
if (target < 0) {
// The variable doesn't exist, add it
ENV_VARIABLES.push(`${key}=${value}`)
} else {
// .env already has that variable set, or at least has the definition of its key
//
// This is currently circumventing a possible bug on dotenv
// where the variables on this script were showing up as undefined on the first run despite the key existing,
// while on a second run they'd appear as empty string, as intended
ENV_VARIABLES.splice(target, 1, `${key}=${value}`)
}
fs.writeFileSync(ENV_PATH, ENV_VARIABLES.join(os.EOL))
}
module.exports = setEnvVariable