static void trunclog(int signo) { int i; flushlog(-1); /* see libBBS/log.c:logconf[] */ static const char *dirty_rotate[] = {"error.log", "connect.log", "msg.log", "trace.chatd", "trace"}; for (i = 0; i < sizeof(dirty_rotate) / sizeof(dirty_rotate[0]); i++) { char buf[MAXPATH]; int j; if (!dashf(dirty_rotate[i])) continue; j=0; while (1) { sprintf(buf,"%s.%d", dirty_rotate[i],j); if (!dashf(buf)) break; j++; } f_mv(dirty_rotate[i],buf); } for (i = 0; i < sizeof(logconfig) / sizeof(struct taglogconfig); i++) { struct taglogconfig *pconf; if (! strcmp(logconfig[i].filename,"boardusage.log")) continue; pconf = &logconfig[i]; if (pconf->fd>=0) { char buf[MAXPATH]; int j; close(pconf->fd); j=0; while (1) { sprintf(buf,"%s.%d",pconf->filename,j); if (!dashf(buf)) break; j++; } f_mv(pconf->filename,buf); } } openbbslog(0); gb_trunclog=true; }
void setaidfile(char *buf, const char *bn, aidu_t aidu) { // try to load by AID int bid = 0; int n = 0, fd = 0; char bfpath[PATHLEN]; boardheader_t *bh = NULL; fileheader_t fh; buf[0] = 0; bid = getbnum(bn); if (bid <= 0) return; assert(0<=bid-1 && bid-1<MAX_BOARD); bh = getbcache(bid); if (!HasBoardPerm(bh)) return; setbfile(bfpath, bh->brdname, FN_DIR); n = search_aidu(bfpath, aidu); if (n < 0) return; fd = open(bfpath, O_RDONLY); if (fd < 0) return; lseek(fd, n*sizeof(fileheader_t), SEEK_SET); memset(&fh, 0, sizeof(fh)); if (read(fd, &fh, sizeof(fh)) > 0) { setbfile(buf, bh->brdname, fh.filename); if (!dashf(buf)) buf[0] = 0; } close(fd); }
int fz_init_option(int argc, char **argv) { unsigned int convert_flag = 0; int opt; while ((opt = getopt(argc, argv, "zimal:d:c:f:t:")) != -1) { switch (opt) { case 'i': convert_flag |= ZIM_CONVERT_IMG; break; case 'm': convert_flag |= ZIM_CONVERT_MATH; break; case 'a': convert_flag |= ZIM_CONVERT_TEXT; break; case 'z': convert_flag |= ZIM_CONVERT_ZH; break; case 'l': strncpy(m_lang, optarg, sizeof(m_lang) - 1); if (strncasecmp(m_lang, "zh", 2) == 0) m_zh_flag = 1; break; case 'd': strncpy(m_date, optarg, sizeof(m_date) - 1); break; case 'c': strncpy(m_creator, optarg, sizeof(m_creator) - 1); break; case 'f': strncpy(m_zim_file, optarg, sizeof(m_zim_file) - 1); break; case 't': m_max_total = atoi(optarg); init_title_hash(); break; default: /* '?' */ usage(argv[0]); break; } } if (convert_flag != 0) { if (convert_flag == ZIM_CONVERT_ZH) m_convert_flag |= ZIM_CONVERT_ZH; else m_convert_flag = convert_flag; } if (m_lang[0] == 0 || m_date[0] == 0 || m_zim_file[0] == 0) usage(argv[0]); if (!dashf(m_zim_file)) { printf("error %s: %s\n", m_zim_file, strerror(errno)); exit(0); } return 0; }
static int canread(int level, char *path, char * fname, char *title) { char buf[PATHLEN+20]; if(strlen(path)+strlen(fname) > PATHLEN) return 0; sprintf(buf,"%s/%s",path,fname); #ifdef FB2KPC if(!strncmp(path,FB2KPC,strlen(FB2KPC))){ if(fb2kpc_is_owner(buf)) return 1; if(strstr(title,"<secret>")) return 0; }else{ #endif if(level & PERM_BOARDS) return 1; #ifdef FB2KPC } #endif if(dashd(buf)){ strcat(buf,"/.allow"); if(!dashf(buf)) return 1; if(!seek_in_file(buf,getCurrentUser()->userid)) return 0; return 1; } return 1; }
void check_reg_extra() { struct schoolmate_info schmate; struct userec *urec = ¤tuser; char buf[192], bufe[192]; sethomefile(buf, currentuser.userid, ".regextra"); if (!dashf(buf)) { do { memset(&schmate, 0, sizeof(schmate)); strlcpy(schmate.userid, currentuser.userid, sizeof(schmate.userid)); screen_move(1, 0); //% prints("请输入个人信息. 如果输入错误,可以重新输入.\n"); prints("\xc7\xeb\xca\xe4\xc8\xeb\xb8\xf6\xc8\xcb\xd0\xc5\xcf\xa2. \xc8\xe7\xb9\xfb\xca\xe4\xc8\xeb\xb4\xed\xce\xf3,\xbf\xc9\xd2\xd4\xd6\xd8\xd0\xc2\xca\xe4\xc8\xeb.\n"); /*default value is 0*/ do { //% getdata(2, 0, "输入以前的学号: ", schmate.school_num, getdata(2, 0, "\xca\xe4\xc8\xeb\xd2\xd4\xc7\xb0\xb5\xc4\xd1\xa7\xba\xc5: ", schmate.school_num, sizeof(schmate.school_num), DOECHO, YEA); } while (!isNumStr(schmate.school_num)); //如果有输入非数字,重新输入!下同 do { //% getdata(4, 0, "输入邮箱(外部邮箱亦可): ", schmate.email, STRLEN, getdata(4, 0, "\xca\xe4\xc8\xeb\xd3\xca\xcf\xe4(\xcd\xe2\xb2\xbf\xd3\xca\xcf\xe4\xd2\xe0\xbf\xc9): ", schmate.email, sizeof(schmate.email), DOECHO, YEA); } while (!valid_addr(schmate.email)); do { //% getdata(6, 0, "输入身份证号码: ", schmate.identity_card_num, getdata(6, 0, "\xca\xe4\xc8\xeb\xc9\xed\xb7\xdd\xd6\xa4\xba\xc5\xc2\xeb: ", schmate.identity_card_num, sizeof(schmate.identity_card_num), DOECHO, YEA); } while (!isNumStrPlusX(schmate.identity_card_num) || strlen(schmate.identity_card_num) !=IDCARDLEN); do { //% getdata(8, 0, "输入毕业证书编号: ", schmate.diploma_num, getdata(8, 0, "\xca\xe4\xc8\xeb\xb1\xcf\xd2\xb5\xd6\xa4\xca\xe9\xb1\xe0\xba\xc5: ", schmate.diploma_num, sizeof(schmate.diploma_num), DOECHO, YEA); } while (!isNumStr(schmate.diploma_num)); do { //% getdata(10, 0, "输入手机或固定电话号码: ", schmate.mobile_num, getdata(10, 0, "\xca\xe4\xc8\xeb\xca\xd6\xbb\xfa\xbb\xf2\xb9\xcc\xb6\xa8\xb5\xe7\xbb\xb0\xba\xc5\xc2\xeb: ", schmate.mobile_num, sizeof(schmate.mobile_num), DOECHO, YEA); } while (!isNumStr(schmate.mobile_num)); strcpy(buf, ""); //% getdata(11, 0, "以上信息输入正确并进行邮箱绑定认证[Y/n]", buf, 2, DOECHO, YEA); getdata(11, 0, "\xd2\xd4\xc9\xcf\xd0\xc5\xcf\xa2\xca\xe4\xc8\xeb\xd5\xfd\xc8\xb7\xb2\xa2\xbd\xf8\xd0\xd0\xd3\xca\xcf\xe4\xb0\xf3\xb6\xa8\xc8\xcf\xd6\xa4[Y/n]", buf, 2, DOECHO, YEA); } while (buf[0] =='n' || buf[0] == 'N'); sprintf(buf, "%s, %s, %s, %s, %s\n", schmate.school_num, schmate.email, schmate.identity_card_num, schmate.diploma_num, schmate.mobile_num); sethomefile(bufe, currentuser.userid, ".regextra"); file_append(bufe, buf); do_report(".SCHOOLMATE", buf); register_send_email(urec, schmate.email); } screen_clear(); tui_check_reg_mail(); }
//#define MY_DEBUG // 执行命令cmdfile,参数为param1 static void exec_cmd(int umode, int pager, char *cmdfile, char *param1) { char buf[160]; char *my_argv[18], *ptr; fb_signal(SIGALRM, SIG_IGN); set_user_status(umode); screen_clear(); screen_move(2, 0); if (!dashf(cmdfile)) { //% prints("文件 [%s] 不存在!\n", cmdfile); prints("\xce\xc4\xbc\xfe [%s] \xb2\xbb\xb4\xe6\xd4\xda\xa3\xa1\n", cmdfile); pressreturn(); return; } sprintf(buf, "%s %s %s %d", cmdfile, param1, currentuser.userid, getpid()); report(buf, currentuser.userid); my_argv[0] = cmdfile; strcpy(buf, param1); if (buf[0] != '\0') ptr = strtok(buf, " \t"); else ptr = NULL; for (int i = 1; i < 18; i++) { if (ptr) { my_argv[i] = ptr; ptr = strtok(NULL, " \t"); } else { my_argv[i] = NULL; } } #ifdef MY_DEBUG for (i = 0; i < 18; i++) { if (my_argv[i] != NULL) prints ("my_argv[%d] = %s\n", i, my_argv[i]); else prints ("my_argv[%d] = (none)\n", i); } pressanykey (); #else child_pid = fork(); if (child_pid == -1) { //% prints("资源紧缺,fork() 失败,请稍后再使用"); prints("\xd7\xca\xd4\xb4\xbd\xf4\xc8\xb1\xa3\xac""fork() \xca\xa7\xb0\xdc\xa3\xac\xc7\xeb\xc9\xd4\xba\xf3\xd4\xd9\xca\xb9\xd3\xc3"); child_pid = 0; pressreturn(); return; } if (child_pid == 0) { execv(cmdfile, my_argv); exit(0); } else { waitpid(child_pid, NULL, 0); } #endif child_pid = 0; screen_clear(); }
static void rollback_board_file(const char *bname, const char *dir) { char dir_path[256]; char old_dir_path[256]; setbfile(dir_path, bname, dir); sprintf(old_dir_path, "%s.v1.2", dir_path); if (dashf(old_dir_path)) rename(old_dir_path, dir_path); }
static void rollback_mail_file(const char *username, const char *dir) { char dir_path[256]; char old_dir_path[256]; setmailfile(dir_path, username, dir); sprintf(old_dir_path, "%s.v1.2", dir_path); if (dashf(old_dir_path)) rename(old_dir_path, dir_path); }
static int init_option(struct fw_stardict_st *st, int argc, char **argv) { int opt; memset(st, 0, sizeof(*st)); if (argc == 1) usage(argv[0]); while ((opt = getopt(argc, argv, "l:d:i:t:s:m:c:")) != -1) { switch (opt) { getopt_str('l', st->lang); getopt_str('d', st->date); getopt_str('i', st->idx); getopt_str('t', st->dict); getopt_str('s', st->script_file); getopt_str('c', st->compress); getopt_int('m', st->max_total); } } if (st->lang[0] == 0 || st->date[0] == 0 || st->idx[0] == 0 || st->dict[0] == 0) usage(argv[0]); if (st->compress[0] == 0) strcpy(st->compress, "gzip"); if (st->script_file[0] && !dashf(st->script_file)) { printf("Not found %s\n", st->script_file); usage(argv[0]); } if (!dashf(st->idx)) { printf("%s: %s\n", st->idx, strerror(errno)); } if (!dashf(st->dict)) { printf("%s: %s\n", st->dict, strerror(errno)); } return 0; }
int check_register_ok(void) { char fname[STRLEN]; sethomefile(fname, currentuser.userid, "register"); if (dashf(fname)) { move(21, 0); prints("������!! ����˳����ɱ�վ��ʹ����ע������,\n"); prints("������������ӵ��һ��ʹ���ߵ�Ȩ��������...\n"); pressanykey(); return 1; } return 0; }
void check_reg_extra() { struct schoolmate_info schmate; struct userec *urec = ¤tuser; char buf[192], bufe[192]; sethomefile(buf, currentuser.userid, ".regextra"); if (!dashf(buf)) { do { memset(&schmate, 0, sizeof(schmate)); strcpy(schmate.userid, currentuser.userid); move(1, 0); prints("�����������Ϣ. ����������,������������.\n"); /*default value is 0*/ do { getdata(2, 0, "������ǰ��ѧ��: ", schmate.school_num, SCHOOLNUMLEN+1, DOECHO, YEA); } while (!isNumStr(schmate.school_num)); //��������������,��������!��ͬ do { getdata(4, 0, "��������(�ⲿ�������): ", schmate.email, STRLEN, DOECHO, YEA); } while (invalidaddr(schmate.email)); do { getdata(6, 0, "�������֤����: ", schmate.identity_card_num, IDCARDLEN+1, DOECHO, YEA); } while (!isNumStrPlusX(schmate.identity_card_num) || strlen(schmate.identity_card_num) !=IDCARDLEN); do { getdata(8, 0, "�����ҵ֤����: ", schmate.diploma_num, DIPLOMANUMLEN+1, DOECHO, YEA); } while (!isNumStr(schmate.diploma_num)); do { getdata(10, 0, "�����ֻ���̶��绰����: ", schmate.mobile_num, MOBILENUMLEN+1, DOECHO, YEA); } while (!isNumStr(schmate.mobile_num)); strcpy(buf, ""); getdata(11, 0, "������Ϣ������ȷ�������������֤[Y/n]", buf, 2, DOECHO, YEA); } while (buf[0] =='n' || buf[0] == 'N'); sprintf(buf, "%s, %s, %s, %s, %s\n", schmate.school_num, schmate.email, schmate.identity_card_num, schmate.diploma_num, schmate.mobile_num); sethomefile(bufe, currentuser.userid, ".regextra"); file_append(bufe, buf); do_report(".SCHOOLMATE", buf); regmail_send(urec, schmate.email); } clear(); check_reg_mail(); }
int check_register_ok(void) { char fname[STRLEN]; sethomefile(fname, currentuser.userid, "register"); if (dashf(fname)) { screen_move(21, 0); //% prints("恭贺您!! 您已顺利完成本站的使用者注册手续,\n"); prints("\xb9\xa7\xba\xd8\xc4\xfa!! \xc4\xfa\xd2\xd1\xcb\xb3\xc0\xfb\xcd\xea\xb3\xc9\xb1\xbe\xd5\xbe\xb5\xc4\xca\xb9\xd3\xc3\xd5\xdf\xd7\xa2\xb2\xe1\xca\xd6\xd0\xf8,\n"); //% prints("从现在起您将拥有一般使用者的权利与义务...\n"); prints("\xb4\xd3\xcf\xd6\xd4\xda\xc6\xf0\xc4\xfa\xbd\xab\xd3\xb5\xd3\xd0\xd2\xbb\xb0\xe3\xca\xb9\xd3\xc3\xd5\xdf\xb5\xc4\xc8\xa8\xc0\xfb\xd3\xeb\xd2\xe5\xce\xf1...\n"); pressanykey(); return 1; } return 0; }
//�������ܱ���¼���� int b_notes_passwd() { FILE *pass; char passbuf[20], prepass[20]; char buf[STRLEN]; if (!chkBM(currbp, ¤tuser)) return 0; clear(); move(1, 0); prints("�趨/����/ȡ�������ܱ���¼������..."); setvfile(buf, currboard, "secnotes"); if (!dashf(buf)) { move(3, 0); prints("�����������ޡ����ܱ���¼����\n\n"); prints("������ W ��á����ܱ���¼�������趨����..."); pressanykey(); return FULLUPDATE; } if (!check_notespasswd()) return FULLUPDATE; getdata(3, 0, "�������µ����ܱ���¼����(Enter ȡ������): ", passbuf, 19, NOECHO, YEA); if (passbuf[0] == '\0') { setvfile(buf, currboard, "notespasswd"); unlink(buf); prints("�Ѿ�ȡ������¼���롣"); pressanykey(); return FULLUPDATE; } getdata(4, 0, "ȷ���µ����ܱ���¼����: ", prepass, 19, NOECHO, YEA); if (strcmp(passbuf, prepass)) { prints("\n���벻���, ���趨�����...."); pressanykey(); return FULLUPDATE; } setvfile(buf, currboard, "notespasswd"); if ((pass = fopen(buf, "w")) == NULL) { move(5, 0); prints("����¼�������趨...."); pressanykey(); return FULLUPDATE; } fprintf(pass, "%s\n", genpasswd(passbuf)); fclose(pass); move(5, 0); prints("���ܱ���¼�����趨���..."); pressanykey(); return FULLUPDATE; }
jobjectArray Java_com_hace_fastwiki_FileBrowse_GetFiles(JNIEnv* env, jobject thiz, jstring path) { int total = 0; char buf[_MAX_IMAGE_TOTAL][64], tmp[128]; jobjectArray ret; const char *file = my_get_string(path); DIR *dirp; struct dirent *d; if ((dirp = opendir(file)) == NULL) dirp = opendir("/"); sprintf(buf[total++], "1.."); while ((d = readdir(dirp))) { if (d->d_name[0] == '.') continue; if (total >= _MAX_IMAGE_TOTAL - 1) break; snprintf(tmp, sizeof(tmp), "%s/%s", file, d->d_name); if (dashf(tmp) && access(tmp, R_OK) == 0) { if (is_image_fname(d->d_name)) snprintf(buf[total++], sizeof(buf[0]), "0%s", d->d_name); } else if (dashd(tmp) && access(tmp, R_OK | X_OK) == 0) { snprintf(buf[total++], sizeof(buf[0]), "1%s", d->d_name); } } closedir(dirp); qsort(buf, total, 64, _cmp_file_name); ret = env->NewObjectArray(total, env->FindClass("java/lang/String"), 0); for (int i = 0; i < total; i++) { env->SetObjectArrayElement(ret, i, env->NewStringUTF(buf[i])); } return ret; }
static int _iter_paste_tag(void *item, void *optarg) { char buf[PATHLEN]; char title[TTLEN + 1] = "◇ "; fileheader_t *fhdr = (fileheader_t*) item; _iter_paste_tag_param *param = (_iter_paste_tag_param*) optarg; param->item ++; // XXX many process crashed here as fhdr.filename[0] == 0 // let's workaround it? or trace? if (!fhdr->filename[0]) { grayout(0, b_lines-2, GRAYOUT_DARK); move(b_lines-1, 0); clrtobot(); prints("處理 #%d 項發生錯誤。 請把你剛剛進行的完整步驟貼到 " BN_BUGREPORT " 板。\n", param->item); vmsg("忽略錯誤並繼續進行。"); return 0; } if (!FindTaggedItem(fhdr)) return 0; if (TagBoard == 0) sethomefile(buf, cuser.userid, fhdr->filename); else { setbfile(buf, param->bh->brdname, fhdr->filename); } if (!dashf(buf)) return 0; strlcpy(title + 3, fhdr->title, sizeof(title) - 3); a_copyitem(buf, title, 0, 0); if (param->mode) { param->mode--; a_pasteitem(param->pm, 0); } else a_appenditem(param->pm, 0); param->copied++; RemoveTagItem(fhdr); return IsEmptyTagList(); }
/* completely destroy a template, caller guarantees permission */ static void deepfree(struct a_template *ptemp, const char *board) { char filepath[STRLEN]; if (ptemp->tmpl->filename[0]) { setbfile(filepath, board, ptemp->tmpl->filename); if (dashf(filepath)) my_unlink(filepath); } if (ptemp->tmpl) { free(ptemp->tmpl); ptemp->tmpl = NULL; } if (ptemp->cont) { free(ptemp->cont); ptemp->cont = NULL; } }
static void a_showname(const menu_t * pm) { char buf[PATHLEN]; int len; int i; int sym; move(b_lines - 1, 0); snprintf(buf, sizeof(buf), "%s/%s", pm->path, pm->header[pm->now - pm->page].filename); if (dashl(buf)) { prints("此 symbolic link 名稱為 %s\n", pm->header[pm->now - pm->page].filename); if ((len = readlink(buf, buf, PATHLEN - 1)) >= 0) { buf[len] = '\0'; for (i = 0; BBSHOME[i] && buf[i] == BBSHOME[i]; i++); if (!BBSHOME[i] && buf[i] == '/') { if (HasUserPerm(PERM_BBSADM)) sym = 1; else { sym = 0; for (i++; BBSHOME "/man"[i] && buf[i] == BBSHOME "/man"[i]; i++); if (!BBSHOME "/man"[i] && buf[i] == '/') sym = 1; } if (sym) { vmsgf("此 symbolic link 指向 %s", &buf[i + 1]); } } } } else if (dashf(buf)) prints("此文章名稱為 %s", pm->header[pm->now - pm->page].filename); else if (dashd(buf)) prints("此目錄名稱為 %s", pm->header[pm->now - pm->page].filename); else outs("此項目已損毀, 建議將其刪除!"); pressanykey(); }
int main(int argc, char *argv[]) { fi_init_curl(); fi_init_image_parse(); q_signal(SIGINT, sig_int); if (!(argc > 1 && strcasecmp(argv[1], "create") == 0)) { printf("start fetch all image ...\n"); fi_start_fetch_thread(argc > 1 ? atoi(argv[1]) : 1); } if (m_sig_int_flag == 0) { printf("output image ...\n"); if (argc > 2 && dashf(argv[2])) fi_output_image_with_file_list("zh", argv[2]); else fi_output_image("zh"); } return 0; }
// Recover user's talk log from abnormal exit. void tlog_recover(void) { char buf[256]; sethomefile(buf, currentuser.userid, "talk_log"); if (strcasecmp(currentuser.userid, "guest") == 0 || !dashf(buf)) return; screen_clear(); genbuf[0] = '\0'; //% getdata(0, 0, "\033[1;32m您有一个不正常断线所留下来的聊天记录, " getdata(0, 0, "\033[1;32m\xc4\xfa\xd3\xd0\xd2\xbb\xb8\xf6\xb2\xbb\xd5\xfd\xb3\xa3\xb6\xcf\xcf\xdf\xcb\xf9\xc1\xf4\xcf\xc2\xc0\xb4\xb5\xc4\xc1\xc4\xcc\xec\xbc\xc7\xc2\xbc, " //% "您要 .. (M) 寄回信箱 (Q) 算了?[Q]:\033[m", "\xc4\xfa\xd2\xaa .. (M) \xbc\xc4\xbb\xd8\xd0\xc5\xcf\xe4 (Q) \xcb\xe3\xc1\xcb\xa3\xbf[Q]\xa3\xba\033[m", genbuf, 2, DOECHO, YEA); if (genbuf[0] == 'M' || genbuf[0] == 'm') { //% mail_file(buf, currentuser.userid, "聊天记录"); mail_file(buf, currentuser.userid, "\xc1\xc4\xcc\xec\xbc\xc7\xc2\xbc"); } unlink(buf); return; }
static void user_login(void) { char fname[STRLEN]; // SYSOP gets all permission bits when login. if (strcmp(currentuser.userid, "SYSOP") == 0) { currentuser.userlevel = ~0; substitut_record(PASSFILE, ¤tuser, sizeof(currentuser), usernum); } fromhost[sizeof(fromhost) - 1] = 0; //added by iamfat 2004.01.05 to avoid overflow log_usies("ENTER", fromhost, ¤tuser); SpecialID(currentuser.userid, fromhost, sizeof(fromhost)); u_enter(); report("Enter", currentuser.userid); #ifdef USE_NOTEPAD notepad_init(); if (strcmp(currentuser.userid, "guest") != 0) { if (DEFINE(DEF_NOTEPAD)) { int noteln; if (lastnote> currentuser.notedate) currentuser.noteline = 0; noteln = countln("etc/notepad"); if (currentuser.noteline == 0) { shownotepad(); } else if ((noteln - currentuser.noteline)> 0) { screen_move(0, 0); ansimore2("etc/notepad", NA, 0, noteln - currentuser.noteline + 1); terminal_getchar(); screen_clear(); } currentuser.noteline = noteln; write_defnotepad(); } } #endif if (show_statshm("etc/hotspot", 0)) { screen_flush(); pressanykey(); } if ((vote_flag(NULL, '\0', 2 /* 检查读过新的Welcome 没 */) == 0)) { if (dashf("Welcome")) { ansimore("Welcome", YEA); vote_flag(NULL, 'R', 2 /* 写入读过新的Welcome */); } } else { ansimore("Welcome2", YEA); } show_statshm("0Announce/bbslist/day", 1); screen_flush(); screen_move_clear(-2); if (currentuser.numlogins < 1) { currentuser.numlogins = 0; //% prints("\033[1;36m☆ 这是您第 \033[33m1\033[36m 次拜访本站,请记住今天吧。\n"); prints("\033[1;36m\xa1\xee \xd5\xe2\xca\xc7\xc4\xfa\xb5\xda \033[33m1\033[36m \xb4\xce\xb0\xdd\xb7\xc3\xb1\xbe\xd5\xbe\xa3\xac\xc7\xeb\xbc\xc7\xd7\xa1\xbd\xf1\xcc\xec\xb0\xc9\xa1\xa3\n"); //% prints("☆ 您第一次连入本站的时间为 \033[33m%s\033[m ", format_time(time(NULL), TIME_FORMAT_ZH)); prints("\xa1\xee \xc4\xfa\xb5\xda\xd2\xbb\xb4\xce\xc1\xac\xc8\xeb\xb1\xbe\xd5\xbe\xb5\xc4\xca\xb1\xbc\xe4\xce\xaa \033[33m%s\033[m ", format_time(fb_time(), TIME_FORMAT_ZH)); } else { prints( //% "\033[1;36m☆ 这是您第 \033[33m%d\033[36m 次拜访本站,上次您是从 \033[33m%s\033[36m 连往本站。\n", "\033[1;36m\xa1\xee \xd5\xe2\xca\xc7\xc4\xfa\xb5\xda \033[33m%d\033[36m \xb4\xce\xb0\xdd\xb7\xc3\xb1\xbe\xd5\xbe\xa3\xac\xc9\xcf\xb4\xce\xc4\xfa\xca\xc7\xb4\xd3 \033[33m%s\033[36m \xc1\xac\xcd\xf9\xb1\xbe\xd5\xbe\xa1\xa3\n", currentuser.numlogins + 1, currentuser.lasthost); //% prints("☆ 上次连线时间为 \033[33m%s\033[m ", format_time(currentuser.lastlogin, TIME_FORMAT_ZH)); prints("\xa1\xee \xc9\xcf\xb4\xce\xc1\xac\xcf\xdf\xca\xb1\xbc\xe4\xce\xaa \033[33m%s\033[m ", format_time(currentuser.lastlogin, TIME_FORMAT_ZH)); } terminal_getchar(); setuserfile(fname, BADLOGINFILE); if (ansimore(fname, NA) != -1) { //% if (askyn("您要删除以上密码输入错误的记录吗", NA, NA) == YEA) if (askyn("\xc4\xfa\xd2\xaa\xc9\xbe\xb3\xfd\xd2\xd4\xc9\xcf\xc3\xdc\xc2\xeb\xca\xe4\xc8\xeb\xb4\xed\xce\xf3\xb5\xc4\xbc\xc7\xc2\xbc\xc2\xf0", NA, NA) == YEA) unlink(fname); } set_safe_record(); tui_check_uinfo(¤tuser); strlcpy(currentuser.lasthost, fromhost, sizeof(currentuser.lasthost)); if (login_start_time - currentuser.lastlogin >= 20 * 60 || !strcmp(currentuser.userid, "guest") || currentuser.numlogins < 100) { currentuser.numlogins++; } session_basic_info_t *res = get_my_sessions(); update_user_stay(¤tuser, true, session_basic_info_count(res) > 1); session_basic_info_clear(res); #ifdef ALLOWGAME if (currentuser.money> 1000000) { currentuser.nummedals += currentuser.money / 10000; currentuser.money %= 1000000; } if ((signed int) (currentuser.money - currentuser.bet) < -4990 && currentuser.numlogins < 10 && currentuser.numposts < 10 && currentuser.nummedals == 0) currentuser.money += 1000; #endif if (currentuser.firstlogin == 0) { currentuser.firstlogin = time(NULL) - 7 * 86400; } substitut_record(PASSFILE, ¤tuser, sizeof(currentuser), usernum); extern char currmaildir[]; setmdir(currmaildir, currentuser.userid); check_register_info(); }
// Do autoposting according to "etc/autopost", // if no such action has been taken since last 00:00 UTC. static void notepad_init(void) { FILE *check; char notetitle[STRLEN]; char tmp[STRLEN * 2]; char *fname, *bname, *ntitle; long int maxsec; maxsec = 86400; lastnote = 0; if ((check = fopen("etc/checknotepad", "r")) != NULL) { fgets(tmp, sizeof(tmp), check); lastnote = atol(tmp); fclose(check); } fb_time_t now = fb_time(); if ((now - lastnote) >= maxsec) { screen_move(-1, 0); //% prints("对不起,系统自动发信,请稍候....."); prints("\xb6\xd4\xb2\xbb\xc6\xf0\xa3\xac\xcf\xb5\xcd\xb3\xd7\xd4\xb6\xaf\xb7\xa2\xd0\xc5\xa3\xac\xc7\xeb\xc9\xd4\xba\xf2....."); screen_flush(); check = fopen("etc/checknotepad", "w"); lastnote = now - (now % maxsec); if (check) { fprintf(check, "%ld", lastnote); fclose(check); } if ((check = fopen("etc/autopost", "r")) != NULL) { while (fgets(tmp, STRLEN, check) != NULL) { fname = strtok(tmp, " \n\t:@"); bname = strtok(NULL, " \n\t:@"); ntitle = strtok(NULL, " \n\t:@"); if (fname == NULL || bname == NULL || ntitle == NULL) continue; else { char *str = format_time(now, TIME_FORMAT_ZH); snprintf(notetitle, sizeof(notetitle), "[%14.14s %6.6s] %s", str, str + 23, ntitle); if (dashf(fname)) { Postfile(fname, bname, notetitle, 1); //% sprintf(tmp, "%s 自动张贴", ntitle); sprintf(tmp, "%s \xd7\xd4\xb6\xaf\xd5\xc5\xcc\xf9", ntitle); report(tmp, currentuser.userid); } } } fclose(check); } char *str = format_time(now, TIME_FORMAT_ZH); //% snprintf(notetitle, sizeof(notetitle), "[%14.14s %6.6s] 留言板记录", snprintf(notetitle, sizeof(notetitle), "[%14.14s %6.6s] \xc1\xf4\xd1\xd4\xb0\xe5\xbc\xc7\xc2\xbc", str, str + 23); if (dashf("etc/notepad")) { Postfile("etc/notepad", "Notepad", notetitle, 1); unlink("etc/notepad"); } //% report("自动发信时间更改", currentuser.userid); report("\xd7\xd4\xb6\xaf\xb7\xa2\xd0\xc5\xca\xb1\xbc\xe4\xb8\xfc\xb8\xc4", currentuser.userid); } return; }
int a_menu_rec(const char *maintitle, const char *path, int lastlevel, int lastbid, char *trans_buffer, a_menu_session_t *sess, const int *preselect, // we don't change root's value (but may change root pointer) // we may change parent's value (but never change parent pointer) const menu_t *root, menu_t* const parent) { menu_t me = {0}; char fname[PATHLEN]; int ch, returnvalue = FULLUPDATE; assert(sess); // prevent deep resursive directories if (strlen(path) + FNLEN >= PATHLEN) { // it is not save to enter such directory. return returnvalue; } if(trans_buffer) trans_buffer[0] = '\0'; if (parent) { parent->next = &me; } else { assert(root == NULL); root = &me; } me.header_size = p_lines; me.header = (fileheader_t *) calloc(me.header_size, FHSZ); me.path = path; strlcpy(me.mtitle, maintitle, sizeof(me.mtitle)); setadir(fname, me.path); me.num = get_num_records(fname, FHSZ); me.bid = lastbid; /* 精華區-tree 中部份結構屬於 cuser ==> BM */ if (!(me.level = lastlevel)) { char *ptr; // warning: this is only valid for me.level. // is_uBM should not do anything except returning test result: // for ex, setting user BM permission automatically. // such extra behavior will result in any sub-op to have PERM_BM // ability, which leads to entering BM board without authority. // Thanks to mtdas@ptt for reporting this exploit. if (HasBasicUserPerm(PERM_LOGINOK) && !HasUserPerm(PERM_NOCITIZEN) && (ptr = strrchr(me.mtitle, '['))) me.level = is_uBM(ptr + 1, cuser.userid); } me.page = A_INVALID_PAGE; if (preselect && !*preselect) preselect = NULL; me.now = preselect ? (*preselect -1) : 0; for (;;) { if (me.now >= me.num) me.now = me.num - 1; if (me.now < 0) me.now = 0; if (me.now < me.page || me.now >= me.page + me.header_size) { me.page = me.now - ((me.page == 10000 && me.now > p_lines / 2) ? (p_lines / 2) : (me.now % p_lines)); if (!a_showmenu(&me)) { // some directories are invalid, restart! sess->bReturnToRoot = 1; break; } } if (preselect && *preselect && preselect[1]) { // if this is not the last preselect entry, enter it ch = KEY_ENTER; } else { ch = cursor_key(2 + me.now - me.page, 0); } if (ch == 'q' || ch == 'Q' || ch == KEY_LEFT) break; // TODO maybe we should let 1-9=simple search and z=tree-search // TODO or let 'z' prefix means 'back to root' if ((ch >= '1' && ch <= '9') || (ch == 'z' || ch == 'Z')) { int n = a_multi_search_num(ch, sess); me.page = A_INVALID_PAGE; if (n > 0) { // simple (single) selection me.now = n-1; me.page = 10000; // I don't know what's the magic value 10000... } else if (n == 0 && sess->z_indexes[0] == 0) { // empty/invalid input } else { // n == 0 with multiple selects preselect = sess->z_indexes; if (*preselect < 0) { // return to root first? if (parent) { sess->bReturnToRoot = 1; return DONOTHING; } // already in root preselect ++; } // handle first preselect (maybe zero due to previous 'already in root') if (*preselect > 0) me.now = *preselect - 1; else preselect = NULL; } continue; } switch (ch) { case KEY_UP: case 'k': if (--me.now < 0) me.now = me.num - 1; break; case KEY_DOWN: case 'j': if (++me.now >= me.num) me.now = 0; break; case KEY_PGUP: case Ctrl('B'): if (me.now >= p_lines) me.now -= p_lines; else if (me.now > 0) me.now = 0; else me.now = me.num - 1; break; case ' ': case KEY_PGDN: case Ctrl('F'): if (me.now < me.num - p_lines) me.now += p_lines; else if (me.now < me.num - 1) me.now = me.num - 1; else me.now = 0; break; case KEY_HOME: case '0': me.now = 0; break; case KEY_END: case '$': me.now = me.num - 1; break; case '?': case '/': if(me.num) { me.now = a_searchtitle(&me, ch == '?'); me.page = A_INVALID_PAGE; } break; case 'h': a_showhelp(me.level); me.page = A_INVALID_PAGE; break; case Ctrl('W'): a_where_am_i(root, me.now, me.header[me.now - me.page].title); vmsg(NULL); me.page = A_INVALID_PAGE; break; case 'e': case 'E': snprintf(fname, sizeof(fname), "%s/%s", path, me.header[me.now - me.page].filename); if (dashf(fname) && me.level >= MANAGER) { int edflags = 0; *quote_file = 0; # ifdef BN_BBSMOVIE if (me.bid && strcmp(getbcache(me.bid)->brdname, BN_BBSMOVIE) == 0) { edflags |= EDITFLAG_UPLOAD; edflags |= EDITFLAG_ALLOWLARGE; } # endif // BN_BBSMOVIE if (vedit2(fname, NA, NULL, edflags) != -1) { char fpath[PATHLEN]; fileheader_t fhdr; strlcpy(fpath, path, sizeof(fpath)); stampfile(fpath, &fhdr); unlink(fpath); strlcpy(fhdr.filename, me.header[me.now - me.page].filename, sizeof(fhdr.filename)); strlcpy(me.header[me.now - me.page].owner, cuser.userid, sizeof(me.header[me.now - me.page].owner)); setadir(fpath, path); substitute_record(fpath, me.header + me.now - me.page, sizeof(fhdr), me.now + 1); } me.page = A_INVALID_PAGE; } break; case 't': case 'c': if (me.now < me.num) { if (!isvisible_man(&me)) break; snprintf(fname, sizeof(fname), "%s/%s", path, me.header[me.now - me.page].filename); /* XXX: dirty fix 應該要改成如果發現該目錄裡面有隱形目錄的話才拒絕. 不過這樣的話須要整個搜一遍, 而且目前判斷該資料是目錄 還是檔案竟然是用 fstat(2) 而不是直接存在 .DIR 內 |||b 須等該資料寫入 .DIR 內再 implement才有效率. */ if( !me.level && !HasUserPerm(PERM_SYSOP) && (me.bid==0 || !is_BM_cache(me.bid)) && dashd(fname) ) vmsg("只有板主才可以拷貝目錄唷!"); else a_copyitem(fname, me.header[me.now - me.page].title, 0, 1); me.page = A_INVALID_PAGE; /* move down */ if (++me.now >= me.num) me.now = 0; break; } case KEY_ENTER: case KEY_RIGHT: case 'r': if (me.now >= me.num || me.now < 0) { preselect = NULL; continue; } else { fileheader_t *fhdr = &me.header[me.now - me.page]; const int *newselect = preselect ? preselect+1 : NULL; preselect = NULL; if (!isvisible_man(&me)) break; #ifdef DEBUG vmsgf("%s/%s", &path[11], fhdr->filename);; #endif snprintf(fname, sizeof(fname), "%s/%s", path, fhdr->filename); if (dashf(fname)) { int more_result; while ((more_result = more(fname, YEA))) { /* Ptt 範本精靈 plugin */ if (trans_buffer && (currstat == EDITEXP || currstat == OSONG)) { char ans[4]; move(22, 0); clrtoeol(); getdata(22, 1, currstat == EDITEXP ? "要把範例加入到文章內嗎?[y/N]" : "確定要選這篇嗎?[y/N]", ans, sizeof(ans), LCECHO); if (ans[0] == 'y') { strlcpy(trans_buffer, fname, PATHLEN); sess->bReturnToRoot = 1; if (currstat == OSONG) { log_filef(FN_USSONG, LOG_CREAT, "%s\n", fhdr->title); } free(me.header); return FULLUPDATE; } } if (more_result == READ_PREV) { if (--me.now < 0) { me.now = 0; break; } } else if (more_result == READ_NEXT) { if (++me.now >= me.num) { me.now = me.num - 1; break; } /* we only load me.header_size pages */ if (me.now - me.page >= me.header_size) break; } else break; if (!isvisible_man(&me)) break; snprintf(fname, sizeof(fname), "%s/%s", path, me.header[me.now - me.page].filename); if (!dashf(fname)) break; } } else if (dashd(fname)) { returnvalue = a_menu_rec(me.header[me.now - me.page].title, fname, me.level, me.bid, trans_buffer, sess, newselect, root, &me); if (returnvalue == DONOTHING) { // DONOTHING will only be caused by previous a_multi_search_num + preselect. assert(sess->bReturnToRoot); if (!parent) { // we've reached root menu! assert(sess->z_indexes[0] == -1); sess->bReturnToRoot = 0; returnvalue = FULLUPDATE; preselect = sess->z_indexes+1; // skip first 'return to root' if (*preselect > 0) me.now = *preselect-1; } } else { returnvalue = FULLUPDATE; } me.next = NULL; /* Ptt 強力跳出recursive */ if (sess->bReturnToRoot) { free(me.header); return returnvalue; } } me.page = A_INVALID_PAGE; } break; case 'F': case 'U': if (me.now < me.num) { fileheader_t *fhdr = &me.header[me.now - me.page]; if (!isvisible_man(&me)) break; snprintf(fname, sizeof(fname), "%s/%s", path, fhdr->filename); if (HasBasicUserPerm(PERM_LOGINOK) && dashf(fname)) { a_forward(path, fhdr, ch /* == 'U' */ ); /* By CharlieL */ } else vmsg("無法轉寄此項目"); me.page = A_INVALID_PAGE; } break; } if (me.level >= MANAGER) { switch (ch) { case 'n': a_newitem(&me, ADDITEM); me.page = A_INVALID_PAGE; break; case 'g': a_newitem(&me, ADDGROUP); me.page = A_INVALID_PAGE; break; case 'p': a_pasteitem(&me, 1); me.page = A_INVALID_PAGE; break; case 'f': a_editsign(&me); me.page = A_INVALID_PAGE; break; case Ctrl('P'): a_pastetagpost(&me, -1); returnvalue = DIRCHANGED; me.page = A_INVALID_PAGE; break; case Ctrl('A'): a_pastetagpost(&me, 1); returnvalue = DIRCHANGED; me.page = A_INVALID_PAGE; break; case 'a': a_appenditem(&me, 1); me.page = A_INVALID_PAGE; break; } if (me.num) switch (ch) { case 'm': a_moveitem(&me); me.page = A_INVALID_PAGE; break; case 'D': /* Ptt me.page = -1; */ a_delrange(&me, sess->backup_dir); me.page = A_INVALID_PAGE; break; case 'd': a_delete(&me, sess->backup_dir); me.page = A_INVALID_PAGE; break; case 'H': a_hideitem(&me); me.page = A_INVALID_PAGE; break; case 'T': a_newtitle(&me); me.page = A_INVALID_PAGE; break; #ifdef CHESSCOUNTRY case 'L': a_setchesslist(&me); break; #endif } } if (me.level >= SYSOP) { switch (ch) { case 'N': a_showname(&me); me.page = A_INVALID_PAGE; break; } } } free(me.header); return returnvalue; }
void a_pasteitem(menu_t * pm, int mode) { char newpath[PATHLEN]; char buf[PATHLEN]; char ans[2], skipAll = 0, multiple = 0; int i, copied = 0; fileheader_t item; CopyQueue *cq; move(b_lines - 1, 0); if(copyqueue_querysize() <= 0) { vmsg("請先執行複製(copy)命令後再貼上(paste)"); return; } if(mode && copyqueue_querysize() > 1) { multiple = 1; move(b_lines-2, 0); clrtobot(); outs("c: 對各項目個別確認是否要貼上, z: 全部不貼,同時重設並取消全部標記\n"); snprintf(buf, sizeof(buf), "確定要貼上全部共 %d 個項目嗎 (c/z/y/N)? ", copyqueue_querysize()); getdata(b_lines - 1, 0, buf, ans, sizeof(ans), LCECHO); if(ans[0] == 'y') skipAll = 1; else if(ans[0] == 'z') { copyqueue_reset(); vmsg("已重設複製記錄。"); return; } else if (ans[0] != 'c') return; clear(); } while (copyqueue_querysize() > 0) { cq = copyqueue_gethead(); if(!cq->copyfile[0]) continue; if(mode && multiple) { scroll(); move(b_lines-2, 0); clrtobot(); prints("%d. %s\n", ++copied,cq->copytitle); } if (dashd(cq->copyfile)) { for (i = 0; cq->copyfile[i] && cq->copyfile[i] == pm->path[i]; i++); if (!cq->copyfile[i]) { vmsg("將目錄拷進自己的子目錄中,會造成無窮迴圈!"); continue; } } if (mode && !skipAll) { snprintf(buf, sizeof(buf), "確定要拷貝[%s]嗎(Y/N)?[N] ", cq->copytitle); getdata(b_lines - 1, 0, buf, ans, sizeof(ans), LCECHO); } else ans[0] = 'y'; if (ans[0] == 'y') { strlcpy(newpath, pm->path, sizeof(newpath)); if (*cq->copyowner) { char *fname = strrchr(cq->copyfile, '/'); if (fname) strcat(newpath, fname); else return; if (access(pm->path, X_OK | R_OK | W_OK)) Mkdir(pm->path); memset(&item, 0, sizeof(fileheader_t)); strlcpy(item.filename, fname + 1, sizeof(item.filename)); memcpy(cq->copytitle, "◎", 2); Copy(cq->copyfile, newpath); } else if (dashf(cq->copyfile)) { stampfile(newpath, &item); memcpy(cq->copytitle, "◇", 2); Copy(cq->copyfile, newpath); } else if (dashd(cq->copyfile) && stampadir(newpath, &item, 0) != -1) { memcpy(cq->copytitle, "◆", 2); copy_file(cq->copyfile, newpath); } else { copyqueue_reset(); vmsg("無法拷貝!"); return; } strlcpy(item.owner, *cq->copyowner ? cq->copyowner : cuser.userid, sizeof(item.owner)); strlcpy(item.title, cq->copytitle, sizeof(item.title)); a_additem(pm, &item); cq->copyfile[0] = '\0'; } } }
static void a_appenditem(const menu_t * pm, int isask) { char fname[PATHLEN]; char buf[ANSILINELEN]; char ans[2] = "y"; FILE *fp, *fin; move(b_lines - 1, 0); if(copyqueue_querysize() <= 0) { vmsg("請先執行 copy 命令後再 append"); copyqueue_reset(); return; } else { CopyQueue *cq = copyqueue_gethead(); off_t sz; if (!dashf(cq->copyfile)) { vmsg("目錄不得附加於檔案後!"); return; } snprintf(fname, sizeof(fname), "%s/%s", pm->path, pm->header[pm->now - pm->page].filename); // if same file, abort. if (!dashf(fname) || strcmp(fname, cq->copyfile) == 0) { vmsg("檔案不得附加於此!"); return; } // fname = destination sz = dashs(fname); if (sz >= MAX_FILE_SIZE) { vmsg("檔案已超過最大限制,無法再附加"); return; } if (isask) { snprintf(buf, sizeof(buf), "確定要將[%s]附加於此嗎(Y/N)?[N] ", cq->copytitle); getdata(b_lines - 2, 1, buf, ans, sizeof(ans), LCECHO); } if (ans[0] != 'y' || !(fp = fopen(fname, "a+"))) return; if (!(fin = fopen(cq->copyfile, "r"))) { fclose(fp); return; } // cq->copyfile = input sz = dashs(cq->copyfile); memset(buf, '-', 74); buf[74] = '\0'; fprintf(fp, "\n> %s <\n\n", buf); if (isask) getdata(b_lines - 1, 1, "是否收錄簽名檔部份(Y/N)?[Y] ", ans, sizeof(ans), LCECHO); // XXX reported by Kinra, appending same file may cause endless loop here. // we check file name at prior steps and do file size check here. while (sz > 0 && fgets(buf, sizeof(buf), fin)) { sz -= strlen(buf); if ((ans[0] == 'n') && !strcmp(buf, "--\n")) break; fputs(buf, fp); } fclose(fin); fclose(fp); cq->copyfile[0] = '\0'; } }
// Delete and archive the physical (except header) of file // // if backup_direct is provided, backup according to that directory. // if backup_path points to buffer, return back the backuped file // Return -1 if cannot delete file, 0 for success, // 1 if delete success but backup failed. int delete_file_content2(const char *direct, const fileheader_t *fh, const char *backup_direct, char *backup_path, size_t sz_backup_path, const char *reason) { char fpath[PATHLEN]; fileheader_t backup = { {0} }; int backup_failed = DELETE_FILE_CONTENT_SUCCESS; if(!fh->filename[0] || !direct) return DELETE_FILE_CONTENT_FAILED; #ifdef FN_SAFEDEL if ( #ifdef FN_SAFEDEL_PREFIX_LEN strncmp(fh->filename, FN_SAFEDEL, FN_SAFEDEL_PREFIX_LEN) == 0 || #endif strcmp(fh->filename, FN_SAFEDEL) == 0 || #endif 0) return DELETE_FILE_CONTENT_SUCCESS; if (backup_path) { assert(backup_direct); assert(sz_backup_path > 0); *backup_path = 0; } // solve source file name setdirpath(fpath, direct, fh->filename); if (!dashf(fpath)) return DELETE_FILE_CONTENT_BACKUP_FAILED; // FIXME some announcements were made by sym-links, especial for those // in mail. we should ignore them. if (backup_direct && !dashl(fpath) && strncmp(fh->owner, RECYCLE_BIN_OWNER, strlen(RECYCLE_BIN_OWNER)) != 0) { // FIXME maybe for non-board files we should do this by simply touching // file instead of full log. if (reason && *reason) log_filef(fpath, LOG_CREAT, "\n※ 刪除原因: %s", reason); log_filef(fpath, LOG_CREAT, "\n※ Deleted by: %s (%s) %s\n", cuser.userid, fromhost, Cdatelite(&now)); // TODO or only memcpy(&backup, fh, sizeof(backup)); ? strlcpy(backup.owner, fh->owner, sizeof(backup.owner)); strlcpy(backup.date, fh->date, sizeof(backup.date)); strlcpy(backup.title, fh->title, sizeof(backup.title)); strlcpy(backup.filename, fh->filename, sizeof(backup.filename)); if (backup_direct != direct && strcmp(backup_direct, direct) != 0) { // need to create a new file entry. char *slash = NULL; char bakpath[PATHLEN]; strlcpy(bakpath, backup_direct, sizeof(bakpath)); slash = strrchr(bakpath, '/'); if (slash) *slash = 0; if (stampfile_u(bakpath, &backup) == 0 && Rename(fpath, bakpath) == 0) { strlcpy(fpath, bakpath, sizeof(fpath)); } else { backup_direct = NULL; backup_failed = 1; } } // now, always backup according to fpath if (backup_direct) { #ifdef USE_TIME_CAPSULE if (!timecapsule_archive_new_revision( fpath, &backup, sizeof(backup), backup_path, sz_backup_path)) backup_failed = DELETE_FILE_CONTENT_BACKUP_FAILED; #else // we can't backup to same folder. if (strcmp(direct, backup_direct) == 0) { backup_failed = DELETE_FILE_CONTENT_BACKUP_FAILED; } else { if (append_record(backup_direct, &backup, sizeof(backup)) < 0) backup_failed = DELETE_FILE_CONTENT_BACKUP_FAILED; if (backup_path) strlcpy(backup_path, fpath, sz_backup_path); } // the fpath is used as-is. *fpath = 0; #endif } } // the file should be already in time capsule if (*fpath && unlink(fpath) != 0) return DELETE_FILE_CONTENT_FAILED; return backup_failed; }
static void a_delete(menu_t * pm, const char *backup_dir) { char fpath[PATHLEN], buf[PATHLEN], cmd[PATHLEN]; char ans[4]; fileheader_t backup, *fhdr = &(pm->header[pm->now - pm->page]); const char *msg_errsync = "刪除檔案失敗,請退回上層目錄後再重試一次", *msg_errsync2 = "檔案可能已被它人刪除,請退回上層目錄再重進確認", *msg_errbackup = "檔案已刪除但無法備份。請至 " BN_BUGREPORT "報告您試圖刪除檔案的位置。"; snprintf(fpath, sizeof(fpath), "%s/%s", pm->path, fhdr->filename); setadir(buf, pm->path); if (fhdr->filename[0] == 'H' && fhdr->filename[1] == '.') { getdata(b_lines - 1, 1, "您確定要刪除此精華區連線嗎(Y/N)?[N] ", ans, sizeof(ans), LCECHO); if (ans[0] != 'y') return; if (delete_fileheader(buf, fhdr, pm->now + 1) == -1) { vmsg(msg_errsync); return; } } else if (dashl(fpath)) { getdata(b_lines - 1, 1, "您確定要刪除此 symbolic link 嗎(Y/N)?[N] ", ans, sizeof(ans), LCECHO); if (ans[0] != 'y') return; if (delete_fileheader(buf, fhdr, pm->now + 1) == -1) { vmsg(msg_errsync); return; } unlink(fpath); } else if (dashf(fpath)) { getdata(b_lines - 1, 1, "您確定要刪除此檔案嗎(Y/N)?[N] ", ans, sizeof(ans), LCECHO); if (ans[0] != 'y') return; if (delete_fileheader(buf, fhdr, pm->now + 1) == -1) { vmsg(msg_errsync); return; } switch(delete_file_content(buf, fhdr, backup_dir, NULL, 0)) { case DELETE_FILE_CONTENT_BACKUP_FAILED: vmsg(msg_errbackup); break; case DELETE_FILE_CONTENT_FAILED: vmsg(msg_errsync2); break; default: #ifndef USE_TIME_CAPSULE // When not using time capsule, .DIR content may be changed in // board (BN_DELETE/BN_JUNK) and need to be changed. However // since that's going to be deprecated in future, let's have a // simple workaround here. if (backup_dir) { const char *bn = NULL; if (strstr(backup_dir, "/" BN_JUNK "/")) bn = BN_JUNK; else if (strstr(backup_dir, "/" BN_DELETED "/")) bn = BN_DELETED; if (bn) setbtotal(getbnum(bn)); } #endif break; } } else if (dashd(fpath)) { // TODO(hungte) We should create a top level folder and move everything // inside. // XXX we also check PERM_MAILLIMIT here because RMAIL // may be not trusted... const char *save_bn = ( HasUserPerm(PERM_MAILLIMIT) && (currstat & RMAIL) ) ? BN_JUNK : BN_DELETED; getdata(b_lines - 1, 1, "您確定要刪除整個目錄嗎(Y/N)?[N] ", ans, sizeof(ans), LCECHO); if (ans[0] != 'y') return; if (delete_fileheader(buf, fhdr, pm->now + 1) == -1) { vmsg(msg_errsync); return; } setapath(buf, save_bn); // XXX because this directory will hold folders from entire site, // let's allow it to use a large set of file names. if (stampadir(buf, &backup, 1) != 0) { vmsg("抱歉,系統目前無法刪除資料,請通知站務人員"); return; } snprintf(cmd, sizeof(cmd), "rm -rf %s;/bin/mv -f %s %s", buf, fpath, buf); system(cmd); strlcpy(backup.owner, cuser.userid, sizeof(backup.owner)); strcpy(backup.title, "◆"); strlcpy(backup.title + 2, fhdr->title + 2, sizeof(backup.title) - 3); // restrict access if source is hidden if ((fhdr->filemode & FILE_BM) || (fhdr->filemode & FILE_HIDE)) backup.filemode |= FILE_BM; /* merge setapath(buf, save_bn); setadir(buf, buf); */ snprintf(buf, sizeof(buf), "man/boards/%c/%s/" FN_DIR, *save_bn, save_bn); append_record(buf, &backup, sizeof(backup)); } else { /* Ptt 損毀的項目 */ getdata(b_lines - 1, 1, "您確定要刪除此損毀的項目嗎(Y/N)?[N] ", ans, sizeof(ans), LCECHO); if (ans[0] != 'y') return; if (delete_fileheader(buf, fhdr, pm->now + 1) == -1) return; } pm->num--; }
//struct file_to_appendix a; int main() { FILE *fp; char filename[80], dir[80], board[80], title[80], buf[80], *content, vfrom[80]; char tmpbuf [5], title2 [10]; char redirfile[80]; int r, i=0, length=0, sig, mode=0, accessed=0; struct fileheader x; struct shortfile *brd; init_all(); if(!loginok) http_fatal("匆匆过客不能发表文章,请先登录"); mode=atoi(getparm("mode")); if(mode) strsncpy(redirfile, getparm("redir"), 20); strsncpy(board, getparm("board"), 18); strsncpy(vfrom, getparm("vfrom"), 18); if (!*vfrom) { strcpy(vfrom, board); } if(dashf("NOPOST")&&!HAS_PERM(PERM_OBOARDS) && insec(1,board) ) http_fatal("对不起,系统进入只读状态,暂停发表文章.你先四处看看吧"); /* efan: very faint */ if (dashf ("NOPOST.2") && ! HAS_PERM (PERM_OBOARDS) && ( !strcmp (board, "VoiceofNankai") || !strcmp (board, "Military") || !strcmp (board, "TaiWan") || !strcmp (board, "Salon")) ) http_fatal("对不起,本板进入只读状态,暂停发表文章"); if(!(currentuser.userlevel & PERM_POST)&&strcmp(board, "appeal")&&strcmp(board, "sysop")) http_fatal("您尚未通过注册,暂无发表文章权限"); if(check_post_limit(board)) return 0; strsncpy(title, getparm("title"), 50); strsncpy (tmpbuf, getparm ("title2"), 5); if (tmpbuf [0] != 0) sprintf (title2, "【%s】", tmpbuf); else title2[0] = 0; content=getparm("text"); brd=getbcache(board); /* add by wzk for outgo post */ //out=strlen(getparm("out")); //if (!(brd->flag & OUT_FLAG)) out=0; /* end */ if(brd==0) http_fatal("错误的讨论区名称"); strcpy(board, brd->filename); //huangxu@070217:no_word_filter flag int bd=0; char temp[80]; if(!(brd->flag2&NOFILTER_FLAG)&&(bad_words(title) || bad_words (tmpbuf) || bad_words(content) )){ bd=1; printf("您的文章可能包含不便显示的内容,已经提交审核。请返回并进行修改。"); sprintf(temp,"TEMP-%s",board); strcpy(board,"TEMP"); }else strcpy(temp,board); for(i=0; i<strlen(title); i++) if(title[i]<=27 && title[i]>=-1) title[i]=' '; sig=atoi(getparm("signature")); if(title[0]==0) http_fatal("文章必须要有标题"); if (title2 [0] == 0 && !strcmp (board, "Secondhand")) http_fatal ("在Secondhand板请说清楚您的需要!"); if (tmpbuf [0] != ' ') { char tmptmpbuf [80]; sprintf (tmptmpbuf, "%s%s", title2, title); strcpy (title, tmptmpbuf); } sprintf(dir, "boards/%s/.DIR", board); if(bd==0) if(!has_post_perm(¤tuser, board)) http_fatal("此讨论区是唯读的, 或是您尚无权限在此发表文章."); sprintf(filename, "boards/%s/deny_users", board); if(file_has_word(filename, currentuser.userid)) http_fatal("很抱歉, 你被板务人员停止了本板的post权利."); if(abs(time(0) - *(int*)(u_info->from+36))<6) { *(int*)(u_info->from+36)=time(0); http_fatal("两次发文间隔过密, 请休息几秒后再试"); } *(int*)(u_info->from+36)=time(0); sprintf(filename, "tmp/%d.%s.tmp", getpid(),currentuser.userid); f_append(filename, content); accessed=0; if(strlen(getparm("noreply"))>0) accessed=FILE_NOREPLY; int outgo=0; if(strlen(getparm("outgo"))>0) outgo=1; int attach=atoi(getparm("attach")); r=0; r=post_article2(temp, title, filename, currentuser.userid, currentuser.username, fromhost, sig-1, accessed, attach,outgo); if(r<=0) http_fatal("内部错误,无法发文"); char path[STRLEN]; /* while( appendix != NULL ) { bzero(&a,sizeof(struct appendix)); strcpy(a.appendixname,appendix); a.filename=r; a.sign=0; strcpy(a.path,board); sprintf(path,"%s/file_appendix",UPLOAD_PATH); append_record(&a,sizeof(struct appendix),path); appendix = strtok( NULL, "," ); } */ sprintf(buf,"M.%d.A",r); brc_init(currentuser.userid, board); brc_add_read(buf); brc_update(currentuser.userid, board); unlink(filename); sprintf(buf, "posted WWW '%s' on '%s'", title, board); report(buf); if(mode==0) sprintf(buf, "bbsdoc?board=%s#bottom", vfrom); else if(mode==1) sprintf(buf, "bbstcon?board=%s&file=%s&vfrom=%s#bottom", board, redirfile, vfrom); else if(mode==2) sprintf(buf, "bbstdoc?board=%s#bottom", vfrom); if(!junkboard(board)) { currentuser.numposts++; save_user_data(¤tuser); // write_posts(currentuser.userid, board, title); } if(toptenboard(board)) { write_posts(currentuser.userid, board, title); } else if(!strcmp("Blessing",board)) write_posts(currentuser.userid, board, title); // return 0; if(bd==0) redirect(buf); }
int web_sector(void) { int sid = 0; board_t parent = { .id = 0 }; db_res_t *res = NULL; const char *sname = web_get_param("s"); if (*sname) { res = db_query("SELECT id, descr" " FROM board_sectors WHERE name = %s", sname); if (!res || db_res_rows(res) < 1) { db_clear(res); return BBS_EINVAL; } } else { const char *pname = web_get_param("board"); if (*pname) get_board(pname, &parent); else get_board_by_bid(strtol(web_get_param("bid"), NULL, 10), &parent); if (!parent.id || !(parent.flag & BOARD_FLAG_DIR) || !has_read_perm(&parent)) return BBS_ENOBRD; } xml_header(NULL); printf("<bbsboa link='%sdoc' ", get_post_list_type_string()); if (*sname) { char path[HOMELEN]; sprintf(path, "%s/info/egroup%d/icon.jpg", BBSHOME, (int) strtol(sname, NULL, 16)); if (dashf(path)) printf(" icon='%s'", path); const char *utf8_sector = db_get_value(res, 0, 1); if (web_request_type(UTF8)) { printf(" title='%s'>", utf8_sector); } else { GBK_BUFFER(sector, BOARD_SECTOR_NAME_CCHARS); convert_u2g(utf8_sector, gbk_sector); printf(" title='%s'>", gbk_sector); } sid = db_get_integer(res, 0, 0); db_clear(res); } else { if (web_request_type(UTF8)) { printf(" dir= '1' title='%s'>", parent.descr); } else { GBK_BUFFER(descr, BOARD_DESCR_CCHARS); convert_u2g(parent.descr, gbk_descr); printf(" dir= '1' title='%s'>", gbk_descr); } } if (sid) res = db_query(BOARD_SELECT_QUERY_BASE "WHERE b.sector = %d", sid); else res = db_query(BOARD_SELECT_QUERY_BASE "WHERE b.parent = %d", parent.id); if (res && db_res_rows(res) > 0) show_board(res); db_clear(res); print_session(); printf("</bbsboa>"); return 0; } int bbsclear_main(void) { if (!session_id()) return BBS_ELGNREQ; board_t board; if (!get_board(web_get_param("board"), &board) || !has_read_perm(&board)) return BBS_ENOBRD; session_set_board(board.id); const char *start = web_get_param("start"); brc_init(currentuser.userid, board.name); brc_clear_all(); brc_sync(currentuser.userid); char buf[STRLEN]; snprintf(buf, sizeof(buf), "doc?board=%s&start=%s", board.name, start); http_header(); refreshto(0, buf); printf("</head></html>"); return 0; } int bbsnot_main(void) { board_t board; if (!get_board(web_get_param("board"), &board) || !has_read_perm(&board)) return BBS_ENOBRD; if (board.flag & BOARD_FLAG_DIR) return BBS_EINVAL; session_set_board(board.id); char fname[HOMELEN]; snprintf(fname, sizeof(fname), "vote/%s/notes", board.name); mmap_t m; m.oflag = O_RDONLY; if (mmap_open(fname, &m) < 0) return BBS_ENOFILE; xml_header(NULL); printf("<bbsnot brd='%s'>", board.name); xml_fputs2((char *) m.ptr, m.size); mmap_close(&m); print_session(); printf("</bbsnot>"); return 0; }
void tui_check_reg_mail(void) { //% char email[EMAIL_LEN] = "您的邮箱", file[HOMELEN], buf[RNDPASSLEN + 1]; char email[EMAIL_LEN] = "\xc4\xfa\xb5\xc4\xd3\xca\xcf\xe4", file[HOMELEN], buf[RNDPASSLEN + 1]; int i = 0; sethomefile(file, currentuser.userid, REG_CODE_FILE); if (!dashf(file)) { screen_move(1, 0); //% outs(" 请输入您的复旦邮箱([email protected]/alu.fudan.edu.cn)\n" outs(" \xc7\xeb\xca\xe4\xc8\xeb\xc4\xfa\xb5\xc4\xb8\xb4\xb5\xa9\xd3\xca\xcf\xe4([email protected]/alu.fudan.edu.cn)\n" //% " \033[1;32m本站采用复旦邮箱绑定认证,将发送认证码至您的复旦邮箱\033[m"); " \033[1;32m\xb1\xbe\xd5\xbe\xb2\xc9\xd3\xc3\xb8\xb4\xb5\xa9\xd3\xca\xcf\xe4\xb0\xf3\xb6\xa8\xc8\xcf\xd6\xa4\xa3\xac\xbd\xab\xb7\xa2\xcb\xcd\xc8\xcf\xd6\xa4\xc2\xeb\xd6\xc1\xc4\xfa\xb5\xc4\xb8\xb4\xb5\xa9\xd3\xca\xcf\xe4\033[m"); do { getdata(3, 0, " E-Mail:> ", email, sizeof(email), DOECHO, YEA); if (!valid_addr(email) || !register_domain_allowed(email) || !register_email_allowed(email)) { //% prints(" 对不起, 该email地址无效, 请重新输入 \n"); prints(" \xb6\xd4\xb2\xbb\xc6\xf0, \xb8\xc3""email\xb5\xd8\xd6\xb7\xce\xde\xd0\xa7, \xc7\xeb\xd6\xd8\xd0\xc2\xca\xe4\xc8\xeb \n"); continue; } else break; } while (1); register_send_email(¤tuser, email); } screen_move_clear(4); screen_move(5, 0); //% prints(" \033[1;33m 认证码已发送到 %s ,请查收\033[m\n", email); prints(" \033[1;33m \xc8\xcf\xd6\xa4\xc2\xeb\xd2\xd1\xb7\xa2\xcb\xcd\xb5\xbd %s \xa3\xac\xc7\xeb\xb2\xe9\xca\xd5\033[m\n", email); screen_move(7, 0); //% if (askyn(" 现在输入认证码么?", true, false)) { if (askyn(" \xcf\xd6\xd4\xda\xca\xe4\xc8\xeb\xc8\xcf\xd6\xa4\xc2\xeb\xc3\xb4\xa3\xbf", true, false)) { screen_move(9, 0); //% outs("请输入注册确认信里, \"认证码\"来做为身份确认\n"); outs("\xc7\xeb\xca\xe4\xc8\xeb\xd7\xa2\xb2\xe1\xc8\xb7\xc8\xcf\xd0\xc5\xc0\xef, \"\xc8\xcf\xd6\xa4\xc2\xeb\"\xc0\xb4\xd7\xf6\xce\xaa\xc9\xed\xb7\xdd\xc8\xb7\xc8\xcf\n"); //% prints("一共是 %d 个字符, 大小写是有差别的, 请注意.\n", RNDPASSLEN); prints("\xd2\xbb\xb9\xb2\xca\xc7 %d \xb8\xf6\xd7\xd6\xb7\xfb, \xb4\xf3\xd0\xa1\xd0\xb4\xca\xc7\xd3\xd0\xb2\xee\xb1\xf0\xb5\xc4, \xc7\xeb\xd7\xa2\xd2\xe2.\n", RNDPASSLEN); //% outs("请注意, 请输入最新一封认证信中所包含的乱数密码!\n\n" outs("\xc7\xeb\xd7\xa2\xd2\xe2, \xc7\xeb\xca\xe4\xc8\xeb\xd7\xee\xd0\xc2\xd2\xbb\xb7\xe2\xc8\xcf\xd6\xa4\xd0\xc5\xd6\xd0\xcb\xf9\xb0\xfc\xba\xac\xb5\xc4\xc2\xd2\xca\xfd\xc3\xdc\xc2\xeb\xa3\xa1\n\n" //% "\033[1;31m提示:注册码输错 3次后系统将要求您重填需绑定的邮箱。\033[m\n"); "\033[1;31m\xcc\xe1\xca\xbe\xa3\xba\xd7\xa2\xb2\xe1\xc2\xeb\xca\xe4\xb4\xed 3\xb4\xce\xba\xf3\xcf\xb5\xcd\xb3\xbd\xab\xd2\xaa\xc7\xf3\xc4\xfa\xd6\xd8\xcc\xee\xd0\xe8\xb0\xf3\xb6\xa8\xb5\xc4\xd3\xca\xcf\xe4\xa1\xa3\033[m\n"); for (i = 0; i < 3; i++) { screen_move(15, 0); //% prints("您还有 %d 次机会\n", 3 - i); prints("\xc4\xfa\xbb\xb9\xd3\xd0 %d \xb4\xce\xbb\xfa\xbb\xe1\n", 3 - i); //% getdata(16, 0, "请输入认证码: ", buf, sizeof(buf), DOECHO, YEA); getdata(16, 0, "\xc7\xeb\xca\xe4\xc8\xeb\xc8\xcf\xd6\xa4\xc2\xeb: ", buf, sizeof(buf), DOECHO, YEA); if (register_activate_email(currentuser.userid, buf)) break; } } if (i == 3) { unlink(file); //% prints("认证失败! 请重填邮箱。\n"); prints("\xc8\xcf\xd6\xa4\xca\xa7\xb0\xdc! \xc7\xeb\xd6\xd8\xcc\xee\xd3\xca\xcf\xe4\xa1\xa3\n"); sethomefile(file, currentuser.userid, ".regextra"); if (dashf(file)) unlink(file); pressanykey(); } else { //% prints("认证成功!\n"); prints("\xc8\xcf\xd6\xa4\xb3\xc9\xb9\xa6!\n"); sethomefile(file, currentuser.userid, ".regextra"); if (dashf(file)) { //% prints("我们将暂时保留您的正常使用权限,如果核对您输入的个人信息有误将停止您的发文权限,\n"); prints("\xce\xd2\xc3\xc7\xbd\xab\xd4\xdd\xca\xb1\xb1\xa3\xc1\xf4\xc4\xfa\xb5\xc4\xd5\xfd\xb3\xa3\xca\xb9\xd3\xc3\xc8\xa8\xcf\xde,\xc8\xe7\xb9\xfb\xba\xcb\xb6\xd4\xc4\xfa\xca\xe4\xc8\xeb\xb5\xc4\xb8\xf6\xc8\xcb\xd0\xc5\xcf\xa2\xd3\xd0\xce\xf3\xbd\xab\xcd\xa3\xd6\xb9\xc4\xfa\xb5\xc4\xb7\xa2\xce\xc4\xc8\xa8\xcf\xde,\n"); //% prints("因此请确保您输入的是个人真实信息.\n"); prints("\xd2\xf2\xb4\xcb\xc7\xeb\xc8\xb7\xb1\xa3\xc4\xfa\xca\xe4\xc8\xeb\xb5\xc4\xca\xc7\xb8\xf6\xc8\xcb\xd5\xe6\xca\xb5\xd0\xc5\xcf\xa2.\n"); } if (!HAS_PERM(PERM_REGISTER)) { //% prints("请继续填写注册单。\n"); prints("\xc7\xeb\xbc\xcc\xd0\xf8\xcc\xee\xd0\xb4\xd7\xa2\xb2\xe1\xb5\xa5\xa1\xa3\n"); } pressanykey(); } }
static int wwwlogin(struct userec *user, const char *ref) { if (!(currentuser.userlevel & PERM_REGISTER)) { char file[HOMELEN]; sethomefile(file, currentuser.userid, "register"); if (dashf(file)) { currentuser.userlevel |= PERM_DEFAULT; save_user_data(¤tuser); } } struct user_info info; memset(&info, 0, sizeof(info)); info.active = 1; info.uid = searchuser(user->userid); info.pid = getpid(); info.mode = WWW | LOGIN; if (HAS_PERM(PERM_LOGINCLOAK) && (currentuser.flags[0] & CLOAK_FLAG)) info.invisible = YEA; info.pager = 0; if (DEFINE(DEF_FRIENDCALL)) info.pager |= FRIEND_PAGER; if (DEFINE(PAGER_FLAG)) { info.pager |= ALL_PAGER; info.pager |= FRIEND_PAGER; } if (DEFINE(DEF_FRIENDMSG)) info.pager |= FRIENDMSG_PAGER; if (DEFINE(DEF_ALLMSG)) { info.pager |= ALLMSG_PAGER; info.pager |= FRIENDMSG_PAGER; } // TODO:... strlcpy(info.from, fromhost, 24); // login start.. #ifdef SPARC *(int*)(info.from + 30) = time(NULL); #else *(int*)(info.from + 32) = time(NULL); #endif info.from[22] = DEFINE(DEF_NOTHIDEIP) ? 'S' : 'H'; info.idle_time = time(NULL); strlcpy(info.username, user->username, sizeof(info.username)); strlcpy(info.userid, user->userid, sizeof(info.userid)); int utmpkey = rand() % 100000000; info.utmpkey = utmpkey; int fd = open("tmp/.UTMP.lock", O_RDWR | O_CREAT, 0600); if (fd < 0) return BBS_EINTNL; if (fb_flock(fd, LOCK_EX) == -1) { close(fd); return BBS_EINTNL; } struct user_info *up = utmpshm->uinfo; int n; for (n = 0; n < MAXACTIVE; n++, up++) { if (!up->active) { *up = info; uidshm->status[up->uid - 1]++; break; } } fb_flock(fd, LOCK_UN); close(fd); if (n >= MAXACTIVE) return BBS_E2MANY; const char *referer = ref; if (*referer == '\0') referer = "sec"; // TODO: these cookies should be merged into one. printf("Content-type: text/html; charset=%s\n" "Set-cookie: utmpnum=%d\nSet-cookie: utmpkey=%d\n" "Set-cookie: utmpuserid=%s\nLocation: %s\n\n", CHARSET, n + 1, utmpkey, currentuser.userid, referer); return 0; }