ok lot of smtp minors

This commit is contained in:
lesion
2021-10-18 15:46:38 +02:00
parent 858d6b31c8
commit b63f22fd31
8 changed files with 76 additions and 35 deletions

View File

@@ -39,7 +39,8 @@ const defaultSettings = {
{ href: '/', label: 'home' }, { href: '/', label: 'home' },
{ href: '/about', label: 'about' } { 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) } 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) { setLogo (req, res) {
if (!req.file) { if (!req.file) {
settingsController.set('logo', false) settingsController.set('logo', false)

View File

@@ -1,18 +1,9 @@
const URL = require('url') const URL = require('url')
const helpers = require('../../helpers.js')
const log = require('../../log') const log = require('../../log')
const db = require('../models/index.js') const db = require('../models/index.js')
const config = require('../../config') const config = require('../../config')
const settingsController = require('./settings') 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 = { const setupController = {
@@ -62,8 +53,8 @@ const setupController = {
await settingsController.set('hostname', new URL.URL(settingsController.settings.baseurl).hostname) await settingsController.set('hostname', new URL.URL(settingsController.settings.baseurl).hostname)
// create admin // create admin
const password = await randomString() const password = helpers.randomString()
const email = `admin@${settingsController.settings.hostname}` const email = `admin`
const User = require('../models/user') const User = require('../models/user')
await User.create({ await User.create({
email, email,

View File

@@ -17,6 +17,7 @@ if (config.firstrun) {
api.post('/settings', settingsController.setRequest) api.post('/settings', settingsController.setRequest)
api.post('/setup/db', setupController.setupDb) api.post('/setup/db', setupController.setupDb)
api.post('/setup/restart', setupController.restart) api.post('/setup/restart', setupController.restart)
api.post('/settings/smtp', settingsController.testSMTP)
} else { } else {

View File

@@ -1,14 +1,13 @@
const Email = require('email-templates') const Email = require('email-templates')
const path = require('path') const path = require('path')
const moment = require('dayjs') const moment = require('dayjs')
const config = require('../config') const settingsController = require('./controller/settings')
const settings = require('./controller/settings').settings
const log = require('../log') const log = require('../log')
const { Task, TaskManager } = require('../taskManager') const { Task, TaskManager } = require('../taskManager')
const locales = require('../../locales') const locales = require('../../locales')
const mail = { 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) log.debug('Enqueue new email ', template, locale)
const task = new Task({ const task = new Task({
name: 'MAIL', name: 'MAIL',
@@ -19,6 +18,7 @@ const mail = {
}, },
_send (addresses, template, locals, locale) { _send (addresses, template, locals, locale) {
const settings = settingsController.settings
log.info(`Send ${template} email to ${addresses} with locale ${locale}`) log.info(`Send ${template} email to ${addresses} with locale ${locale}`)
const email = new Email({ const email = new Email({
views: { root: path.join(__dirname, '..', 'emails') }, views: { root: path.join(__dirname, '..', 'emails') },
@@ -49,8 +49,7 @@ const mail = {
const msg = { const msg = {
template, template,
message: { message: {
to: addresses, to: addresses
bcc: settings.admin_email
}, },
locals: { locals: {
...locals, ...locals,
@@ -62,6 +61,7 @@ const mail = {
return email.send(msg) return email.send(msg)
.catch(e => { .catch(e => {
log.error('[MAIL]', e) log.error('[MAIL]', e)
throw e
}) })
} }
} }

View File

@@ -1,23 +1,52 @@
const Sequelize = require('sequelize') const Sequelize = require('sequelize')
const Umzug = require('umzug')
const path = require('path')
const config = require('../../config') const config = require('../../config')
const log = require('../../log') const log = require('../../log')
const db = { const db = {
sequelize: null, sequelize: null,
close () { close () {
return db.sequelize.close() if (db.sequelize) {
return db.sequelize.close()
}
}, },
async connect (dbConf = config.db) { connect (dbConf = config.db) {
log.debug(`Connecting to DB: ${dbConf}`) log.debug(`Connecting to DB: ${JSON.stringify(dbConf)}`)
db.sequelize = new Sequelize(dbConf) db.sequelize = new Sequelize(dbConf)
await db.sequelize.authenticate() return db.sequelize.authenticate()
return db.sequelize },
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) { if (!config.firstrun) {
try { try {
db.connect() db.connect().then(e => {
log.debug('Running migrations')
db.runMigrations()
})
} catch (e) { } catch (e) {
log.warn(` ⚠️ Cannot connect to db, check your configuration => ${e}`) log.warn(` ⚠️ Cannot connect to db, check your configuration => ${e}`)
process.exit(1) process.exit(1)

View File

@@ -9,15 +9,13 @@ if (process.env.NODE_ENV === 'production') {
process.chdir(path.resolve(__dirname, '..')) process.chdir(path.resolve(__dirname, '..'))
} }
async function start (options) { async function start () {
try { const suffix = require('../package.json').name.includes('-edge') ? '-edge' : ''
require('./config') require('@nuxt/cli' + suffix).run(['start', '--modern'])
} catch (e) { .catch((error) => {
console.error(e) console.error(error)
process.exit(-1) process.exit(2)
} })
require('./index')
} }
console.info(`📅 ${pkg.name} - v${pkg.version} - ${pkg.description} (nodejs: ${process.version}, ENV: ${process.env.NODE_ENV})`) console.info(`📅 ${pkg.name} - v${pkg.version} - ${pkg.description} (nodejs: ${process.version}, ENV: ${process.env.NODE_ENV})`)

View File

@@ -9,9 +9,9 @@ let config = {
port: 13120 port: 13120
}, },
log_level: 'debug', log_level: 'debug',
log_path: path.resolve(process.env.cwd, 'logs'), log_path: path.resolve(process.env.cwd || '', 'logs'),
db: {}, 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') { write (config_path= process.env.config_path || './config.json') {
return fs.writeFileSync(config_path, JSON.stringify(config, null, 2)) return fs.writeFileSync(config_path, JSON.stringify(config, null, 2))
}, },

View File

@@ -47,6 +47,14 @@ domPurify.addHook('beforeSanitizeElements', node => {
}) })
module.exports = { 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) { sanitizeHTML (html) {
return domPurify.sanitize(html, { return domPurify.sanitize(html, {
ALLOWED_TAGS: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'br', ALLOWED_TAGS: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'br',