本文描述的修改在 FireBird 2.5 和 2.6 上均可使用.
FireBird 原始代码对使用 D 进行区段删除操作时,
不作类似用 d 单篇删除,或者是用 b 进行主题删除时的备份操作,
也就是不转移被删文章到 deleted/junk 两版.
这样,误删无法恢复;有 D 权的人(比如版主)恶意删版将造成很大损失.
同时,虽然 2.6 版在系统安全版(syssecurity)记录谁何时在何版 D 多少文章,
但是依然不能解决误删或者恶意删版的问题.
而这两种情况,我都见过多次,前者尤甚.
为此,特修改 D 操作同样使用 deleted/junk 进行备份.
修改代码于 Thu Jan 22 14:22:11 1998 由 Leeward 在水木清华站开发并运行.
修改后,用 D 在任何版区段删除成功的每篇文章, 同样放到 deleted 或 junk 版.
=========================================================================
程序修改:
1. bbs_src/record.c 的 delete_range 函数中
unlink(fullpath);
>改成
#ifdef BACKUP_RANGE_DELETE
if (strcmp(currboard, "deleted"))
{
cancelpost(currboard, currentuser.userid,
&fhdr, !strcmp(fhdr.owner, currentuser.userid));
}
#endif
unlink(fullpath);
2. 文件 bbs_src/Makefile 中编译 bbs 的指令,大概是:
$(PROGNAME): $(COBJS) $(OTHERS) 一节下的:
$(CC) -o $(PROGNAME) $(CFLAGS) $(COBJS) $(LIBS) 一句.
需要修改成为:
$(CC) -o $(PROGNAME) $(CFLAGS) -DBACKUP_RANGE_DELETE $(COBJS) $(LIBS)
3. 其它目录下的 Makefile 中,如果编译指令指定使用 bbs_src/record.o
那么需要修改为使用 bbs_src/record.c
比如如果 bbs_src/local_utl/Makefile 中 usage: usage.c ../record.o 一节,
包含指令:$(CC) $(CFLAGS) -o usage usage.c ../record.o
那么,两处 ../record.o 需要修改成为 ../record.c
这么做,是指定在编译除了 bbs 这个程序外,其它使用 bbs_src/record.c 的程序时,
不会直接连接 bbs_src/record.o 而是重新编译 bbs_src/record.c 以生成 record.o
如果直接连接, 可能会出错误的, 告诉你 cancelpost 这个函数无法连接.
这是因为除了编译 bbs 这个程序外是不定义宏 BACKUP_RANGE_DELETE 的.
而只有 bbs 这个程序可以连接并使用 cancelpost 函数对被删除的文章进行备份.
=========================================================================
当然,对 D 操作进行备份,将可能会比较显著地降低 D 操作的平均速度.
但是备份总是很重要的,尤其是要挽回误删或者恶意删文.
可以考虑改进 cancelpost 代码,加速备份操作.
--
修改:Leeward FROM 202.101.112.202
FROM 202.101.112.202