Skip to content

Commit

Permalink
Auto whitelist users created during Cypress tests runs
Browse files Browse the repository at this point in the history
  • Loading branch information
serdiukov-o-nordwhale committed Jun 30, 2020
1 parent c60dd3f commit 66f3a13
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 64 deletions.
12 changes: 4 additions & 8 deletions src/server/mautic/mauticAPI.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
// @flow
import fetch from 'cross-fetch'
import logger from '../../imports/logger'
import { get } from 'lodash'

import logger from '../../imports/logger'
import { UserRecord } from '../../imports/types'
import Config from '../server.config'
import get from 'lodash/get'
import requestTimeout from '../utils/timeout'

const log = logger.child({ from: 'Mautic' })
const Timeout = (timeout: msec) => {
return new Promise((res, rej) => {
setTimeout(rej, timeout, new Error('Request Timeout'))
})
}

export const Mautic = {
baseUrl: Config.mauticURL,
Expand All @@ -23,7 +19,7 @@ export const Mautic = {
baseQuery(url, headers, body, method = 'post', timeout = 15000) {
const fullUrl = `${this.baseUrl}${url}`

return Promise.race([Timeout(timeout), fetch(fullUrl, { method, body: JSON.stringify(body), headers })])
return Promise.race([requestTimeout(timeout), fetch(fullUrl, { method, body: JSON.stringify(body), headers })])
.then(async res => {
log.debug(res)
if (res.status >= 300) throw new Error(await res.text())
Expand Down
8 changes: 2 additions & 6 deletions src/server/server-prod.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@ import path from 'path'
import express from 'express'
import conf from './server.config'
import { GunDBPublic } from './gun/gun-middleware'
import requestTimeout from './utils/timeout'
import app from './app'

const Timeout = (timeout, err) => {
return new Promise((res, rej) => {
setTimeout(rej, timeout, new Error('Request Timeout:' + err))
})
}
export default function start(workerId) {
console.log(`start workerId = ${workerId}`)

Expand Down Expand Up @@ -39,7 +35,7 @@ export default function start(workerId) {
})

Promise.race([
Timeout(30000, 'gun not initialized'),
requestTimeout(30000, 'gun not initialized'),
GunDBPublic.init(server, conf.gundbPassword, `publicdb${workerId}`, conf.gunPublicS3)
]).catch(e => {
console.log('gun failed... quiting', e)
Expand Down
18 changes: 5 additions & 13 deletions src/server/storage/__tests__/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { UserRecord } from '../../../imports/types'
import UserDBPrivate from '../../db/mongo/user-privat-provider'
import { getCreds } from '../../__util__'
import addUserSteps from '../addUserSteps'
import config from '../../server.config'

jest.setTimeout(30000)

describe('storageAPI', () => {
Expand Down Expand Up @@ -47,23 +47,15 @@ describe('storageAPI', () => {
expect(mauticId).toBeTruthy()
})

test('should not addUserToWhiteList when faceverification enabled', async () => {
config.disableFaceVerification = false
test('should addUserToWhiteList', async () => {
let userIsCompleted
const creds = await getCreds(true)
let userRecord = { ...creds, ...user, gdAddress: creds.address }
userRecord.profilePublickey = String(Math.random())
await addUserSteps.addUserToWhiteList(userRecord, console)
const userIsCompleted = await UserDBPrivate.getUserField(user.identifier, 'isCompleted')
expect(userIsCompleted.whiteList).toBeFalsy()
})

test('should addUserToWhiteList when faceverification disabled', async () => {
config.disableFaceVerification = true
const creds = await getCreds(true)
let userRecord = { ...creds, ...user, gdAddress: creds.address }
userRecord.profilePublickey = String(Math.random())
await addUserSteps.addUserToWhiteList(userRecord, console)
const userIsCompleted = await UserDBPrivate.getUserField(user.identifier, 'isCompleted')
userIsCompleted = await UserDBPrivate.getUserField(user.identifier, 'isCompleted')

expect(userIsCompleted.whiteList).toBeTruthy()
})

Expand Down
55 changes: 30 additions & 25 deletions src/server/storage/addUserSteps.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,39 @@ import { Mautic } from '../mautic/mauticAPI'
import get from 'lodash/get'
import W3Helper from '../utils/W3Helper'
import { generateMarketToken } from '../utils/market'

const Timeout = (timeout: msec, msg: string) => {
return new Promise((res, rej) => {
setTimeout(rej, timeout, new Error(`Request Timeout: ${msg}`))
})
}
import requestTimeout from '../utils/timeout'

const addUserToWhiteList = async (userRecord: UserRecord, logger: any) => {
let user = await UserDBPrivate.getUser(userRecord.identifier)
const user = await UserDBPrivate.getUser(userRecord.identifier)
const whiteList = get(user, 'isCompleted.whiteList', false)
if (conf.disableFaceVerification && !whiteList) {
logger.debug('addUserToWhiteList whitelisting user...', {
address: userRecord.gdAddress,
profile: userRecord.profilePublickey
})
return AdminWallet.whitelistUser(userRecord.gdAddress, userRecord.profilePublickey)
.then(async r => {
await UserDBPrivate.completeStep(userRecord.identifier, 'whiteList')
logger.debug('addUserToWhiteList user whitelisted success', { address: userRecord.gdAddress })
return true
})
.catch(e => {
logger.error('addUserToWhiteList failed whitelisting', { e, errMessage: e.message, userRecord })
return false
})

if (whiteList) {
logger.debug('addUserToWhiteList user already whitelisted', { address: userRecord.gdAddress })
return true
}

// removed disableFaceVerification check as
// a) it's already performed in storageAPI
// b) this method is used in storageAPI only
// c) it simplyfies checking are we running on cypress or not (no need to pass E2E flag)

logger.debug('addUserToWhiteList whitelisting user...', {
address: userRecord.gdAddress,
profile: userRecord.profilePublickey
})

try {
await AdminWallet.whitelistUser(userRecord.gdAddress, userRecord.profilePublickey)
await UserDBPrivate.completeStep(userRecord.identifier, 'whiteList')

logger.debug('addUserToWhiteList user whitelisted success', { address: userRecord.gdAddress })
return true
} catch (exception) {
const { message: errMessage } = exception

logger.error('addUserToWhiteList failed whitelisting', { e: exception, errMessage, userRecord })
return false
}
whiteList && logger.debug('addUserToWhiteList user already whitelisted', { address: userRecord.gdAddress })
return true
}

const updateMauticRecord = async (userRecord: UserRecord, logger: any) => {
Expand Down Expand Up @@ -105,7 +110,7 @@ const topUserWallet = async (userRecord: UserRecord, logger: any) => {
let user = await UserDBPrivate.getUser(userRecord.identifier)
const topWallet = get(user, 'isCompleted.topWallet', false)
if (!topWallet) {
return Promise.race([AdminWallet.topWallet(userRecord.gdAddress, null), Timeout(15000, 'topWallet')])
return Promise.race([AdminWallet.topWallet(userRecord.gdAddress, null), requestTimeout(15000, 'topWallet')])
.then(r => {
UserDBPrivate.completeStep(userRecord.identifier, 'topWallet')
logger.debug('topUserWallet success', { address: userRecord.gdAddress })
Expand Down
17 changes: 11 additions & 6 deletions src/server/storage/storageAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {
'/user/add',
passport.authenticate('jwt', { session: false }),
wrapAsync(async (req, res) => {
const { body, user: userRecord } = req
const { env, skipEmailVerification, disableFaceVerification } = conf
const { body, user: userRecord, isE2ERunning } = req
const { user: userPayload = {} } = body
const logger = req.log

Expand All @@ -42,13 +43,13 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {

// check that user email/mobile sent is the same as the ones verified
//in case email/mobile was verified using torus userRecord.mobile/email will be empty
if (['production', 'staging'].includes(conf.env)) {
if (['production', 'staging'].includes(env)) {
if (userRecord.smsValidated !== true || (userRecord.mobile && userRecord.mobile !== sha3(mobile))) {
throw new Error('User mobile not verified!')
}

if (
conf.skipEmailVerification === false &&
skipEmailVerification === false &&
(userRecord.isEmailConfirmed !== true || (userRecord.email && userRecord.email !== sha3(email)))
) {
throw new Error('User email not verified!')
Expand Down Expand Up @@ -80,6 +81,7 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {

const userRecordWithPII = { ...userRecord, email, mobile }
const signUpPromises = []

const p1 = storage
.updateUser(toUpdateUser)
.then(r => logger.debug('updated new user record', { toUpdateUser }))
Expand All @@ -88,7 +90,9 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {
throw e
})
signUpPromises.push(p1)
if (conf.disableFaceVerification) {

// whitelisting user if FR is disabled or we're running cypress tests
if (disableFaceVerification || isE2ERunning) {
const p2 = addUserSteps
.addUserToWhiteList(userRecord, logger)
.then(isWhitelisted => {
Expand Down Expand Up @@ -147,7 +151,6 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {
logger.error('topUserWallet failed', { e, errMessage: e.message, userRecord })
throw e
})

signUpPromises.push(p4)

const p5 = Promise.all([
Expand All @@ -160,8 +163,8 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {
userRecordWithPII.gdAddress &&
gunPublic.addUserToIndex('walletAddress', userRecordWithPII.gdAddress, userRecordWithPII)
])

signUpPromises.push(p5)

await Promise.all(signUpPromises)
logger.debug('signup steps success. adding new user:', { toUpdateUser })

Expand All @@ -170,8 +173,10 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {
createdDate: new Date().toString(),
otp: {} //delete trace of mobile,email
})

const web3Record = await web3RecordP
const marketToken = await marketTokenP

res.json({
ok: 1,
loginToken: web3Record && web3Record.loginToken,
Expand Down
8 changes: 2 additions & 6 deletions src/server/utils/W3Helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,9 @@ import fetch from 'cross-fetch'
import md5 from 'md5'
import conf from '../server.config'
import logger from '../../imports/logger'
import requestTimeout from '../utils/timeout'

const log = logger.child({ from: 'W3Helper' })
const Timeout = timeout => {
return new Promise((res, rej) => {
setTimeout(rej, timeout, new Error('Request Timeout'))
})
}

export default {
baseUrl: `${conf.web3SiteUrl}/api/wl/user`,
Expand All @@ -22,7 +18,7 @@ export default {

log.debug('req options', { url, headers, body, method, options, timeout })

return Promise.race([Timeout(timeout), fetch(fullUrl, { method, body: stringBody, headers })])
return Promise.race([requestTimeout(timeout), fetch(fullUrl, { method, body: stringBody, headers })])
.then(async res => {
log.debug('request response', { res })

Expand Down
21 changes: 21 additions & 0 deletions src/server/utils/timeout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { promisify } from 'util'

const promisifiedTimeout = promisify(setTimeout)

export const timeout = async (millis, errorMessage = null) => {
await promisifiedTimeout(millis)

if (errorMessage) {
throw new Error(errorMessage)
}
}

export default async function requestTimeout(millis, timeoutReason = null) {
let errorMessage = 'Request timeout'

if (timeoutReason) {
errorMessage += `: ${timeoutReason}`
}

await timeout(millis, errorMessage)
}

0 comments on commit 66f3a13

Please sign in to comment.