bbsedit.c
来自「bbs server linux平台下软件源码」· C语言 代码 · 共 260 行
C
260 行
/* * $Id: bbsedit.c,v 1.25 2003/07/30 15:05:10 stiger Exp $ */#include "bbslib.h"int get_edit_post(char *userid, char *board, char *file, struct fileheader *x){ struct userec *user; bcache_t *brd; char fname[STRLEN]; if (getuser(userid, &user) == 0) return -1; brd = getbcache(board); if (brd == NULL) { /* * http_fatal("错误的讨论区"); */ return -1; } if (!strcmp(board, "syssecurity") || !strcmp(board, "junk") || !strcmp(board, "deleted")) /* Leeward : 98.01.22 */ return -1; if (checkreadonly(board) == true) { /* * http_fatal("讨论区只读"); */ return -1; } if (get_file_ent(board, file, x) == 0) { /* * http_fatal("无法取得文件记录"); */ return -1; } if (!HAS_PERM(user, PERM_SYSOP) /* SYSOP、当前版主、原发信人 可以编辑 */ &&!chk_currBM(brd->BM, user)) { setbfile(fname, board, file); if (!isowner(user, x)) { /* * http_fatal("不是属主"); */ return -1; } /* * 同名ID不能修改老ID的文章 */ else if (file_time(fname) < user->firstlogin) { /* * time_t t; * * t = file_time(fname); * printf("file_time = %s<br>", ctime(&t)); * t = user->firstlogin; * printf("firstlogin = %s<br>", ctime(&t)); * http_fatal("错误时间"); */ return -1; } } /* * 版主禁止POST 检查 */ if (deny_me(user->userid, board) && !HAS_PERM(user, PERM_SYSOP)) { /* * http_fatal("被封禁POST"); */ return -1; } return 0;}int get_file_attach(char *infile, long *attach_pt, long *attach_length){ int ch; char attachpad[10]; int matched; char *ptr; long size; long ret = 0; int fd; if ((fd = open(infile, O_RDONLY)) < 0) return 0; *attach_length = 0; matched = 0; if (safe_mmapfile_handle(fd, O_RDONLY, PROT_READ, MAP_SHARED, (void **) &ptr, (size_t *) & size) == 1) { char *data; long not; data = ptr; for (not = 0; not < size; not++, data++) { if (*data == 0) { matched++; if (matched == ATTACHMENT_SIZE) { int d, size; char *sstart = data; data++; not++; if (ret == 0) ret = data - ptr - ATTACHMENT_SIZE + 1; while (*data) { data++; not++; } data++; not++; memcpy(&d, data, 4); size = htonl(d); data += 4 + size - 1; not += 4 + size - 1; matched = 0; *attach_length += data - sstart + ATTACHMENT_SIZE; } continue; } } } else { close(fd); return 0; } end_mmapfile((void *) ptr, size, -1); *attach_pt = ret; close(fd); if (ret <= 0) return 0; return 1;}int update_form(char *board, char *file){ FILE *fin; FILE *fout; char *buf = getparm("text"); char infile[80], outfile[80]; char buf2[256]; int i; long attach_pt, attach_size; setbfile(infile, board, file); sprintf(outfile, "tmp/%s.%d.editpost", getcurruserid(), getpid()); if ((fin = fopen(infile, "r")) == NULL) return -1; if ((fout = fopen(outfile, "w")) == NULL) { fclose(fin); return -1; } for (i = 0; i < 4; i++) { fgets(buf2, sizeof(buf2), fin); fprintf(fout, "%s", buf2); } fprintf(fout, "%s", unix_string(buf)); fprintf(fout, "[36m※ 修改:·%s 於 %s 修改本文·[FROM: %s][m\n", currentuser->userid, wwwCTime(time(0)) + 4, fromhost); while (fgets(buf2, sizeof(buf2), fin) != NULL) { if (!Origin2(buf2)) { fprintf(fout, "%s", buf2); break; } } fclose(fin); fclose(fout); if (get_file_attach(infile, &attach_pt, &attach_size)) { int fsrc, fdst; if ((fsrc = open(infile, O_RDONLY)) >= 0) { if ((fdst = open(outfile, O_WRONLY | O_CREAT | O_APPEND, 0644)) >= 0) { char *src = (char *) malloc(10240); long ret; long lsize = attach_size; long ndread; lseek(fsrc, attach_pt - 1, SEEK_SET); do { if (lsize > 10240) ndread = 10240; else ndread = lsize; ret = read(fsrc, src, ndread); if (ret <= 0) break; lsize -= ret; } while (write(fdst, src, ret) > 0 && lsize > 0); close(fdst); free(src); } close(fsrc); } } f_mv(outfile, infile); printf("修改文章成功.<br><a href=\"/bbsdoc.php?board=%s\">返回本讨论区</a>", board); return 0;}int main(){ FILE *fp; int type = 0, i, num; struct fileheader x; char userid[80], buf[512], path[512], file[512], board[512], title[80] = ""; init_all(); if (!loginok) http_fatal("匆匆过客不能修改文章,请先登录"); strsncpy(board, getparm("board"), 20); type = atoi(getparm("type")); strsncpy(file, getparm("file"), 20); if (VALID_FILENAME(file) < 0) http_fatal("错误的参数"); if (get_edit_post(getcurruserid(), board, file, &x) < 0) http_fatal("您不能编辑这篇文章"); printf("<center>%s -- 修改文章 [使用者: %s]<hr color=\"green\">\n", BBSNAME, currentuser->userid); if (type != 0) return update_form(board, file); printf("<table border=\"1\">\n"); printf("<tr><td>"); printf("<tr><td><form method=\"post\" action=\"bbsedit\">\n"); printf("使用标题: %s 讨论区: %s<br>\n", nohtml(x.title), board); printf("本文作者:%s<br>\n", currentuser->userid); printf("<textarea name=\"text\" rows=\"20\" cols=\"80\" wrap=\"physical\">"); setbfile(path, board, file); fp = fopen(path, "r"); if (fp == 0) http_fatal("文件丢失"); /* * 这里还需要添加代码,以防止用户修改文件头和来源 */ for (i = 0; i < 4; i++) if (skip_attach_fgets(buf, sizeof(buf), fp) == 0) break; while (skip_attach_fgets(buf, sizeof(buf), fp) != 0) { char tmp[256]; if (Origin2(buf)) break; sprintf(tmp, "※ 来源:·%s ", BBS_FULL_NAME); if (strstr(buf, tmp) && *buf != ':') break; if (!strcasestr(buf, "</textarea>")) printf("%s", buf); } fclose(fp); printf("</textarea>\n"); printf("<tr><td class=\"post\" align=\"center\">\n"); printf("<input type=\"hidden\" name=\"type\" value=\"1\">\n"); printf("<input type=\"hidden\" name=\"board\" value=\"%s\">\n", board); printf("<input type=\"hidden\" name=\"file\" value=\"%s\">\n", file); printf("<input type=\"submit\" value=\"存盘\"> \n"); printf("<input type=\"reset\" value=\"重置\"></form>\n"); printf("</table>"); http_quit(); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?