✨ 完善通知模块
This commit is contained in:
parent
279cd90f63
commit
3d410602d6
@ -31,7 +31,9 @@ module.exports = {
|
|||||||
'no-redeclare': ['error', { builtinGlobals: true }], // 禁止重复对象声明
|
'no-redeclare': ['error', { builtinGlobals: true }], // 禁止重复对象声明
|
||||||
'no-multi-assign': 0,
|
'no-multi-assign': 0,
|
||||||
'no-restricted-globals': 0,
|
'no-restricted-globals': 0,
|
||||||
|
'no-case-declarations': 0,
|
||||||
'space-before-function-paren': 0, // 函数定义时括号前面空格
|
'space-before-function-paren': 0, // 函数定义时括号前面空格
|
||||||
|
'no-async-promise-executor': 0, // 允许在回调中使用async函数
|
||||||
'one-var': 0, // 允许连续声明
|
'one-var': 0, // 允许连续声明
|
||||||
// 'no-undef': 0, // 允许未定义的变量【会使env配置无效】
|
// 'no-undef': 0, // 允许未定义的变量【会使env配置无效】
|
||||||
'linebreak-style': 0, // 检测CRLF/LF检测【默认LF】
|
'linebreak-style': 0, // 检测CRLF/LF检测【默认LF】
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
const { readNotifyConfig, writeNotifyConfig, readNotifyList, writeNotifyList } = require('../utils')
|
const { readNotifyConfig, writeNotifyConfig, readNotifyList, writeNotifyList } = require('../utils')
|
||||||
const { sctTest, emailTest } = require('../utils/notify')
|
const { sendServerChan, sendEmail } = require('../utils/notify')
|
||||||
// const commonTemp = require('../template/commonTemp')
|
// const commonTemp = require('../template/commonTemp')
|
||||||
|
|
||||||
async function getNotifyConfig({ res }) {
|
async function getNotifyConfig({ res }) {
|
||||||
@ -13,10 +13,10 @@ async function updateNotifyConfig({ res, request }) {
|
|||||||
try {
|
try {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case 'sct':
|
case 'sct':
|
||||||
await sctTest(noticeConfig[type])
|
await sendServerChan(noticeConfig[type]['sendKey'], 'EasyNode通知测试', '这是一条测试通知')
|
||||||
break
|
break
|
||||||
case 'email':
|
case 'email':
|
||||||
await emailTest(noticeConfig[type])
|
await sendEmail(noticeConfig[type], 'EasyNode通知测试', '这是一条测试通知')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
await writeNotifyConfig(noticeConfig)
|
await writeNotifyConfig(noticeConfig)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
const jwt = require('jsonwebtoken')
|
const jwt = require('jsonwebtoken')
|
||||||
const axios = require('axios')
|
const axios = require('axios')
|
||||||
const { getNetIPInfo, readKey, writeKey, RSADecryptSync, AESEncryptSync, SHA1Encrypt, sendEmailToConfList, getNotifySwByType } = require('../utils')
|
const { getNetIPInfo, readKey, writeKey, RSADecryptSync, AESEncryptSync, SHA1Encrypt, getNotifySwByType } = require('../utils')
|
||||||
|
const { asyncSendNotice } = require('../utils/notify')
|
||||||
|
|
||||||
const getpublicKey = async ({ res }) => {
|
const getpublicKey = async ({ res }) => {
|
||||||
let { publicKey: data } = await readKey()
|
let { publicKey: data } = await readKey()
|
||||||
@ -24,9 +25,8 @@ const login = async ({ res, request }) => {
|
|||||||
loginErrTotal++
|
loginErrTotal++
|
||||||
if (loginErrCount >= allowErrCount) {
|
if (loginErrCount >= allowErrCount) {
|
||||||
const { ip, country, city } = await getNetIPInfo(clientIp)
|
const { ip, country, city } = await getNetIPInfo(clientIp)
|
||||||
// 发送通知&禁止登录
|
// 异步发送通知&禁止登录
|
||||||
let sw = getNotifySwByType('err_login')
|
asyncSendNotice('err_login', 'EasyNode登录错误提醒', `错误登录次数: ${ loginErrTotal }<br/>地点:${ country + city }<br/>IP: ${ ip }`)
|
||||||
if (sw) sendEmailToConfList('登录错误提醒', `重新登录次数: ${ loginErrTotal }<br/>地点:${ country + city }<br/>IP: ${ ip }`)
|
|
||||||
forbidLogin = true
|
forbidLogin = true
|
||||||
loginErrCount = 0
|
loginErrCount = 0
|
||||||
|
|
||||||
@ -82,8 +82,7 @@ const beforeLoginHandler = async (clientIp, jwtExpires) => {
|
|||||||
consola.info('登录成功:', new Date(), { ip, country, city })
|
consola.info('登录成功:', new Date(), { ip, country, city })
|
||||||
|
|
||||||
// 邮件登录通知
|
// 邮件登录通知
|
||||||
let sw = getNotifySwByType('login')
|
asyncSendNotice('login', 'EasyNode登录提醒', `地点:${ country + city }<br/>IP: ${ ip }`)
|
||||||
if (sw) sendEmailToConfList('登录提醒', `地点:${ country + city }<br/>IP: ${ ip }`)
|
|
||||||
|
|
||||||
global.loginRecord.unshift(clientIPInfo)
|
global.loginRecord.unshift(clientIPInfo)
|
||||||
if (global.loginRecord.length > 10) global.loginRecord = global.loginRecord.slice(0, 10)
|
if (global.loginRecord.length > 10) global.loginRecord = global.loginRecord.slice(0, 10)
|
||||||
@ -103,8 +102,7 @@ const updatePwd = async ({ res, request }) => {
|
|||||||
keyObj.pwd = newPwd
|
keyObj.pwd = newPwd
|
||||||
await writeKey(keyObj)
|
await writeKey(keyObj)
|
||||||
|
|
||||||
let sw = getNotifySwByType('updatePwd')
|
asyncSendNotice('updatePwd', 'EasyNode用户密码修改提醒', `原用户名:${ user }<br/>更新用户名: ${ newLoginName }`)
|
||||||
if (sw) sendEmailToConfList(`登录信息修改提醒, 新用户名: ${ newLoginName }`)
|
|
||||||
|
|
||||||
res.success({ data: true, msg: 'success' })
|
res.success({ data: true, msg: 'success' })
|
||||||
}
|
}
|
||||||
|
@ -1,27 +1,34 @@
|
|||||||
const nodemailer = require('nodemailer')
|
const nodemailer = require('nodemailer')
|
||||||
const axios = require('axios')
|
const axios = require('axios')
|
||||||
|
const { getNotifySwByType, readNotifyConfig } = require('../utils')
|
||||||
|
|
||||||
module.exports.sctTest = function ({ sendKey }) {
|
function sendServerChan(sendKey, title, content) {
|
||||||
// eslint-disable-next-line no-async-promise-executor
|
if (!sendKey) return consola.error('发送server酱通知失败, sendKey 为空')
|
||||||
return new Promise((async (resolve, reject) => {
|
return new Promise((async (resolve, reject) => {
|
||||||
consola.info('server酱通知测试: ', sendKey)
|
|
||||||
try {
|
try {
|
||||||
let { data } = await axios.get(`https://sctapi.ftqq.com/${ sendKey }.send?title=messagetitle`)
|
consola.info('server酱通知预发送: ', title)
|
||||||
|
const url = `https://sctapi.ftqq.com/${ sendKey }.send`
|
||||||
|
const params = new URLSearchParams({ text: title, desp: content })
|
||||||
|
let { data } = await axios.post(url, params, {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded'
|
||||||
|
}
|
||||||
|
})
|
||||||
resolve(data)
|
resolve(data)
|
||||||
consola.success('测试成功')
|
consola.info('server酱通知发送成功: ', title)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error)
|
reject(error)
|
||||||
consola.error('测试失败: ', error)
|
consola.error('server酱通知发送失败: ', error)
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.emailTest = function (conf) {
|
function sendEmail({ service, user, pass }, title, content) {
|
||||||
// eslint-disable-next-line no-async-promise-executor
|
if (!service || !user || !pass) return consola.info('发送通知失败, 邮箱配置信息不完整: ', { service, user, pass })
|
||||||
return new Promise((async (resolve, reject) => {
|
return new Promise((async (resolve, reject) => {
|
||||||
consola.info('邮箱通知测试: ', conf)
|
|
||||||
try {
|
try {
|
||||||
const { service, user, pass } = conf
|
consola.info('邮箱通知预发送: ', title)
|
||||||
let transporter = nodemailer.createTransport({
|
let transporter = nodemailer.createTransport({
|
||||||
service,
|
service,
|
||||||
auth: {
|
auth: {
|
||||||
@ -29,19 +36,52 @@ module.exports.emailTest = function (conf) {
|
|||||||
pass
|
pass
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
let info = await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
from: user,
|
from: user,
|
||||||
to: user,
|
to: user,
|
||||||
subject: 'EasyNode: 测试邮件通知',
|
subject: title,
|
||||||
text: '测试邮件',
|
// text: '', // 纯文本版本内容,如果收件人的邮件客户端不支持HTML显示,就会显示这个文本
|
||||||
html: '<b>测试邮件</b>'
|
html: content
|
||||||
})
|
})
|
||||||
consola.info('Message sent: %s', info.messageId)
|
consola.info('邮件通知发送成功: ', title)
|
||||||
resolve()
|
resolve()
|
||||||
consola.success('测试成功')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error)
|
reject(error)
|
||||||
consola.error('测试失败: ', error)
|
consola.error('邮件通知发送失败: ', error)
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 异步发送通知
|
||||||
|
async function asyncSendNotice(noticeAction, title, content) {
|
||||||
|
try {
|
||||||
|
let sw = await getNotifySwByType(noticeAction) // 获取对应动作的通知开关
|
||||||
|
if (!sw) return
|
||||||
|
let notifyConfig = await readNotifyConfig()
|
||||||
|
let { type } = notifyConfig
|
||||||
|
if (!type) return consola.error('通知类型不存在: ', type)
|
||||||
|
content += `<br/>通知发送时间:${ new Date() }`
|
||||||
|
switch (type) {
|
||||||
|
case 'sct':
|
||||||
|
let { sendKey } = notifyConfig['sct']
|
||||||
|
if (!sendKey) return consola.info('未发送server酱通知, sendKey 为空')
|
||||||
|
await sendServerChan(sendKey, title, content)
|
||||||
|
break
|
||||||
|
case 'email':
|
||||||
|
let { service, user, pass } = notifyConfig['email']
|
||||||
|
if (!service || !user || !pass) return consola.info('未发送邮件通知通知, 未配置邮箱: ', { service, user, pass })
|
||||||
|
await sendEmail({ service, user, pass }, title, content)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
consola.error('通知发送失败: ', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
asyncSendNotice,
|
||||||
|
sendServerChan,
|
||||||
|
sendEmail
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user