diff options
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/bbs.c | 18 | ||||
-rw-r--r-- | mbbsd/cache.c | 12 | ||||
-rw-r--r-- | mbbsd/mail.c | 8 | ||||
-rw-r--r-- | mbbsd/record.c | 26 |
4 files changed, 50 insertions, 14 deletions
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 90538221..e99874a1 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -770,9 +770,7 @@ delete_allpost(const char *userid) setbfile(file, BN_ALLPOST, fhdr.filename); unlink(file); - sprintf(fhdr.title, "(本文已被刪除)"); - strcpy(fhdr.filename, ".deleted"); - strcpy(fhdr.owner, "-"); + set_safedel_fhdr(&fhdr); lseek(fd, sizeof(fileheader_t) * i, SEEK_SET); write(fd, &fhdr, sizeof(fileheader_t)); } @@ -1730,7 +1728,11 @@ cross_post(int ent, fileheader_t * fhdr, const char *direct) bp = getbcache(currbid); if (bp && (bp->brdattr & BRD_VOTEBOARD) ) - return FULLUPDATE; + return DONOTHING; + + // if file is SAFE_DELETED, skip it. + if (fhdr->owner[0] == '-' && fhdr->owner[1] == 0) + return DONOTHING; setbfile(fname, currboard, fhdr->filename); if (!dashf(fname)) @@ -1756,6 +1758,14 @@ cross_post(int ent, fileheader_t * fhdr, const char *direct) } #endif // USE_AUTOCPLOG + // XXX TODO 為避免違法使用者大量對申訴板轉文,限定每次發文量。 + if (HasUserPerm(PERM_VIOLATELAW)) + { + static int violatecp = 0; + if (violatecp++ >= MAX_CROSSNUM) + return DONOTHING; + } + move(2, 0); clrtoeol(); if (postrecord.times > 1) diff --git a/mbbsd/cache.c b/mbbsd/cache.c index 0ca1d740..2a046969 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -822,10 +822,14 @@ postperm_msg(const char *bname) !is_hidden_board_friend(i, usernum)) return "看板限制發文"; - if (HasUserPerm(PERM_VIOLATELAW) && (bp->level & PERM_VIOLATELAW)) - return NULL; - else if (HasUserPerm(PERM_VIOLATELAW)) - return "罰單未繳"; + if (HasUserPerm(PERM_VIOLATELAW)) + { + // 在罰單的討論相關板可以發文 + if (bp->level & PERM_VIOLATELAW) + return NULL; + else + return "罰單未繳"; + } if (!(bp->level & ~PERM_POST)) return NULL; diff --git a/mbbsd/mail.c b/mbbsd/mail.c index 545027ca..60d2b34f 100644 --- a/mbbsd/mail.c +++ b/mbbsd/mail.c @@ -1422,6 +1422,14 @@ mail_cross_post(int ent, fileheader_t * fhdr, const char *direct) char genbuf[200]; char genbuf2[4]; + // XXX TODO 為避免違法使用者大量對申訴板轉文,限定每次發文量。 + if (HasUserPerm(PERM_VIOLATELAW)) + { + static int violatecp = 0; + if (violatecp++ >= MAX_CROSSNUM) + return DONOTHING; + } + move(2, 0); clrtoeol(); if (postrecord.times > 1) diff --git a/mbbsd/record.c b/mbbsd/record.c index 6b8a8af9..48c61fe2 100644 --- a/mbbsd/record.c +++ b/mbbsd/record.c @@ -383,6 +383,24 @@ delete_range(const char *fpath, int id1, int id2) } #endif +void +set_safedel_fhdr(fileheader_t *fhdr) +{ + if ( strcmp(fhdr->owner, cuser.userid) == 0 || + !fhdr->owner[0] || + (fhdr->owner[0] == '-' && fhdr->owner[1] == 0) ) + { + // i'm the one to delete it, or if the owner is corpse. + snprintf(fhdr->title, sizeof(fhdr->title), + "%s [%s]", STR_SAFEDEL_TITLE, cuser.userid); + } else { + snprintf(fhdr->title, sizeof(fhdr->title), + "%s [%s/%s]", STR_SAFEDEL_TITLE, fhdr->owner, cuser.userid); + } + // snprintf(fhdr->title, sizeof(fhdr->title), "%s", STR_SAFEDEL_TITLE); + strcpy(fhdr->filename, FN_SAFEDEL); + strcpy(fhdr->owner, "-"); +} #ifdef SAFE_ARTICLE_DELETE int @@ -390,9 +408,7 @@ safe_article_delete(int ent, const fileheader_t *fhdr, const char *direct) { fileheader_t newfhdr; memcpy(&newfhdr, fhdr, sizeof(fileheader_t)); - sprintf(newfhdr.title, "(本文已被刪除)"); - strcpy(newfhdr.filename, ".deleted"); - strcpy(newfhdr.owner, "-"); + set_safedel_fhdr(&newfhdr); substitute_record(direct, &newfhdr, sizeof(newfhdr), ent); return 0; } @@ -420,9 +436,7 @@ safe_article_delete_range(const char *direct, int from, int to) strlcpy(ptr, newfhdr.filename, sizeof(newfhdr.filename)); unlink(fn); - sprintf(newfhdr.title, "(本文已被刪除)"); - strcpy(newfhdr.filename, ".deleted"); - strcpy(newfhdr.owner, "-"); + set_safedel_fhdr(&newfhdr); // because off_t is unsigned, we could NOT seek backward. lseek(fd, sizeof(fileheader_t) * (from - 1), SEEK_SET); write(fd, &newfhdr, sizeof(fileheader_t)); |