|
1 | 1 | 'use strict'; |
2 | 2 |
|
3 | 3 | const validator = require('validator'); |
| 4 | +const utility = require('utility'); |
| 5 | +const uuid = require('uuid'); |
4 | 6 | const Controller = require('egg').Controller; |
5 | 7 |
|
6 | 8 | const tools = require('../common/tools'); |
@@ -85,6 +87,130 @@ class SignController extends Controller { |
85 | 87 | ctx.logout(); |
86 | 88 | ctx.redirect('/'); |
87 | 89 | } |
| 90 | + |
| 91 | + async activeAccount() { |
| 92 | + const { ctx, service, config } = this; |
| 93 | + const key = validator.trim(ctx.query.key); |
| 94 | + const name = validator.trim(ctx.query.name); |
| 95 | + |
| 96 | + const user = await service.user.getUserByLoginName(name); |
| 97 | + if (!user) { |
| 98 | + throw new Error('[ACTIVE_ACCOUNT] no such user: ' + name); |
| 99 | + } |
| 100 | + |
| 101 | + const passhash = user.pass; |
| 102 | + if (!user || utility.md5(user.email + passhash + config.session_secret) !== key) { |
| 103 | + await ctx.render('notify/notify', { error: '信息有误,帐号无法被激活。' }); |
| 104 | + return; |
| 105 | + } |
| 106 | + |
| 107 | + if (user.active) { |
| 108 | + await ctx.render('notify/notify', { error: '帐号已经是激活状态。' }); |
| 109 | + return; |
| 110 | + } |
| 111 | + |
| 112 | + user.active = true; |
| 113 | + await user.save(); |
| 114 | + await ctx.render('notify/notify', { success: '帐号已被激活,请登录' }); |
| 115 | + } |
| 116 | + |
| 117 | + async showSearchPass() { |
| 118 | + await this.ctx.render('sign/search_pass'); |
| 119 | + } |
| 120 | + |
| 121 | + async updateSearchPass() { |
| 122 | + const { ctx, service } = this; |
| 123 | + const email = validator.trim(ctx.request.body.email).toLowerCase(); |
| 124 | + if (!validator.isEmail(email)) { |
| 125 | + await this.ctx.render('sign/search_pass', { |
| 126 | + error: '邮箱不合法', |
| 127 | + email, |
| 128 | + }); |
| 129 | + return; |
| 130 | + } |
| 131 | + |
| 132 | + // 动态生成retrive_key和timestamp到users collection,之后重置密码进行验证 |
| 133 | + const retrieveKey = uuid.v4(); |
| 134 | + const retrieveTime = Date.now(); |
| 135 | + |
| 136 | + const user = await service.user.getUserByMail(email); |
| 137 | + if (!user) { |
| 138 | + await this.ctx.render('sign/search_pass', { |
| 139 | + error: '没有这个电子邮箱。', |
| 140 | + email, |
| 141 | + }); |
| 142 | + return; |
| 143 | + } |
| 144 | + |
| 145 | + user.retrieve_key = retrieveKey; |
| 146 | + user.retrieve_time = retrieveTime; |
| 147 | + await user.save(); |
| 148 | + |
| 149 | + // 发送重置密码邮件 |
| 150 | + // mail.sendResetPassMail(email, retrieveKey, user.loginname); |
| 151 | + await this.ctx.render('notify/notify', { |
| 152 | + success: '我们已给您填写的电子邮箱发送了一封邮件,请在24小时内点击里面的链接来重置密码。', |
| 153 | + }); |
| 154 | + } |
| 155 | + |
| 156 | + async resetPass() { |
| 157 | + const { ctx, service } = this; |
| 158 | + const key = validator.trim(ctx.query.key || ''); |
| 159 | + const name = validator.trim(ctx.query.name || ''); |
| 160 | + |
| 161 | + const user = await service.user.getUserByNameAndKey(name, key); |
| 162 | + if (!user) { |
| 163 | + ctx.status = 403; |
| 164 | + await this.ctx.render('notify/notify', { |
| 165 | + error: '信息有误,密码无法重置。', |
| 166 | + }); |
| 167 | + return; |
| 168 | + } |
| 169 | + |
| 170 | + const now = Date.now(); |
| 171 | + const oneDay = 1000 * 60 * 60 * 24; |
| 172 | + if (!user.retrieve_time || now - user.retrieve_time > oneDay) { |
| 173 | + ctx.status = 403; |
| 174 | + await this.ctx.render('notify/notify', { |
| 175 | + error: '该链接已过期,请重新申请。', |
| 176 | + }); |
| 177 | + return; |
| 178 | + } |
| 179 | + await this.ctx.render('sign/reset', { name, key }); |
| 180 | + } |
| 181 | + |
| 182 | + async updatePass() { |
| 183 | + const { ctx, service } = this; |
| 184 | + const psw = validator.trim(ctx.body.psw) || ''; |
| 185 | + const repsw = validator.trim(ctx.body.repsw) || ''; |
| 186 | + const key = validator.trim(ctx.body.key) || ''; |
| 187 | + const name = validator.trim(ctx.body.name) || ''; |
| 188 | + |
| 189 | + if (psw !== repsw) { |
| 190 | + await this.ctx.render('sign/reset', { |
| 191 | + name, |
| 192 | + key, |
| 193 | + error: '两次密码输入不一致。', |
| 194 | + }); |
| 195 | + return; |
| 196 | + } |
| 197 | + const user = await service.user.getUserByNameAndKey(name, key); |
| 198 | + |
| 199 | + if (!user) { |
| 200 | + await this.ctx.render('notify/notify', { |
| 201 | + error: '错误的激活链接', |
| 202 | + }); |
| 203 | + return; |
| 204 | + } |
| 205 | + const passhash = tools.bhash(psw); |
| 206 | + user.pass = passhash; |
| 207 | + user.retrieve_key = null; |
| 208 | + user.retrieve_time = null; |
| 209 | + user.active = true; // 用户激活 |
| 210 | + |
| 211 | + await user.save(); |
| 212 | + await this.ctx.render('notify/notify', { success: '你的密码已重置。' }); |
| 213 | + } |
88 | 214 | } |
89 | 215 |
|
90 | 216 | module.exports = SignController; |
0 commit comments