diff --git a/src/routes/tokens.js b/src/routes/tokens.js index a38bc56..d9f9183 100644 --- a/src/routes/tokens.js +++ b/src/routes/tokens.js @@ -74,13 +74,15 @@ router.post("/", middlewareRestrictor(10, 3600, false), async (req, res) => { // Check user exists by the email address - if (!(await User.findOne({email: req.body.email}).exec())) { + const user = await User.findOne({email: req.body.email}).exec(); + if (!user) { res.sendStatus(StatusCodes.NOT_FOUND); return; } // Handle code and metadata const metadata = { + userId: user._id, email: req.body.email, }; const {code, sessionId} = utilCodeSession. @@ -89,9 +91,11 @@ router.post("/", // Handle mail try { await utilMailSender("create_token", { + name: user.nickname, to: req.body.email, website: getMust("SARA_AUDIENCE_URL"), ip_address: utilVisitor.getIPAddress(req), + session_id: sessionId, code, }); if (getMust("NODE_ENV") === "testing") { @@ -176,6 +180,12 @@ router.patch("/", return; } + // Check metadata user id + if (user._id !== metadata.userId) { + res.sendStatus(StatusCodes.FORBIDDEN); + return; + } + // Handle authentication const userData = user.toObject(); const token = utilXaraToken. diff --git a/src/routes/users.js b/src/routes/users.js index 276991b..955a973 100644 --- a/src/routes/users.js +++ b/src/routes/users.js @@ -188,9 +188,12 @@ router.put("/me/email", // Handle mail try { await utilMailSender("update_email", { + name: req.auth.metadata?.profile?.name, + origin: req.auth.metadata?.profile?.email, to: req.body.email, website: getMust("SARA_AUDIENCE_URL"), ip_address: utilVisitor.getIPAddress(req), + session_id: sessionId, code, }); if (getMust("NODE_ENV") === "testing") { @@ -346,9 +349,11 @@ router.post("/", // Handle mail try { await utilMailSender("create_user", { + name: metadata.nickname, to: req.body.email, website: getMust("SARA_AUDIENCE_URL"), ip_address: utilVisitor.getIPAddress(req), + session_id: sessionId, code, }); if (getMust("NODE_ENV") === "testing") { diff --git a/src/templates/mail/create_token.js b/src/templates/mail/create_token.js index f04b20b..0810c0d 100644 --- a/src/templates/mail/create_token.js +++ b/src/templates/mail/create_token.js @@ -3,29 +3,42 @@ module.exports = { subject: (data) => `登入 ${data.website} 上的Sara系統`, text: (data) => ` - 您好,這裡是 ${data.website} 網站,有人申請使用您的信箱 ${data.to} 進行登入。 + 您好,這裡是 ${data.website} 網站。 + 使用者 ${data.name} 申請使用您的信箱 ${data.to} 進行登入。 - 這裡是您的登入代碼:${data.code} + 這裡是您的登入代碼: + ${data.code} - 這份請求來自於IP:${data.ip_address} + 這份請求來自於 IP 位址: + ${data.ip_address} 若您未曾請求過該代碼,請您無視本電子郵件。 + ${data.session_id} (${data.timestamp}) - 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由臺灣網際網路技術推廣組織(https://web-tech-tw.github.io)提供技術支援。 + 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案, + 由臺灣網際網路技術推廣組織(https://web-tech.tw)提供技術支援。 `, html: (data) => ` - 您好,這裡是 ${data.website} 網站,有人申請使用您的信箱 ${data.to} 進行登入
+

+ 您好,這裡是 ${data.website} 網站。
+ 使用者 ${data.name} 申請使用您的信箱 ${data.to} 進行登入。 +

這裡是您的登入代碼:
${data.code}

- 這份請求來自於IP:
+ 這份請求來自於 IP 位址:
${data.ip_address}

-

若您未曾請求過該代碼,請您無視本電子郵件。

- 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由 - 臺灣網際網路技術推廣組織 - 提供技術支援。
+

+ 若您未曾請求過該代碼,請您無視本電子郵件。
+ ${data.session_id} (${data.timestamp}) +

+

+ 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由 + 臺灣網際網路技術推廣組織 + 提供技術支援。
+

`, }; diff --git a/src/templates/mail/create_user.js b/src/templates/mail/create_user.js index 209b7d3..feeeb7c 100644 --- a/src/templates/mail/create_user.js +++ b/src/templates/mail/create_user.js @@ -3,29 +3,42 @@ module.exports = { subject: (data) => `向 ${data.website} 上的Sara系統註冊帳號`, text: (data) => ` - 您好,這裡是 ${data.website} 網站,有人申請使用您的信箱 ${data.to} 進行註冊。 + 您好,這裡是 ${data.website} 網站。 + 使用者 ${data.name} 申請使用您的信箱 ${data.to} 進行註冊。 - 這裡是您的註冊代碼:${data.code} + 這裡是您的註冊代碼: + ${data.code} - 這份請求來自於IP:${data.ip_address} + 這份請求來自於 IP 位址: + ${data.ip_address} 若您未曾請求過該代碼,請您無視本電子郵件。 + ${data.session_id} (${data.timestamp}) - 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由臺灣網際網路技術推廣組織(https://web-tech-tw.github.io)提供技術支援。 + 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案, + 由臺灣網際網路技術推廣組織(https://web-tech.tw)提供技術支援。 `, html: (data) => ` - 您好,這裡是 ${data.website} 網站,有人申請使用您的信箱 ${data.to} 進行註冊
+

+ 您好,這裡是 ${data.website} 網站。
+ 使用者 ${data.name} 申請使用您的信箱 ${data.to} 進行註冊。 +

這裡是您的註冊代碼:
${data.code}

- 這份請求來自於IP:
+ 這份請求來自於 IP 位址:
${data.ip_address}

-

若您未曾請求過該代碼,請您無視本電子郵件。

- 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由 - 臺灣網際網路技術推廣組織 - 提供技術支援。
+

+ 若您未曾請求過該代碼,請您無視本電子郵件。
+ ${data.session_id} (${data.timestamp}) +

+

+ 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由 + 臺灣網際網路技術推廣組織 + 提供技術支援。
+

`, }; diff --git a/src/templates/mail/update_email.js b/src/templates/mail/update_email.js index 06f0e15..606361f 100644 --- a/src/templates/mail/update_email.js +++ b/src/templates/mail/update_email.js @@ -3,29 +3,42 @@ module.exports = { subject: (data) => `轉移 ${data.website} 上的Sara系統帳號`, text: (data) => ` - 您好,這裡是 ${data.website} 網站,有人將帳號轉移到您的信箱 ${data.to} 上。 + 您好,這裡是 ${data.website} 網站。 + 使用者 ${data.name} 請求將帳號自 ${data.origin} 轉移到您的信箱 ${data.to} 上。 - 這裡是您的轉移代碼:${data.code} + 這裡是您的轉移代碼: + ${data.code} - 這份請求來自於IP:${data.ip_address} + 這份請求來自於 IP 位址: + ${data.ip_address} 若您未曾請求過該代碼,請您無視本電子郵件。 + ${data.session_id} (${data.timestamp}) - 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由臺灣網際網路技術推廣組織(https://web-tech-tw.github.io)提供技術支援。 + 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案, + 由臺灣網際網路技術推廣組織(https://web-tech.tw)提供技術支援。 `, html: (data) => ` - 您好,這裡是 ${data.website} 網站,有人將帳號轉移到您的信箱 ${data.to} 上
+

+ 您好,這裡是 ${data.website} 網站。
+ 使用者 ${data.name} 將帳號轉移到您的信箱 ${data.to} 上。 +

這裡是您的轉移代碼:
${data.code}

- 這份請求來自於IP:
+ 這份請求來自於 IP 位址
${data.ip_address}

-

若您未曾請求過該代碼,請您無視本電子郵件。

- 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由 - 臺灣網際網路技術推廣組織 - 提供技術支援。
+

+ 若您未曾請求過該代碼,請您無視本電子郵件。
+ ${data.session_id} (${data.timestamp}) +

+

+ 「Sara系統」是一個開放原始碼的無密碼式身份認證解決方案,由 + 臺灣網際網路技術推廣組織 + 提供技術支援。
+

`, }; diff --git a/src/utils/mail_sender.js b/src/utils/mail_sender.js index 24324a3..5a8f0de 100644 --- a/src/utils/mail_sender.js +++ b/src/utils/mail_sender.js @@ -21,6 +21,7 @@ const isTestMailAddress = (addr) => addr.endsWith("@" + constant.TEST_EMAIL_DOMAIN); module.exports = function(template, data) { + data.timestamp = new Date().toISOString(); if (isTestMailAddress(data.to)) { return new Promise((resolve) => { if (getMust("NODE_ENV") === "development") {