From b63f22fd3177a08002b28cafdee21563017ee57b Mon Sep 17 00:00:00 2001 From: lesion Date: Mon, 18 Oct 2021 15:46:38 +0200 Subject: [PATCH] ok lot of smtp minors --- server/api/controller/settings.js | 16 +++++++++++- server/api/controller/setup.js | 15 +++-------- server/api/index.js | 1 + server/api/mail.js | 10 ++++---- server/api/models/index.js | 41 ++++++++++++++++++++++++++----- server/cli.js | 16 ++++++------ server/config.js | 4 +-- server/helpers.js | 8 ++++++ 8 files changed, 76 insertions(+), 35 deletions(-) diff --git a/server/api/controller/settings.js b/server/api/controller/settings.js index f916db0c..458fd59d 100644 --- a/server/api/controller/settings.js +++ b/server/api/controller/settings.js @@ -39,7 +39,8 @@ const defaultSettings = { { href: '/', label: 'home' }, { href: '/about', label: 'about' } ], - admin_email: config.admin_email || '' + admin_email: config.admin_email || '', + smtp: config.smtp || false } /** @@ -127,6 +128,19 @@ const settingsController = { if (ret) { res.sendStatus(200) } else { res.sendStatus(400) } }, + async testSMTP (req, res) { + const smtp = req.body + await settingsController.set('smtp', smtp.smtp) + const mail = require('../mail') + try { + await mail._send(settingsController.settings.admin_email, 'test') + return res.sendStatus(200) + } catch (e) { + console.error(e) + return res.status(400).send(String(e)) + } + }, + setLogo (req, res) { if (!req.file) { settingsController.set('logo', false) diff --git a/server/api/controller/setup.js b/server/api/controller/setup.js index 52656ba3..71a20749 100644 --- a/server/api/controller/setup.js +++ b/server/api/controller/setup.js @@ -1,18 +1,9 @@ const URL = require('url') +const helpers = require('../../helpers.js') const log = require('../../log') const db = require('../models/index.js') const config = require('../../config') const settingsController = require('./settings') -const crypto = require('crypto') -const { promisify } = require('util') -const randomBytes = promisify(crypto.randomBytes) -async function randomString (len = 16) { - const bytes = await randomBytes(len * 8) - return crypto - .createHash('sha1') - .update(bytes) - .digest('hex') -} const setupController = { @@ -62,8 +53,8 @@ const setupController = { await settingsController.set('hostname', new URL.URL(settingsController.settings.baseurl).hostname) // create admin - const password = await randomString() - const email = `admin@${settingsController.settings.hostname}` + const password = helpers.randomString() + const email = `admin` const User = require('../models/user') await User.create({ email, diff --git a/server/api/index.js b/server/api/index.js index aa7537f6..d271276e 100644 --- a/server/api/index.js +++ b/server/api/index.js @@ -17,6 +17,7 @@ if (config.firstrun) { api.post('/settings', settingsController.setRequest) api.post('/setup/db', setupController.setupDb) api.post('/setup/restart', setupController.restart) + api.post('/settings/smtp', settingsController.testSMTP) } else { diff --git a/server/api/mail.js b/server/api/mail.js index 6d281477..d21df93d 100644 --- a/server/api/mail.js +++ b/server/api/mail.js @@ -1,14 +1,13 @@ const Email = require('email-templates') const path = require('path') const moment = require('dayjs') -const config = require('../config') -const settings = require('./controller/settings').settings +const settingsController = require('./controller/settings') const log = require('../log') const { Task, TaskManager } = require('../taskManager') const locales = require('../../locales') const mail = { - send (addresses, template, locals, locale = settings.instance_locale) { + send (addresses, template, locals, locale = settingsController.settings.instance_locale) { log.debug('Enqueue new email ', template, locale) const task = new Task({ name: 'MAIL', @@ -19,6 +18,7 @@ const mail = { }, _send (addresses, template, locals, locale) { + const settings = settingsController.settings log.info(`Send ${template} email to ${addresses} with locale ${locale}`) const email = new Email({ views: { root: path.join(__dirname, '..', 'emails') }, @@ -49,8 +49,7 @@ const mail = { const msg = { template, message: { - to: addresses, - bcc: settings.admin_email + to: addresses }, locals: { ...locals, @@ -62,6 +61,7 @@ const mail = { return email.send(msg) .catch(e => { log.error('[MAIL]', e) + throw e }) } } diff --git a/server/api/models/index.js b/server/api/models/index.js index 7ff217d3..b0cd7cca 100644 --- a/server/api/models/index.js +++ b/server/api/models/index.js @@ -1,23 +1,52 @@ const Sequelize = require('sequelize') +const Umzug = require('umzug') +const path = require('path') const config = require('../../config') const log = require('../../log') const db = { sequelize: null, close () { - return db.sequelize.close() + if (db.sequelize) { + return db.sequelize.close() + } }, - async connect (dbConf = config.db) { - log.debug(`Connecting to DB: ${dbConf}`) + connect (dbConf = config.db) { + log.debug(`Connecting to DB: ${JSON.stringify(dbConf)}`) db.sequelize = new Sequelize(dbConf) - await db.sequelize.authenticate() - return db.sequelize + return db.sequelize.authenticate() + }, + async isEmpty () { + const users = await db.sequelize.query('SELECT * from users').catch(e => {}) + return !(users && users.length) + }, + async runMigrations () { + const logging = config.firstrun ? false : log.debug.bind(log) + const umzug = new Umzug({ + storage: 'sequelize', + storageOptions: { sequelize: db.sequelize }, + logging, + migrations: { + wrap: fun => { + return () => + fun(db.sequelize.queryInterface, Sequelize).catch(e => { + // log.error(e) + return false + }) + }, + path: path.resolve(__dirname, '..', '..', 'migrations') + } + }) + return await umzug.up() } } if (!config.firstrun) { try { - db.connect() + db.connect().then(e => { + log.debug('Running migrations') + db.runMigrations() + }) } catch (e) { log.warn(` ⚠️ Cannot connect to db, check your configuration => ${e}`) process.exit(1) diff --git a/server/cli.js b/server/cli.js index 29b41812..b72c219a 100755 --- a/server/cli.js +++ b/server/cli.js @@ -9,15 +9,13 @@ if (process.env.NODE_ENV === 'production') { process.chdir(path.resolve(__dirname, '..')) } -async function start (options) { - try { - require('./config') - } catch (e) { - console.error(e) - process.exit(-1) - } - - require('./index') +async function start () { + const suffix = require('../package.json').name.includes('-edge') ? '-edge' : '' + require('@nuxt/cli' + suffix).run(['start', '--modern']) + .catch((error) => { + console.error(error) + process.exit(2) + }) } console.info(`📅 ${pkg.name} - v${pkg.version} - ${pkg.description} (nodejs: ${process.version}, ENV: ${process.env.NODE_ENV})`) diff --git a/server/config.js b/server/config.js index b05145f1..46a263ba 100644 --- a/server/config.js +++ b/server/config.js @@ -9,9 +9,9 @@ let config = { port: 13120 }, log_level: 'debug', - log_path: path.resolve(process.env.cwd, 'logs'), + log_path: path.resolve(process.env.cwd || '', 'logs'), db: {}, - upload_path: path.resolve(process.env.cwd, 'uploads'), + upload_path: path.resolve(process.env.cwd || '', 'uploads'), write (config_path= process.env.config_path || './config.json') { return fs.writeFileSync(config_path, JSON.stringify(config, null, 2)) }, diff --git a/server/helpers.js b/server/helpers.js index bbed4021..31102966 100644 --- a/server/helpers.js +++ b/server/helpers.js @@ -47,6 +47,14 @@ domPurify.addHook('beforeSanitizeElements', node => { }) module.exports = { + + randomString (length = 12) { + const wishlist = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + return Array.from(crypto.randomFillSync(new Uint32Array(length))) + .map(x => wishlist[x % wishlist.length]) + .join('') + }, + sanitizeHTML (html) { return domPurify.sanitize(html, { ALLOWED_TAGS: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'br',