回精華區
作者itoc, 信區: itoc
標題[功能] rec_article.c 轉信板主自定擋信
時間03/08/17
作者: itoc (:MM:) 看板: itoc
標題: Re: [問題]WindTop的Firewall功能
時間: Sat Jan  4 14:18:29 2003                          Updated: 2006/02/16

※ 引述《dundung.bbs@no.bbs.ee.nchu.edu.tw.spam (星海中的發呆羊)》之銘言:
> 想要自訂條件濾信的話這功能真的不錯用

  在 rec_article.c 的 bbspost_add()

  board    是 要轉進的看板
  userid   是 作者的 email
  usernick 是 作者的暱稱
  SUBJECT  是 文章標題
  SITE     是 Organization:
  MSGID    是 MessageID:
  BODY     是 內容

  所以你只要在這裡動手腳即可

: rec_article.c:bbspost_add()

+ brd_fpath(fpath, board, "spam");                  /* 每個板自己的 spam */
+ if (belong_spam(fpath, addr, nick))
+ {
+   board = "apple";   // 把有濾掉的信送去 apple 板,板名自定 
+ }

  /* 寫入文章內容 */

  brd_fpath(folder, board, FN_DIR);

: 而 belong_spam() 可以這樣寫
: rec_article.c 在 bbspost_add() 前面新增以下函式

static int
belong_spam(filelist, addr, nick)
  char *filelist, *addr, *nick;
{
  FILE *fp;
  char buf[80];
  char user[80], *host;
  char *type, *spam;
  int rc, checknum;

  rc = 0;
  if (fp = fopen(filelist, "r"))
  {
    str_ncpy(user, addr, sizeof(user));  /* 防止字串太長蓋過頭 */
    if (host = (char *) strchr(user, '@'))
    {
      *host = '\0';
      host++;
    }

    checknum = 0;
    while (fgets(buf, 80, fp))
    {
      if (buf[0] == '#')    /* 加 # 是註解 */
        continue;

      if (++checknum >= 100)    /* 限 100 條 rule */
        break;

      type = (char *) strtok(buf, " \t\r\n");
      if (type && *type)
      {
        spam = (char *) strtok(NULL, " \t\r\n");
        if (spam && *spam)
        {
          /* nick、host 可以是 NULL,故要檢查 */
          str_lowest(spam, spam);
          if ((!strcmp(type, "user") && str_sub(user, spam)) ||
            (!strcmp(type, "host") && host && str_sub(host, spam)) ||
            (!strcmp(type, "nick") && nick && str_sub(nick, spam)) ||
            (!strcmp(type, "subj") && str_sub(SUBJECT, spam)) ||
            (!strcmp(type, "site") && str_sub(SITE, spam)) ||
            (!strcmp(type, "from") && str_sub(FROM, spam)) ||
            (!strcmp(type, "msgi") && str_str(MSGID, spam)))
          {
            rc = 1;
            break;
          }
        }
      }
    }
    fclose(fp);
  }
  return rc;
}

: 接下來你要在看板讓板主可以編 spam 這個檔案
: src/so/manage.c:post_spam_edit() 新增於 post_memo_edit() 後面

static int
post_spam_edit(xo)
  XO *xo;
{
  int mode;
  char fpath[64];

  mode = vans("擋信列表 (D)刪除 (E)修改 (Q)取消?[E] ");

  if (mode != 'q')
  {
    brd_fpath(fpath, currboard, "spam");

    if (!(bbstate & STAT_BOARD))
    {
      vedit(fpath, -1); /* itoc.020722: 讓一般使用者也能看到 spam 內容 */
    }
    else if (mode == 'd')
    {
      unlink(fpath);
      return XO_FOOT;
    }
    else
    {
      if (vedit(fpath, 0))      /* Thor.981020: 注意被talk的問題 */
        vmsg(msg_cancel);
    }

    return XO_HEAD;
  }
  return XO_FOOT;
}

: manage.c:post_manage()

    "WMemo   編輯進板畫面",
+   "Spam    看板擋信列表",
    "Manager 增減副板主",

  ...
  ...

- char *menu = "◎ 板主選單 (B)主題 (W)進板 (M)副板"
+ char *menu = "◎ 板主選單 (B)主題 (W)進板 (S)擋信 (M)副板"

  ...
  ...

  case 'w':
    ret = post_memo_edit(xo);
    break;

+ case 's':
+   ret = post_spam_edit(xo);
+   break;

> ───────────────────────────────────── <

  spam 這檔案的格式為

# 這是註解,要擋二個就寫二次
# 要注意英文要全為小寫
user    fuck
user    shit
host    hinet.net
nick    幹
subj    不要的標題
site    hinet
from    someone@some.domain
msgi    netnews.seed.net.tw
msgi    netnews.hinet.net
#
# 如果後面 spam 的內容有空格,只會抓到第一個字串
# 也就是說下面這二行的效果是一樣的
site    giga news service
site    giga

> ───────────────────────────────────── <

  spam 比較的內容是

發信人: itoc.bbs@processor.tfcis.org (今天下雨), 看板: itoc
標  題: Re: 看板的閱讀權限
發信站: XEON (Sun Jan  5 01:04:28 2003)
轉信站: kulu!TomatoNEWS!news.tfcis.org!PROCESSOR
Origin: zhouer.mcl.math.ncu.edu.tw

  user 比對 itoc.bbs
  host 比對 processor.tfcis.org
  nick 比對 今天下雨
  subj 比對 Re: 看板的閱讀權限
  site 比對 XEON
  from 比對 itoc.bbs@processor.tfcis.org

--
    ╭── Origin ╮  動力核心  processor.tfcis.org  ~ δεζ ──┼
    ┼     Author ╯ itoc.Dorm-GD2.NCTU.edu.tw
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻