/[LeafOK_CVS]/fenglin/bbs/user_login_service.php
ViewVC logotype

Contents of /fenglin/bbs/user_login_service.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations)
Mon Mar 31 14:09:27 2025 UTC (11 months, 2 weeks ago) by sysadm
Branch: MAIN
Move check_user.php to user_login_service.php
Refact as backend service

1 <?
2 require_once "../lib/db_open.inc.php";
3 require_once "../lib/lml.inc.php";
4 require_once "../lib/passwd.inc.php";
5 require_once "../lib/vn_gif.inc.php";
6 require_once "../lib/client_addr.inc.php";
7 require_once "../lib/ip_mask.inc.php";
8 require_once "./session_init.inc.php";
9 require_once "./user_login.inc.php";
10
11 $data = json_decode(file_get_contents("php://input"), true);
12
13 $username = (isset($data["username"]) ? $data["username"] : "");
14 $password = (isset($data["password"]) ? $data["password"] : "");
15 $ch_passwd = (isset($data["ch_passwd"]) && $data["ch_passwd"] == "1" ? 1 : 0);
16 $password_new = (isset($data["password_new"]) ? $data["password_new"] : "");
17 $agreement = (isset($data["agreement"]) && $data["agreement"] == "1");
18 $mfa = (isset($data["mfa"]) && $data["mfa"] == "1" ? 1 : 0);
19 $vn_str = (isset($data["vn_str"]) ? $data["vn_str"] : "");
20
21 $result_set = array(
22 "return" => array(
23 "code" => 0,
24 "message" => "",
25 "errorFields" => array(),
26 )
27 );
28
29 header("Content-Type:application/json; charset=utf-8");
30
31 // Validate input data
32
33 if (!preg_match("/^[A-Za-z][A-Za-z0-9]{4,11}$/", $username))
34 {
35 $result_set["return"]["code"] = -1;
36 array_push($result_set["return"]["errorFields"], array(
37 "id" => "username",
38 "errMsg" => "不符合格式要求",
39 ));
40 }
41
42 if (!preg_match("/^[A-Za-z0-9]{5,12}$/", $password))
43 {
44 $result_set["return"]["code"] = -1;
45 array_push($result_set["return"]["errorFields"], array(
46 "id" => "password",
47 "errMsg" => "不符合格式要求",
48 ));
49 }
50
51 if ($ch_passwd)
52 {
53 if (!preg_match("/^[A-Za-z0-9]{5,12}$/", $password_new))
54 {
55 $result_set["return"]["code"] = -1;
56 array_push($result_set["return"]["errorFields"], array(
57 "id" => "password_new",
58 "errMsg" => "不符合格式要求",
59 ));
60 }
61
62 if (!verify_pass_complexity($password_new, $username, 6))
63 {
64 $result_set["return"]["code"] = -1;
65 array_push($result_set["return"]["errorFields"], array(
66 "id" => "password_new",
67 "errMsg" => "不符合复杂性要求",
68 ));
69 }
70 }
71
72 if ($mfa)
73 {
74 if ((!isset($_SESSION["BBS_vn_str"])) || VN_check($_SESSION["BBS_vn_str"], $vn_str) != 0)
75 {
76 $result_set["return"]["code"] = -1;
77 array_push($result_set["return"]["errorFields"], array(
78 "id" => "vn_str",
79 "errMsg" => "验证码错误",
80 ));
81 }
82 }
83
84 if ($result_set["return"]["code"] != 0)
85 {
86 mysqli_close($db_conn);
87 exit(json_encode($result_set));
88 }
89
90 // Begin transaction
91 $rs = mysqli_query($db_conn, "SET autocommit=0");
92 if ($rs == false)
93 {
94 $result_set["return"]["code"] = -2;
95 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
96
97 mysqli_close($db_conn);
98 exit(json_encode($result_set));
99 }
100
101 $rs = mysqli_query($db_conn, "BEGIN");
102 if ($rs == false)
103 {
104 $result_set["return"]["code"] = -2;
105 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
106
107 mysqli_close($db_conn);
108 exit(json_encode($result_set));
109 }
110
111 if (!$mfa)
112 {
113 // Failed login attempts from the same source (subnet /24) during certain time period
114 $sql = "SELECT COUNT(*) AS err_count FROM user_err_login_log
115 WHERE login_dt >= SUBDATE(NOW(), INTERVAL '10' MINUTE)
116 AND login_ip LIKE '" . client_addr(1) . "'";
117 $rs = mysqli_query($db_conn, $sql);
118 if ($rs == false)
119 {
120 $result_set["return"]["code"] = -2;
121 $result_set["return"]["message"] = "Query login log error; " . mysqli_error($db_conn);
122
123 mysqli_close($db_conn);
124 exit(json_encode($result_set));
125 }
126
127 if ($row = mysqli_fetch_array($rs))
128 {
129 if ($row["err_count"] >= 2)
130 {
131 $result_set["return"]["code"] = 1;
132 $result_set["return"]["message"] = "来源存在多次失败登陆尝试,请输入验证码";
133
134 mysqli_close($db_conn);
135 exit(json_encode($result_set));
136 }
137 }
138 mysqli_free_result($rs);
139
140 // Failed login attempts against the current username during certain time period
141 $sql = "SELECT COUNT(*) AS err_count FROM user_err_login_log
142 WHERE username = '$username' AND login_dt >= SUBDATE(NOW(), INTERVAL '1' DAY)";
143 $rs = mysqli_query($db_conn, $sql);
144 if ($rs == false)
145 {
146 $result_set["return"]["code"] = -2;
147 $result_set["return"]["message"] = "Query login log error; " . mysqli_error($db_conn);
148
149 mysqli_close($db_conn);
150 exit(json_encode($result_set));
151 }
152
153 if ($row = mysqli_fetch_array($rs))
154 {
155 if ($row["err_count"] >= 5)
156 {
157 $result_set["return"]["code"] = 1;
158 $result_set["return"]["message"] = "账号存在多次失败登陆尝试,请输入验证码";
159
160 mysqli_close($db_conn);
161 exit(json_encode($result_set));
162 }
163 }
164 mysqli_free_result($rs);
165 }
166
167 $sql = "SELECT UID, p_login, verified, temp_password,
168 password = MD5('$password') AS old_pass
169 FROM user_list WHERE username = '$username' AND
170 (password = MD5('$password') OR password = SHA2('$password', 256) OR
171 temp_password = '$password')
172 AND enable";
173
174 $rs = mysqli_query($db_conn, $sql);
175 if ($rs == false)
176 {
177 $result_set["return"]["code"] = -2;
178 $result_set["return"]["message"] = "Query user list error; " . mysqli_error($db_conn);
179
180 mysqli_close($db_conn);
181 exit(json_encode($result_set));
182 }
183
184 $uid = 0;
185
186 if ($row = mysqli_fetch_array($rs))
187 {
188 $uid = $row["UID"];
189
190 if ($password == $row["temp_password"] && !$ch_passwd)
191 {
192 $result_set["return"]["code"] = 2;
193 $result_set["return"]["message"] = "使用临时密码登录需设置新密码";
194
195 mysqli_close($db_conn);
196 exit(json_encode($result_set));
197 }
198
199 if ($ch_passwd)
200 {
201 $verified = ($password == $row["temp_password"] ? 1 : $row["verified"]); // New user first time login with temp password
202
203 $sql = "UPDATE user_list SET password = SHA2('$password_new', 256),
204 temp_password = '', verified = $verified WHERE UID = $uid";
205 $rs_p = mysqli_query($db_conn, $sql);
206 if ($rs_p == false)
207 {
208 $result_set["return"]["code"] = -2;
209 $result_set["return"]["message"] = "Update password error; " . mysqli_error($db_conn);
210
211 mysqli_close($db_conn);
212 exit(json_encode($result_set));
213 }
214 }
215 else if ($row["old_pass"])
216 {
217 $sql = "UPDATE user_list SET password = SHA2('$password', 256) WHERE UID = $uid";
218 $rs_p = mysqli_query($db_conn, $sql);
219 if ($rs_p == false)
220 {
221 $result_set["return"]["code"] = -2;
222 $result_set["return"]["message"] = "Upgrade password error; " . mysqli_error($db_conn);
223
224 mysqli_close($db_conn);
225 exit(json_encode($result_set));
226 }
227 }
228
229 mysqli_free_result($rs);
230
231 // Add user login log
232 $sql = "INSERT INTO user_login_log(uid, login_dt, login_ip) VALUES($uid, NOW(), '" .
233 client_addr() . "')";
234 $rs = mysqli_query($db_conn, $sql);
235 if ($rs == false)
236 {
237 $result_set["return"]["code"] = -2;
238 $result_set["return"]["message"] = "Write log error; " . mysqli_error($db_conn);
239
240 mysqli_close($db_conn);
241 exit(json_encode($result_set));
242 }
243
244 // Commit transaction
245 $rs = mysqli_query($db_conn, "COMMIT");
246 if ($rs == false)
247 {
248 $result_set["return"]["code"] = -2;
249 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
250
251 mysqli_close($db_conn);
252 exit(json_encode($result_set));
253 }
254
255 // Forbidden user
256 if (!$row["p_login"])
257 {
258 $result_set["return"]["code"] = 3;
259 $result_set["return"]["message"] = "您已被封禁全站登陆权限!";
260
261 mysqli_close($db_conn);
262 exit(json_encode($result_set));
263 }
264 }
265 else
266 {
267 // Log login failure
268 $sql = "INSERT INTO user_err_login_log(username, password, login_dt, login_ip)
269 VALUES('$username', '$password', NOW(), '" . client_addr() . "')";
270
271 $rs = mysqli_query($db_conn, $sql);
272 if ($rs == false)
273 {
274 $result_set["return"]["code"] = -2;
275 $result_set["return"]["message"] = "Write log error; " . mysqli_error($db_conn);
276
277 mysqli_close($db_conn);
278 exit(json_encode($result_set));
279 }
280
281 // Commit transaction
282 $rs = mysqli_query($db_conn, "COMMIT");
283 if ($rs == false)
284 {
285 $result_set["return"]["code"] = -2;
286 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
287
288 mysqli_close($db_conn);
289 exit(json_encode($result_set));
290 }
291
292 $result_set["return"]["code"] = 3;
293 $result_set["return"]["message"] = "用户名或密码不正确";
294
295 mysqli_close($db_conn);
296 exit(json_encode($result_set));
297 }
298
299 // SET AUTOCOMMIT = 1
300 $rs = mysqli_query($db_conn, "SET autocommit=1");
301 if ($rs == false)
302 {
303 $result_set["return"]["code"] = -2;
304 $result_set["return"]["message"] = "Mysqli error: " . mysqli_error($db_conn);
305
306 mysqli_close($db_conn);
307 exit(json_encode($result_set));
308 }
309
310 //Load User Information
311 $ret = load_user_info($uid, $db_conn);
312 switch($ret)
313 {
314 case "-1":
315 $result_set["return"]["code"] = -2;
316 $result_set["return"]["message"] = "User data not found; " . mysqli_error($db_conn);
317
318 mysqli_close($db_conn);
319 exit(json_encode($result_set));
320 case "-2":
321 if (!$agreement)
322 {
323 $buffer = file_get_contents("./doc/license/" . (new DateTime($BBS_license_dt))->format("Ymd") . ".txt");
324
325 $result_set["return"]["code"] = 4;
326 $result_set["return"]["message"] = LML(htmlspecialchars($buffer, ENT_HTML401, 'UTF-8'), false, false, 1024);
327
328 mysqli_close($db_conn);
329 exit(json_encode($result_set));
330 }
331 break;
332 case "-3":
333 $result_set["return"]["code"] = 3;
334 $result_set["return"]["message"] = "很遗憾,您已经永远离开了我们的世界……";
335
336 mysqli_close($db_conn);
337 exit(json_encode($result_set));
338 }
339
340 $sql = "UPDATE user_pubinfo SET visit_count = visit_count + 1,
341 last_login_dt = NOW() WHERE UID = $uid";
342 $rs = mysqli_query($db_conn, $sql);
343 if ($rs == false)
344 {
345 $result_set["return"]["code"] = -2;
346 $result_set["return"]["message"] = "Update login info error; " . mysqli_error($db_conn);
347
348 mysqli_close($db_conn);
349 exit(json_encode($result_set));
350 }
351
352 $_SESSION["BBS_uid"] = $uid;
353 $_SESSION["BBS_username"] = $username;
354 $_SESSION["BBS_login_tm"] = time();
355 $_SESSION["BBS_vn_str"] == "";
356
357 mysqli_close($db_conn);
358 exit(json_encode($result_set));
359 ?>

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1