From 3dd8533bb30aaa9c9d5a3efc01a9094e43d5670a Mon Sep 17 00:00:00 2001 From: Oleksii Serdiukov Date: Tue, 21 Jul 2020 19:34:27 +0300 Subject: [PATCH 1/7] catch the exception correctly (only async exception were catched, non async haven't yet) --- src/server/blockchain/AdminWallet.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/server/blockchain/AdminWallet.js b/src/server/blockchain/AdminWallet.js index 6eb64187..567ec09c 100644 --- a/src/server/blockchain/AdminWallet.js +++ b/src/server/blockchain/AdminWallet.js @@ -368,15 +368,23 @@ export class Wallet { */ async whitelistUser(address: string, did: string): Promise { const isVerified = await this.isVerified(address) + let tx + if (isVerified) { return { status: true } } - const tx: TransactionReceipt = await this.sendTransaction(this.proxyContract.methods.whitelist(address, did)).catch( - e => { - log.error('Error whitelistUser', e.message, e, { address, did }) - throw e - } - ) + + try { + const transaction = this.proxyContract.methods.whitelist(address, did) + + tx = await this.sendTransaction(transaction) + } catch (exception) { + const { message } = exception + + log.error('Error whitelistUser', message, exception, { address, did }) + throw exception + } + log.info('Whitelisted user', { address, did, tx }) return tx } From 9f8c4c76882e6a1ab3f2d9c74715b99ac7fd1a5c Mon Sep 17 00:00:00 2001 From: Oleksii Serdiukov Date: Tue, 21 Jul 2020 19:40:20 +0300 Subject: [PATCH 2/7] fix return romise without await in try block --- src/server/blockchain/AdminWallet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/blockchain/AdminWallet.js b/src/server/blockchain/AdminWallet.js index 567ec09c..62f39680 100644 --- a/src/server/blockchain/AdminWallet.js +++ b/src/server/blockchain/AdminWallet.js @@ -530,7 +530,7 @@ export class Wallet { .catch(e => log.error('Failed to estimate gas for tx', e.message, e))) || defaultGas - //adminwallet contract might give wrong gas estimates, so if its more than block gas limit reduce it to default + // adminwallet contract might give wrong gas estimates, so if its more than block gas limit reduce it to default if (gas > 8000000) gas = defaultGas gasPrice = gasPrice || defaultGasPrice @@ -545,7 +545,7 @@ export class Wallet { } currentAddress = address log.debug(`sending tx from: ${address} | nonce: ${nonce}`, { uuid, balance, gas, gasPrice }) - return new Promise((res, rej) => { + return await new Promise((res, rej) => { tx.send({ gas, gasPrice, chainId: this.networkId, nonce, from: address }) .on('transactionHash', h => { release() From 495bad0cbb969791add405f08ce770ac06b4b4ff Mon Sep 17 00:00:00 2001 From: Oleksii Serdiukov Date: Tue, 21 Jul 2020 20:00:07 +0300 Subject: [PATCH 3/7] jwtPayload should take precedence in passport strategy --- src/server/login/login-middleware.js | 38 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/server/login/login-middleware.js b/src/server/login/login-middleware.js index 33f5ff61..e00414b7 100644 --- a/src/server/login/login-middleware.js +++ b/src/server/login/login-middleware.js @@ -12,26 +12,26 @@ import Config from '../server.config.js' import { recoverPublickey } from '../utils/eth' import requestRateLimiter from '../utils/requestRateLimiter' -// const ExtractJwt = passportJWT.ExtractJwt -// const JwtStrategy = passportJWT.Strategy - -const jwtOptions = {} -jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken() -jwtOptions.secretOrKey = Config.jwtPassword -// jwtOptions.issuer = 'accounts.examplesoft.com'; -// jwtOptions.audience = 'yoursite.net'; +const log = logger.child({ from: 'login-middleware' }) + +const jwtOptions = { + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + secretOrKey: Config.jwtPassword +} + export const strategy = new Strategy(jwtOptions, async (jwtPayload, next) => { - const log = logger.child({ from: 'login-middleware' }) - // usually this would be a database call: - let user = await UserDBPrivate.getUser(jwtPayload.loggedInAs) - log.debug('payload received', { jwtPayload, user }) - //if user is empty make sure we have something - user = defaults(user, jwtPayload, { identifier: jwtPayload.loggedInAs }) - if (get(jwtPayload, 'loggedInAs')) { - next(null, user) - } else { - next(null, false) + const { loggedInAs: identifier } = jwtPayload + let user = false + + if (identifier) { + user = await UserDBPrivate.getUser(identifier) // usually this would be a database call + + log.debug('payload received', { jwtPayload, user }) + // if user is empty make sure we have something + user = defaults(jwtPayload, user, { identifier }) } + + next(null, user) }) const setup = (app: Router) => { @@ -158,7 +158,7 @@ const setup = (app: Router) => { }) ) - logger.child({ from: 'login-middleware' }).info('Done setup login middleware.') + log.info('Done setup login middleware.') } export default setup From 9c312a8c1cdc519e27ecd1d670b40e0b031dc4b0 Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyshyn Date: Wed, 22 Jul 2020 16:38:32 +0300 Subject: [PATCH 4/7] fix: fix FV test --- src/server/verification/__tests__/verificationAPI.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/verification/__tests__/verificationAPI.js b/src/server/verification/__tests__/verificationAPI.js index a68dc14a..b389306a 100644 --- a/src/server/verification/__tests__/verificationAPI.js +++ b/src/server/verification/__tests__/verificationAPI.js @@ -261,7 +261,9 @@ describe('verificationAPI', () => { error: helper.duplicateFoundMessage, enrollmentResult: { isVerified: false, - isDuplicate: true + isDuplicate: true, + code: 200, + message: 'The search request was processed successfully.' } }) From 376468cf9ef5924c18ee15882bea754283e302d3 Mon Sep 17 00:00:00 2001 From: Oleksii Serdiukov Date: Wed, 22 Jul 2020 16:56:42 +0300 Subject: [PATCH 5/7] in /user/add verify that this also save to the user record the correct public profile key --- src/server/db/mongo/models/user-private.js | 3 +++ src/server/storage/storageAPI.js | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/db/mongo/models/user-private.js b/src/server/db/mongo/models/user-private.js index f3a750b3..38860e57 100644 --- a/src/server/db/mongo/models/user-private.js +++ b/src/server/db/mongo/models/user-private.js @@ -63,6 +63,9 @@ export const UserPrivateSchema = new mongoose.Schema({ mnemonic: { type: String }, + profilePublickey: { + type: String + }, hanukaBonus: { type: mongoose.Schema.Types.Mixed, default: {} diff --git a/src/server/storage/storageAPI.js b/src/server/storage/storageAPI.js index 3f307158..67d76f70 100644 --- a/src/server/storage/storageAPI.js +++ b/src/server/storage/storageAPI.js @@ -74,6 +74,7 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => { torusProvider: userPayload.torusProvider, email: sha3(email), mobile: sha3(mobile), + profilePublickey: userRecord.profilePublickey, isCompleted: userRecord.isCompleted ? userRecord.isCompleted : { @@ -84,7 +85,7 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => { } }) - const userRecordWithPII = { ...userRecord, ...payloadWithoutCreds, inviteCode, email, mobile } + const userRecordWithPII = { ...payloadWithoutCreds, ...userRecord, inviteCode, email, mobile } const signUpPromises = [] const p1 = storage From ff5f22d2cb031e49fe4d27661ff26d5a044620de Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyshyn Date: Wed, 22 Jul 2020 17:01:05 +0300 Subject: [PATCH 6/7] fix: check and fix log.error format across the project --- src/server/blockchain/AdminWallet.js | 6 +++--- src/server/blockchain/stakingModelTasks.js | 8 ++++---- src/server/db/mongo/user-privat-provider.js | 3 +-- src/server/verification/processor/EnrollmentSession.js | 2 +- src/server/verification/verificationAPI.js | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/server/blockchain/AdminWallet.js b/src/server/blockchain/AdminWallet.js index 7e8f69ed..7eeccb36 100644 --- a/src/server/blockchain/AdminWallet.js +++ b/src/server/blockchain/AdminWallet.js @@ -170,7 +170,7 @@ export class Wallet { const adminWalletContractBalance = await this.web3.eth.getBalance(adminWalletAddress) log.info(`AdminWallet contract balance`, { adminWalletContractBalance, adminWalletAddress }) if (adminWalletContractBalance < adminMinBalance * this.addresses.length) { - log.error('AdminWallet contract low funds', {}) + log.error('AdminWallet contract low funds') if (conf.env !== 'test' && conf.env !== 'development') process.exit(-1) } @@ -683,7 +683,7 @@ export class Wallet { (await tx .estimateGas() .then(gas => gas + 200000) //buffer for proxy contract, reimburseGas?, and low gas unexpected failures - .catch(e => log.error('Failed to estimate gas for tx', { errMessage: e.message, e }))) || + .catch(e => log.error('Failed to estimate gas for tx', e.message, e))) || defaultGas //adminwallet contract might give wrong gas estimates, so if its more than block gas limit reduce it to default @@ -715,7 +715,7 @@ export class Wallet { }) .on('confirmation', c => onConfirmation && onConfirmation(c)) .on('error', async e => { - log.error('sendTransaction error:', { error: e.message, e, from: address, uuid }) + log.error('sendTransaction error:', e.message, e, { from: address, uuid }) if (isNonceError(e)) { let netNonce = parseInt(await this.mainnetWeb3.eth.getTransactionCount(address)) log.warn('sendTransaciton nonce failure retry', { diff --git a/src/server/blockchain/stakingModelTasks.js b/src/server/blockchain/stakingModelTasks.js index 174da349..d7b457f0 100644 --- a/src/server/blockchain/stakingModelTasks.js +++ b/src/server/blockchain/stakingModelTasks.js @@ -71,7 +71,7 @@ export class StakingModelManager { //top ropsten wallet if (moment().diff(this.lastRopstenTopping, 'days') > 0) { fetch('https://faucet.metamask.io', { method: 'POST', body: AdminWallet.mainnetAddresses[0] }).catch(e => { - this.log.error('failed calling ropsten faucet', e) + this.log.error('failed calling ropsten faucet', e.message, e) }) this.lastRopstenTopping = moment() } @@ -156,7 +156,7 @@ export class StakingModelManager { const cronTime = await this.getNextCollectionTime() //make sure atleast one hour passes in case of an error if (cronTime.isBefore(moment().add(1, 'hour'))) cronTime.add(1, 'hour') - this.log.error('collecting interest failed.', { e, errMsg: e.message, cronTime }) + this.log.error('collecting interest failed.', e.message, e, { cronTime }) return { result: false, cronTime } } } @@ -321,7 +321,7 @@ class FishingManager { unfished = unfished.concat(tofish.slice(totalFished)) fishers.push(fisherAccount) } catch (e) { - this.log.error('Failed fishing chunk', { tofish, error: e.message, e }) + this.log.error('Failed fishing chunk', e.message, e, { tofish }) } } if (unfished.length > 0) { @@ -338,7 +338,7 @@ class FishingManager { const cronTime = await this.getNextDay() return { result: true, cronTime, fishers } } catch (e) { - this.log.error('fishing task failed:', { e, errMsg: e.message }) + this.log.error('fishing task failed:', e.message, e) const cronTime = await this.getNextDay() if (cronTime.isBefore(moment().add(1, 'hour'))) cronTime.add(1, 'hour') return { result: true, cronTime } diff --git a/src/server/db/mongo/user-privat-provider.js b/src/server/db/mongo/user-privat-provider.js index 04d3369e..42a2447a 100644 --- a/src/server/db/mongo/user-privat-provider.js +++ b/src/server/db/mongo/user-privat-provider.js @@ -312,9 +312,8 @@ class UserPrivate { ) } catch (exception) { const { message: errMessage } = exception - const logPayload = { e: exception, errMessage, tasksIdentifiers } - logger.error("Couldn't unlock and update delayed tasks", logPayload) + logger.error("Couldn't unlock and update delayed tasks", errMessage, exception, { tasksIdentifiers }) throw exception } } diff --git a/src/server/verification/processor/EnrollmentSession.js b/src/server/verification/processor/EnrollmentSession.js index 84c31818..5ae62fea 100644 --- a/src/server/verification/processor/EnrollmentSession.js +++ b/src/server/verification/processor/EnrollmentSession.js @@ -55,7 +55,7 @@ export default class EnrollmentSession { result.enrollmentResult = response } - log.error('Enrollment session failed with exception:', { result, exception }) + log.error('Enrollment session failed with exception:', message, exception, { result }) this.onEnrollmentFailed(exception) } finally { diff --git a/src/server/verification/verificationAPI.js b/src/server/verification/verificationAPI.js index 045508ec..2f9fc200 100644 --- a/src/server/verification/verificationAPI.js +++ b/src/server/verification/verificationAPI.js @@ -101,7 +101,7 @@ const setup = (app: Router, verifier: VerificationAPI, gunPublic: StorageAPI, st res.json({ success: true, sessionToken }) } catch (exception) { const { message } = exception - log.error('generating enrollment session token failed:', { message, exception, user }) + log.error('generating enrollment session token failed:', message, exception, { user }) res.status(400).json({ success: false, error: message }) } }) From 7788208e81cbe947250a1e5d47c4634b19b5bca9 Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyshyn Date: Wed, 22 Jul 2020 17:02:59 +0300 Subject: [PATCH 7/7] fix: add default value for context[SPLAT] --- src/imports/logger/ErrorsTransport.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/imports/logger/ErrorsTransport.js b/src/imports/logger/ErrorsTransport.js index 5b39b6f6..bc9e9141 100644 --- a/src/imports/logger/ErrorsTransport.js +++ b/src/imports/logger/ErrorsTransport.js @@ -35,7 +35,10 @@ export default class ErrorsTransport extends Transport { log(context) { const { message: generalMessage, userId, ...data } = context - const [errorMessage, errorObj, extra = {}] = context[SPLAT] + + // context[SPLAT] could be undefined in case if just one argument passed to the error log + // i.e log.error('some error message') + const [errorMessage, errorObj, extra = {}] = context[SPLAT] || [] const dataToPassIntoLog = { generalMessage, errorMessage, errorObj, ...extra, ...data } let errorToPassIntoLog = errorObj