diff --git a/src/controller/admin/management/settingController.ts b/src/controller/admin/management/settingController.ts index 1a82b9a..643ba44 100644 --- a/src/controller/admin/management/settingController.ts +++ b/src/controller/admin/management/settingController.ts @@ -1,6 +1,8 @@ import { Request, Response } from "express"; import SettingHelper from "../../../helpers/settingsHelper"; import { SettingString, SettingValueMapping } from "../../../type/settingTypes"; +import MailHelper from "../../../helpers/mailHelper"; +import InternalException from "../../../exceptions/internalException"; /** * @description get All settings @@ -40,7 +42,15 @@ export async function setSetting(req: Request, res: Response): Promise { let setting = req.body.setting as SettingString; let value = req.body.value as string; - SettingHelper.setSetting(setting, value); + await SettingHelper.checkMail([{ key: setting, value }]).catch((err) => { + if (err == "mail") { + throw new InternalException("Mail is not valid"); + } else { + throw new InternalException("Config is not valid"); + } + }); + + await SettingHelper.setSetting(setting, value); res.sendStatus(204); } @@ -54,8 +64,16 @@ export async function setSetting(req: Request, res: Response): Promise { export async function setSettings(req: Request, res: Response): Promise { let setting = req.body as Array<{ key: K; value: SettingValueMapping[K] }>; + await SettingHelper.checkMail(setting).catch((err) => { + if (err == "mail") { + throw new InternalException("Mail is not valid"); + } else { + throw new InternalException("Config is not valid"); + } + }); + for (let entry of setting) { - SettingHelper.setSetting(entry.key, entry.value); + await SettingHelper.setSetting(entry.key, entry.value); } res.sendStatus(204); @@ -92,7 +110,7 @@ export async function setImages(req: Request, res: Response): Promise { export async function resetSetting(req: Request, res: Response): Promise { let setting = req.params.setting as SettingString; - SettingHelper.resetSetting(setting); + await SettingHelper.resetSetting(setting); res.sendStatus(204); } diff --git a/src/helpers/settingsHelper.ts b/src/helpers/settingsHelper.ts index adddcc7..15b78df 100644 --- a/src/helpers/settingsHelper.ts +++ b/src/helpers/settingsHelper.ts @@ -14,6 +14,9 @@ import { UrlConverter, } from "./convertHelper"; import cloneDeep from "lodash.clonedeep"; +import { rejects } from "assert"; +import InternalException from "../exceptions/internalException"; +import MailHelper from "./mailHelper"; export default abstract class SettingHelper { private static settings: { [key in SettingString]?: string } = {}; @@ -141,6 +144,39 @@ export default abstract class SettingHelper { } } + public static async checkMail( + setting: Array<{ key: K; value: SettingValueMapping[K] }> + ): Promise { + return new Promise(async (resolve, reject) => { + if (setting.some((t) => t.key == "mail.email" && t.value != undefined)) { + let emailValue = setting.find((t) => t.key == "mail.email").value as string; + let checkMail = await MailHelper.checkMail(emailValue); + if (!checkMail) { + return reject("mail"); + } + } + + if (setting.some((t) => t.key.startsWith("mail"))) { + let checkConfig = await MailHelper.verifyTransport({ + user: + (setting.find((t) => t.key == "mail.username").value as string) ?? + SettingHelper.getSetting("mail.username"), + password: + (setting.find((t) => t.key == "mail.password").value as string) ?? + SettingHelper.getSetting("mail.password"), + host: (setting.find((t) => t.key == "mail.host").value as string) ?? SettingHelper.getSetting("mail.host"), + port: (setting.find((t) => t.key == "mail.port").value as number) ?? SettingHelper.getSetting("mail.port"), + secure: + (setting.find((t) => t.key == "mail.secure").value as boolean) ?? SettingHelper.getSetting("mail.secure"), + }); + if (!checkConfig) { + return reject("Config is not valid"); + } + } + resolve(); + }); + } + /** * Validates a setting * @param key The key of the setting