summaryrefslogtreecommitdiffstats
path: root/mbbsd/user.c
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-03-06 20:09:00 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-03-06 20:09:00 +0800
commit1ff37fcf607bfc356c60d423ad05fca9d9eab190 (patch)
tree86500ec110b3f80babee1bb958a3d553b54cded5 /mbbsd/user.c
parent113ce755bf96bb52e5e6336be82363d79582aca0 (diff)
downloadpttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.tar
pttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.tar.gz
pttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.tar.bz2
pttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.tar.lz
pttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.tar.xz
pttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.tar.zst
pttbbs-1ff37fcf607bfc356c60d423ad05fca9d9eab190.zip
- [code refine] move all registration code to register.c
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3966 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/user.c')
-rw-r--r--mbbsd/user.c751
1 files changed, 5 insertions, 746 deletions
diff --git a/mbbsd/user.c b/mbbsd/user.c
index a44e500e..9c686b24 100644
--- a/mbbsd/user.c
+++ b/mbbsd/user.c
@@ -15,8 +15,6 @@ static const char * const chess_type[3] = {
};
#endif
-#define REGCODE_INITIAL "v6" // always 2 characters
-
int
kill_user(int num, const char *userid)
{
@@ -525,146 +523,6 @@ void Customize(void)
vmsg("設定完成");
}
-static char *
-getregfile(char *buf)
-{
- // not in user's home because s/he could zip his/her home
- snprintf(buf, PATHLEN, "jobspool/.regcode.%s", cuser.userid);
- return buf;
-}
-
-static char *
-makeregcode(char *buf)
-{
- char fpath[PATHLEN];
- int fd, i;
- // prevent ambigious characters: oOlI
- const char *alphabet = "qwertyuipasdfghjkzxcvbnmoQWERTYUPASDFGHJKLZXCVBNM";
-
- /* generate a new regcode */
- buf[13] = 0;
- buf[0] = REGCODE_INITIAL[0];
- buf[1] = REGCODE_INITIAL[1];
- for( i = 2 ; i < 13 ; ++i )
- buf[i] = alphabet[random() % strlen(alphabet)];
-
- getregfile(fpath);
- if( (fd = open(fpath, O_WRONLY | O_CREAT, 0600)) == -1 ){
- perror("open");
- exit(1);
- }
- write(fd, buf, 13);
- close(fd);
-
- return buf;
-}
-
-static char *
-getregcode(char *buf)
-{
- int fd;
- char fpath[PATHLEN];
-
- getregfile(fpath);
- if( (fd = open(fpath, O_RDONLY)) == -1 ){
- buf[0] = 0;
- return buf;
- }
- read(fd, buf, 13);
- close(fd);
- buf[13] = 0;
- return buf;
-}
-
-static void
-delregcodefile(void)
-{
- char fpath[PATHLEN];
- getregfile(fpath);
- unlink(fpath);
-}
-
-#ifdef DEBUG
-int
-_debug_testregcode()
-{
- char buf[16], rcode[16];
- char myid[16];
- int i = 1;
-
- clear();
- strcpy(myid, cuser.userid);
- do {
- getdata(0, 0, "輸入 id (空白結束): ",
- buf, IDLEN+1, DOECHO);
- if(buf[0])
- {
- move(i++, 0);
- i %= t_lines;
- if(i == 0)
- i = 1;
- strcpy(cuser.userid, buf);
- prints("id: [%s], regcode: [%s]\n",
- cuser.userid, getregcode(rcode));
- move(i, 0);
- clrtoeol();
- }
- } while (buf[0]);
- strcpy(cuser.userid, myid);
-
- pressanykey();
- return 0;
-}
-#endif
-
-static void
-justify_wait(char *userid, char *phone, char *career,
- char *rname, char *addr, char *mobile)
-{
- char buf[PATHLEN];
- sethomefile(buf, userid, "justify.wait");
- if (phone[0] != 0) {
- FILE* fn = fopen(buf, "w");
- assert(fn);
- fprintf(fn, "%s\n%s\ndummy\n%s\n%s\n%s\n",
- phone, career, rname, addr, mobile);
- fclose(fn);
- }
-}
-
-static void email_justify(const userec_t *muser)
-{
- char tmp[IDLEN + 1], buf[256], genbuf[256];
- /*
- * It is intended to use BBSENAME instead of BBSNAME here.
- * Because recently many poor users with poor mail clients
- * (or evil mail servers) cannot handle/decode Chinese
- * subjects (BBSNAME) correctly, so we'd like to use
- * BBSENAME here to prevent subject being messed up.
- * And please keep BBSENAME short or it may be truncated
- * by evil mail servers.
- */
- snprintf(buf, sizeof(buf),
- " " BBSENAME " - [ %s ]", makeregcode(genbuf));
-
- strlcpy(tmp, cuser.userid, sizeof(tmp));
- // XXX dirty, set userid=SYSOP
- strlcpy(cuser.userid, str_sysop, sizeof(cuser.userid));
-#ifdef HAVEMOBILE
- if (strcmp(muser->email, "m") == 0 || strcmp(muser->email, "M") == 0)
- mobile_message(mobile, buf);
- else
-#endif
- bsmtp("etc/registermail", buf, muser->email);
- strlcpy(cuser.userid, tmp, sizeof(cuser.userid));
- move(20,0);
- clrtobot();
- outs("我們即將寄出認證信 (您應該會在 10 分鐘內收到)\n"
- "收到後您可以根據認證信標題的認證碼\n"
- "輸入到 (U)ser -> (R)egister 後就可以完成註冊");
- pressanykey();
- return;
-}
void
uinfo_query(userec_t *u, int adminmode, int unum)
@@ -696,7 +554,7 @@ uinfo_query(userec_t *u, int adminmode, int unum)
memcpy(&x, u, sizeof(userec_t));
ans = getans(adminmode ?
- "(1)改資料(2)密碼(3)權限(4)砍帳號(5)改ID(6)寵物(7)審判(M)信箱 [0]結束 " :
+ "(1)改資料(2)密碼(3)權限(4)砍帳號(5)改ID(7)審判(M)信箱 [0]結束 " :
"請選擇 (1)修改資料 (2)設定密碼 (M)修改信箱 (C) 個人化設定 ==> [0]結束 ");
if (ans > '2' && ans != 'm' && ans != 'c' && !adminmode)
@@ -1050,6 +908,9 @@ uinfo_query(userec_t *u, int adminmode, int unum)
}
strlcpy(genbuf, buf, PASSLEN);
+ move(y+1, 0);
+ outs("請注意設定密碼只有前八個字元有效,超過的將自動忽略。");
+
getdata(y++, 0, "請檢查新密碼:", buf, PASSLEN, NOECHO);
if (strncmp(buf, genbuf, PASSLEN)) {
outs("\n\n新密碼確認失敗, 無法設定新密碼\n");
@@ -1087,12 +948,6 @@ uinfo_query(userec_t *u, int adminmode, int unum)
strlcpy(x.userid, genbuf, sizeof(x.userid));
}
break;
- case '6':
- if (x.mychicken.name[0])
- x.mychicken.name[0] = 0;
- else
- strlcpy(x.mychicken.name, "[死]", sizeof(x.mychicken.name));
- break;
default:
return;
}
@@ -1118,22 +973,8 @@ uinfo_query(userec_t *u, int adminmode, int unum)
setuserid(unum, x.userid);
}
if (mail_changed && !adminmode) {
- char justify_tmp[REGLEN + 1];
- char *phone, *career;
- char *strtok_pos;
- strlcpy(justify_tmp, u->justify, sizeof(justify_tmp));
-
+ // wait registration.
x.userlevel &= ~(PERM_LOGINOK | PERM_POST);
-
- phone = strtok_r(justify_tmp, ":", &strtok_pos);
- career = strtok_r(NULL, ":", &strtok_pos);
-
- if (phone == NULL) phone = "";
- if (career == NULL) career = "";
-
- snprintf(buf, sizeof(buf), "%d", x.mobile);
-
- justify_wait(x.userid, phone, career, x.realname, x.address, buf);
}
memcpy(u, &x, sizeof(x));
if (tokill) {
@@ -1380,41 +1221,6 @@ u_editplan(void)
return 0;
}
-
-/* 使用者填寫註冊表格 */
-static void
-getfield(int line, const char *info, const char *desc, char *buf, int len)
-{
- char prompt[STRLEN];
- char genbuf[200];
-
- // clear first
- move(line+1, 0); clrtoeol();
- move(line, 0); clrtoeol();
- prints(" 原先設定:%-30.30s (%s)", buf, info);
- snprintf(prompt, sizeof(prompt), " %s:", desc);
- if (getdata_str(line + 1, 0, prompt, genbuf, len, DOECHO, buf))
- strcpy(buf, genbuf);
- move(line+1, 0); clrtoeol();
- move(line, 0); clrtoeol();
- prints(" %s:%s", desc, buf);
-}
-
-static int
-removespace(char *s)
-{
- int i, index;
-
- for (i = 0, index = 0; s[i]; i++) {
- if (s[i] != ' ')
- s[index++] = s[i];
- }
- s[index] = '\0';
- return index;
-}
-
-
-
int
isvalidemail(const char *email)
{
@@ -1443,553 +1249,6 @@ isvalidemail(const char *email)
return 1;
}
-static void
-toregister(char *email, char *phone, char *career,
- char *rname, char *addr, char *mobile)
-{
- FILE *fn = NULL;
-
- justify_wait(cuser.userid, phone, career, rname, addr, mobile);
-
- clear();
- stand_title("認證設定");
- if (cuser.userlevel & PERM_NOREGCODE){
- strcpy(email, "x");
- goto REGFORM2;
- }
- move(1, 0);
- outs("您好, 本站認證認證的方式有:\n"
- " 1.若您有 E-Mail (本站不接受 yahoo, kimo等免費的 E-Mail)\n"
- " 請輸入您的 E-Mail , 我們會寄發含有認證碼的信件給您\n"
- " 收到後請到 (U)ser => (R)egister 輸入認證碼, 即可通過認證\n"
- "\n"
- " 2.若您沒有 E-Mail 或是一直無法收到認證信, 請輸入 x \n"
- " 會有站長親自人工審核註冊資料," ANSI_COLOR(1;33)
- "但注意這可能會花上數週或更多時間。" ANSI_RESET "\n"
- "**********************************************************\n"
- "* 注意! *\n"
- "* 通常應該會在輸入完成後十分鐘內收到認證信, 若過久未收到 *\n"
- "* 請到郵件垃圾桶檢查是否被當作垃圾信(SPAM)了,另外若是 *\n"
- "* 輸入後發生認證碼錯誤請重填一次 E-Mail *\n"
- "**********************************************************\n");
-
-#ifdef HAVEMOBILE
- outs(" 3.若您有手機門號且想採取手機簡訊認證的方式 , 請輸入 m \n"
- " 我們將會寄發含有認證碼的簡訊給您 \n"
- " 收到後請到(U)ser => (R)egister 輸入認證碼, 即可通過認證\n");
-#endif
-
- while (1) {
- email[0] = 0;
- getfield(15, "身分認證用", "E-Mail Address", email, 50);
- if (strcmp(email, "x") == 0 || strcmp(email, "X") == 0)
- break;
-#ifdef HAVEMOBILE
- else if (strcmp(email, "m") == 0 || strcmp(email, "M") == 0) {
- if (isvalidmobile(mobile)) {
- char yn[3];
- getdata(16, 0, "請再次確認您輸入的手機號碼正確嘛? [y/N]",
- yn, sizeof(yn), LCECHO);
- if (yn[0] == 'Y' || yn[0] == 'y')
- break;
- } else {
- move(15, 0); clrtobot();
- move(17, 0);
- outs("指定的手機號碼不正確,"
- "若您無手機門號請選擇其他方式認證");
- }
-
- }
-#endif
- else if (isvalidemail(email)) {
- char yn[3];
-#ifdef USE_EMAILDB
- int email_count = emaildb_check_email(email, strlen(email));
-
- if (email_count < 0) {
- move(15, 0); clrtobot();
- move(17, 0);
- outs("暫時不允許\ email 認證註冊, 請稍後再試\n");
- pressanykey();
- return;
- } else if (email_count >= EMAILDB_LIMIT) {
- move(15, 0); clrtobot();
- move(17, 0);
- outs("指定的 E-Mail 已註冊過多帳號, 請使用其他 E-Mail, 或輸入 x 採手動認證\n");
- outs("但注意手動認證通常會花上數週以上的時間。\n");
- } else {
-#endif
- getdata(16, 0, "請再次確認您輸入的 E-Mail 位置正確嘛? [y/N]",
- yn, sizeof(yn), LCECHO);
- if (yn[0] == 'Y' || yn[0] == 'y')
- break;
-#ifdef USE_EMAILDB
- }
-#endif
- } else {
- move(15, 0); clrtobot();
- move(17, 0);
- outs("指定的 E-Mail 不正確, 若您無 E-Mail 請輸入 x 由站長手動認證\n");
- outs("但注意手動認證通常會花上數週以上的時間。\n");
- }
- }
-#ifdef USE_EMAILDB
- if (emaildb_update_email(cuser.userid, strlen(cuser.userid),
- email, strlen(email)) < 0) {
- move(15, 0); clrtobot();
- move(17, 0);
- outs("暫時不允許\ email 認證註冊, 請稍後再試\n");
- pressanykey();
- return;
- }
-#endif
- strlcpy(cuser.email, email, sizeof(cuser.email));
- REGFORM2:
- if (strcasecmp(email, "x") == 0) { /* 手動認證 */
- if ((fn = fopen(fn_register, "a"))) {
- fprintf(fn, "num: %d, %s", usernum, ctime4(&now));
- fprintf(fn, "uid: %s\n", cuser.userid);
- fprintf(fn, "name: %s\n", rname);
- fprintf(fn, "career: %s\n", career);
- fprintf(fn, "addr: %s\n", addr);
- fprintf(fn, "phone: %s\n", phone);
- fprintf(fn, "mobile: %s\n", mobile);
- fprintf(fn, "email: %s\n", email);
- fprintf(fn, "----\n");
- fclose(fn);
- // save justify information
- snprintf(cuser.justify, sizeof(cuser.justify),
- "%s:%s:<Manual>", phone, career);
- }
- // XXX what if we cannot open register form?
- } else {
- // register by mail of phone
- snprintf(cuser.justify, sizeof(cuser.justify),
- "%s:%s:<Email>", phone, career);
-#ifdef HAVEMOBILE
- if (phone != NULL && email[1] == 0 && tolower(email[0]) == 'm')
- sprintf(cuser.justify, sizeof(cuser.justify),
- "%s:%s:<Mobile>", phone, career);
-#endif
- email_justify(&cuser);
- }
-}
-
-static int HaveRejectStr(const char *s, const char **rej)
-{
- int i;
- char *ptr, *rejectstr[] =
- {"幹", "阿", "不", "你媽", "某", "笨", "呆", "..", "xx",
- "你管", "管我", "猜", "天才", "超人",
- "ㄅ", "ㄆ", "ㄇ", "ㄈ", "ㄉ", "ㄊ", "ㄋ", "ㄌ", "ㄍ", "ㄎ", "ㄏ",
- "ㄐ", "ㄑ", "ㄒ", "ㄓ",/*"ㄔ",*/ "ㄕ", "ㄖ", "ㄗ", "ㄘ", "ㄙ",
- "ㄧ", "ㄨ", "ㄩ", "ㄚ", "ㄛ", "ㄜ", "ㄝ", "ㄞ", "ㄟ", "ㄠ", "ㄡ",
- "ㄢ", "ㄣ", "ㄤ", "ㄥ", "ㄦ", NULL};
-
- if( rej != NULL )
- for( i = 0 ; rej[i] != NULL ; ++i )
- if( strstr(s, rej[i]) )
- return 1;
-
- for( i = 0 ; rejectstr[i] != NULL ; ++i )
- if( strstr(s, rejectstr[i]) )
- return 1;
-
- if( (ptr = strstr(s, "ㄔ")) != NULL ){
- if( ptr != s && strncmp(ptr - 1, "都市", 4) == 0 )
- return 0;
- return 1;
- }
- return 0;
-}
-
-char *isvalidname(char *rname)
-{
-#ifdef FOREIGN_REG
- return NULL;
-#else
- const char *rejectstr[] =
- {"肥", "胖", "豬頭", "小白", "小明", "路人", "老王", "老李", "寶貝",
- "先生", "帥哥", "老頭", "小姊", "小姐", "美女", "小妹", "大頭",
- "公主", "同學", "寶寶", "公子", "大頭", "小小", "小弟", "小妹",
- "妹妹", "嘿", "嗯", "爺爺", "大哥", "無",
- NULL};
- if( removespace(rname) && rname[0] < 0 &&
- strlen(rname) >= 4 &&
- !HaveRejectStr(rname, rejectstr) &&
- strncmp(rname, "小", 2) != 0 && //起頭是「小」
- strncmp(rname, "我是", 4) != 0 && //起頭是「我是」
- !(strlen(rname) == 4 && strncmp(&rname[2], "兒", 2) == 0) &&
- !(strlen(rname) >= 4 && strncmp(&rname[0], &rname[2], 2) == 0))
- return NULL;
- return "您的輸入不正確";
-#endif
-
-}
-
-static char *isvalidcareer(char *career)
-{
-#ifndef FOREIGN_REG
- const char *rejectstr[] = {NULL};
- if (!(removespace(career) && career[0] < 0 && strlen(career) >= 6) ||
- strcmp(career, "家裡") == 0 || HaveRejectStr(career, rejectstr) )
- return "您的輸入不正確";
- if (strcmp(&career[strlen(career) - 2], "大") == 0 ||
- strcmp(&career[strlen(career) - 4], "大學") == 0 ||
- strcmp(career, "學生大學") == 0)
- return "麻煩請加學校系所";
- if (strcmp(career, "學生高中") == 0)
- return "麻煩輸入學校名稱";
-#else
- if( strlen(career) < 6 )
- return "您的輸入不正確";
-#endif
- return NULL;
-}
-
-char *isvalidaddr(char *addr)
-{
- const char *rejectstr[] =
- {"地球", "銀河", "火星", NULL};
-
- // addr[0] > 0: check if address is starting by Chinese.
- if (!removespace(addr) || strlen(addr) < 15)
- return "這個地址似乎並不完整";
- if (strstr(addr, "信箱") != NULL || strstr(addr, "郵政") != NULL)
- return "抱歉我們不接受郵政信箱";
- if ((strstr(addr, "市") == NULL && strstr(addr, "巿") == NULL &&
- strstr(addr, "縣") == NULL && strstr(addr, "室") == NULL) ||
- HaveRejectStr(addr, rejectstr) ||
- strcmp(&addr[strlen(addr) - 2], "段") == 0 ||
- strcmp(&addr[strlen(addr) - 2], "路") == 0 ||
- strcmp(&addr[strlen(addr) - 2], "巷") == 0 ||
- strcmp(&addr[strlen(addr) - 2], "弄") == 0 ||
- strcmp(&addr[strlen(addr) - 2], "區") == 0 ||
- strcmp(&addr[strlen(addr) - 2], "市") == 0 ||
- strcmp(&addr[strlen(addr) - 2], "街") == 0 )
- return "這個地址似乎並不完整";
- return NULL;
-}
-
-static char *isvalidphone(char *phone)
-{
- int i;
- for( i = 0 ; phone[i] != 0 ; ++i )
- if( !isdigit((int)phone[i]) )
- return "請不要加分隔符號";
- if (!removespace(phone) ||
- strlen(phone) < 9 ||
- strstr(phone, "00000000") != NULL ||
- strstr(phone, "22222222") != NULL ) {
- return "這個電話號碼並不正確(請含區碼)" ;
- }
- return NULL;
-}
-
-int
-u_register(void)
-{
- char rname[20], addr[50], mobile[16];
-#ifdef FOREIGN_REG
- char fore[2];
-#endif
- 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 genbuf[200];
- FILE *fn;
-
- 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("該死,都不看說明的...\n");
- outs(" 進入人工審核程序後 Email 註冊自動失效,有註冊碼也沒用,\n");
- outs(" 要等到審核完成 (會多花很多時間,通常起碼數天) ,所以請耐心等候。\n\n");
-
- /* 下面是國王的 code 所需要的 message */
-#if 0
- outs(" 另外請注意,若站長審註冊單時您正在站上則會無法審核、自動跳過。\n");
- outs(" 所以等候審核時請勿掛站。若超過兩三天仍未被審到,通常就是這個原因。\n");
-#endif
-
- vmsg("您的註冊申請單尚在處理中");
- return FULLUPDATE;
- }
- fclose(fn);
- }
- strlcpy(rname, cuser.realname, sizeof(rname));
- strlcpy(addr, cuser.address, sizeof(addr));
- strlcpy(email, cuser.email, sizeof(email));
- if (cuser.mobile)
- snprintf(mobile, sizeof(mobile), "0%09d", cuser.mobile);
- else
- mobile[0] = 0;
- if (cuser.month == 0 && cuser.day == 0 && cuser.year == 0)
- birthday[0] = 0;
- else
- snprintf(birthday, sizeof(birthday), "%04i/%02i/%02i",
- 1900 + cuser.year, cuser.month, cuser.day);
- sex_is[0] = (cuser.sex % 8) + '1';
- sex_is[1] = 0;
- career[0] = phone[0] = '\0';
- sethomefile(genbuf, cuser.userid, "justify.wait");
- if ((fn = fopen(genbuf, "r"))) {
- fgets(genbuf, sizeof(genbuf), fn);
- chomp(genbuf);
- strlcpy(phone, genbuf, sizeof(phone));
-
- fgets(genbuf, sizeof(genbuf), fn);
- chomp(genbuf);
- strlcpy(career, genbuf, sizeof(career));
-
- fgets(genbuf, sizeof(genbuf), fn); // old version compatible
-
- fgets(genbuf, sizeof(genbuf), fn);
- chomp(genbuf);
- strlcpy(rname, genbuf, sizeof(rname));
-
- fgets(genbuf, sizeof(genbuf), fn);
- chomp(genbuf);
- strlcpy(addr, genbuf, sizeof(addr));
-
- fgets(genbuf, sizeof(genbuf), fn);
- chomp(genbuf);
- strlcpy(mobile, genbuf, sizeof(mobile));
-
- fclose(fn);
- }
-
- if (cuser.userlevel & PERM_NOREGCODE) {
- vmsg("您不被允許\使用認證碼認證。請填寫註冊申請單");
- goto REGFORM;
- }
-
- // getregcode(regcode);
-
- // XXX why check by year?
- // birthday is moved to earlier, so let's check email instead.
- if (cuser.email[0] && // cuser.year != 0 && /* 已經第一次填過了~ ^^" */
- strcmp(cuser.email, "x") != 0 && /* 上次手動認證失敗 */
- strcmp(cuser.email, "X") != 0)
- {
- clear();
- stand_title("EMail認證");
- move(2, 0);
-
- prints("請輸入您的認證碼。(由 %s 開頭無空白的十三碼)\n"
- "或輸入 x 來重新填寫 E-Mail 或改由站長手動認證\n", REGCODE_INITIAL);
- inregcode[0] = 0;
-
- do{
- getdata(10, 0, "您的認證碼:",
- inregcode, sizeof(inregcode), DOECHO);
- if( strcmp(inregcode, "x") == 0 || strcmp(inregcode, "X") == 0 )
- break;
- if( strlen(inregcode) != 13 || inregcode[0] == ' ')
- vmsg("認證碼輸入不完整,總共應有十三碼,沒有空白字元。");
- else if( inregcode[0] != REGCODE_INITIAL[0] || inregcode[1] != REGCODE_INITIAL[1] ) {
- /* old regcode */
- vmsg("輸入的認證碼錯誤," // "或因系統昇級已失效,"
- "請輸入 x 重填一次 E-Mail");
- }
- else
- break;
- } while( 1 );
-
- // make it case insensitive.
- if (strcasecmp(inregcode, getregcode(regcode)) == 0) {
- int unum;
- delregcodefile();
- if ((unum = searchuser(cuser.userid, NULL)) == 0) {
- vmsg("系統錯誤,查無此人!");
- u_exit("getuser error");
- exit(0);
- }
- mail_muser(cuser, "[註冊成功\囉]", "etc/registeredmail");
-#if FOREIGN_REG_DAY > 0
- if(cuser.uflag2 & FOREIGN)
- mail_muser(cuser, "[出入境管理局]", "etc/foreign_welcome");
-#endif
- cuser.userlevel |= (PERM_LOGINOK | PERM_POST);
- outs("\n註冊成功\, 重新上站後將取得完整權限\n"
- "請按下任一鍵跳離後重新上站~ :)");
- sethomefile(genbuf, cuser.userid, "justify.wait");
- unlink(genbuf);
- snprintf(cuser.justify, sizeof(cuser.justify),
- "%s:%s:email", phone, career);
- sethomefile(genbuf, cuser.userid, "justify");
- log_file(genbuf, LOG_CREAT, cuser.justify);
- pressanykey();
- u_exit("registed");
- exit(0);
- return QUIT;
- } else if (strcasecmp(inregcode, "x") != 0) {
- if (regcode[0])
- {
- vmsg("認證碼錯誤!");
- return FULLUPDATE;
- }
- else
- {
- vmsg("認證碼已過期,請重新註冊。");
- toregister(email, phone, career, rname, addr, mobile);
- return FULLUPDATE;
- }
- } else {
- toregister(email, phone, career, rname, addr, mobile);
- return FULLUPDATE;
- }
- }
-
- REGFORM:
- getdata(b_lines - 1, 0, "您確定要填寫註冊單嗎(Y/N)?[N] ",
- ans, 3, LCECHO);
- if (ans[0] != 'y')
- return FULLUPDATE;
-
- move(2, 0);
- clrtobot();
- while (1) {
- clear();
- move(1, 0);
- prints("%s(%s) 您好,請據實填寫以下的資料:",
- cuser.userid, cuser.nickname);
-#ifdef FOREIGN_REG
- fore[0] = 'y';
- fore[1] = 0;
- getfield(2, "Y/n", "是否現在住在台灣", fore, 2);
- if (fore[0] == 'n')
- fore[0] |= FOREIGN;
- else
- fore[0] = 0;
-#endif
- while (1) {
- getfield(8,
-#ifdef FOREIGN_REG
- "請用本名",
-#else
- "請用中文",
-#endif
- "真實姓名", rname, 20);
- if( (errcode = isvalidname(rname)) == NULL )
- break;
- else
- vmsg(errcode);
- }
-
- move(11, 0);
- outs(" 請盡量詳細的填寫您的服務單位,大專院校請麻煩"
- "加" ANSI_COLOR(1;33) "系所" ANSI_RESET ",公司單位請加" ANSI_COLOR(1;33) "職稱" ANSI_RESET ",\n"
- " 暫無工作請麻煩填寫" ANSI_COLOR(1;33) "畢業學校" ANSI_RESET "。\n");
- while (1) {
- getfield(9, "(畢業)學校(含" ANSI_COLOR(1;33) "系所年級" ANSI_RESET ")或單位職稱",
- "服務單位", career, 40);
- if( (errcode = isvalidcareer(career)) == NULL )
- break;
- else
- vmsg(errcode);
- }
- move(10, 0); clrtobot();
- while (1) {
- getfield(10, "含" ANSI_COLOR(1;33) "縣市" ANSI_RESET "及門寢號碼"
- "(台北請加" ANSI_COLOR(1;33) "行政區" ANSI_RESET ")",
- "目前住址", addr, sizeof(addr));
- if( (errcode = isvalidaddr(addr)) == NULL
-#ifdef FOREIGN_REG
- || fore[0]
-#endif
- )
- break;
- else
- vmsg(errcode);
- }
- while (1) {
- getfield(11, "不加-(), 包括長途區號", "連絡電話", phone, 11);
- if( (errcode = isvalidphone(phone)) == NULL )
- break;
- else
- vmsg(errcode);
- }
- getfield(12, "只輸入數字 如:0912345678 (可不填)",
- "手機號碼", mobile, 20);
- while (1) {
- getfield(13, "西元/月月/日日 如:1984/02/29", "生日", birthday, sizeof(birthday));
- if (birthday[0] == 0) {
- snprintf(birthday, sizeof(birthday), "%04i/%02i/%02i",
- 1900 + cuser.year, cuser.month, cuser.day);
- mon = cuser.month;
- day = cuser.day;
- year = cuser.year;
- } else {
- int y, m, d;
- if (ParseDate(birthday, &y, &m, &d)) {
- vmsg("您的輸入不正確");
- continue;
- }
- mon = (unsigned char)m;
- day = (unsigned char)d;
- year = (unsigned char)(y - 1900);
- }
- if (year < 40) {
- vmsg("您的輸入不正確");
- continue;
- }
- break;
- }
- getfield(14, "1.葛格 2.姐接 ", "性別", sex_is, 2);
- getdata(20, 0, "以上資料是否正確(Y/N)?(Q)取消註冊 [N] ",
- ans, 3, LCECHO);
- if (ans[0] == 'q')
- return 0;
- if (ans[0] == 'y')
- break;
- }
- strlcpy(cuser.realname, rname, sizeof(cuser.realname));
- strlcpy(cuser.address, addr, sizeof(cuser.address));
- strlcpy(cuser.email, email, sizeof(cuser.email));
- cuser.mobile = atoi(mobile);
- cuser.sex = (sex_is[0] - '1') % 8;
- cuser.month = mon;
- cuser.day = day;
- cuser.year = year;
-#ifdef FOREIGN_REG
- if (fore[0])
- cuser.uflag2 |= FOREIGN;
- else
- cuser.uflag2 &= ~FOREIGN;
-#endif
- trim(career);
- trim(addr);
- trim(phone);
-
- toregister(email, phone, career, rname, addr, mobile);
-
- // update cuser
- passwd_update(usernum, &cuser);
-
- return FULLUPDATE;
-}
-
/* 列出所有註冊使用者 */
struct ListAllUsetCtx {
int usercounter;