回精華區
作者itoc.bbs@processor.tfcis.org (:MM:) 看板: plan
標題[功能] 動態設定使用者的看版權限
時間XEON (Sat, 07 Jun 2003 10:24:00 +0800 (CST)) Updated: 2004/12/06
※ 引述《amaki (淡墨)》之銘言:
>   板主一設定好名單,便立刻對名單中所有id進行動態的閱讀權限變更,我是不是該在
>   UCACHE或是UTMP加新的欄位?

  此篇修改可與看板壞人合併使用

※ 一、首先刪除原本的 brd_bits 宣告

: board.c

- char brd_bits[MAXBOARD];

#ifndef ENHANCED_VISIT
time_t brd_visit[MAXBOARD];             /* 最近瀏覽時間 */
#endif

: cache.c favor.c gem.c post.c visio.c vote.c

- extern char brd_bits[];


※ 二、把 brd_bits 放進 UTMP

: struct.h:struct UTMP

  int pal_max;                  /* 有幾個好友 */
  int pal_spool[PAL_MAX];       /* 所有好友的 userno */
+ short brd_bits[MAXBOARD];     /* 看板閱讀權限 */

: board.c cache.c favor.c gem.c post.c visio.c vote.c

  所有 brd_bits 取代成 cutmp->brd_bits


※ 三、新增個 STATUS_BRD_BIT、BRD_D_BIT

: ufo.h

+ #define STATUS_BRD_BIT  BFLAG(7)        /* 被變更過看板權限 */

  你不一定用7,只要小於32的數字且跟其他旗標沒有重複即可。

: modes.h

#define BRD_Z_BIT       0x80    /* .BRH zap 掉了 */
+ #define BRD_D_BIT     0x100   /* dirty */


※ 四、新增 改所有線上使用者 brd_bits 的函式

: maple.p

+ void utmp_brdset(int bno);

: board.c 新增函式 utmp_brdset() 於 Ben_Perm() 後面

void
utmp_brdset(bno)
  int bno;
{
  UTMP *uentp, *uceil;

  uentp = ushm->uslot;
  uceil = (void *) uentp + ushm->offset;

  do
  {
    uentp->status |= STATUS_BRD_BIT;        /* 告訴對方要重新判斷 brd_bits */
    uentp->brd_bits[bno] |= BRD_D_BIT;      /* 要重新判斷的是 bno 這個板 */
  } while (++uentp <= uceil);
}


※ 五、當板主變動看板好友時,就要變動所有線上使用者的 brd_bits

: manage.c:XoBM()

    free(xt);
+   utmp_brdset(currbno);

    return XO_INIT;


※ 六、當站長/板主變動看板權限時,就要變動所有線上使用者的 brd_bits

: manage.c:post_brdlevel()

  if ((vans(msg_sure_ny) == 'y') && memcmp(&newbrd, oldbrd, sizeof(BRD)))
  {
    memcpy(oldbrd, &newbrd, sizeof(BRD));
    rec_put(FN_BRD, &newbrd, sizeof(BRD), currbno, NULL);
+   utmp_brdset(currbno);
  }

: acct.c:m_newbrd() 及 newbrd.c:nbrd_newbrd()

  brh_save();
  board_main();                 /* reload brd_bits[] */
+ utmp_brdset(bno);

: acct.c:brd_edit()

        memcpy(bhdr, &newbh, sizeof(BRD));
        rec_put(FN_BRD, &newbh, sizeof(BRD), bno, NULL);
+       utmp_brdset(bno);


※ 七、當我發現我自己的 status 有 STATUS_BRD_BIT 時,我應該要重新載入看板

: 改 board.c:class_head()

static int
class_head(xo)
  XO *xo;
{
+ if (cutmp->status & STATUS_BRD_BIT)
+ {
+   int n, max;
+   char bit_temp;
+
+   n = 0;
+   max = bshm->number;
+   do
+   {
+     bit_temp = cutmp->brd_bits[n];
+     if (bit_temp & BRD_D_BIT)   /* 只更新有 dirty 的,原本的 V,H,Z 要保留 */
+       cutmp->brd_bits[n] = Ben_Perm(n, cuser.userlevel) |
+         (bit_temp & (BRD_V_BIT | BRD_H_BIT | BRD_Z_BIT));
+   } while (++n < max);
+
+   cutmp->status ^= STATUS_BRD_BIT;
+   class_load(xo);
+ }
  vs_head("看板列表", str_site);
  return class_neck(xo);
}


※ 八、原本可見的看板可能突然變成不可見,所以呼叫 XoPost() 的地方要改

: menu.c:menu()

        if (currbno >= 0)
        {
          utmp_mode(M_BOARD);
-         XoPost(currbno);
+         if (XoPost(currbno) < 0)    /* 傳回-1 代表 無閱讀權限 */
          {
            xover(XZ_POST);
#ifndef ENHANCED_VISIT
            time(&brd_visit[currbno]);
#endif
          }
        }

: xover.c:every_Z()

  case 'b':
    if (xz[XZ_POST - XO_ZONE].xo) /* 若已選定看板,進入看板,否則到看板列表 */
    {
-     XoPost(currbno);
+     if (XoPost(currbno) < 0)
+       break;
      cmd = XZ_POST;
      break;
    }

--
  改 struct UTMP 要清 shm,重開 bbsd

--
    ╭─ Origin ─╗ O processor.tfcis.org  ~ κλμ ─┤
    ├   Author   ╡ itoc.Dorm-GD2.NCTU.edu.tw                
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻