Giter Site home page Giter Site logo

bmybbs / bmybbs Goto Github PK

View Code? Open in Web Editor NEW
33.0 33.0 13.0 33.04 MB

The project for bmybbs, which is the official Bulletin Board System of Xi'an Jiaotong University.

Home Page: http://bbs.xjtu.edu.cn

License: GNU General Public License v2.0

Shell 2.35% Makefile 1.56% C 81.09% Gnuplot 0.02% Perl 1.40% JavaScript 1.45% CSS 2.00% Python 0.39% HTML 6.80% CMake 0.26% Roff 0.21% Batchfile 0.01% M4 0.28% Yacc 0.39% Vue 1.74% SCSS 0.03% Visual Basic 6.0 0.01%

bmybbs's Introduction

BMYBBS Backend Build Status Frontend Build Status Coverity Scan Build Status

BMYBBSYTHT 代码的一个分支,被使用在西安交通大学兵马俑 BBS。 当前开发和运行环境使用的是 Ubuntu 20.04 / gcc 9.3.0,测试环境使用的是 Ubuntu 20.04 / gcc 10.2.0。

BMYBBS 已经和最初的 YTHT 系统不兼容。由于能力和精力有限,本项目未提供升级或者转换程序,同时代码中或许移除掉了一些可移植性相关的宏或者代码,因此本项目亦不能保证在其他 Linux 发行版或者 POSIX 系统上运行。

如果您仅需要反馈问题,可以前往 issues 查找是否已被反馈,或者提交新的 issue 。如果对于 BMYBBS 的开发、运行感兴趣,以下指南或许可以给您帮助。

环境准备

工具和库

在编译过程中需要使用到的一些工具和库

sudo apt install build-essential libtool cmake gdb chrpath \
	apache2 libapache2-mod-perl2 mysql-server redis-server \
	libmysqlclient-dev libpcre3-dev libjson-c-dev libhiredis-dev \
	libxml2-dev libgmp-dev libcurl4-openssl-dev

以下工具亦可能带来帮助:

sudo apt install language-pack-zh-hans git zsh tmux

本项目还依赖于 libghthash、onion 以及 check ,相关编译安装可以在 GitHub CI 配置文件 找到。

用户环境

BMYBBS 运行使用 bbs 用户身份,其 UID/GID 均为 999。如果系统中已有用户和组使用了这些 ID,例如在 Ubuntu 20.04 中被 systemd-coredump 占用,可以参照如下命令:

sudo groupmod -g 1999 systemd-coredump
sudo usermod  -u 1999 systemd-coredump

使用如下命令创建 bbs 用户和用户组:

sudo groupadd -g 999 bbs
sudo adduser --uid 999 --gid 999 bbs

初始化 bbs 相关目录和配置文件

以下是典型的使用,其中某些值可能已经作为常量写入了代码,建议除了 LOCALIP 外保持一致。

BBS_HOME=/home/bbs \
HTMPATH=/home/apache/htdocs/bbs \
CGIPATH=/home/apache/cgi-bin/bbs \
LOCALIP=202.117.1.8 \
sudo -E ./PrepDirs.sh

编译

# 假设您已经在 bmybbs 代码根目录
mkdir build
cd build
cmake ..
make

这里的编译应该是成功的。单元测试中一些验证码相关的用例会因为您缺少数据而不通过,因此您可以忽略执行单元测试。

已知问题: 当前使用 cmake 构建的 sshbbsd 会在建立连接后断开并终止子进程,因此需要使用原先的 Makefile 方式。建议参考 编译sshbbsd的过程.txt

安装

参考 install_binaries_and_libraries.sh,典型使用方法:

# 整体安装,此处假设您位于上一步编译的目录下(即 build 目录)
../install_binaries_and_libraries.sh .

# 单独更新,例如 libytht.so 和 bbsd,此处假设您位于上一步编译的目录下(即 build 目录)
../install_binaries_and_libraries.sh libytht/libytht.so /home/bbs/lib/libytht.so
../install_binaries_and_libraries.sh src/bbsd/bbsd /home/bbs/bin/bbsd

额外配置

apache2

  1. /etc/apache2/envvars 中设置 APACHE_RUN_USERAPACHE_RUN_GROUPbbs
  2. 使用 a2enmod(8) 启用 rewritecgid 两个模块。

重启 apache2 以生效。

系统调试

BBS 存在很多缺陷,难免会意外终止程序,这时借助 gdb 和转储文件可以帮助很多。参考以下配置:

ulimit -c unlimited
sysctl -w kernel.core_pattern='/core/%e.%t.%u.%g.%s.%p'

其他

如果您在编译安装中遇到未提及的情况,可能在如下文档中能找到帮助信息:

bmybbs's People

Contributors

dependabot[bot] avatar ironblood avatar liu-ameng avatar pzhg avatar sfking avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bmybbs's Issues

bbslist 各讨论区人气榜统计错误

可能是空文,可能前几名没有显示,例如

发信人: XJTU-XANET (自动发信系统), 信区:
标  题: [Sun Oct 12] 本站各讨论区人气榜
发信站: 兵马俑BBS自动发信系统 (Sun Oct 12 09:28:52 2014)

【此篇文章是由自动发信系统所张贴】

名次 讨论区名称     中文叙述                               人气值
   3 dance          [体育] 青春舞步                          118
   4 XJTUnews       [本校] 说说咱交大                         84
   5 sysop          [本站] 站长工作室                         63
   7 Single         [感性] 单身贵族                           50
   8 SecondHand     [信息] 二手货市场                         46
  10 Jiangxi        [乡谊] 江南西道                           34
  12 bbslists       [本站] 本站的各类统计列表                 26

无法阅读版面最新的帖子

现象

打开版面最新的帖子会返回 500 的错误。检查对应的 dump 文件,显示在 iconv 某处调用出错。

如果新发表一篇文章,则当前无法阅读的文章可以正常显示内容,并且无 dump 文件产生。

需要更新进站画面上传程序

有可能 Perl 版本升级之后,API 发生了变化,有些函数和原本的预期产生了出入,例如 readdir,需要更新。

此期间进站画面的管理可能得手动修改 loginpicsloginlinks 文件。

配置 core dump

能将转储的文件独立存放,最好能重命名为形如 core-<prog_name>-<pid>-<datetime> 的形式。

恢复数据的方法讨论

目前从老机器上恢复的数据已经拿到。

猜测是文件索引的信息大多数已经损坏,所以绝大部分的目录名、文件名是以 groupnodeobj 加编号来命名的。完整的文件树参见 data.to.be.fixed.tar.gz

粗鲁查看了部分数据内容,文件的分布尚未发现规律。以 unknown 目录为例:

unknown-desc

粗略统计有 1000w 的文本文件需要重命名(并移动到正确的路径)。考虑使用如下的流程来判断并做处理,请评审。

bmyfix

预订讨论区www下不显示

www下预定讨论区时显示错误!你已预定本版
预定后左边栏不现实预订讨论区
以上是在www未退出下,显示无变化

十大不统计超过24小时的主题帖

原因:统计方法不对

                if ((data = ght_get(p_table, sizeof (int), &(ptr->thread))) == NULL) {
                        if(ptr->thread != ptr->filetime) // 主题不存在,并且该篇帖子 id 和主题不相同,视为回帖
                                continue;

bbscon.c 某处内存错误

(gdb) where
#0  0x00007fa7a2921bb9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007fa7a2924fc8 in __GI_abort () at abort.c:89
#2  0x00007fa7a295ee14 in __libc_message (do_abort=do_abort@entry=1,
    fmt=fmt@entry=0x7fa7a2a6b06b "*** %s ***: %s terminated\n") at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007fa7a29f67dc in __GI___fortify_fail (msg=<optimized out>,
    msg@entry=0x7fa7a2a6b053 "stack smashing detected") at fortify_fail.c:37
#4  0x00007fa7a29f6780 in __stack_chk_fail () at stack_chk_fail.c:28
#5  0x0000000000408e20 in bbscon_main () at bbscon.c:801
#6  0x3e72742f3c3e6474 in ?? ()
#7  0x3e656c6261742f3c in ?? ()
#8  0x742f3c3e64742f3c in ?? ()
#9  0x00000000000a3e72 in ?? ()
#10 0x0000000000684638 in applets ()
#11 0x0000000001400000 in ?? ()
#12 0x0000000002800000 in ?? ()
#13 0x0000000000000000 in ?? ()
(gdb) frame 5
#5  0x0000000000408e20 in bbscon_main () at bbscon.c:801
801     }

新增提醒功能

目的

让用户有效的查看到各项提醒。提醒项可以忽略。提醒项查看后会从提醒列表中删除。
查看提醒的功能主要针对www用户。telnet/www下回帖等等操作都可以触发提醒通知。

数据存放

位于用户个人文件夹,例如 /home/bbs/home/S/SYSOP/Notification,数据格式如下:

<?xml version="1.0" encoding="gbk"?>
<Notify>
  <Item type="0" board="sysop" aid="1375224754" uid="IronBlood" title="[公告]本站开放回复提醒" />
</Notify>

有关流程

列出当前提醒

  • 能在状态栏中显示提醒的消息条数
  • 能有一个单独的页面显示提醒的内容,并跳转到提醒指向的文件,e.g. SYSOP帖子标题中回复了您

删除提醒项目

  • 可以在未阅读提醒的状态下忽略提醒。
  • 已查看过的项目会从提醒列表中永久删除,因此不提供提醒历史的功能。

新增文章回复提醒

  • www/term 方式回复文章都会向被回复的作者发送提醒。若提醒文件不存在,则创建提醒文件。( 注意并发,较为常见
  • 新的提醒默认新增加到第一条。
  • 自己回复自己不发送提醒。
  • 注意 title 字符转义

查看文章提醒

  • 普通模式下,看文章前先判断当前文章是否在使用者的提醒列表中,若在则删除提醒。
  • 主题模式下,逐一文章显示前判断当前是否在提醒列表中。

ubuntu 14.04 x86_64 运行时错误

telnet 下回复另一个 ID 的帖子,在 add_notification.c 函数中执行到 free 的时候出错。

Debug 显示:

glibc detected free(): invalid next size (fast)

如果此处 title_utf8 换成声明为字符数组,而非通过 malloc() 获取,则提示有关什么 stack smashing detected 的错误。最终指向的是:

in __GI_raise at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

初步检查如 stackoverflow 上的这个 QA 显示:

#include <stdlib.h>
void foo() { abort(); }
int main() { foo(); return 0; }

该代码在调试的时候同样会返回有关 __GI_raise 的错误。

修复 .PASSWDS 文件

现状:

  1. 数据恢复出来的 .PASSWDS 文件大约从 (37046*452) 字节开始全部为零,也就是此后的用户信息丢失
  2. 依据 #24 的分析,i386/amd64 架构下 userec 结构体因 time_t 发生长度变化,因此 .PASSWDS 文件不再通用

任务:

  1. 更新 .PASSWDS 文件到 amd64 架构
  2. 前 37045 个用户信息使用恢复的数据,后面的用户使用备份文件

预计结果:

  1. 部分 2013.9.9 后注册的用户可能丢失
  2. 大部分用户的信息可能停留在 2013.9.9,部分用户的权限位需要修复

关联 Issue:
#22 ,更新 .PASSWDS 文件后需要进一步校验用户文件夹。

硬件性能监视的方案

新服务器放弃了之前的 RAID5 + ReiserFS 的存储方案,改用了 RAID1 + EXT4。

需要一套系统来监视诸如 CPU 使用率、内存使用率、硬盘 IO、网络吞吐量这些硬件数据。

要求:部署简单,能绘制图表。

参考:nagioszabbix 以及其他。

term 下更新菜单时 Segmentation fault

更新 menu.ini 后在主菜单下 ~ 按键时 segmentation fault,堆栈信息

(gdb) where
#0  0x00007f76ecbd5095 in f_prep (pat_index=1, Pattern=0x7f76ee588174 "13186147158", patt_img=0x7f76ee583d40)
    at mgrep.c:466
#1  0x00007f76ecbd44a9 in prepf (fp=1, ppatt_img=0x7fffa286f260, patt_image_len=0x7fffa286f258) at mgrep.c:161
#2  0x00007f76ecbd3d6a in reload_badwords (wordlistf=0x7f76ecbdda3a "etc/badwords",
    imgf=0x7f76ecbdda28 "etc/.badwords_new") at smth_filter.c:30
#3  0x00007f76ecb53537 in domenu (menu_name=0x7f76ecbd8b14 "TOPMENU") at comm_lists.c:747
#4  0x00007f76ecb3953d in main (argc=3, argv=0x7fffa286f448) at main.c:1189

ssh 编译过程简化

目前 smth_sshbbsd 还包含有一些 GNU 配置命令。目前的编译已不考虑平台的兼容性,因此不再适用,需要被精简掉。

term 下注册失败

又一处运行时错误,关联 #30

重现方法:
输入有效的邮箱及验证密码后 core dump。

调试信息:

Program received signal SIGSEGV, Segmentation fault.
__strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
296     ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.

(gdb) where
#0  __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
#1  0x00007f1313b7f11b in x_fillform () at userinfo.c:864
#2  0x00007f1313b3f4c0 in main (argc=3, argv=0x7fffc40a8fb8) at main.c:1176

(gdb) frame 1
#1  0x00007f1313b7f11b in x_fillform () at userinfo.c:864
864             strcpy(email, str_to_lowercase(user));

nju09 下某用户查看提醒时 core dump

堆栈信息:

(gdb) where
#0  0x00007fa172f0f2c5 in malloc_consolidate (av=av@entry=0x7fa17324f760 <main_arena>) at malloc.c:4165
#1  0x00007fa172f10878 in _int_malloc (av=0x7fa17324f760 <main_arena>, bytes=32640) at malloc.c:3423
#2  0x00007fa172f13230 in __GI___libc_malloc (bytes=32640) at malloc.c:2891
#3  0x00007fa172eb2e31 in __gconv_open (toset=<optimized out>, toset@entry=0x7fff363753b0 "GB2312//", fromset=<optimized out>,
    fromset@entry=0x7fff36375390 "UTF-8//", handle=handle@entry=0x7fff363753d0, flags=flags@entry=0) at gconv_open.c:282
#4  0x00007fa172eb27d2 in iconv_open (tocode=0x7fff363753b0 "GB2312//", fromcode=0x7fff36375390 "UTF-8//") at iconv_open.c:71
#5  0x0000000000444f6d in code_convert (from_charset=0x4774e1 "utf-8", to_charset=0x4774da "gb2312",
    inbuf=0x140d5d0 "Re: term下没法注册和绑定认证新id。。。", inlen=52, outbuf=0x14163e0 "", outlen=52) at misc.c:102
#6  0x0000000000445013 in u2g (inbuf=0x140d5d0 "Re: term下没法注册和绑定认证新id。。。", inlen=52, outbuf=0x14163e0 "", outlen=52)
    at misc.c:113
#7  0x000000000044f294 in parse_to_item (xmlItem=0x1419940) at notification.c:291
#8  0x000000000044ecab in parse_notification (userid=0x6aa440 <currentuser> "ironb") at notification.c:175
#9  0x0000000000438f5f in bbsnotify_main () at bbsnotify.c:10
#10 0x0000000000404003 in main (argc=1, argv=0x7fff36375758) at bbsmain.c:417

term 下 @ 提醒中的一处缺陷

hasreadperm_ext 函数引起,相关代码依次为:

bbs.c

    while(i!=MAX_MENTION_ID && mention_ids[i][0]!=0) {
        if(strcasecmp(currentuser.userid, mention_ids[i])!=0) {
            if(hasreadperm_ext(mention_ids[i], currboard)) {    // 该函数内调用了 getuser() 函数,因此可以直接使用 lookupuser 全局变量
                // 用户存在的情况下,且不为当前用户的情况下,且拥有该版面阅读权限的情况下,且不在黑名单里的时候
                if(!inoverride(currentuser.userid, lookupuser.userid, "rejects"))
                    add_mention_notification(lookupuser.userid, (header.chk_anony) ? "Anonymous" : currentuser.userid,
                            currboard, postfile.filetime, postfile.title);
            }
        }
        ++i;
    }

bcache.c

int hasreadperm_ext(char *username,  char *boardname)
{
    // ...
    struct user_info *ui = query_uindex(tuid, 0); // 调用 ui 前先检查 ui 是否不在线(主要为俱乐部、封闭版面)
    // ..
    if(!(ui->userlevel & PERM_BASIC))
        return 0;
    // ..
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.