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/emailer.ts | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 server/lib/emailer.ts (limited to 'server/lib/emailer.ts') diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts new file mode 100644 index 000000000..f5b68640e --- /dev/null +++ b/server/lib/emailer.ts @@ -0,0 +1,106 @@ +import { createTransport, Transporter } from 'nodemailer' +import { isTestInstance } from '../helpers/core-utils' +import { logger } from '../helpers/logger' +import { CONFIG } from '../initializers' +import { JobQueue } from './job-queue' +import { EmailPayload } from './job-queue/handlers/email' +import { readFileSync } from 'fs' + +class Emailer { + + private static instance: Emailer + private initialized = false + private transporter: Transporter + + private constructor () {} + + init () { + // Already initialized + if (this.initialized === true) return + this.initialized = true + + if (CONFIG.SMTP.HOSTNAME && CONFIG.SMTP.PORT) { + logger.info('Using %s:%s as SMTP server.', CONFIG.SMTP.HOSTNAME, CONFIG.SMTP.PORT) + + let tls + if (CONFIG.SMTP.CA_FILE) { + tls = { + ca: [ readFileSync(CONFIG.SMTP.CA_FILE) ] + } + } + + this.transporter = createTransport({ + host: CONFIG.SMTP.HOSTNAME, + port: CONFIG.SMTP.PORT, + secure: CONFIG.SMTP.TLS, + tls, + auth: { + user: CONFIG.SMTP.USERNAME, + pass: CONFIG.SMTP.PASSWORD + } + }) + } else { + if (!isTestInstance()) { + logger.error('Cannot use SMTP server because of lack of configuration. PeerTube will not be able to send mails!') + } + } + } + + async checkConnectionOrDie () { + if (!this.transporter) return + + try { + const success = await this.transporter.verify() + if (success !== true) this.dieOnConnectionFailure() + + logger.info('Successfully connected to SMTP server.') + } catch (err) { + this.dieOnConnectionFailure(err) + } + } + + addForgetPasswordEmailJob (to: string, resetPasswordUrl: string) { + const text = `Hi dear user,\n\n` + + `It seems you forgot your password on ${CONFIG.WEBSERVER.HOST}! ` + + `Please follow this link to reset it: ${resetPasswordUrl}.\n\n` + + `If you are not the person who initiated this request, please ignore this email.\n\n` + + `Cheers,\n` + + `PeerTube.` + + const emailPayload: EmailPayload = { + to: [ to ], + subject: 'Reset your PeerTube password', + text + } + + return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) + } + + sendMail (to: string[], subject: string, text: string) { + if (!this.transporter) { + throw new Error('Cannot send mail because SMTP is not configured.') + } + + return this.transporter.sendMail({ + from: CONFIG.SMTP.FROM_ADDRESS, + to: to.join(','), + subject, + text + }) + } + + private dieOnConnectionFailure (err?: Error) { + logger.error('Failed to connect to SMTP %s:%d.', CONFIG.SMTP.HOSTNAME, CONFIG.SMTP.PORT, err) + process.exit(-1) + } + + static get Instance () { + return this.instance || (this.instance = new this()) + } +} + +// --------------------------------------------------------------------------- + +export { + Emailer +} -- cgit v1.2.3