diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-03-06 20:09:00 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-03-06 20:09:00 +0800 |
commit | 1ff37fcf607bfc356c60d423ad05fca9d9eab190 (patch) | |
tree | 86500ec110b3f80babee1bb958a3d553b54cded5 /mbbsd/user.c | |
parent | 113ce755bf96bb52e5e6336be82363d79582aca0 (diff) | |
download | pttbbs-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.c | 751 |
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; |