summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pttbbs/mbbsd/mbbsd.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/pttbbs/mbbsd/mbbsd.c b/pttbbs/mbbsd/mbbsd.c
index f757caea..9a9d7626 100644
--- a/pttbbs/mbbsd/mbbsd.c
+++ b/pttbbs/mbbsd/mbbsd.c
@@ -1105,6 +1105,61 @@ inline static void check_bad_login(void)
}
}
+void
+check_bad_clients(void) {
+ // check bad clients
+ int i, y;
+ char src[PATHLEN], dest[PATHLEN], buf[STRLEN];
+ FILE *fp;
+ snprintf(src, sizeof(src), "bad_clients/%s", cuser.userid);
+ if (!dashf(src))
+ return;
+
+ strlcpy(dest, src, sizeof(dest));
+ strlcat(dest, ".reply", sizeof(dest));
+ if (dashf(dest))
+ return;
+
+ vs_hdr2("安全系統", "異常發文確認");
+ outs(ANSI_COLOR(1;33)
+ "親愛的使用者您好,我們發現您曾在 SYSOP 看板有如下的回文,\n"
+ "看起來像是使用了某些不正常的程式導致發文結果異常。\n" ANSI_RESET);
+ fp = fopen(src, "rt");
+ for (i = 0; i < (t_lines - 6) && fgets(buf, sizeof(buf), fp); i++) {
+ outs(buf);
+ }
+ fclose(fp);
+ outs(ANSI_RESET ANSI_COLOR(1;31)
+ "為了避免類似的問題再度發生,我們必須請您回答下列問題:\n" ANSI_RESET);
+ y = vgety();
+
+ do {
+ mvouts(y, 0, "請問您發文時使用的是什麼程式?"
+ "(例: telnet, PCMan, BBSReader, 手機App, ...)\n");
+ getdata(y+1, 0, "發文程式: ", buf, DISP_TTLEN, DOECHO);
+ trim(buf);
+ } while (strlen(buf) < 2);
+ mvprints(y++, 0, "發文程式: %s\n", buf);
+ log_filef(dest, LOG_CREAT, "%s program: %s\n", Cdatelite(&now), buf);
+
+ do {
+ getdata(y, 0, "發文時你是在信箱(m)回文還是在看板(b)上回文? [m/b]: ",
+ buf, 3, LCECHO);
+ } while (*buf != 'm' && *buf != 'b');
+ mvprints(y++, 0, "發文位置: %s", *buf == 'm' ? "信箱" : "看板");
+ log_filef(dest, LOG_CREAT, "%s location: %c %s\n", Cdatelite(&now),
+ *buf, *buf == 'm' ? "mailbox" : "board");
+
+ do {
+ mvouts(y, 0, "當時有任何異常的資訊可以提供給我們參考嗎?");
+ getdata(y+1, 0, "其它: ", buf, DISP_TTLEN, DOECHO);
+ trim(buf);
+ } while (0);
+ log_filef(dest, LOG_CREAT, "%s info: %s\n", Cdatelite(&now), buf);
+
+ vmsg("謝謝您的合作。如果您想提供更多資訊歡迎至" BN_BUGREPORT "報告");
+}
+
inline static void append_log_recent_login()
{
char buf[STRLEN], logfn[PATHLEN];
@@ -1250,6 +1305,9 @@ user_login(void)
append_log_recent_login();
check_bad_login();
+#ifdef USE_CHECK_BAD_CLIENTS
+ check_bad_clients();
+#endif
check_register();
pwcuLoginSave(); // is_first_login_of_today is only valid after pwcuLoginSave.
// cuser.lastlogin 由 pwcuLoginSave 後值就變了,要看 last_login_time