/*-------------------------------------------------------*/
/* 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;
}