回精華區
作者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 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻