| 197 | |
| 198 | // 用户注册 ############################################################################### |
| 199 | export async function userRegs(c: Context) { |
| 200 | let mail_data_in: string = <string>c.req.query('email'); // 邮件明文索引用户 |
| 201 | let mail_code_in: string = <string>c.req.query('codes'); // 邮件+验证码 HMAC |
| 202 | let pass_code_in: string = <string>c.req.query('crypt'); // 密码+验证码 AES2 |
| 203 | let pass_sets_in: string = <string>c.req.query('token'); // 用户+原密码 HMAC |
| 204 | // 修改密码 ========================================================================== |
| 205 | if (pass_sets_in != undefined && pass_sets_in.length > 0) { |
| 206 | if (!await userAuth(c)) return c.json({"flags": 2, "texts": "用户尚未登录"}, 401); |
| 207 | let user_data_db: Record<string, any>[] = await getUsers(c, mail_data_in); |
| 208 | if (Object.keys(user_data_db).length <= 0) return c.json({flags: 2}, 401); |
| 209 | let user_data_in = user_data_db[0] |
| 210 | console.log(user_data_in['pass'], pass_code_in, pass_sets_in); |
| 211 | if (user_data_in['pass'] !== pass_code_in) return c.json({flags: 5}, 403); |
| 212 | await saves.updateDB(c.env.DB_CF, "Users", {pass: pass_sets_in}, {mail: mail_data_in}) |
| 213 | return c.redirect("/#/login", 302); |
| 214 | } |
| 215 | // 校验验证码 ======================================================================== |
| 216 | let user_data_db: Record<string, any>[] = await getUsers(c, mail_data_in); |
| 217 | if (Object.keys(user_data_db).length <= 0) |
| 218 | return c.json({error: '请先发送邮件验证码'}, 200); |
| 219 | let user_data_in: Record<string, any> = user_data_db[0] |
| 220 | let code_hash_db = CryptoJS.SHA256(user_data_in["code"]).toString(CryptoJS.enc.Hex); |
| 221 | let mail_data_db = CryptoJS.HmacSHA256(mail_data_in, code_hash_db) // 邮箱 |
| 222 | let mail_code_db = mail_data_db.toString(CryptoJS.enc.Hex); |
| 223 | if (mail_code_db == mail_code_in) { // 验证通过,要保存密码 |
| 224 | try { // 解密密码sha256 ---------------------------------------------------------- |
| 225 | const save_word = CryptoJS.enc.Hex.parse(pass_code_in); |
| 226 | const save_base = CryptoJS.enc.Base64.stringify(save_word); |
| 227 | const keys_word = CryptoJS.enc.Hex.parse(code_hash_db); |
| 228 | // =========================================================================== |
| 229 | // console.log("save_word", save_word); |
| 230 | // console.log("save_text", save_text); |
| 231 | // console.log("save_base", save_base); |
| 232 | // console.log("keys_word", keys_word); |
| 233 | // console.log("keys_text", code_hash_db); |
| 234 | // 执行解密 ================================================================== |
| 235 | const decrypted = CryptoJS.AES.decrypt(save_base, keys_word, { |
| 236 | mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 |
| 237 | }); |
| 238 | const data_text = decrypted.toString(CryptoJS.enc.Hex); |
| 239 | // console.log("data_word:", decrypted); |
| 240 | // console.log("data_text:", data_text); |
| 241 | // 存储密码 ===================================================== |
| 242 | // const pass_salt = bcrypt.genSaltSync(10); |
| 243 | // const pass_save = bcrypt.hashSync(data_text, pass_salt); |
| 244 | // console.log("pass_salt:", pass_salt); |
| 245 | // console.log("pass_save:", pass_save); |
| 246 | |
| 247 | |
| 248 | const {publicKey, privateKey} = generateKeyPairSync( |
| 249 | 'ec', {namedCurve: 'prime256v1'}); |
| 250 | console.log(publicKey); |
| 251 | |
| 252 | // 新注册用户(flag 原为 0)需要初始化 quota 与 is_admin; |
| 253 | // 重置密码路径(flag 已为 1)保留原 quota / is_admin,不被回溯。 |
| 254 | const isFreshRegister = Number(user_data_in["flag"] ?? 0) === 0; |
| 255 | // ACME 账户私钥: |
| 256 | // - 新注册:务必生成并存入 keys 字段(后续申请证书直接复用,无需再在申请时生成) |