summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--UPDATING4
-rw-r--r--include/proto.h3
-rw-r--r--mbbsd/chicken.c2
-rw-r--r--mbbsd/menu.c2
-rw-r--r--mbbsd/register.c82
-rw-r--r--mbbsd/var.c1
-rw-r--r--upgrade/r4035_regnew.c169
7 files changed, 228 insertions, 35 deletions
diff --git a/UPDATING b/UPDATING
index 20180d44..9d78ac6b 100644
--- a/UPDATING
+++ b/UPDATING
@@ -15,6 +15,10 @@ https://opensvn.csie.org/traccgi/pttbbs/changeset/2273
-----------------------------------------------------------------------------
+r4035: [REGISTER]
+註冊系統導入 Regform v2, 請用 upgrade/r4035_regnew 轉移已填註冊單。
+(Regform2 可由 USE_REGFORM2 開啟)
+
r3968: [CHICKEN]
把 Chicken 搬出 PASSWD, 並且改用 mmap 同步。
請記得關站後執行 upgrade/r3968_chicken 轉移資料後再重開 BBS。
diff --git a/include/proto.h b/include/proto.h
index 2fabbfba..f324d338 100644
--- a/include/proto.h
+++ b/include/proto.h
@@ -514,10 +514,11 @@ int getindex(const char *fpath, fileheader_t *fh, int start);
/* register */
int u_register(void);
-int getnewuserid(void);
int bad_user_id(const char *userid);
+int getnewuserid(void);
int checkpasswd(const char *passwd, char *test);
int setupnewuser(const userec_t *user);
+int regform_estimate_queuesize();
void new_register(void);
void check_register(void);
void delregcodefile(void);
diff --git a/mbbsd/chicken.c b/mbbsd/chicken.c
index 4de2bb85..368ddd19 100644
--- a/mbbsd/chicken.c
+++ b/mbbsd/chicken.c
@@ -846,7 +846,7 @@ recover_chicken(chicken_t * thechicken)
chicken_type[(int)thechicken->type], price);
outmsg(buf);
bell();
- getdata_str(21, 0, " 選擇:(N:坑人嘛/y:請幫幫我)", buf, 3, LCECHO, "N");
+ getdata(21, 0, " 選擇 (N:坑人嘛/y:請幫幫我): ", buf, 3, LCECHO);
if (buf[0] == 'y' || buf[0] == 'Y') {
reload_money();
if (cuser.money < price) {
diff --git a/mbbsd/menu.c b/mbbsd/menu.c
index 6aaf3399..e34685db 100644
--- a/mbbsd/menu.c
+++ b/mbbsd/menu.c
@@ -55,7 +55,7 @@ showtitle(const char *title, const char *mid)
mid = " 你有新信件 ";
mid_attr = ANSI_COLOR(41;5);
} else if ( HasUserPerm(PERM_ACCTREG) ) {
- int nreg = dashs((char *)fn_register) / 163;
+ int nreg = regform_estimate_queuesize();
if(nreg > 100)
{
sprintf(buf, " 有 %03d 未審核 ", nreg);
diff --git a/mbbsd/register.c b/mbbsd/register.c
index b1dc3975..face58b2 100644
--- a/mbbsd/register.c
+++ b/mbbsd/register.c
@@ -6,6 +6,9 @@
#define FN_JUSTIFY_WAIT "justify.wait"
#define FN_REJECT_NOTIFY "justify.reject"
+// Regform1 file name (deprecated)
+#define fn_register "register.new"
+
// New style (Regform2) file names:
#define FN_REGFORM "regform" // registration form in user home
#define FN_REGFORM_LOG "regform.log" // regform history in user home
@@ -945,46 +948,54 @@ u_register(void)
char phone[20], career[40], email[50], birthday[11], sex_is[2];
unsigned char year, mon, day;
char inregcode[14], regcode[50];
- char ans[3], *ptr, *errcode;
+ char ans[3], *errcode;
char genbuf[200];
FILE *fn;
+ int i = 0;
if (cuser.userlevel & PERM_LOGINOK) {
outs("您的身份確認已經完成,不需填寫申請表");
return XEASY;
}
- if ((fn = fopen(fn_register, "r"))) {
- int i =0;
- while (fgets(genbuf, STRLEN, fn)) {
- if ((ptr = strchr(genbuf, '\n')))
- *ptr = '\0';
- if (strncmp(genbuf, "uid: ", 5) != 0)
- continue;
- i++;
- if(strcmp(genbuf + 5, cuser.userid) != 0)
- continue;
- fclose(fn);
- /* idiots complain about this, so bug them */
- clear();
- move(3, 0);
- prints(" 您的註冊申請單尚在處理中(處理順位: %d),請耐心等候\n\n", i);
- outs(" 如果您已收到註冊碼卻看到這個畫面,那代表您在使用 Email 註冊後\n");
- outs(" " ANSI_COLOR(1;31) "又另外申請了站長直接人工審核的註冊申請單。"
- ANSI_RESET "\n\n");
- outs(" 進入人工審核程序後 Email 註冊自動失效,有註冊碼也沒用,\n");
- outs(" 要等到審核完成 (會多花很多時間,通常起碼數天) ,所以請耐心等候。\n\n");
-
- /* 下面是國王的 code 所需要的 message */
+
+#ifdef USE_REGFORM2
+ // TODO REGFORM 2 checks 2 parts.
+ i = file_find_record(FN_REQLIST, cuser.userid);
+#else
+ fn = fopen(fn_register, "rt");
+ while (fn && fgets(genbuf, STRLEN, fn)) {
+ if (strncmp(genbuf, "uid: ", 5) != 0)
+ continue;
+ i++;
+ if ((ptr = strchr(genbuf, '\n')))
+ *ptr = '\0';
+ if(strcmp(genbuf + 5, cuser.userid) == 0)
+ break;
+ genbuf[0] = 0;
+ }
+ if (!genbuf[0]) i = 0; // drop index if not found.
+ if (fn) fclose(fn);
+#endif // !USE_REGFORM2
+
+ if (i > 0)
+ {
+ clear();
+ move(3, 0);
+ prints(" 您的註冊申請單尚在處理中(處理順位: %d),請耐心等候\n\n", i);
+ outs(" 如果您已收到註冊碼卻看到這個畫面,那代表您在使用 Email 註冊後\n");
+ outs(" " ANSI_COLOR(1;31) "又另外申請了站長直接人工審核的註冊申請單。"
+ ANSI_RESET "\n\n");
+ outs(" 進入人工審核程序後 Email 註冊自動失效,有註冊碼也沒用,\n");
+ outs(" 要等到審核完成 (會多花很多時間,通常起碼數天) ,所以請耐心等候。\n\n");
+ /* 下面是國王的 code 所需要的 message */
#if 0
- outs(" 另外請注意,若站長審註冊單時您正在站上則會無法審核、自動跳過。\n");
- outs(" 所以等候審核時請勿掛站。若超過兩三天仍未被審到,通常就是這個原因。\n");
+ outs(" 另外請注意,若站長審註冊單時您正在站上則會無法審核、自動跳過。\n");
+ outs(" 所以等候審核時請勿掛站。若超過兩三天仍未被審到,通常就是這個原因。\n");
#endif
-
- vmsg("您的註冊申請單尚在處理中");
- return FULLUPDATE;
- }
- fclose(fn);
+ vmsg("您的註冊申請單尚在處理中");
+ return FULLUPDATE;
}
+
strlcpy(rname, cuser.realname, sizeof(rname));
strlcpy(addr, cuser.address, sizeof(addr));
strlcpy(email, cuser.email, sizeof(email));
@@ -1355,6 +1366,15 @@ append_regform(const RegformEntry *pre, const char *logfn,
return 1;
}
+int regform_estimate_queuesize()
+{
+#ifdef USE_REGFORM2
+ return dashs(FN_REQLIST) / IDLEN;
+#else
+ return dashs(fn_register) / 163;
+#endif // !USE_REGFORM2
+}
+
/////////////////////////////////////////////////////////////////////////////
// Administration (SYSOP Validation)
/////////////////////////////////////////////////////////////////////////////
@@ -2319,7 +2339,7 @@ regform2_validate_page(int dryrun)
// finishing
clear(); move(5, 0);
- prints("您審了 %d 份註冊單份。", tid);
+ prints("您審了 %d 份註冊單。", tid);
pressanykey();
return 0;
}
diff --git a/mbbsd/var.c b/mbbsd/var.c
index e48b94c3..9f1932cb 100644
--- a/mbbsd/var.c
+++ b/mbbsd/var.c
@@ -112,7 +112,6 @@ unsigned char currfmode; /* current file mode */
char * const fn_passwd = FN_PASSWD;
char * const fn_board = FN_BOARD;
-char * const fn_register = "register.new";
char * const fn_note_ans = FN_NOTE_ANS;
const char * const fn_plans = "plans";
const char * const fn_writelog = "writelog";
diff --git a/upgrade/r4035_regnew.c b/upgrade/r4035_regnew.c
new file mode 100644
index 00000000..8af4cd6f
--- /dev/null
+++ b/upgrade/r4035_regnew.c
@@ -0,0 +1,169 @@
+/* $Id$ */
+#include "bbs.h"
+#include "cmbbs.h"
+
+// New style (Regform2) file names:
+#define FN_REGFORM "regform" // registration form in user home
+#define FN_REGFORM_LOG "regform.log" // regform history in user home
+#define FN_REQLIST "reg.wait" // request list file, in global directory (replacing fn_register)
+
+#define FN_OLDREG "register.new"
+
+////////////////////////////////////////////////////////////////////////////
+// Regform Utilities
+////////////////////////////////////////////////////////////////////////////
+
+// TODO define and use structure instead, even in reg request file.
+typedef struct {
+ // current format:
+ // (optional) num: unum, date
+ // [0] uid: xxxxx (IDLEN=12)
+ // [1] name: RRRRRR (20)
+ // [2] career: YYYYYYYYYYYYYYYYYYYYYYYYYY (40)
+ // [3] addr: TTTTTTTTT (50)
+ // [4] phone: 02DDDDDDDD (20)
+ // [5] email: x (50) (deprecated)
+ // [6] mobile: (deprecated)
+ // [7] ----
+ // lasthost: 16
+ char userid[IDLEN+1];
+
+ char exist;
+ char online;
+ char pad [ 5]; // IDLEN(12)+1+1+1+5=20
+
+ char name [20];
+ char career[40];
+ char addr [50];
+ char phone [20];
+} RegformEntry;
+
+// regform format utilities
+int
+load_regform_entry(RegformEntry *pre, FILE *fp)
+{
+ char buf[STRLEN];
+ char *v;
+
+ memset(pre, 0, sizeof(RegformEntry));
+ while (fgets(buf, sizeof(buf), fp))
+ {
+ if (buf[0] == '-')
+ break;
+ buf[sizeof(buf)-1] = 0;
+ v = strchr(buf, ':');
+ if (v == NULL)
+ continue;
+ *v++ = 0;
+ if (*v == ' ') v++;
+ chomp(v);
+
+ if (strcmp(buf, "uid") == 0)
+ strlcpy(pre->userid, v, sizeof(pre->userid));
+ else if (strcmp(buf, "name") == 0)
+ strlcpy(pre->name, v, sizeof(pre->name));
+ else if (strcmp(buf, "career") == 0)
+ strlcpy(pre->career, v, sizeof(pre->career));
+ else if (strcmp(buf, "addr") == 0)
+ strlcpy(pre->addr, v, sizeof(pre->addr));
+ else if (strcmp(buf, "phone") == 0)
+ strlcpy(pre->phone, v, sizeof(pre->phone));
+ }
+ return pre->userid[0] ? 1 : 0;
+}
+
+int
+print_regform_entry(const RegformEntry *pre, FILE *fp, int close)
+{
+ fprintf(fp, "uid: %s\n", pre->userid);
+ fprintf(fp, "name: %s\n", pre->name);
+ fprintf(fp, "career: %s\n", pre->career);
+ fprintf(fp, "addr: %s\n", pre->addr);
+ fprintf(fp, "phone: %s\n", pre->phone);
+ if (close)
+ fprintf(fp, "----\n");
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Regform2 API
+////////////////////////////////////////////////////////////////////////////
+
+// registration queue
+int
+regq_append(const char *userid)
+{
+ if (file_append_record(FN_REQLIST, userid) < 0)
+ return 0;
+ return 1;
+}
+
+int
+regq_find(const char *userid)
+{
+ return file_find_record(FN_REQLIST, userid);
+}
+
+// user home regform operation
+int
+regfrm_exist(const char *userid)
+{
+ char fn[PATHLEN];
+ sethomefile(fn, userid, FN_REGFORM);
+ return dashf(fn) ? 1 : 0;
+}
+
+int
+regfrm_load(const char *userid, RegformEntry *pre)
+{
+ FILE *fp = NULL;
+ char fn[PATHLEN];
+ int ret = 0;
+ sethomefile(fn, userid, FN_REGFORM);
+ if (!dashf(fn))
+ return 0;
+
+ fp = fopen(fn, "rt");
+ if (!fp)
+ return 0;
+ ret = load_regform_entry(pre, fp);
+ fclose(fp);
+ return ret;
+}
+
+int
+regfrm_save(const char *userid, const RegformEntry *pre)
+{
+ FILE *fp = NULL;
+ char fn[PATHLEN];
+ int ret = 0;
+ sethomefile(fn, userid, FN_REGFORM);
+
+ fp = fopen(fn, "wt");
+ if (!fp)
+ return 0;
+ ret = print_regform_entry(pre, fp, 1);
+ fclose(fp);
+ return ret;
+}
+
+int main()
+{
+ FILE *fp = NULL;
+ RegformEntry re;
+ chdir(BBSHOME);
+ fp = fopen(FN_OLDREG, "rt");
+ if(!fp) {
+ printf("no register.new file. abort.\n");
+ return 0;
+ }
+ while (load_regform_entry(&re, fp))
+ {
+ printf("converting: %s\n", re.userid);
+ regfrm_save(re.userid, &re);
+ if (!regq_find(re.userid))
+ regq_append(re.userid);
+ }
+ fclose(fp);
+ return 0;
+}