回精華區
作者itoc.bbs@kulu.twbbs.org (老夫子的頭?!), 看板: itoc
標題[功能] 使用者自定擋信
時間咕嚕咕嚕火鍋站 (Sun Jun 2 17:19:08 2002) Updated: 2003/06/26
  原本要寫讓使用者自定擋信列表的
  可是後來發現大部分的 user 都懶得編 :p
  所以改成選項式的

: struct.h

typedef struct
{
  ...
  ...
+ usint ncm;                    /* 拒收郵件 */
}      ACCT;

  加欄位當然要轉換 .ACCT


: maple.p

+int u_reject(void);

: acct.c 新增此函式

int
u_reject()
{
  cuser.ncm = bitset(cuser.ncm, 32, 32,
    "請自行調整擋信列表(■為擋信,□為不擋):", reject_tbl);
  vmsg("要重新上站才會開始生效");
  return 0;
}

: menu.c 加入選項

+ u_reject, PERM_BASIC, M_UFILES,
+ "NoCeM      ├ 擋信設定 ┤",

: ufo.h 加入這段

#ifdef _ADMIN_C_
static char *reject_tbl[] =
{
  "拒收全部 Internet 的信件",
  "拒收來自 *.com.* 的信件",
  "拒收來自 *.net.* 的信件",
  "拒收來自 *.org.* 的信件",
  "0x00000010 保留",
  "0x00000020 保留",
  "0x00000040 保留",
  "0x00000080 保留",
  "0x00000100 保留",
  "0x00000200 保留",
  "0x00000400 保留",
  "0x00000800 保留",
  "0x00001000 保留",
  "0x00002000 保留",
  "0x00004000 保留",
  "0x00008000 保留",
  "拒收來自 台灣(tw) 的信件",
  "拒收來自 中國(cn) 的信件",
  "0x00040000 保留",
  "0x00080000 保留",
  "0x00100000 保留",
  "0x00200000 保留",
  "0x00400000 保留",
  "0x00800000 保留",
  "0x01000000 保留",
  "0x02000000 保留",
  "0x04000000 保留",
  "0x08000000 保留",
  "0x10000000 保留",
  "0x20000000 保留",
  "0x40000000 保留",
  "0x80000000 保留",
};
#endif

: bmtad.c bbs_mail()

  /* Thor.990617: get file stat */
  if (!stat(folder, &st) && st.st_size > MAX_BBSMAIL * sizeof(HDR))
  {
    fprintf(fp, "MAIL-\t[%d] <%s> over-spammed\n", sno, userid);
    return -1;
  }

+  /* user reject */
+ if (user_reject(ap->addr, userid))
+ {
+   fprintf(fp, "MAIL-\t[%d] <%s> user reject\n", sno, userid);
+   return -3;
+ }

  /* allocate a file for the new mail */

: bbsmail.c mail2bbs()

  if (st.st_size > MAX_BBSMAIL * sizeof(HDR))
  {
    close(fx);
    sprintf(buf, "BBS user <%s> over-spammed", userid);
    mailog(buf);
    puts(buf);
    return EX_NOUSER;
  }

+  /* user reject */
+ if (user_reject(sender, userid))
+ {
+   close(fx);
+   sprintf(buf, "BBS user <%s> rejected", userid);
+   mailog(buf);
+   puts(buf);
+   return EX_NOUSER;
+ }

: bmtad.c bbs_mail() 前面加入這些函式
: bbsmail.c mail2bbs() 前面加入這些函式

static int
str_area(from, domain)
  char *from;
  char *domain;         /* .tw .cn 之類的 */
{
  int len1, len2;
  char *str;

  len1 = strlen(from) - 1;
  len2 = strlen(domain) - 1;

  if (len1 < len2)
    return 0;

  str = from + len1;
  for (; len2 >= 0; len2--)
  {
    if (domain[len2] != *str)
      return 0;
    str--;
  }

  return 1;
}


static int
str_last(from, domain)
  char *from;
  char *domain;         /* .com.* .org.* .net.* 之類的 */
{
  int len1, len2;
  char *str;

  if (str_area(from, domain))   /* from 的結尾已 match domain */
    return 1;

  len1 = strlen(from) - 4;      /* 把 .tw 除去再比較一次 */
  len2 = strlen(domain) - 1;

  if (len1 < len2)
    return 0;

  str = from + len1;
  for (; len2 >= 0; len2--)
  {
    if (domain[len2] != *str)
      return 0;
    str--;
  }

  return 1;
}


static inline int         /* 1: reject */
user_reject(addr, userid) /* itoc.020602: 使用者自訂擋信列表 */
  char *addr;
  char *userid;
{
  ACCT cuser;
  int ncm;
  char author[80], *from;

  sprintf(author, "usr/%c/%s/.ACCT", *userid, userid);  /* 借用 author ncm */
  if ((ncm = open(author, O_RDONLY)) < 0)
  {
    return 0;
  }
  if (read(ncm, &cuser, sizeof(ACCT)) != sizeof(ACCT))
  {
    close(ncm);
    return 0;
  }
  close(ncm);
  ncm = cuser.ncm;

  strcpy(author, addr);
  from = strchr(author, '@');
  *from = '\0';
  from++;

  /* 改以下程式請順便改 ufo.h 中的 reject_tbl[] */

  if ((ncm & 0x000001) ||                             /* 拒收來自 Internet */

    (ncm & 0x00000002 && str_last(from, ".com")) ||   /* 拒收來自 *.com.* */
    (ncm & 0x00000004 && str_last(from, ".net")) ||   /* 拒收來自 *.net.* */
    (ncm & 0x00000008 && str_last(from, ".org")) ||   /* 拒收來自 *.org.* */

    (ncm & 0x00010000 && str_area(from, ".tw")) ||    /* 拒收來自 台灣(tw) */
    (ncm & 0x00020000 && str_area(from, ".cn")))      /* 拒收來自 中國(cn) */
  {
    return 1;
  }

  return 0;
}

> ------------------- 完成 ------------------------ <

如果以後要擴充,就改 bmtad.c user_reject() 及 ufo.h reject_tbl[]

<<範例一>>

: reject_tbl[]
  "0x00000010 保留", 改為 "拒收來自 *.gov.* 的信件",

: user_reject()
+   (ncm & 0x00000010 && str_last(from, ".gov")) ||   /* 拒收來自 *.gov.* */


<<範例二>>

: reject_tbl[]
  "0x00040000 保留", 改為 "拒收來自 日本(jp) 的信件",

: user_reject()
+   (ncm & 0x00040000 && str_area(from, ".jp")) ||    /* 拒收來自 日本(jp) */


<<範例三>> 當然你也可以自定規則

: reject_tbl[]
  "0x00000400 保留", 改為 "拒收作者含有 fuck 字眼",

: user_reject()
+   (ncm & 0x00000400 && strstr(author, "fuck")) ||    /* 拒收作者 fuck */

--
□ 本文章由 itocnctu5566.Dorm3.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻