From ecb4e35f4e6c7304cb274593c13cb47fd5078b75 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 30 Jan 2018 13:27:07 +0100 Subject: Add ability to reset our password --- server/lib/redis.ts | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 server/lib/redis.ts (limited to 'server/lib/redis.ts') diff --git a/server/lib/redis.ts b/server/lib/redis.ts new file mode 100644 index 000000000..4240cc162 --- /dev/null +++ b/server/lib/redis.ts @@ -0,0 +1,84 @@ +import { createClient, RedisClient } from 'redis' +import { logger } from '../helpers/logger' +import { generateRandomString } from '../helpers/utils' +import { CONFIG, USER_PASSWORD_RESET_LIFETIME } from '../initializers' + +class Redis { + + private static instance: Redis + private initialized = false + private client: RedisClient + private prefix: string + + private constructor () {} + + init () { + // Already initialized + if (this.initialized === true) return + this.initialized = true + + this.client = createClient({ + host: CONFIG.REDIS.HOSTNAME, + port: CONFIG.REDIS.PORT + }) + + this.client.on('error', err => { + logger.error('Error in Redis client.', err) + process.exit(-1) + }) + + if (CONFIG.REDIS.AUTH) { + this.client.auth(CONFIG.REDIS.AUTH) + } + + this.prefix = 'redis-' + CONFIG.WEBSERVER.HOST + '-' + } + + async setResetPasswordVerificationString (userId: number) { + const generatedString = await generateRandomString(32) + + await this.setValue(this.generateResetPasswordKey(userId), generatedString, USER_PASSWORD_RESET_LIFETIME) + + return generatedString + } + + async getResetPasswordLink (userId: number) { + return this.getValue(this.generateResetPasswordKey(userId)) + } + + private getValue (key: string) { + return new Promise((res, rej) => { + this.client.get(this.prefix + key, (err, value) => { + if (err) return rej(err) + + return res(value) + }) + }) + } + + private setValue (key: string, value: string, expirationMilliseconds: number) { + return new Promise((res, rej) => { + this.client.set(this.prefix + key, value, 'PX', expirationMilliseconds, (err, ok) => { + if (err) return rej(err) + + if (ok !== 'OK') return rej(new Error('Redis result is not OK.')) + + return res() + }) + }) + } + + private generateResetPasswordKey (userId: number) { + return 'reset-password-' + userId + } + + static get Instance () { + return this.instance || (this.instance = new this()) + } +} + +// --------------------------------------------------------------------------- + +export { + Redis +} -- cgit v1.2.3