X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fredis.ts;h=b7523492a5895ba50ce3c487e7d1cd0f9161d8fc;hb=37ff5005b47b9df2933a0b8812609a6c41faa170;hp=158f3c08090e7106c165847cdac9c49ae14e4cfb;hpb=2b621ac0ebe83693bba6354b3482a03ba58143e7;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/redis.ts b/server/lib/redis.ts index 158f3c080..b7523492a 100644 --- a/server/lib/redis.ts +++ b/server/lib/redis.ts @@ -1,4 +1,4 @@ -import { createClient, RedisClientOptions, RedisModules, RedisScripts } from 'redis' +import { createClient, RedisClientOptions, RedisModules } from 'redis' import { exists } from '@server/helpers/custom-validators/misc' import { sha256 } from '@shared/extra-utils' import { logger } from '../helpers/logger' @@ -9,6 +9,7 @@ import { CONTACT_FORM_LIFETIME, RESUMABLE_UPLOAD_SESSION_LIFETIME, TRACKER_RATE_LIMITS, + TWO_FACTOR_AUTH_REQUEST_TOKEN_LIFETIME, USER_EMAIL_VERIFY_LIFETIME, USER_PASSWORD_CREATE_LIFETIME, USER_PASSWORD_RESET_LIFETIME, @@ -16,16 +17,12 @@ import { WEBSERVER } from '../initializers/constants' -// Only used for typings -// TODO: remove when https://github.com/microsoft/TypeScript/issues/37181 is fixed -const redisClientWrapperForType = () => createClient<{}, RedisScripts>() - class Redis { private static instance: Redis private initialized = false private connected = false - private client: ReturnType + private client: ReturnType private prefix: string private constructor () { @@ -37,6 +34,7 @@ class Redis { this.initialized = true this.client = createClient(Redis.getRedisClientOptions()) + this.client.on('error', err => logger.error('Redis Client Error', { err })) logger.info('Connecting to redis...') @@ -111,10 +109,24 @@ class Redis { return this.removeValue(this.generateResetPasswordKey(userId)) } - async getResetPasswordLink (userId: number) { + async getResetPasswordVerificationString (userId: number) { return this.getValue(this.generateResetPasswordKey(userId)) } + /* ************ Two factor auth request ************ */ + + async setTwoFactorRequest (userId: number, otpSecret: string) { + const requestToken = await generateRandomString(32) + + await this.setValue(this.generateTwoFactorRequestKey(userId, requestToken), otpSecret, TWO_FACTOR_AUTH_REQUEST_TOKEN_LIFETIME) + + return requestToken + } + + async getTwoFactorRequestToken (userId: number, requestToken: string) { + return this.getValue(this.generateTwoFactorRequestKey(userId, requestToken)) + } + /* ************ Email verification ************ */ async setVerifyEmailVerificationString (userId: number) { @@ -345,6 +357,10 @@ class Redis { return 'reset-password-' + userId } + private generateTwoFactorRequestKey (userId: number, token: string) { + return 'two-factor-request-' + userId + '-' + token + } + private generateVerifyEmailKey (userId: number) { return 'verify-email-' + userId } @@ -394,8 +410,8 @@ class Redis { return JSON.parse(value) } - private setObject (key: string, value: { [ id: string ]: number | string }) { - return this.setValue(key, JSON.stringify(value)) + private setObject (key: string, value: { [ id: string ]: number | string }, expirationMilliseconds?: number) { + return this.setValue(key, JSON.stringify(value), expirationMilliseconds) } private async setValue (key: string, value: string, expirationMilliseconds?: number) {