作者itoc, 信區: itoc
標題[功能] admutil.c 快速設定權限的選項
時間03/12/03
作者: itoc (核心動力) 看板: itoc
標題: Re: 關於M3 for win
時間: Wed Dec 3 02:25:27 2003 Updated: 2005/04/05
※ 引述《Gainer.bbs@venus.nhit.edu.tw (GAI)》之銘言:
> 我已經架設Maple不過在系統維護區裡面少了一向'設定權限'
> 要如何新增呢??
: menu.c:menu_admin[]
"bin/admutil.so:a_user", PERM_ALLACCT, - M_SYSTEM,
"User ◤ 顧客資料 ◢",
+ "bin/admutil.so:a_setperm", PERM_ALLBOARD, - M_SYSTEM,
+ "Perm ◤ 設定權限 ◢",
: admutil.c:a_setperm() 加在 a_user() 後面
int
a_setperm()
{
ACCT acct;
int adm;
usint levelup, leveldown;
char ans[8];
move(1, 0);
clrtobot();
while (acct_get(msg_uid, &acct) > 0)
{
if (acct.userlevel & PERM_ALLADMIN) /* 不能改站務的權限 */
return 0;
// 如果大站長不想讓小站長用 ◤ 設定權限 ◢ 這選項看使用者資料
// 那麼可以把下面這行拿掉
acct_show(&acct, 1); /* 顯示使用者資料 */
if (HAS_PERM(PERM_ALLACCT))
{
adm = vans("設定 1)板主上任 2)板主卸任 3)停權 4)復權 5)砍帳號?[Q] ");
if (adm < '1' || adm > '5')
return 0;
}
else /* if (HAS_PERM(PERM_ALLBOARD)) */
{
adm = vans("設定 1)板主上任 2)板主卸任 Q)取消 [Q] ");
if (adm < '1' || adm > '2')
return 0;
}
if (vans(msg_sure_ny) != 'y')
return 0;
switch (adm)
{
case '1':
levelup = PERM_BM;
leveldown = 0;
break;
case '2':
levelup = 0;
leveldown = PERM_BM;
break;
case '3':
levelup = 0;
if (vans("請問要停止這位使用者的發文權嗎(Y/N)?[Y] ") != 'n')
levelup |= PERM_DENYPOST;
if (vans("請問要停止這位使用者的談話權嗎(Y/N)?[Y] ") != 'n')
levelup |= PERM_DENYTALK;
if (vans("請問要停止這位使用者的聊天權嗎(Y/N)?[Y] ") != 'n')
levelup |= PERM_DENYCHAT;
if (vans("請問要停止這位使用者的寄信權嗎(Y/N)?[Y] ") != 'n')
levelup |= PERM_DENYMAIL;
leveldown = 0;
/* 停權要指定期限 */
adm = -1;
if (vget(b_lines, 0, "停權幾天:", ans, 4, DOECHO))
adm = atoi(ans);
if (adm <= 0)
adm = 30; /* 預設 30 天 */
acct.tvalid = time(0) + adm * 86400;
break;
case '4':
levelup = 0;
leveldown = PERM_ALLDENY;
time(&(acct.tvalid));
break;
case '5':
levelup = PERM_PURGE;
leveldown = 0;
break;
}
acct_setperm(&acct, levelup, leveldown);
}
return 0;
}
> ───────────────────────────────────── <
站務停權需要輸入理由,並且把理由記在 log 板
: admutil.c 新增以下函式在 a_setperm() 前面
static void
add_post(brdname, fpath, title) /* 發文到看板 */
char *brdname; /* 欲 post 的看板 */
char *fpath; /* 檔案路徑 */
char *title; /* 文章標題 */
{
HDR hdr;
char folder[64];
brd_fpath(folder, brdname, fn_dir);
hdr_stamp(folder, HDR_LINK | 'A', &hdr, fpath);
strcpy(hdr.owner, cuser.userid);
strcpy(hdr.nick, cuser.username);
strcpy(hdr.title, title);
rec_add(folder, &hdr, sizeof(HDR));
}
static void
log_setperm(userid, day, reason)
char *userid;
int day;
char *reason;
{
char fpath[64], title[TTLEN + 1];
FILE *fp;
sprintf(fpath, "tmp/log_setperm.%s", cuser.userid); /* 暫存檔 */
if (fp = fopen(fpath, "w"))
{
sprintf(title, "站長 %s 停 %s 權 %d 天",
cuser.userid, userid, day);
/* 文章檔頭 */
fprintf(fp, "%s %s (%s) %s %s\n",
str_author1, cuser.userid, cuser.username,
str_post2, BN_SECURITY);
fprintf(fp, "標題: %s\n時間: %s\n\n", title, Now());
/* 文章內容 */
fprintf(fp, "%s\n\n", title);
fprintf(fp, "理由:%s\n\n", reason);
fclose(fp);
add_post(BN_SECURITY, fpath, title);
unlink(fpath);
}
}
: admutil.c:a_setperm()
ACCT acct;
int adm;
usint levelup, leveldown;
char ans[8];
+ char reason[80];
...
...
/* 停權要指定期限 */
adm = -1;
if (vget(b_lines, 0, "停權幾天:", ans, 4, DOECHO))
adm = atoi(ans);
if (adm <= 0)
adm = 30; /* 預設 30 天 */
acct.tvalid = time(0) + adm * 86400;
+ if (!vget(b_lines, 0, "停權理由:", reason, 50, DOECHO))
+ strcpy(reason, "莫須有");
+ log_setperm(acct.userid, adm, reason);
break;
--
┌┼ Origin: Maple-itoc˙動力核心 processor.tfcis.org
└┘ Author: itoc 從 itoc.dorm11.nctu.edu.tw 發表