精華區beta SetupBBS 關於我們 聯絡資訊
/*-------------------------------------------------------*/ /* admin.c ( NTHU CS MapleBBS Ver 2.36 ) */ /*-------------------------------------------------------*/ /* target : administration routines */ /* create : 95/03/29 */ /* update : 95/12/15 */ /*-------------------------------------------------------*/ #define _ADMIN_C_ #include "bbs.h" /* ----------------------------------------------------- */ /* 設定系統檔案 */ /* ----------------------------------------------------- */ int x_file() { int aborted; char ans[4], *fpath, buffer[41]; move(b_lines - 4 ,0); /* Ptt */ outs("設定 (1)身份確認信 (2)匿明名單 (3)不列入統計看版 (4)post注意事項 (5)錯誤登入訊息\n"); outs(" (6)註冊範例 (7)通過確認通知 (8)email post通知 (9)系統功\能精靈 (A)茶樓\n"); outs(" (B)站長名單 (C)email通過確認 (D)新使用者需知 (E)身份確認方法 (F)歡迎畫面\n"); getdata(b_lines - 1, 0, " (G)進站畫面 (H)看板期限 (I)故鄉 (J)出站畫面 (K)生日卡 (L)節日 [Q]取消?", ans, 3, LCECHO); switch (ans[0]) { case '1': fpath = "etc/confirm"; break; case '2': fpath = "etc/anonymous"; break; case '3': fpath = "etc/NoStatBoards"; break; case '4': fpath = "etc/post.note"; break; case '5': fpath = "etc/goodbye"; break; case '6': fpath = "etc/register"; break; case '7': fpath = "etc/registered"; break; case '8': fpath = "etc/emailpost"; break; case '9': fpath = "etc/hint"; break; case 'a': fpath = "etc/teashop"; break; case 'b': fpath = "etc/sysop"; break; case 'c': fpath = "etc/bademail"; break; case 'd': fpath = "etc/newuser"; break; case 'e': fpath = "etc/justify"; break; case 'f': fpath = "etc/Welcome"; break; case 'g': fpath = "etc/Welcome_login"; break; case 'h': fpath = "etc/expire.conf"; break; case 'i': fpath = "etc/domain_name_query"; break; case 'j': fpath = "etc/Logout"; break; case 'k': fpath = "etc/Welcome_birth"; break; case 'l': fpath = "etc/feast"; break; /* Ptt case '0': getdata(b_lines, 0, "請輸入檔名:",buffer, 40, DOECHO); fpath=buffer; break; */ default: return FULLUPDATE; } aborted = vedit(fpath, NA); prints("\n\n系統檔案[%s]:%s", fpath, aborted ? "未改變" : "更新完畢"); pressanykey(); return FULLUPDATE; } /* ----------------------------------------------------- */ /* 看板管理 */ /* ----------------------------------------------------- */ extern int cmpbnames(); static int invalid_brdname(brd) char *brd; { register char ch; ch = *brd++; if (not_alnum(ch)) return 1; while (ch = *brd++) { if (not_alnum(ch) && ch != '_' && ch != '-' && ch != '.') return 1; } return 0; } void Security (x,y,sysopid,userid) int x,y; char *sysopid,*userid; { FILE *fp=fopen("etc/security","w"); fileheader fhdr; time_t now = time(0); char genbuf[200],reason[30]; int i,flag=0; for (i = 4; i < NUMPERMS; i++) { if (((x >> i) & 1)!= ((y >> i) & 1)) { if (!flag) { now = time(NULL) - 6 * 60; sprintf (genbuf,"作者: [系統安全局] 看板: Security\n"); strcat (genbuf,"標題: [公安報告] 站長修改權限報告\n"); fputs (genbuf,fp); sprintf (genbuf,"時間: %s\n",ctime(&now)); fputs (genbuf,fp); } sprintf (genbuf," 站長;32m%s%s%s%sm的權限\n",sysopid,(((x >> i) & 1)?";33m關閉":";33m開啟"),userid,permstrings[i]); fputs (genbuf,fp); flag++; } } if (flag) { clrtobot (); clear(); while (!getdata_str(5 ,0 ,"請輸入理由以示負責:",reason,60,DOECHO ,"看版版主:")); sprintf (genbuf,"\n ;37m站長%s修改權限理由是:%sm",cuser.userid,reason); fputs (genbuf,fp); fclose (fp); sprintf(genbuf, "boards/%s", "Security"); stampfile(genbuf, &fhdr); rename ("etc/security",genbuf); sprintf(fhdr.title, "[公安報告] 站長修改%s權限報告",userid); strcpy(fhdr.owner, "[系統安全局]"); sprintf(genbuf, "boards/%s/.DIR", "Security"); append_record(genbuf, &fhdr, sizeof(fhdr)); } } unsigned setperms(pbits) unsigned pbits; { register int i; char choice[4]; move(4, 0); for (i = 0; i < NUMPERMS/2 ; i++) { prints("%c. %-20s %-15s %c. %-20s %s\n" , 'A' + i, permstrings[i],((pbits >> i) & 1 ? "ˇ" : "X") , i < 10 ? 'Q' + i : '0' + i - 10, permstrings[i+16],((pbits >> i+16) & 1 ? "ˇ" : "X")); } clrtobot(); while (getdata(b_lines - 1, 0, "請按 [A-5] 切換設定,按 [Return] 結束:", choice, 3, LCECHO)) { i = choice[0] - 'a'; if (i < 0) i = choice[0] - '0' + 26; if (i >= NUMPERMS) bell(); else { pbits ^= (1 << i); move( i%16 + 4, i <= 15 ? 24 : 64); prints((pbits >> i) & 1 ? "ˇ" : "X"); } } return (pbits); } /* -------------- */ /* 自動設立精華區 */ /* -------------- */ static void setup_man(board) boardheader *board; { char genbuf[200]; FILE *fp; setapath(genbuf, board->brdname); mkdir(genbuf, 0755); } static void bperm_msg(board) boardheader *board; { prints("\n設定 [%s] 看板之(%s)權限:", board->brdname, board->level & PERM_POSTMASK ? "發表" : "閱\讀"); } static char *classname[] = { "1.發電","2.嘰哩","3.市井", "4.大資","5.城邦","6.校園", "7.雄友","8.它系","9.法律", "[或自行輸入]", NULL}; int m_newbrd() { boardheader newboard; char ans[4]; int bid,classnum=0; char genbuf[200]; stand_title("建立新板"); memset(&newboard, 0, sizeof(newboard)); do { if (!getdata(3, 0, msg_bid, newboard.brdname, IDLEN + 1, DOECHO)) return -1; } while (invalid_brdname(newboard.brdname)); while (classname[classnum]!=NULL) outs (classname[classnum++]); getdata(6, 0, "看板類別:", genbuf , 5 ,DOECHO); if ( genbuf[0]>='1' && genbuf[0]<='9' ) { strncpy (newboard.title,classname[*genbuf-'1']+2,4); } else if( strlen(genbuf)>=4 ) { strncpy (newboard.title, genbuf ,4); } newboard.title[4]=' '; getdata_str(7, 0, "1.轉信 ● 2.不轉信 ◎ 3.子選單 Σ:" , genbuf , 3 ,LCECHO,"2"); if(genbuf[0]) { strncpy (newboard.title+5,((*genbuf=='1')?"●": (*genbuf=='2' ? "◎":"Σ")) , 2); } getdata(8, 0, "看板主題:", genbuf , BTLEN + 1, DOECHO); if(genbuf[0]) { strcpy (newboard.title + 7,genbuf); } setbpath(genbuf, newboard.brdname); if (getbnum(newboard.brdname) > 0 || mkdir(genbuf, 0755) == -1) { outs(err_bid); pressanykey(); return -1; } if (strncmp(newboard.title+5,"Σ",2)) { getdata(9, 0, "板主名單:", newboard.BM, IDLEN * 3 + 3, DOECHO); newboard.level = 0; getdata_str(10, 0, "設定讀寫權限(Y/N)?", ans, 4, LCECHO,"N"); if (*ans == 'y') { getdata_str(11, 0, "限制 [R]閱\讀 (P)發表?", ans, 4, LCECHO,"R"); if (*ans == 'p') newboard.level = PERM_POSTMASK; move(1, 0); clrtobot(); bperm_msg(&newboard); newboard.level = setperms(newboard.level); clear(); } } else { strcpy(newboard.BM,"[目錄]"); newboard.level = PERM_POSTMASK; newboard.level |= (1 << 15); } if ((bid = getbnum("")) > 0) { substitute_record(fn_board, &newboard, sizeof(newboard), bid); } else if (append_record(fn_board, &newboard, sizeof(newboard)) == -1) { pressanykey(); return -1; } setup_man(&newboard); touch_boards(); outs("\n新板成立"); log_usies("NewBoard", newboard.title); pressanykey(); return 0; } int m_board() { boardheader bh, newbh; char bname[20]; int bid,classnum=0; char genbuf[200]; stand_title("看板設定"); make_blist(); namecomplete(msg_bid, bname); if (!*bname) return 0; bid = getbnum(bname); if (get_record(fn_board, &bh, sizeof(bh), bid) == -1) { outs(err_bid); pressanykey(); return -1; } prints("看板名稱:%s\n看板說明:%s\n板主名單:%s", bh.brdname, bh.title, bh.BM); bperm_msg(&bh); prints("%s設限", (bh.level & ~PERM_POSTMASK) ? "有" : "不"); getdata(7, 0, "看板 (D)刪除 (E)設定 [Q]取消?", genbuf, 3, LCECHO); switch (*genbuf) { case 'd': getdata_str(9, 0, msg_sure_ny, genbuf, 3, LCECHO,"N"); if (genbuf[0] != 'y') { outs(MSG_DEL_CANCEL); } else { strcpy(bname, bh.brdname); sprintf(genbuf, "/bin/rm -fr boards/%s man/%s", bname, bname); system(genbuf); memset(&bh, 0, sizeof(bh)); sprintf(bh.title, "[%s] deleted by %s", bname, cuser.userid); substitute_record(fn_board, &bh, sizeof(bh), bid); touch_boards(); log_usies("DelBoard", bh.title); outs("刪板完畢"); } break; case 'e': move(8, 0); outs("直接按 [Return] 不修改該項設定"); memcpy(&newbh, &bh, sizeof(bh)); while (getdata(9, 0, "新看板名稱:", genbuf, IDLEN + 1,DOECHO)) { if (getbnum(genbuf)) { move(3, 0); outs("錯誤! 板名雷同"); } else if (!invalid_brdname(genbuf)) { strcpy(newbh.brdname, genbuf); break; } } /*if (getdata(10, 0, "新看板說明:", genbuf, BTLEN + 1, DOECHO)) strcpy(newbh.title, genbuf);*/ while (classname[classnum]!=NULL) outs (classname[classnum++]); getdata_str(12, 0, "看板類別:", genbuf , 5 ,DOECHO,bh.title); if ( genbuf[0]>='1' && genbuf[0]<='9' ) { strncpy (newbh.title,classname[*genbuf-'1']+2,4); } else if( strlen(genbuf)>=4 ) { strncpy (newbh.title, genbuf ,4); } newbh.title[4]=' '; getdata(13, 0, "1.轉信 ● 2.不轉信 ◎ 3.子選單 Σ:" , genbuf , 3 ,LCECHO); if(genbuf[0]) { strncpy (newbh.title+5,((*genbuf=='1')?"●": (*genbuf=='2' ? "◎":"Σ")) , 2); } getdata_str(14, 0, "看板主題:", genbuf , BTLEN + 1, DOECHO,bh.title+7); if(genbuf[0]) { strcpy (newbh.title + 7,genbuf); } if (strncmp(newbh.title+5,"Σ",2)) { if (getdata_str(15, 0, "新板主名單:", genbuf, IDLEN * 3 + 3, DOECHO,bh.BM)) { trim(genbuf); strcpy(newbh.BM, genbuf); } getdata(16, 0, "是否更改存取權限(Y/N)?[N] ", genbuf, 4, LCECHO); if (*genbuf == 'y') { char ans[4]; getdata_str(17, 0, "限制 (R)閱\讀 (P)發表? ", ans, 4, LCECHO, (newbh.level & PERM_POSTMASK ? "P" : "R")); if (newbh.level & PERM_POSTMASK) { if (*ans == 'r') newbh.level &= ~PERM_POSTMASK; } else { if (*ans == 'p') newbh.level |= PERM_POSTMASK; } move(1, 0); clrtobot(); bperm_msg(&newbh); newbh.level = setperms(newbh.level); } } else { strcpy(newbh.BM,"[目錄]"); newbh.level = PERM_POSTMASK; newbh.level |= (1 << 15); } getdata_str(b_lines - 1, 0, msg_sure_ny, genbuf, 4, LCECHO,"Y"); if ((*genbuf == 'y') && memcmp(&newbh, &bh, sizeof(bh))) { if (strcmp(bh.brdname, newbh.brdname)) { char src[60], tar[60]; setbpath(src, bh.brdname); setbpath(tar, newbh.brdname); Rename(src, tar); setapath(src, bh.brdname); setapath(tar, newbh.brdname); Rename(src, tar); } setup_man(&newbh); substitute_record(fn_board, &newbh, sizeof(newbh), bid); touch_boards(); /* woju */ log_usies("SetBoard", newbh.brdname); } } return 0; } /* ----------------------------------------------------- */ /* 使用者管理 */ /* ----------------------------------------------------- */ int m_user() { userec muser; int id; char genbuf[200]; stand_title("使用者設定"); usercomplete(msg_uid, genbuf); if (*genbuf) { move(2, 0); if (id = getuser(genbuf)) { memcpy(&muser, &xuser, sizeof(muser)); user_display(&muser, 1); uinfo_query(&muser, 1, id); } else { outs(err_uid); clrtoeol(); pressanykey(); } } return 0; } #ifdef HAVE_TIN int post_in_tin(username) char *username; { char buf[256]; FILE *fh; int counter = 0; sethomefile(buf, username, ".tin/posted"); fh = fopen(buf, "r"); if (fh == NULL) return 0; else { while (fgets(buf, 255, fh) != NULL) { if (buf[9] != 'd' && strncmp(&buf[11], "csie.bbs.test", 13)) counter++; if (buf[9] == 'd') counter--; } fclose(fh); return counter; } } #endif /* ----------------------------------------------------- */ /* 清除使用者信箱 */ /* ----------------------------------------------------- */ #ifdef HAVE_MAILCLEAN FILE *cleanlog; char curruser[IDLEN + 2]; extern int delmsgs[]; extern int delcnt; static int domailclean(fhdrp) fileheader *fhdrp; { static int newcnt, savecnt, deleted, idc; char buf[STRLEN]; if (!fhdrp) { fprintf(cleanlog, "new = %d, saved = %d, deleted = %d\n", newcnt, savecnt, deleted); newcnt = savecnt = deleted = idc = 0; if (delcnt) { sethomedir(buf, curruser); while (delcnt--) delete_record(buf, sizeof(fileheader), delmsgs[delcnt]); } delcnt = 0; return 1; } idc++; if (!(fhdrp->filemode & FILE_READ)) newcnt++; else if (fhdrp->filemode & FILE_MARKED) savecnt++; else { deleted++; sethomefile(buf, curruser, fhdrp->filename); unlink(buf); delmsgs[delcnt++] = idc; } return 0; } static int cleanmail(urec) userec *urec; { struct stat statb; char genbuf[200]; if (urec->userid[0] == '\0' || !strcmp(urec->userid, str_new)) return; sethomedir(genbuf, urec->userid); fprintf(cleanlog, "%s:", urec->userid); if (stat(genbuf, &statb) == -1 || statb.st_size == 0) fprintf(cleanlog, "no mail\n"); else { strcpy(curruser, urec->userid); delcnt = 0; apply_record(genbuf, domailclean, sizeof(fileheader)); domailclean(NULL); } return 0; } int m_mclean() { char ans[4]; getdata_str(b_lines - 1, 0, msg_sure_ny, ans, 4, LCECHO,"N"); if (ans[0] != 'y') return FULLUPDATE; cleanlog = fopen("mailclean.log", "w"); outmsg("This is variable msg_working!"); move(b_lines - 1, 0); if (apply_record(fn_passwd, cleanmail, sizeof(userec)) == -1) { outs(ERR_PASSWD_OPEN); } else { fclose(cleanlog); outs("清除完成! 記錄檔 mailclean.log."); } return FULLUPDATE; } #endif HAVE_MAILCLEAN /* ----------------------------------------------------- */ /* 產生追蹤記錄:建議改用 log_usies()、TRACE() */ /* ----------------------------------------------------- */ #ifdef HAVE_REPORT void report(s) char *s; { static int disable = NA; int fd; if (disable) return; if ((fd = open("trace", O_WRONLY, 0644)) != -1) { char buf[256]; char *thetime; time_t dtime; time(&dtime); thetime = Cdate(&dtime); flock(fd, LOCK_EX); lseek(fd, 0, L_XTND); sprintf(buf, "%s %s %s\n", cuser.userid, thetime, s); write(fd, buf, strlen(buf)); flock(fd, LOCK_UN); close(fd); } else disable = YEA; } int m_trace() { struct stat bstatb, ostatb, cstatb; int btflag, otflag, ctflag, done = 0; char ans[2]; char *msg; clear(); move(0, 0); outs("Set Trace Options"); clrtobot(); while (!done) { move(2, 0); otflag = stat("trace", &ostatb); ctflag = stat("trace.chatd", &cstatb); btflag = stat("trace.bvote", &bstatb); outs("Current Trace Settings:\n"); if (otflag) outs("Normal tracing is OFF\n"); else prints("Normal tracing is ON (size = %d)\n", ostatb.st_size); if (ctflag) outs("Chatd tracing is OFF\n"); else prints("Chatd tracing is ON (size = %d)\n", cstatb.st_size); if (btflag) outs("BVote tracing is OFF\n"); else prints("BVote tracing is ON (size = %d)\n", bstatb.st_size); move(8, 0); outs("Enter:\n"); prints("<1> to %s Normal tracing\n", otflag ? "enable " : "disable"); prints("<2> to %s Chatd tracing\n", ctflag ? "enable " : "disable"); prints("<3> to %s BVote tracing\n", btflag ? "enable " : "disable"); getdata(12, 0, "Anything else to exit:", ans, 2, DOECHO); switch (ans[0]) { case '1': if (otflag) { /* woju */ system("touch trace"); msg = "BBS tracing enabled."; report("opened report log"); } else { report("closed report log"); system("/bin/mv trace trace.old"); msg = "BBS tracing disabled; log is in trace.old"; } break; case '2': if (ctflag) { system("touch trace.chatd"); msg = "Chat tracing enabled."; report("chatd trace log opened"); } else { system("/bin/mv trace.chatd trace.chatd.old"); msg = "Chat tracing disabled; log is in trace.chatd.old"; report("chatd trace log closed"); } break; case '3': if (btflag) { system("touch trace.bvote"); msg = "BVote tracing enabled."; report("BVote trace log opened"); } else { system("/bin/mv trace.bvote trace.bvote.old"); msg = "BVote tracing disabled; log is in trace.bvote.old"; report("BoardVote trace log closed"); } break; default: msg = NULL; done = 1; } move(t_lines - 2, 0); if (msg) prints("%s\n", msg); } clear(); } #endif /* HAVE_REPORT */ /* ----------------------------------------------------- */ /* 處理 Register Form */ /* ----------------------------------------------------- */ int /* Ptt */ mail_muser(userec muser) { fileheader mhdr; char title[128], buf1[80]; FILE* fp; sethomepath(buf1, muser.userid); stampfile(buf1, &mhdr); strcpy(mhdr.owner, cuser.userid); strncpy(mhdr.title, "[註冊成功\囉]", TTLEN); mhdr.savemode = 0; mhdr.filemode = 0; sethomedir(title, muser.userid); append_record(title, &mhdr, sizeof(mhdr)); Link("etc/registered", buf1); return 0; } static int scan_register_form(regfile) char *regfile; { char genbuf[200]; static char *logfile = "register.log"; static char *field[] = {"num", "uid", "name", "career", "addr", "phone", "email", NULL}; static char *finfo[] = {"帳號位置", "申請代號", "真實姓名", "服務單位", "目前住址", "連絡電話", "電子郵件信箱", NULL}; static char *reason[] = {"輸入真實姓名", "詳填學校科系與年級", "填寫完整的住址資料", "詳填連絡電話", "確實填寫註冊申請表", "用中文填寫申請單", NULL}; userec muser; FILE *fn, *fout, *freg; char fdata[7][STRLEN]; char fname[STRLEN], buf[STRLEN]; char ans[4], *ptr, *uid; int n, unum; uid = cuser.userid; sprintf(fname, "%s.tmp", regfile); move(2, 0); if (dashf(fname)) { outs("其他 SYSOP 也在審核註冊申請單"); pressanykey(); return -1; } Rename(regfile, fname); if ((fn = fopen(fname, "r")) == NULL) { prints("系統錯誤,無法讀取註冊資料檔: %s", fname); pressanykey(); return -1; } memset(fdata, 0, sizeof(fdata)); while (fgets(genbuf, STRLEN, fn)) { if (ptr = (char *) strstr(genbuf, ": ")) { *ptr = '\0'; for (n = 0; field[n]; n++) { if (strcmp(genbuf, field[n]) == 0) { strcpy(fdata[n], ptr + 2); if (ptr = (char *) strchr(fdata[n], '\n')) *ptr = '\0'; } } } else if ((unum = getuser(fdata[1])) == 0) { move(2, 0); clrtobot(); outs("系統錯誤,查無此人\n\n"); for (n = 0; field[n]; n++) prints("%s : %s\n", finfo[n], fdata[n]); pressanykey(); } else { memcpy(&muser, &xuser, sizeof(muser)); move(1, 0); prints("帳號位置 :%d\n", unum); user_display(&muser, 1); move(14, 0); /*printdash(NULL);*/ prints(";32m------------- 請站長嚴格審核使用者資料 ---------------m\n"); for (n = 0; field[n]; n++) prints("%-12s:%s\n", finfo[n], fdata[n]); if (muser.userlevel & PERM_LOGINOK) { getdata(b_lines - 1, 0, "此帳號已經完成註冊, 更新(Y/N/Skip)?[N] ", ans, 3, LCECHO); if (ans[0] != 'y' && ans[0] != 's') ans[0] = 'd'; } else { getdata(b_lines - 1, 0, "是否接受此資料(Y/N/Q/Del/Skip)?[S] ", ans, 3, LCECHO); } move(2, 0); clrtobot(); switch (ans[0]) { case 'y': prints("以下使用者資料已經更新:\n"); mail_muser(muser); muser.userlevel |= (PERM_LOGINOK | PERM_POST); /* muser.userlevel &= ~(PERM_LOGINOK | PERM_POST);*/ strcpy(muser.realname, fdata[2]); strcpy(muser.address, fdata[4]); strcpy(muser.email, fdata[6]); sprintf(genbuf, "%s:%s:%s", fdata[5], fdata[3], uid); strncpy(muser.justify, genbuf, REGLEN); sethomefile(buf, muser.userid, "justify"); if (fout = fopen(buf, "a")) { fprintf(fout, "%s\n", genbuf); fclose(fout); } substitute_record(fn_passwd, &muser, sizeof(muser), unum); if (fout = fopen(logfile, "a")) { for (n = 0; field[n]; n++) fprintf(fout, "%s: %s\n", field[n], fdata[n]); n = time(NULL); fprintf(fout, "Date: %s\n", Cdate(&n)); fprintf(fout, "Approved: %s\n", uid); fprintf(fout, "----\n"); fclose(fout); } mail_justify(muser); break; case 'q': /* 太累了,結束休息 */ if (freg = fopen(regfile, "a")) { for (n = 0; field[n]; n++) fprintf(freg, "%s: %s\n", field[n], fdata[n]); fprintf(freg, "----\n"); while (fgets(genbuf, STRLEN, fn)) fputs(genbuf, freg); fclose(freg); } case 'd': break; case 'n': for (n = 0; field[n]; n++) prints("%s: %s\n", finfo[n], fdata[n]); move(9, 0); prints("請提出退回申請表原因,按 <enter> 取消\n"); for (n = 0; reason[n]; n++) prints("%d) 請%s\n", n, reason[n]); /* woju */ if (getdata(10 + n, 0, "退回原因:", buf, 60, DOECHO)) { int i; fileheader mhdr; char title[128], buf1[80]; FILE* fp; i = buf[0] - '0'; if (i >= 0 && i < n) strcpy(buf, reason[i]); sprintf(genbuf, "[退回原因] 請%s", buf); sethomepath(buf1, muser.userid); stampfile(buf1, &mhdr); strcpy(mhdr.owner, cuser.userid); strncpy(mhdr.title, "[註冊失敗]", TTLEN); mhdr.savemode = 0; mhdr.filemode = 0; sethomedir(title, muser.userid); if (append_record(title, &mhdr, sizeof(mhdr)) != -1) { fp = fopen(buf1, "w"); fprintf(fp, "%s\n", genbuf); fclose(fp); } /* strncpy(muser.address, genbuf, NAMELEN); substitute_record(fn_passwd, &muser, sizeof(muser), unum); */ if (fout = fopen(logfile, "a")) { for (n = 0; field[n]; n++) fprintf(fout, "%s: %s\n", field[n], fdata[n]); n = time(NULL); fprintf(fout, "Date: %s\n", Cdate(&n)); fprintf(fout, "Rejected: %s [%s]\n----\n", uid, buf); fclose(fout); } break; } move(10, 0); clrtobot(); prints("取消退回此註冊申請表"); default: /* put back to regfile */ if (freg = fopen(regfile, "a")) { for (n = 0; field[n]; n++) fprintf(freg, "%s: %s\n", field[n], fdata[n]); fprintf(freg, "----\n"); fclose(freg); } } } } fclose(fn); unlink(fname); return (0); } int m_register() { FILE *fn; int x, y, wid, len; char ans[4]; char genbuf[200]; if ((fn = fopen(fn_register, "r")) == NULL) { outs("目前並無新註冊資料"); return XEASY; } stand_title("審核使用者註冊資料"); y = 2; x = wid = 0; while (fgets(genbuf, STRLEN, fn) && x < 65) { if (strncmp(genbuf, "uid: ", 5) == 0) { move(y++, x); outs(genbuf + 5); len = strlen(genbuf + 5); if (len > wid) wid = len; if (y >= t_lines - 3) { y = 2; x += wid + 2; } } } fclose(fn); getdata(b_lines - 1, 0, "開始審核嗎(Y/N)?[N] ", ans, 3, LCECHO); if (ans[0] == 'y') scan_register_form(fn_register); return 0; } /* Ptt */ /* extern int bad_user_id(char userid[]); int search_bad_id() { userec user; char ch; int coun=0; FILE *fp1=fopen(".PASSWDS","r"); char buf[100]; clear(); while( (fread( &user, sizeof(user), 1, fp1))>0 ) { coun ++; move(0,0); sprintf(buf,"尋找損毀id\n第 [%d] 筆資料\n",coun); outs(buf); refresh(); if(bad_user_id(user.userid)) { user_display(&user, 1); uinfo_query(&user, 1, coun); outs("4m 任一鍵7m:搜尋下一個 3m Q7m: 離開 m"); ch=igetch(); if(ch=='q' || ch =='Q') return 0; clear(); } } fclose(fp1); return 0; } */ int search_key_user() { userec user; char ch; int coun=0; FILE *fp1=fopen(".PASSWDS","r"); char buf[100],key[22]; clear(); getdata(0,0,"請輸入使用者關鍵字 [姓名|email|ID|電話|地址]:",key,21, DOECHO); while( (fread( &user, sizeof(user), 1, fp1))>0 ) { coun ++; move(1,0); sprintf(buf,"第 [%d] 筆資料\n",coun); outs(buf); refresh(); if( strstr(user.userid,key)|| strstr(user.realname,key)|| strstr(user.username,key)|| strstr(user.lasthost,key)|| strstr(user.email,key)|| strstr(user.address,key)|| strstr(user.justify,key)) { user_display(&user, 1); uinfo_query(&user, 1, coun); outs( "4m 任一鍵7m:搜尋下一個 3m Q7m: 離開 m "); ch=igetch(); if(ch=='q' || ch =='Q') return 0; clear(); move(0,0); outs("請輸入使用者關鍵字 [姓名|email|ID|電話|地址]:"); outs(key); } } fclose(fp1); return 0; }