Skip to content

Commit 9551f7c

Browse files
author
zhangjiangbin
committed
通过邮件重置密码
1 parent 2df3e7e commit 9551f7c

26 files changed

+980
-117
lines changed

app/Http/Controllers/AdminController.php

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function index(Request $request)
3838
$flowCount = $this->flowAutoShow($flowCount);
3939
$view['flowCount'] = $flowCount;
4040
$view['totalBalance'] = User::sum('balance');
41-
$view['expireWarningUserCount'] = User::where('expire_time', '<=', date('Y-m-d', strtotime("+15 days")))->count();
41+
$view['expireWarningUserCount'] = User::where('expire_time', '<=', date('Y-m-d', strtotime("+15 days")))->where('enable', 1)->count();
4242

4343
// 到期账号禁用
4444
User::where('enable', 1)->where('expire_time', '<=', date('Y-m-d'))->update(['enable' => 0]);
@@ -861,13 +861,15 @@ public function export(Request $request)
861861
// 生成文本配置信息
862862
$txt = <<<TXT
863863
服务器:{$node->server}
864-
端口:{$user->port}
864+
远程端口:{$user->port}
865+
本地端口:1080
865866
密码:{$user->passwd}
866-
加密方式{$user->method}
867+
加密方法{$user->method}
867868
协议:{$user->protocol}
868869
协议参数:{$user->protocol_param}
869-
混淆{$user->obfs}
870+
混淆方式{$user->obfs}
870871
混淆参数:{$user->obfs_param}
872+
路由:绕过局域网及中国大陆地址
871873
TXT;
872874

873875
$node->txt = $txt;
@@ -1138,6 +1140,36 @@ public function enableUserRandPort(Request $request)
11381140
return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
11391141
}
11401142

1143+
// 启用、禁用注册
1144+
public function enableRegister(Request $request)
1145+
{
1146+
$value = intval($request->get('value'));
1147+
1148+
Config::where('id', 4)->update(['value' => $value]);
1149+
1150+
return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
1151+
}
1152+
1153+
// 启用、禁用邀请注册
1154+
public function enableInviteRegister(Request $request)
1155+
{
1156+
$value = intval($request->get('value'));
1157+
1158+
Config::where('id', 5)->update(['value' => $value]);
1159+
1160+
return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
1161+
}
1162+
1163+
// 设置可生成邀请码数
1164+
public function setInviteNum(Request $request)
1165+
{
1166+
$value = intval($request->get('value'));
1167+
1168+
Config::where('id', 3)->update(['value' => $value]);
1169+
1170+
return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
1171+
}
1172+
11411173
// 邀请码列表
11421174
public function inviteList(Request $request)
11431175
{
@@ -1167,11 +1199,11 @@ public function makeInvite(Request $request)
11671199

11681200
$user = $request->session()->get('user');
11691201

1170-
for ($i = 0; $i < 10; $i++) {
1202+
for ($i = 0; $i < 5; $i++) {
11711203
$obj = new Invite();
11721204
$obj->uid = $user['id'];
11731205
$obj->fuid = 0;
1174-
$obj->code = strtoupper(md5(microtime() . $this->makeRandStr(6)));
1206+
$obj->code = strtoupper(substr(md5(microtime() . $this->makeRandStr(6)), 8, 16));
11751207
$obj->status = 0;
11761208
$obj->dateline = date('Y-m-d H:i:s', strtotime("+ 7days"));
11771209
$obj->save();

app/Http/Controllers/BaseController.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,23 @@ public function tail($file, $n, $base = 5)
137137

138138
return array_slice($lines, 0, $n);
139139
}
140+
141+
/**
142+
* 文件大小转换
143+
*
144+
* @param int $bytes
145+
* @param int $precision
146+
*
147+
* @return string
148+
*/
149+
public function formatBytes($bytes, $precision = 2)
150+
{
151+
$units = array('B', 'KB', 'MB', 'GB', 'TB');
152+
$bytes = max($bytes, 0);
153+
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
154+
$pow = min($pow, count($units) - 1);
155+
$bytes /= pow(1024, $pow);
156+
157+
return round($bytes, $precision) . ' ' . $units[$pow];
158+
}
140159
}

app/Http/Controllers/RegisterController.php

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,37 @@ public function index(Request $request)
3535
} else if (empty($repassword)) {
3636
$request->session()->flash('errorMsg', '请重新输入密码');
3737

38-
return Redirect::back()->withInput();
39-
} else if (empty($code)) {
40-
$request->session()->flash('errorMsg', '请输入邀请码');
41-
4238
return Redirect::back()->withInput();
4339
} else if (md5($password) != md5($repassword)) {
4440
$request->session()->flash('errorMsg', '两次输入密码不一致,请重新输入');
4541

4642
return Redirect::back()->withInput($request->except(['password', 'repassword']));
4743
}
4844

49-
// 校验邀请码合法性
50-
$code = Invite::where('code', $code)->where('status', 0)->first();
51-
if (empty($code)) {
52-
$request->session()->flash('errorMsg', '邀请码不可用,请更换邀请码后重试');
45+
$config = $this->systemConfig();
46+
47+
// 是否开启注册
48+
if (!$config['is_register']) {
49+
$request->session()->flash('errorMsg', '系统维护暂停注册,如需账号请联系管理员');
5350

54-
return Redirect::back()->withInput($request->except(['code']));
51+
return Redirect::back();
52+
}
53+
54+
// 如果需要邀请注册
55+
if ($config['is_invite_register']) {
56+
if (empty($code)) {
57+
$request->session()->flash('errorMsg', '请输入邀请码');
58+
59+
return Redirect::back()->withInput();
60+
}
61+
62+
// 校验邀请码合法性
63+
$code = Invite::where('code', $code)->where('status', 0)->first();
64+
if (empty($code)) {
65+
$request->session()->flash('errorMsg', '邀请码不可用,请更换邀请码后重试');
66+
67+
return Redirect::back()->withInput($request->except(['code']));
68+
}
5569
}
5670

5771
// 校验用户名是否已存在
@@ -80,13 +94,17 @@ public function index(Request $request)
8094
$obj->save();
8195

8296
// 更新邀请码
83-
if ($obj->id) {
84-
Invite::where('id', $code->id)->update(['status' => 1]);
97+
if ($config['is_invite_register'] && $obj->id) {
98+
Invite::where('id', $code->id)->update(['fuid' => $obj->id,'status' => 1]);
8599
}
86100

87101
return Redirect::to('login');
88102
} else {
89-
return Response::view('register');
103+
$config = $this->systemConfig();
104+
$view['is_register'] = $config['is_register'];
105+
$view['is_invite_register'] = $config['is_invite_register'];
106+
107+
return Response::view('register', $view);
90108
}
91109
}
92110

app/Http/Controllers/UserController.php

Lines changed: 142 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010
use App\Http\Models\SsNodeOnlineLog;
1111
use App\Http\Models\User;
1212
use App\Http\Models\UserTrafficLog;
13+
use App\Http\Models\Verify;
14+
use App\Mail\resetPassword;
1315
use Illuminate\Http\Request;
1416
use Redirect;
1517
use Response;
18+
use Cache;
19+
use Mail;
1620

1721
class UserController extends BaseController
1822
{
@@ -22,7 +26,7 @@ public function index(Request $request)
2226
return Redirect::to('login');
2327
}
2428

25-
$view['articleList'] = Article::orderBy('sort', 'desc')->orderBy('id', 'desc')->limit(5)->get();
29+
$view['articleList'] = Article::orderBy('sort', 'desc')->orderBy('id', 'desc')->paginate(5);
2630
$view['info'] = $request->session()->get('user');
2731

2832
return Response::view('user/index', $view);
@@ -176,13 +180,15 @@ public function nodeList(Request $request)
176180
// 生成文本配置信息
177181
$txt = <<<TXT
178182
服务器:{$node->server}
179-
端口:{$user['port']}
183+
远程端口:{$user['port']}
184+
本地端口:1080
180185
密码:{$user['passwd']}
181-
加密方式{$user['method']}
186+
加密方法{$user['method']}
182187
协议:{$user['protocol']}
183188
协议参数:{$user['protocol_param']}
184-
混淆{$user['obfs']}
189+
混淆方式{$user['obfs']}
185190
混淆参数:{$user['obfs_param']}
191+
路由:绕过局域网及中国大陆地址
186192
TXT;
187193

188194
$node->txt = $txt;
@@ -226,9 +232,9 @@ public function invite(Request $request)
226232

227233
// 已生成的邀请码数量
228234
$num = Invite::where('uid', $user['id'])->count();
229-
$inviteNum = Config::where('id', 3)->pluck('value');
235+
$config = $this->systemConfig();
230236

231-
$view['num'] = $inviteNum[0] - $num; // 还可以生成的邀请码数量
237+
$view['num'] = $config['invite_num'] - $num <= 0 ? 0 : $config['invite_num'] - $num; // 还可以生成的邀请码数量
232238
$view['inviteList'] = Invite::where('uid', $user['id'])->with(['generator', 'user'])->paginate(10); // 邀请码列表
233239

234240
return Response::view('user/invite', $view);
@@ -245,20 +251,145 @@ public function makeInvite(Request $request)
245251

246252
// 已生成的邀请码数量
247253
$num = Invite::where('uid', $user['id'])->count();
248-
$inviteNum = Config::where('id', 3)->pluck('value');
249-
if ($num >= $inviteNum[0]) {
250-
return Response::json(['status' => 'fail', 'data' => '', 'message' => '生成失败:最多只能生成' . $inviteNum[0] . '个邀请码']);
254+
$config = $this->systemConfig();
255+
if ($num >= $config['invite_num']) {
256+
return Response::json(['status' => 'fail', 'data' => '', 'message' => '生成失败:最多只能生成' . $config['invite_num'] . '个邀请码']);
251257
}
252258

253259
$obj = new Invite();
254260
$obj->uid = $user['id'];
255261
$obj->fuid = 0;
256-
$obj->code = strtoupper(md5(microtime() . $this->makeRandStr(6)));
262+
$obj->code = strtoupper(mb_substr(md5(microtime() . $this->makeRandStr(6)), 8, 16));
257263
$obj->status = 0;
258-
$obj->dateline = date('Y-m-d H:i:s', strtotime("+ 7days"));
264+
$obj->dateline = date('Y-m-d H:i:s', strtotime("+7 days"));
259265
$obj->save();
260266

261267
return Response::json(['status' => 'success', 'data' => '', 'message' => '生成成功']);
262268
}
263269

270+
// 重设密码
271+
public function resetPassword(Request $request)
272+
{
273+
$config = $this->systemConfig();
274+
275+
if ($request->method() == 'POST') {
276+
$username = trim($request->get('username'));
277+
278+
// 是否开启重设密码
279+
if (!$config['is_reset_password']) {
280+
$request->session()->flash('errorMsg', '系统未开启重置密码功能,请联系管理员');
281+
282+
return Redirect::back()->withInput();
283+
}
284+
285+
// 查找账号
286+
$user = User::where('username', $username)->first();
287+
if (!$user) {
288+
$request->session()->flash('errorMsg', '账号不存在,请重试');
289+
290+
return Redirect::back();
291+
}
292+
293+
// 24小时内重设密码次数限制
294+
$resetTimes = 0;
295+
if (Cache::has('resetPassword_' . md5($username))) {
296+
$resetTimes = Cache::get('resetPassword_' . md5($username));
297+
if ($resetTimes >= $config['reset_password_times']) {
298+
$request->session()->flash('errorMsg', '同一个账号24小时内只能重设密码' . $config['reset_password_times'] . '次,请勿频繁操作');
299+
300+
return Redirect::back();
301+
}
302+
}
303+
304+
// 生成取回密码的地址
305+
$token = md5($config['website_name'] . $username . microtime());
306+
$verify = new Verify();
307+
$verify->user_id = $user->id;
308+
$verify->username = $username;
309+
$verify->token = $token;
310+
$verify->status = 0;
311+
$verify->save();
312+
313+
// 发送邮件
314+
$resetPasswordUrl = $config['website_url'] . '/reset/' . $token;
315+
Mail::to($user->username)->send(new resetPassword($config['website_name'], $resetPasswordUrl));
316+
317+
Cache::put('resetPassword_' . md5($username), $resetTimes + 1, 1440);
318+
$request->session()->flash('successMsg', '重置成功,请查看邮箱');
319+
320+
return Redirect::back();
321+
} else {
322+
$view['is_reset_password'] = $config['is_reset_password'];
323+
324+
return Response::view('user/resetPassword', $view);
325+
}
326+
}
327+
328+
// 重设密码
329+
public function reset(Request $request, $token)
330+
{
331+
if ($request->method() == 'POST') {
332+
$password = trim($request->get('password'));
333+
$repassword = trim($request->get('repassword'));
334+
335+
if (empty($token)) {
336+
return Redirect::to('login');
337+
} else if (empty($password) || empty($repassword)) {
338+
$request->session()->flash('errorMsg', '密码不能为空');
339+
340+
return Redirect::back();
341+
} else if (md5($password) != md5($repassword)) {
342+
$request->session()->flash('errorMsg', '两次输入密码不一致,请重新输入');
343+
344+
return Redirect::back();
345+
}
346+
347+
// 校验账号
348+
$verify = Verify::where('token', $token)->with('User')->first();
349+
if (empty($verify)) {
350+
return Redirect::to('login');
351+
} else if ($verify->status == 1) {
352+
$request->session()->flash('errorMsg', '该链接已失效');
353+
354+
return Redirect::back();
355+
} else if (!$verify->user->enable) {
356+
$request->session()->flash('errorMsg', '账号已被禁用');
357+
358+
return Redirect::back();
359+
} else if (md5($password) == $verify->user->password) {
360+
$request->session()->flash('errorMsg', '新旧密码一样,请重新输入');
361+
362+
return Redirect::back();
363+
}
364+
365+
// 更新密码
366+
$ret = User::where('id', $verify->user_id)->update(['password' => md5($password)]);
367+
if (!$ret) {
368+
$request->session()->flash('errorMsg', '重设密码失败');
369+
370+
return Redirect::back();
371+
}
372+
373+
// 更新verify
374+
$verify->status = 1;
375+
$verify->save();
376+
377+
$request->session()->flash('successMsg', '新密码设置成功,请自行登录');
378+
379+
return Redirect::back();
380+
} else {
381+
if (empty($token)) {
382+
return Redirect::to('login');
383+
}
384+
385+
$verify = Verify::where('token', $token)->with('user')->first();
386+
if (empty($verify)) {
387+
return Redirect::to('login');
388+
}
389+
390+
$view['verify'] = $verify;
391+
392+
return Response::view('user/reset', $view);
393+
}
394+
}
264395
}

app/Http/Models/Article.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66

77
/**
88
* 文章
9-
* Class Node
9+
* Class Article
1010
* @package App\Http\Models
1111
*/
1212
class Article extends Model
1313
{
1414
protected $table = 'article';
1515
protected $primaryKey = 'id';
16-
public $timestamps = false;
1716
protected $fillable = [
1817
'title',
1918
'content',

0 commit comments

Comments
 (0)