import { scryptSync } from 'crypto' import { validateAuthKeys } from '../../helpers' import { compareHashes, decryptHash, errorMessage, } from './helpers' import { AuthValidateResponse, Body } from './types' export async function ServerUtils_AuthValidate({ authKeys, apiKey, auth, }: Body) { const response: AuthValidateResponse = { access: true, } try { validateAuthKeys(authKeys) const currentSecret = authKeys.current! const currentKey: Buffer = scryptSync(currentSecret, apiKey, 32) const currentDecrypt = decryptHash({ key: currentKey, apiKey, auth, secret: currentSecret, }) if (currentDecrypt.success) { if (compareHashes(currentDecrypt.wappiAuthKey, currentKey)) { response.auth = currentDecrypt } else { errorMessage(response) } } else { const previousSecret = authKeys.previous! const previousKey: Buffer = scryptSync(previousSecret, apiKey, 32) const previousDecrypt = decryptHash({ key: previousKey, apiKey, auth, secret: previousSecret, }) if (previousDecrypt.success) { if (compareHashes(currentDecrypt.wappiAuthKey, currentKey)) { response.auth = previousDecrypt } else { errorMessage(response) } } else { errorMessage(response) } } // Remove the built in wappi variables const { // eslint-disable-next-line @typescript-eslint/no-unused-vars wappiAuthKey, success, ...responseObject } = response.auth return { access: response.access, ...responseObject, } } catch (err) { return new Promise((resolve) => { response.error = 'Fatal error in ServerUtils_AuthValidate. Investigate.' response.errorMessage = err.message response.success = false response.access = false // eslint-disable-next-line no-promise-executor-return return resolve(response) }) } }