diff --git a/include/dao.h b/include/dao.h index 3d25f206d..ab84fca37 100644 --- a/include/dao.h +++ b/include/dao.h @@ -38,6 +38,22 @@ extern "C" { /* Thor.981206: lkchu patch */ extern const char radix32[32]; +/* acct.c */ +void addmoney(int addend, const char *userid); +void addpoint1(int addend, const char *userid); +void addpoint2(int addend, const char *userid); +void keeplog(const char *fnlog, const char *board, const char *title, int mode); +int acct_load(ACCT *acct, const char *userid); +void acct_save(const ACCT *acct); +int acct_userno(const char *userid); +void deny_log_email(const char *mail, time_t deny); +int seek_log_email(const char *mail, int mode); +int add_deny_exer(ACCT *u, int adm, int cross, const char *exer); +void ban_addr_tlogger_init(const TLogger *tlogger); +int ban_addr(const char *addr); +int allow_addr(const char *addr); +void check_nckuemail(char *email); +int find_same_email(const char *mail, int mode); /* acl.c */ int acl_addr(const char *acl, const char *addr); int acl_has(const char *acl, const char *user, const char *host); diff --git a/include/proto.h b/include/proto.h index 135349e9d..e89922716 100644 --- a/include/proto.h +++ b/include/proto.h @@ -41,13 +41,6 @@ char *genpasswd(char *pw, int mode); /* acct.c */ void logitfile(const char *file, const char *key, const char *msg); -void addmoney(int addend, const char *userid); -void addpoint1(int addend, const char *userid); -void addpoint2(int addend, const char *userid); -void keeplog(const char *fnlog, const char *board, const char *title, int mode); -int acct_load(ACCT *acct, const char *userid); -void acct_save(const ACCT *acct); -int acct_userno(const char *userid); int acct_get(const char *msg, ACCT *acct); void x_file(int mode, const char *const xlist[], const char *const flist[]); int check_admin(const char *name); @@ -55,15 +48,11 @@ void bitmsg(const char *msg, const char *str, int level); unsigned int bitset(unsigned int pbits, int count, int maxon, const char *msg, const char *const perms[]); void acct_show(const ACCT *u, int adm); void bm_setup(ACCT *u, int adm); -void deny_log_email(const char *mail, time_t deny); int add_deny(ACCT *u, int adm, int cross); void acct_setup(ACCT *u, int adm); int u_info(void); int m_user(void); int m_bmset(void); -int ban_addr(const char *addr); -void check_nckuemail(char *email); -int find_same_email(const char *mail, int mode); int u_addr(void); void su_setup(ACCT *u); int u_setup(void); diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 51d972308..1ea457c77 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -12,5 +12,5 @@ add_library(dao STATIC acl.c file.c isnot.c radix32.c shm.c dl_lib.c record.c splay.c date.c xsort.c attr_lib.c dns.c header.c string.c xwrite.c - proc.c passwd.c mime.c logger.c + proc.c passwd.c mime.c logger.c acct.c ) diff --git a/lib/Makefile b/lib/Makefile index 76ee9ed55..070d4acb1 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -15,12 +15,12 @@ HDR = dao.h dao.p SRC = acl.c file.c isnot.c radix32.c shm.c \ dl_lib.c record.c splay.c date.c xsort.c \ attr_lib.c dns.c header.c string.c xwrite.c \ - proc.c passwd.c mime.c logger.c + proc.c passwd.c mime.c logger.c acct.c OBJ = acl.o file.o isnot.o radix32.o shm.o \ dl_lib.o record.o splay.o date.o xsort.o \ attr_lib.o dns.o header.o string.o xwrite.o \ - proc.o passwd.o mime.o logger.o + proc.o passwd.o mime.o logger.o acct.c .c.o: ;$(CC) $(CFLAGS) -c $*.c diff --git a/lib/acct.c b/lib/acct.c new file mode 100644 index 000000000..02ac3777d --- /dev/null +++ b/lib/acct.c @@ -0,0 +1,523 @@ +/*-------------------------------------------------------*/ +/* lib/acct.c ( NCKU CCNS WindTop-DreamBBS 3.21 ) */ +/*-------------------------------------------------------*/ +/* Author: ??? */ +/* Target: User account structure library for DreamBBS */ +/* Create: 95/03/29 (as maple/acct.c) */ +/* Update: 2021-05-20 (split from maple/acct.c) */ +/* : by Wei-Cheng Yeh (IID) */ +/*-------------------------------------------------------*/ + +#include "config.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "global_def.h" +#include "struct.h" +#include "timetype.h" +#include "dao.h" + +/* ----------------------------------------------------- */ +/* 增加銀幣, 優良積分, 劣退 */ +/* ----------------------------------------------------- */ + +void addmoney(int addend, const char *userid) +{ + ACCT acct; + if (acct_load(&acct, userid) >= 0) + { + double temp = (acct.money + addend); /* 避免溢位 */ + if (temp < INT_MAX) + acct.money += addend; + else + { + acct.money = (INT_MAX - 1); + } + acct_save(&acct); + } +} + +void addpoint1(int addend, const char *userid) +{ + ACCT acct; + if (acct_load(&acct, userid) >= 0) + { + double temp = (acct.point1 + addend); /* 避免溢位 */ + if (temp < INT_MAX) + acct.point1 += addend; + acct_save(&acct); + } +} + +void addpoint2(int addend, const char *userid) +{ + ACCT acct; + if (acct_load(&acct, userid) >= 0) + { + double temp = (acct.point2 + addend); /* 避免溢位 */ + if (temp < INT_MAX) + acct.point2 += addend; + acct_save(&acct); + } +} + +/* ----------------------------------------------------- */ +/* (.ACCT) 使用者帳號 (account) subroutines */ +/* ----------------------------------------------------- */ + +void keeplog(const char *fnlog, const char *board, const char *title, int mode /* 0:load 1:rename 2:load+unlink 3:load+mark 4:rename+mark */ + ) +{ + HDR hdr; + char folder[128], fpath[128]; + int fd; + FILE *fp; + + if (!board) + board = BRD_SYSTEM; + + sprintf(folder, "brd/%s/.DIR", board); + fd = hdr_stamp(folder, 'A', &hdr, fpath); + if (fd < 0) + return; + + if (mode == 1 || mode == 4) + { + close(fd); + /* rename(fnlog, fpath); */ + f_mv(fnlog, fpath); /* Thor.990409:可跨partition */ + } + else + { + fp = fdopen(fd, "w"); + fprintf(fp, "作者: SYSOP (%s)\n標題: %s\n時間: %s\n", + SYSOPNICK, title, ctime_any(&hdr.chrono)); + f_suck(fp, fnlog); + fclose(fp); + if (mode == 2) + unlink(fnlog); + } + + strcpy(hdr.title, title); + strcpy(hdr.owner, "SYSOP"); + strcpy(hdr.nick, SYSOPNICK); + if (mode == 3 || mode == 4) + hdr.xmode |= POST_MARKED; + fd = open(folder, O_WRONLY | O_CREAT | O_APPEND, 0600); + if (fd < 0) + { + unlink(fpath); + return; + } + write(fd, &hdr, sizeof(HDR)); + close(fd); +} + + +int acct_load(ACCT *acct, const char *userid) +{ + int fd; + + usr_fpath((char *)acct, userid, FN_ACCT); + fd = open((char *)acct, O_RDONLY); + if (fd >= 0) + { + /* Thor.990416: 特別注意, 有時 .ACCT的長度會是0 */ + read(fd, acct, sizeof(ACCT)); + close(fd); + } + return fd; +} + +void acct_save(const ACCT *acct) +{ + int fd; + char fpath[80]; + + usr_fpath(fpath, acct->userid, FN_ACCT); + fd = open(fpath, O_WRONLY, 0600); /* fpath 必須已經存在 */ + if (fd >= 0) + { + write(fd, acct, sizeof(ACCT)); + close(fd); + } +} + + +int acct_userno(const char *userid) +{ + int fd; + int userno; + char fpath[80]; + + usr_fpath(fpath, userid, FN_ACCT); + fd = open(fpath, O_RDONLY); + if (fd >= 0) + { + read(fd, &userno, sizeof(userno)); + close(fd); + return userno; + } + return 0; +} + +/* ----------------------------------------------------- */ +/* 帳號管理 */ +/* ----------------------------------------------------- */ + +int seek_log_email(const char *mail, int mode) +{ + EMAIL email; + int pos = 0, fd; + fd = open(FN_VIOLATELAW_DB, O_RDONLY); + while (fd >= 0) + { + lseek(fd, (off_t) (sizeof(email) * pos), SEEK_SET); + if (read(fd, &email, sizeof(email)) == sizeof(email)) + { + if (!strcmp(email.email, mail) + && (mode ? (email.deny > time(0) || email.deny == -1) : 1)) + { + close(fd); + return pos; + } + pos++; + } + else + { + close(fd); + break; + } + } + return -1; +} + +void deny_log_email(const char *mail, time_t deny) +{ + EMAIL email; + int pos; + pos = seek_log_email(mail, 0); + if (pos >= 0) + { + rec_get(FN_VIOLATELAW_DB, &email, sizeof(EMAIL), pos); + if (deny > email.deny || deny == -1) + email.deny = deny; + email.times++; + rec_put(FN_VIOLATELAW_DB, &email, sizeof(EMAIL), pos); + } + else + { + memset(&email, 0, sizeof(email)); + strcpy(email.email, mail); + email.deny = deny; + rec_add(FN_VIOLATELAW_DB, &email, sizeof(EMAIL)); + } +} + +static void deny_add_email(ACCT *he, const char *exer) +{ + char buf[128]; + time_t now; + struct tm *p; + + time(&now); + + p = localtime(&now); + str_lower(he->vmail, he->vmail); + sprintf(buf, "%s # %02d/%02d/%02d %02d:%02d %s (%s)\n", + he->vmail, + p->tm_year % 100, p->tm_mon + 1, p->tm_mday, + p->tm_hour, p->tm_min, "停權", exer); + f_cat(FN_ETC_UNTRUST_ACL, buf); +} + +int add_deny_exer(ACCT *u, int adm, int cross, const char *exer) +{ + FILE *fp; + char buf[80]; + ACCT x; + time_t now; + bool check_time; + const char *cselect = NULL, *cdays = NULL, *cmode = NULL; + + memcpy(&x, u, sizeof(ACCT)); + time(&now); + check_time = (x.deny > now); + + if (!strncmp(u->justify, "reg:", 4)) + adm = (adm & ~DENY_MODE_ALL) | DENY_MODE_GUEST; + + unlink(FN_STOP_LOG); + fp = fopen(FN_STOP_LOG, "w"); + if (adm & DENY_SEL_OK) + { + x.deny = now; + memcpy(u, &x, sizeof(x)); + acct_save(u); + return adm; + } + if (adm & DENY_SEL) + { + if (adm & DENY_SEL_TALK) + cselect = "不當言論"; + else if (adm & DENY_SEL_POST) + cselect = " Cross Post"; + else if (adm & DENY_SEL_MAIL) + cselect = "散發連鎖信"; + else if (adm & DENY_SEL_AD) + cselect = "散發廣告信"; + else if (adm & DENY_SEL_SELL) + cselect = "販賣非法事物"; + fprintf(fp, "查 %s 違反站規%s,依站規停止", u->userid, cselect); + } + if ((adm & (DENY_MODE_ALL)) && !(adm & DENY_MODE_GUEST)) + { + if ((adm & DENY_MODE_ALL) == DENY_MODE_ALL) + { + x.userlevel |= + (PERM_DENYPOST | PERM_DENYTALK | PERM_DENYCHAT | PERM_DENYMAIL + | PERM_DENYNICK); + cmode = " Talk、Mail、\nPost、更改暱稱"; + } + else if (adm & DENY_MODE_POST) + { + x.userlevel |= (PERM_DENYPOST); + cmode = " Post "; + } + else if (adm & DENY_MODE_TALK) + { + x.userlevel |= (PERM_DENYTALK | PERM_DENYCHAT); + cmode = " Talk "; + } + else if (adm & DENY_MODE_MAIL) + { + x.userlevel |= (PERM_DENYMAIL); + cmode = " Mail "; + } + else if (adm & DENY_MODE_NICK) + { + x.userlevel |= (PERM_DENYNICK); + cmode = "更改暱稱"; + } + fprintf(fp, "%s權限", cmode); + } + if (adm & DENY_MODE_GUEST) + { + x.userlevel |= + (PERM_DENYPOST | PERM_DENYTALK | PERM_DENYCHAT | PERM_DENYMAIL | + PERM_DENYNICK | PERM_DENYSTOP); + x.userlevel &= ~(PERM_BASIC | PERM_VALID); + x.deny += 86400 * 31; + cmode = " Talk、Mail、\nPost、更改暱稱"; + fprintf(fp, + "%s權限,權限降至 guest,永不復權,並保留帳號,\n其 E-mail:%s 永不得在本站註冊。\n\n", + cmode, u->vmail[0] ? u->vmail : "[無認證信箱]"); + deny_add_email(u, exer); + } + if ((adm & DENY_DAYS) && !(adm & DENY_MODE_GUEST)) + { + x.deny = ((now > x.deny) ? now : x.deny); + if (adm & DENY_DAYS_1) + { + cdays = "一星期"; + x.deny += 86400 * 7; + } + else if (adm & DENY_DAYS_2) + { + cdays = "兩星期"; + x.deny += 86400 * 14; + } + else if (adm & DENY_DAYS_3) + { + cdays = "三星期"; + x.deny += 86400 * 21; + } + else if (adm & DENY_DAYS_4) + { + cdays = "一個月"; + x.deny += 86400 * 31; + } + else if (adm & DENY_DAYS_5) + { + cdays = ""; + x.deny += 86400 * 31; + x.userlevel |= PERM_DENYSTOP; + } + fprintf(fp, "%s。\n", cdays); + if (adm & DENY_DAYS_5) + fprintf(fp, "期間: 永不復權。\n\n"); + else + fprintf(fp, "期間: %s%s,期限一過自動復權。\n\n", + check_time ? "上次處罰到期日累加" : "從今天起", cdays); + } + fprintf(fp, + "\x1b[1;32m※ Origin: \x1b[1;33m%s \x1b[1;37m<%s>\x1b[m\n\x1b[1;31m◆ From: \x1b[1;36m%s\x1b[m\n", + BOARDNAME, MYHOSTNAME, MYHOSTNAME); + + fclose(fp); + sprintf(buf, "[%s處罰] %s %s", cross ? "連坐" : "", u->userid, cselect); + keeplog(FN_STOP_LOG, BRD_VIOLATELAW, buf, 3); + usr_fpath(buf, x.userid, FN_STOPPERM_LOG); + fp = fopen(buf, "a+"); + f_suck(fp, FN_STOP_LOG); + fclose(fp); + + memcpy(u, &x, sizeof(x)); + acct_save(u); + return adm; +} + +/* ----------------------------------------------------- */ +/* 設定 E-mail address */ +/* ----------------------------------------------------- */ + +/* Tag logger */ + +static TLogger ban_addr_tlogger = TLOGGER_DEFAULT; + +void ban_addr_tlogger_init(const TLogger *tlogger) +{ + ban_addr_tlogger = (tlogger) ? *tlogger : TLOGGER_DEFAULT; +} + +int ban_addr(const char *addr) +{ + int i; + char *host, *str GCC_UNUSED; + char foo[64]; /* SoC: 放置待檢查的 email address */ + const char* str_invalid; + + static const char *const invalid[] = { "@bbs", "bbs@", "root@", "gopher@", + "guest@", "@ppp", "@slip", "@dial", "unknown@", "@anon.penet.fi", + "193.64.202.3", "brd@", NULL + }; + + /* SoC: 保持原 email 的大小寫 */ + str_lower(foo, addr); + + for (i = 0; (str_invalid = invalid[i]); i++) + { + if (strstr(foo, str_invalid)) + return 1; + } + + /* check for mail.acl (lower case filter) */ + + host = (char *)strchr(foo, '@'); + *host = '\0'; + /* i = acl_has(FN_ETC_SPAMMER_ACL, foo, host + 1); */ + /* Thor.981223: 將bbsreg拒絕部分分開 */ + i = acl_has(FN_ETC_UNTRUST_ACL, foo, host + 1); + /* *host = '@'; */ + if (i < 0) + logger_tag(&ban_addr_tlogger, "NOACL", host); + return i > 0; +} + +int allow_addr(const char *addr) +{ + int i; + char *host; + char foo[64]; + + str_lower(foo, addr); + + host = (char *)strchr(foo, '@'); + *host = '\0'; + i = acl_has(FN_ETC_ALLOW_ACL, foo, host + 1); + return i > 0; +} + +/* gaod:換新:p */ +void check_nckuemail(char *email) +{ + char *ptr; + ptr = strstr(email, DEFAULTSERVER); + + if (ptr) + { + strcpy(ptr, NCKUMAIL); + } +} + +/* 找尋是否有註冊三個以上之 Email */ +/* mode : 1.find 2.add 3.del */ +int find_same_email(const char *mail, int mode) +{ + int pos = 0, fd; + const char *fpath; + SAME_EMAIL email; + + + fpath = FN_ETC_EMAILADDR_ACL; + + if (mode >= 1 && mode <= 3) + { + fd = open(fpath, O_RDONLY); + pos = 0; + while (fd >= 0) + { + lseek(fd, (off_t) (sizeof(SAME_EMAIL) * pos), SEEK_SET); + if (read(fd, &email, sizeof(SAME_EMAIL)) == sizeof(SAME_EMAIL)) + { + if (!strcmp(mail, email.email)) + break; + pos++; + } + else + { + pos = -1; + break; + } + } + if (fd >= 0) + close(fd); + } + + + if (mode == 1) + { + if (pos >= 0) + return email.num; + else + return 0; + } + if (mode == 2) + { + if (pos == -1) + { + memset(&email, 0, sizeof(SAME_EMAIL)); + strcpy(email.email, mail); + email.num = 1; + rec_add(fpath, &email, sizeof(SAME_EMAIL)); + } + else + { + email.num++; + rec_put(fpath, &email, sizeof(SAME_EMAIL), pos); + } + } + if (mode == 3) + { + if (pos == -1) + return 0; + if (email.num == 1) + { + rec_del(fpath, sizeof(SAME_EMAIL), pos, NULL, NULL); + } + else + { + email.num--; + rec_put(fpath, &email, sizeof(SAME_EMAIL), pos); + } + } + return 0; +} diff --git a/maple/acct.c b/maple/acct.c index 80d187205..fb429867f 100644 --- a/maple/acct.c +++ b/maple/acct.c @@ -31,150 +31,7 @@ void logitfile(const char *file, const char *key, const char *msg) f_cat(file, buf); } -/* ----------------------------------------------------- */ -/* W[ȹ, u}n, Hh */ -/* ----------------------------------------------------- */ - -void addmoney(int addend, const char *userid) -{ - ACCT acct; - if (acct_load(&acct, userid) >= 0) - { - double temp = (acct.money + addend); /* קK */ - if (temp < INT_MAX) - acct.money += addend; - else - { - acct.money = (INT_MAX - 1); - } - acct_save(&acct); - } -} - -void addpoint1(int addend, const char *userid) -{ - ACCT acct; - if (acct_load(&acct, userid) >= 0) - { - double temp = (acct.point1 + addend); /* קK */ - if (temp < INT_MAX) - acct.point1 += addend; - acct_save(&acct); - } -} - -void addpoint2(int addend, const char *userid) -{ - ACCT acct; - if (acct_load(&acct, userid) >= 0) - { - double temp = (acct.point2 + addend); /* קK */ - if (temp < INT_MAX) - acct.point2 += addend; - acct_save(&acct); - } -} - -/* ----------------------------------------------------- */ -/* (.ACCT) ϥΪ̱b (account) subroutines */ -/* ----------------------------------------------------- */ - -void keeplog(const char *fnlog, const char *board, const char *title, int mode /* 0:load 1:rename 2:unlink 3:mark */ - ) -{ - HDR hdr; - char folder[128], fpath[128]; - int fd; - FILE *fp; - - if (!board) - board = BRD_SYSTEM; - - sprintf(folder, "brd/%s/.DIR", board); - fd = hdr_stamp(folder, 'A', &hdr, fpath); - if (fd < 0) - return; - - if (mode == 1) - { - close(fd); - /* rename(fnlog, fpath); */ - f_mv(fnlog, fpath); /* Thor.990409:ipartition */ - } - else - { - fp = fdopen(fd, "w"); - fprintf(fp, "@: SYSOP (%s)\nD: %s\nɶ: %s\n", - SYSOPNICK, title, ctime_any(&hdr.chrono)); - f_suck(fp, fnlog); - fclose(fp); - if (mode == 2) - unlink(fnlog); - } - - strcpy(hdr.title, title); - strcpy(hdr.owner, "SYSOP"); - strcpy(hdr.nick, SYSOPNICK); - if (mode == 3) - hdr.xmode |= POST_MARKED; - fd = open(folder, O_WRONLY | O_CREAT | O_APPEND, 0600); - if (fd < 0) - { - unlink(fpath); - return; - } - write(fd, &hdr, sizeof(HDR)); - close(fd); -} - - -int acct_load(ACCT * acct, const char *userid) -{ - int fd; - - usr_fpath((char *)acct, userid, FN_ACCT); - fd = open((char *)acct, O_RDONLY); - if (fd >= 0) - { - /* Thor.990416: SO`N, .ACCT׷|O0 */ - read(fd, acct, sizeof(ACCT)); - close(fd); - } - return fd; -} - -void acct_save(const ACCT * acct) -{ - int fd; - char fpath[80]; - - usr_fpath(fpath, acct->userid, FN_ACCT); - fd = open(fpath, O_WRONLY, 0600); /* fpath wgsb */ - if (fd >= 0) - { - write(fd, acct, sizeof(ACCT)); - close(fd); - } -} - - -int acct_userno(const char *userid) -{ - int fd; - int userno; - char fpath[80]; - - usr_fpath(fpath, userid, FN_ACCT); - fd = open(fpath, O_RDONLY); - if (fd >= 0) - { - read(fd, &userno, sizeof(userno)); - close(fd); - return userno; - } - return 0; -} - +/* IID.2021-05-20: For functions independent of bbsd globals, please refer to lib/acct.c */ /* ----------------------------------------------------- */ /* name complete for user ID */ @@ -197,7 +54,6 @@ int acct_get(const char *msg, ACCT * acct) return -1; } - /* ----------------------------------------------------- */ /* ]wtɮ */ /* ----------------------------------------------------- */ @@ -644,73 +500,6 @@ void bm_setup(ACCT * u, int adm) clrtobot(); } - -static int seek_log_email(const char *mail, int mode) -{ - EMAIL email; - int pos = 0, fd; - fd = open(FN_VIOLATELAW_DB, O_RDONLY); - while (fd >= 0) - { - lseek(fd, (off_t) (sizeof(email) * pos), SEEK_SET); - if (read(fd, &email, sizeof(email)) == sizeof(email)) - { - if (!strcmp(email.email, mail) - && (mode ? (email.deny > time(0) || email.deny == -1) : 1)) - { - close(fd); - return pos; - } - pos++; - } - else - { - close(fd); - break; - } - } - return -1; -} - -void deny_log_email(const char *mail, time_t deny) -{ - EMAIL email; - int pos; - pos = seek_log_email(mail, 0); - if (pos >= 0) - { - rec_get(FN_VIOLATELAW_DB, &email, sizeof(EMAIL), pos); - if (deny > email.deny || deny == -1) - email.deny = deny; - email.times++; - rec_put(FN_VIOLATELAW_DB, &email, sizeof(EMAIL), pos); - } - else - { - memset(&email, 0, sizeof(email)); - strcpy(email.email, mail); - email.deny = deny; - rec_add(FN_VIOLATELAW_DB, &email, sizeof(EMAIL)); - } -} - -static void deny_add_email(ACCT * he) -{ - char buf[128]; - time_t now; - struct tm *p; - - time(&now); - - p = localtime(&now); - str_lower(he->vmail, he->vmail); - sprintf(buf, "%s # %02d/%02d/%02d %02d:%02d %s (%s)\n", - he->vmail, - p->tm_year % 100, p->tm_mon + 1, p->tm_mday, - p->tm_hour, p->tm_min, "v", cuser.userid); - f_cat(FN_ETC_UNTRUST_ACL, buf); -} - static int select_mode(int adm) { int select, days = 0, mode = 0; @@ -807,154 +596,15 @@ static int select_mode(int adm) return adm; } -int add_deny(ACCT * u, int adm, int cross) +int add_deny(ACCT *u, int adm, int cross) { - FILE *fp; - char buf[80]; - ACCT x; - time_t now; - bool check_time; - const char *cselect = NULL, *cdays = NULL, *cmode = NULL; - - memcpy(&x, u, sizeof(ACCT)); - time(&now); - check_time = (x.deny > now); - - - fp = fopen(FN_STOP_LOG, "w"); if (!adm) - { adm = select_mode(adm); - } if (!adm) - { - if (fp) - fclose(fp); return 0; - } - - if (!strncmp(u->justify, "reg:", 4)) - adm = (adm & ~DENY_MODE_ALL) | DENY_MODE_GUEST; - - if (adm & DENY_SEL_OK) - { - x.deny = now; - memcpy(u, &x, sizeof(x)); - acct_save(u); - return adm; - } - if (adm & DENY_SEL) - { - if (adm & DENY_SEL_TALK) - cselect = ""; - else if (adm & DENY_SEL_POST) - cselect = " Cross Post"; - else if (adm & DENY_SEL_MAIL) - cselect = "osH"; - else if (adm & DENY_SEL_AD) - cselect = "osiH"; - else if (adm & DENY_SEL_SELL) - cselect = "cDkƪ"; - fprintf(fp, "d %s HϯW%sA̯W", u->userid, cselect); - } - if ((adm & (DENY_MODE_ALL)) && !(adm & DENY_MODE_GUEST)) - { - if ((adm & DENY_MODE_ALL) == DENY_MODE_ALL) - { - x.userlevel |= - (PERM_DENYPOST | PERM_DENYTALK | PERM_DENYCHAT | PERM_DENYMAIL - | PERM_DENYNICK); - cmode = " TalkBMailB\nPostBʺ"; - } - else if (adm & DENY_MODE_POST) - { - x.userlevel |= (PERM_DENYPOST); - cmode = " Post "; - } - else if (adm & DENY_MODE_TALK) - { - x.userlevel |= (PERM_DENYTALK | PERM_DENYCHAT); - cmode = " Talk "; - } - else if (adm & DENY_MODE_MAIL) - { - x.userlevel |= (PERM_DENYMAIL); - cmode = " Mail "; - } - else if (adm & DENY_MODE_NICK) - { - x.userlevel |= (PERM_DENYNICK); - cmode = "ʺ"; - } - fprintf(fp, "%sv", cmode); - } - if (adm & DENY_MODE_GUEST) - { - x.userlevel |= - (PERM_DENYPOST | PERM_DENYTALK | PERM_DENYCHAT | PERM_DENYMAIL | - PERM_DENYNICK | PERM_DENYSTOP); - x.userlevel &= ~(PERM_BASIC | PERM_VALID); - x.deny += 86400 * 31; - cmode = " TalkBMailB\nPostBʺ"; - fprintf(fp, - "%svAv guestAä_vAëOdbA\n E-mailG%s äobUC\n\n", - cmode, u->vmail[0] ? u->vmail : "[L{ҫHc]"); - deny_add_email(u); - } - if ((adm & DENY_DAYS) && !(adm & DENY_MODE_GUEST)) - { - x.deny = ((now > x.deny) ? now : x.deny); - if (adm & DENY_DAYS_1) - { - cdays = "@P"; - x.deny += 86400 * 7; - } - else if (adm & DENY_DAYS_2) - { - cdays = "P"; - x.deny += 86400 * 14; - } - else if (adm & DENY_DAYS_3) - { - cdays = "TP"; - x.deny += 86400 * 21; - } - else if (adm & DENY_DAYS_4) - { - cdays = "@Ӥ"; - x.deny += 86400 * 31; - } - else if (adm & DENY_DAYS_5) - { - cdays = ""; - x.deny += 86400 * 31; - x.userlevel |= PERM_DENYSTOP; - } - fprintf(fp, "%sC\n", cdays); - if (adm & DENY_DAYS_5) - fprintf(fp, ": ä_vC\n\n"); - else - fprintf(fp, ": %s%sA@L۰ʴ_vC\n\n", - check_time ? "WB@֥[" : "qѰ_", cdays); - } - fprintf(fp, - "\x1b[1;32m Origin: \x1b[1;33m%s \x1b[1;37m<%s>\x1b[m\n\x1b[1;31m From: \x1b[1;36m%s\x1b[m\n", - BOARDNAME, MYHOSTNAME, MYHOSTNAME); - - fclose(fp); - sprintf(buf, "[%sB@] %s %s", cross ? "s" : "", u->userid, cselect); - keeplog(FN_STOP_LOG, BRD_VIOLATELAW, buf, 3); - usr_fpath(buf, x.userid, FN_STOPPERM_LOG); - fp = fopen(buf, "a+"); - f_suck(fp, FN_STOP_LOG); - fclose(fp); - - memcpy(u, &x, sizeof(x)); - acct_save(u); - return adm; + return add_deny_exer(u, adm, cross, cuser.userid); } - void acct_setup(ACCT * u, int adm) { ACCT x; @@ -1375,148 +1025,10 @@ int m_bmset(void) return 0; } - /* ----------------------------------------------------- */ /* ]w E-mail address */ /* ----------------------------------------------------- */ - -int ban_addr(const char *addr) -{ - int i; - char *host, *str GCC_UNUSED; - char foo[64]; /* SoC: mˬd email address */ - const char* str_invalid; - - static const char *const invalid[] = { "@bbs", "bbs@", "root@", "gopher@", - "guest@", "@ppp", "@slip", "@dial", "unknown@", "@anon.penet.fi", - "193.64.202.3", "brd@", NULL - }; - - /* SoC: O email jpg */ - str_lower(foo, addr); - - for (i = 0; (str_invalid = invalid[i]); i++) - { - if (strstr(foo, str_invalid)) - return 1; - } - - /* check for mail.acl (lower case filter) */ - - host = (char *)strchr(foo, '@'); - *host = '\0'; - /* i = acl_has(FN_ETC_SPAMMER_ACL, foo, host + 1); */ - /* Thor.981223: Nbbsregڵ} */ - i = acl_has(FN_ETC_UNTRUST_ACL, foo, host + 1); - /* *host = '@'; */ - if (i < 0) - blog("NOACL", host); - return i > 0; -} - -#ifdef HAVE_WRITE -static int allow_addr(const char *addr) -{ - int i; - char *host; - char foo[64]; - - str_lower(foo, addr); - - host = (char *)strchr(foo, '@'); - *host = '\0'; - i = acl_has(FN_ETC_ALLOW_ACL, foo, host + 1); - return i > 0; -} -#endif - -void /* gaod:s:p */ -check_nckuemail(char *email) -{ - char *ptr; - ptr = strstr(email, DEFAULTSERVER); - - if (ptr) - { - strcpy(ptr, NCKUMAIL); - } -} - -/* MO_UTӥHW Email */ -int find_same_email( /* mode : 1.find 2.add 3.del */ - const char *mail, int mode) -{ - int pos = 0, fd; - const char *fpath; - SAME_EMAIL email; - - - fpath = FN_ETC_EMAILADDR_ACL; - - if (mode >= 1 && mode <= 3) - { - fd = open(fpath, O_RDONLY); - pos = 0; - while (fd >= 0) - { - lseek(fd, (off_t) (sizeof(SAME_EMAIL) * pos), SEEK_SET); - if (read(fd, &email, sizeof(SAME_EMAIL)) == sizeof(SAME_EMAIL)) - { - if (!strcmp(mail, email.email)) - break; - pos++; - } - else - { - pos = -1; - break; - } - } - if (fd >= 0) - close(fd); - } - - - if (mode == 1) - { - if (pos >= 0) - return email.num; - else - return 0; - } - if (mode == 2) - { - if (pos == -1) - { - memset(&email, 0, sizeof(SAME_EMAIL)); - strcpy(email.email, mail); - email.num = 1; - rec_add(fpath, &email, sizeof(SAME_EMAIL)); - } - else - { - email.num++; - rec_put(fpath, &email, sizeof(SAME_EMAIL), pos); - } - } - if (mode == 3) - { - if (pos == -1) - return 0; - if (email.num == 1) - { - rec_del(fpath, sizeof(SAME_EMAIL), pos, NULL, NULL); - } - else - { - email.num--; - rec_put(fpath, &email, sizeof(SAME_EMAIL), pos); - } - } - return 0; -} - int u_addr(void) { const char *msg; diff --git a/maple/bbsd.c b/maple/bbsd.c index 5a55a809e..350036dc6 100644 --- a/maple/bbsd.c +++ b/maple/bbsd.c @@ -1912,6 +1912,7 @@ int main(int argc, char *argv[]) /* attach shared memory & semaphore */ /* --------------------------------------------------- */ + ban_addr_tlogger_init(&blog_tlogger); shm_tlogger_init(&blog_tlogger); #ifdef HAVE_SEM diff --git a/maple/xchatd.c b/maple/xchatd.c index 069b18b71..6cdd55e51 100644 --- a/maple/xchatd.c +++ b/maple/xchatd.c @@ -846,26 +846,6 @@ exit_room( /* BBS server side routines */ /* ----------------------------------------------------- */ -/* Thor.990211: Τ@ dao library */ -/* static */ -int -acct_load( - ACCT *acct, - const char *userid) -{ - int fd; - - usr_fpath((char *) acct, userid, FN_ACCT); - fd = open((char *) acct, O_RDONLY); - if (fd >= 0) - { - read(fd, acct, sizeof(ACCT)); - close(fd); - } - return fd; -} - - /* Thor.990211: Τ@ dao library */ static void diff --git a/util/account.c b/util/account.c index ed2970328..2aeb915c8 100644 --- a/util/account.c +++ b/util/account.c @@ -656,10 +656,10 @@ main(void) /* HUOK */ sprintf(title, "[O] %s峹[ݬ", date); - keeplog(FN_BROWSE_LOG, BRD_SECRET, title, 3); + keeplog(FN_BROWSE_LOG, BRD_SECRET, title, 4); sprintf(title, "[O] %sΦWO", date); - keeplog(FN_ANONYMOUS_LOG, BRD_SECRET, title, 3); + keeplog(FN_ANONYMOUS_LOG, BRD_SECRET, title, 4); /* ѩ@B}ɪA, OG log by statue ק SIG_USR1 iN log dump X by visor */ @@ -831,56 +831,3 @@ main(void) exit(0); } - -void -keeplog( - const char *fnlog, - const char *board, - const char *title, - int mode) /* 0:load 1: rename 2:unlink 3:mark*/ -{ - HDR hdr; - char folder[128], fpath[128]; - int fd; - FILE *fp; - - if (!board) - board = BRD_SYSTEM; - - sprintf(folder, "brd/%s/.DIR", board); - fd = hdr_stamp(folder, 'A', &hdr, fpath); - if (fd < 0) - return; - - if (mode == 1 || mode == 3) - { - close(fd); - /* rename(fnlog, fpath); */ - f_mv(fnlog, fpath); /* Thor.990409:ipartition */ - } - else - { - fp = fdopen(fd, "w"); - fprintf(fp, "@: SYSOP (" SYSOPNICK ")\nD: %s\nɶ: %s\n", - title, ctime_any(&hdr.chrono)); - f_suck(fp, fnlog); - fclose(fp); - if (mode) - unlink(fnlog); - } - if (mode == 3) - hdr.xmode |= POST_MARKED; - - strcpy(hdr.title, title); - strcpy(hdr.owner, "SYSOP"); - strcpy(hdr.nick, SYSOPNICK); - fd = open(folder, O_WRONLY | O_CREAT | O_APPEND, 0600); - if (fd < 0) - { - unlink(fpath); - return; - } - write(fd, &hdr, sizeof(HDR)); - close(fd); -} - diff --git a/util/addsong.c b/util/addsong.c index a36ae93e4..1ca4ecf4e 100644 --- a/util/addsong.c +++ b/util/addsong.c @@ -14,23 +14,6 @@ static unsigned int perm; static int num; -void -acct_save( - const ACCT *acct) -{ - int fd; - char fpath[80]; - - usr_fpath(fpath, acct->userid, FN_ACCT); - fd = open(fpath, O_WRONLY, 0600); /* fpath wgsb */ - if (fd >= 0) - { - write(fd, acct, sizeof(ACCT)); - close(fd); - } -} - - static void reaper( const char *fpath, diff --git a/util/bbsmail.c b/util/bbsmail.c index e07a9c44f..a7abfac99 100644 --- a/util/bbsmail.c +++ b/util/bbsmail.c @@ -100,24 +100,6 @@ bbs_biff( /* D{ */ /* ----------------------------------------------------- */ -int -acct_load( - ACCT *acct, - const char *userid) -{ - int fd; - - usr_fpath((char *) acct, userid, FN_ACCT); - fd = open((char *) acct, O_RDONLY); - if (fd >= 0) - { - /* Thor.990416: SO`N, .ACCT׷|O0 */ - read(fd, acct, sizeof(ACCT)); - close(fd); - } - return fd; -} - static int mail2bbs( const char *userid) diff --git a/util/brdstat.c b/util/brdstat.c index b00a41691..4973cb5e3 100644 --- a/util/brdstat.c +++ b/util/brdstat.c @@ -30,59 +30,6 @@ HDR hotboard[MAX_HOTBOARD]; int hotcount; -void -keeplog( - const char *fnlog, - const char *board, - const char *title, - int mode) /* 0:load 1: rename 2:unlink 3:mark*/ -{ - HDR hdr; - char folder[128], fpath[128]; - int fd; - FILE *fp; - - if (!board) - board = BRD_SYSTEM; - - sprintf(folder, "brd/%s/.DIR", board); - fd = hdr_stamp(folder, 'A', &hdr, fpath); - if (fd < 0) - return; - - if (mode == 1 || mode == 3) - { - close(fd); - /* rename(fnlog, fpath); */ - f_mv(fnlog, fpath); /* Thor.990409:ipartition */ - } - else - { - fp = fdopen(fd, "w"); - fprintf(fp, "@: SYSOP (" SYSOPNICK ")\nD: %s\nɶ: %s\n", - title, ctime(&hdr.chrono)); - f_suck(fp, fnlog); - fclose(fp); - if (mode) - unlink(fnlog); - } - if (mode == 3) - hdr.xmode |= POST_MARKED; - - strcpy(hdr.title, title); - strcpy(hdr.owner, "SYSOP"); - strcpy(hdr.nick, SYSOPNICK); - fd = open(folder, O_WRONLY | O_CREAT | O_APPEND, 0600); - if (fd < 0) - { - unlink(fpath); - return; - } - write(fd, &hdr, sizeof(HDR)); - close(fd); -} - - /* ----------------------------------------------------- */ /* }Gshm P cache.c ۮe */ /* ----------------------------------------------------- */ diff --git a/util/resetvmail.c b/util/resetvmail.c index 1cb8c46c6..56cdaaddf 100644 --- a/util/resetvmail.c +++ b/util/resetvmail.c @@ -10,23 +10,6 @@ #include "bbs.h" -void -acct_save( - const ACCT *acct) -{ - int fd; - char fpath[80]; - - usr_fpath(fpath, acct->userid, FN_ACCT); - fd = open(fpath, O_WRONLY, 0600); /* fpath wgsb */ - if (fd >= 0) - { - write(fd, acct, sizeof(ACCT)); - close(fd); - } -} - - static void reaper( const char *fpath, diff --git a/util/stopperm.c b/util/stopperm.c index 9f492a0ab..dbbd3685e 100644 --- a/util/stopperm.c +++ b/util/stopperm.c @@ -115,263 +115,6 @@ same_mail2( return total; } -void -keeplog( - const char *fnlog, - const char *board, - const char *title, - int mode) /* 0:load 1:rename 2:unlink 3:mark */ -{ - HDR hdr; - char folder[128], fpath[128]; - int fd; - FILE *fp; - - if (!board) - board = BRD_SYSTEM; - - sprintf(folder, "brd/%s/.DIR", board); - fd = hdr_stamp(folder, 'A', &hdr, fpath); - if (fd < 0) - return; - - fp = fdopen(fd, "w"); - fprintf(fp, "@: SYSOP (" SYSOPNICK ")\nD: %s\nɶ: %s\n", - title, ctime_any(&hdr.chrono)); - f_suck(fp, fnlog); - fclose(fp); - - strcpy(hdr.title, title); - strcpy(hdr.owner, "SYSOP"); - strcpy(hdr.nick, SYSOPNICK); - if (mode == 3) - hdr.xmode |= POST_MARKED; - fd = open(folder, O_WRONLY | O_CREAT | O_APPEND, 0600); - if (fd < 0) - { - unlink(fpath); - return; - } - write(fd, &hdr, sizeof(HDR)); - close(fd); -} - - -int -acct_load( - ACCT *acct, - const char *userid) -{ - int fd; - - usr_fpath((char *) acct, userid, FN_ACCT); - fd = open((char *) acct, O_RDONLY); - if (fd >= 0) - { - read(fd, acct, sizeof(ACCT)); - close(fd); - } - return fd; -} - - -void -acct_save( - const ACCT *acct) -{ - int fd; - char fpath[80]; - - usr_fpath(fpath, acct->userid, FN_ACCT); - fd = open(fpath, O_WRONLY, 0600); /* fpath wgsb */ - if (fd >= 0) - { - write(fd, acct, sizeof(ACCT)); - close(fd); - } -} - - -int -seek_log_email( - const char *mail) -{ - EMAIL email; - int pos=0, fd; - fd = open(FN_VIOLATELAW_DB, O_RDONLY); - while (fd >= 0) - { - lseek(fd, (off_t) (sizeof(email) * pos), SEEK_SET); - if (read(fd, &email, sizeof(email)) == sizeof(email)) - { - if (!strcmp(email.email, mail)) - { - close(fd); - return pos; - } - pos++; - } - else - { - close(fd); - break; - } - } - return -1; -} - -void -deny_log_email( - const char *mail, - time_t deny) -{ - EMAIL email; - int pos; - pos = seek_log_email(mail); - if (pos >=0) - { - rec_get(FN_VIOLATELAW_DB, &email, sizeof(EMAIL), pos); - if (deny > email.deny || deny == -1) - email.deny = deny; - email.times++; - rec_put(FN_VIOLATELAW_DB, &email, sizeof(EMAIL), pos); - } - else - { - memset(&email, 0, sizeof(email)); - strcpy(email.email, mail); - email.deny = deny; - rec_add(FN_VIOLATELAW_DB, &email, sizeof(EMAIL)); - } -} - -static void -deny_add_email( - ACCT *he, - const char *exer) -{ - char buf[128]; - time_t now; - struct tm *p; - - time(&now); - - p = localtime(&now); - str_lower(he->vmail, he->vmail); - sprintf(buf, "%s # %02d/%02d/%02d %02d:%02d %s (%s)\n", - he->vmail, - p->tm_year % 100, p->tm_mon + 1, p->tm_mday, - p->tm_hour, p->tm_min, "v", exer); - f_cat(FN_ETC_UNTRUST_ACL, buf); -} - -static int -add_deny_exer( - ACCT *u, - int adm, - int cross, - const char *exer) -{ - FILE *fp; - char buf[80]; - ACCT x; - time_t now; - bool check_time; - const char *cselect=NULL, *cdays=NULL, *cmode=NULL; - - memcpy(&x, u, sizeof(ACCT)); - time(&now); - check_time = (x.deny > now); - - if (!strncmp(u->justify, "reg:", 4)) - adm = (adm & ~DENY_MODE_ALL)|DENY_MODE_GUEST; - - unlink(FN_STOP_LOG); - fp = fopen(FN_STOP_LOG, "w"); - if (adm & DENY_SEL_OK) - { - x.deny = now; - memcpy(u, &x, sizeof(x)); - acct_save(u); - return adm; - } - if (adm & DENY_SEL) - { - if (adm & DENY_SEL_TALK) cselect = ""; - else if (adm & DENY_SEL_POST) cselect = " Cross Post"; - else if (adm & DENY_SEL_MAIL) cselect = "osH"; - else if (adm & DENY_SEL_AD) cselect = "osiH"; - else if (adm & DENY_SEL_SELL) cselect = "cDkƪ"; - fprintf(fp, "d %s HϯW%sA̯W", u->userid, cselect); - } - if ((adm & (DENY_MODE_ALL)) && !(adm & DENY_MODE_GUEST)) - { - if ((adm & DENY_MODE_ALL) == DENY_MODE_ALL) - { - x.userlevel |= (PERM_DENYPOST | PERM_DENYTALK | PERM_DENYCHAT | PERM_DENYMAIL | PERM_DENYNICK); - cmode = " TalkBMailB\nPostBʺ"; - } - else if (adm & DENY_MODE_POST) - { - x.userlevel |= (PERM_DENYPOST); - cmode = " Post "; - } - else if (adm & DENY_MODE_TALK) - { - x.userlevel |= (PERM_DENYTALK|PERM_DENYCHAT); - cmode = " Talk "; - } - else if (adm & DENY_MODE_MAIL) - { - x.userlevel |= (PERM_DENYMAIL); - cmode = " Mail "; - } - else if (adm & DENY_MODE_NICK) - { - x.userlevel |= (PERM_DENYNICK); - cmode = "ʺ"; - } - fprintf(fp, "%sv", cmode); - } - if (adm & DENY_MODE_GUEST) - { - x.userlevel |= (PERM_DENYPOST | PERM_DENYTALK | PERM_DENYCHAT | PERM_DENYMAIL | PERM_DENYSTOP); - x.userlevel &= ~(PERM_BASIC | PERM_VALID); - x.deny += 86400 * 31; - cmode = " TalkBMailB\nPostBʺ"; - fprintf(fp, "%svAv guestAä_vAëOdbA\n E-mailG%s äobUC\n\n", cmode, u->vmail[0] ? u->vmail : "[L{ҫHc]"); - deny_add_email(u, exer); - } - if ((adm & DENY_DAYS) && !(adm & DENY_MODE_GUEST)) - { - if (adm & DENY_DAYS_1) { cdays = "@P"; x.deny = now + 86400 * 7; } - else if (adm & DENY_DAYS_2) { cdays = "P"; x.deny = now + 86400 * 14; } - else if (adm & DENY_DAYS_3) { cdays = "ѬP"; x.deny = now + 86400 * 21; } - else if (adm & DENY_DAYS_4) { cdays = "@Ӥ"; x.deny = now + 86400 * 31; } - else if (adm & DENY_DAYS_5) { cdays = ""; x.deny = now + 86400 * 31; x.userlevel |= PERM_DENYSTOP; } - fprintf(fp, "%s\n", cdays); - if (adm & DENY_DAYS_5) - fprintf(fp, ": ä_vC\n\n"); - else - fprintf(fp, ": %s%sA@L۰ʴ_vC\n\n", check_time ? "WB@֥[":"qѰ_", cdays); - } - fprintf(fp, "\x1b[1;32m Origin: \x1b[1;33m%s \x1b[1;37m<%s>\x1b[m\n\x1b[1;31m From: \x1b[1;36m%s\x1b[m\n", BOARDNAME, MYHOSTNAME, MYHOSTNAME); - - fclose(fp); - sprintf(buf, "[%sB@] %s %s", cross ? "s":"", u->userid, cselect); - keeplog(FN_STOP_LOG, BRD_VIOLATELAW, buf, 3); - usr_fpath(buf, x.userid, FN_STOPPERM_LOG); - unlink(buf); - fp = fopen(buf, "a+"); - f_suck(fp, FN_STOP_LOG); - fclose(fp); - - - memcpy(u, &x, sizeof(x)); - acct_save(u); - return adm; -} - static void setup( diff --git a/util/template.c b/util/template.c index a645450dd..8953bec89 100644 --- a/util/template.c +++ b/util/template.c @@ -11,22 +11,6 @@ #include "bbs.h" -void -acct_save( - const ACCT *acct) -{ - int fd; - char fpath[80]; - - usr_fpath(fpath, acct->userid, FN_ACCT); - fd = open(fpath, O_WRONLY, 0600); /* fpath wgsb */ - if (fd >= 0) - { - write(fd, acct, sizeof(ACCT)); - close(fd); - } -} - static void reaper( const char *fpath, diff --git a/util/tranufo.c b/util/tranufo.c index 3c4c159ec..ddf5d25b8 100644 --- a/util/tranufo.c +++ b/util/tranufo.c @@ -36,22 +36,6 @@ const TABLE table[] = { {0, 0} }; -void -acct_save( - const ACCT *acct) -{ - int fd; - char fpath[80]; - - usr_fpath(fpath, acct->userid, FN_ACCT); - fd = open(fpath, O_WRONLY, 0600); /* fpath wgsb */ - if (fd >= 0) - { - write(fd, acct, sizeof(ACCT)); - close(fd); - } -} - static void reaper( const char *fpath,