int mailalertuid(int tuid) { userinfo_t *uentp=NULL; if(tuid>0 && (uentp = (userinfo_t *)search_ulist(tuid)) ) uentp->alerts|=ALERT_NEW_MAIL; return 0; }
static void multi_user_check() { register userinfo_t *ui; register pid_t pid; char genbuf[3]; if(HAS_PERM(PERM_SYSOP)) return; /* don't check sysops */ if(cuser.userlevel) { if(!(ui = (userinfo_t *)search_ulist(cmpuids, usernum))) return; /* user isn't logged in */ pid = ui->pid; if(!pid /*|| (kill(pid, 0) == -1)*/) return; /* stale entry in utmp file */ getdata(b_lines - 1, 0, "您想刪除其他重複的 login (Y/N)嗎?[Y] ", genbuf, 3, LCECHO); if(genbuf[0] != 'n') { if(pid > 0) kill(pid, SIGHUP); log_usies("KICK ", cuser.username); } else { if(count_multi() >= 3) system_abort(); /* Goodbye(); */ } } else { /* allow multiple guest user */ if(count_multi() > 32) { outs("\n抱歉,目前已有太多 guest, 請稍後再試。\n"); pressanykey(); oflush(); exit(1); } } }
static void multi_user_check() { register user_info *ui; register pid_t pid; int cmpuids (); if (HAS_PERM(PERM_SYSOP)) return; /* wildcat:站長不限制 */ if (cuser.userlevel) { if (!(ui = (user_info *) search_ulist(cmpuids, usernum))) return; /* user isn't logged in */ pid = ui->pid; if (!pid || (kill(pid, 0) == -1)) return; /* stale entry in utmp file */ if (getans2(b_lines, 0, "您想刪除其他重複的 login 嗎?", 0, 2, 'y') != 'n') { kill(pid, SIGHUP); log_usies("KICK ", cuser.username); } else { int nums = MULTI_NUMS; if (HAS_PERM(PERM_BM)) nums += 2; if (count_multi() >= nums) system_abort(); } } else { /* guest的話 */ if (count_multi() > 512) { pressanykey("抱歉,目前已有太多 guest, 請稍後再試。"); oflush(); exit(1); } } }
int ParseKMP(char *cmd, REQUEST_REC *r) { char kmp[STRLEN], proto[STRLEN], data[STRLEN], arg1[STRLEN], arg2[STRLEN], arg3[STRLEN], arg4[STRLEN]; int result; *proto = *data = *arg1 = *arg2 = *arg3 = *arg4 = 0x00; sscanf(cmd, "%s\t%s\t%s\t%s\t%s\t%s", kmp, proto, arg1, arg2, arg3, arg4); #if 0 fprintf(fp_out, "[%s]\r\n", cmd); fprintf(fp_out, "arg1=%s, arg2=%s, arg3=%s, arg4=%s\r\n", arg1, arg2, arg3, arg4); fflush(fp_out); #endif if(!strcmp(proto, "USERNEW")) { sprintf(data, "ID=%s&PASSWORD=%s&PASSWORD1=%s&NICKNAME=%s&EMAIL=%s", arg1, arg2, arg2, arg3, arg4); result = NewUser(data, &curuser); if(result != WEB_OK) { if(strstr(WEBBBS_ERROR_MESSAGE, "帳號已存在") != NULL) fprintf(fp_out, "622 使用者帳號已存在\r\n"); else fprintf(fp_out, "721 註冊失敗\r\n"); } else fprintf(fp_out, "800 OK!!\r\n"); } else if(!strcmp(proto, "USERQUERY")) { if (!get_passwd(&curuser, arg1)) { bzero(&curuser, sizeof(USEREC)); fprintf(fp_out, "621 使用者帳號不存在\r\n"); } else { USER_INFO *quinf; char user_status[1024]; if ((quinf = search_ulist(cmp_userid, curuser.userid)) && !(quinf->invisible)) { sprintf(user_status, "線上狀態: %s, 呼喚鈴: %s.", modestring(quinf, 1), (quinf->pager != PAGER_QUIET) ? MSG_ON : MSG_OFF); } else sprintf(user_status, "目前不在線上"); fprintf(fp_out, "800 OK!!\r\n"); fprintf(fp_out, "%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\r\n", curuser.userid, curuser.username, curuser.userlevel, curuser.ident, curuser.numlogins, curuser.numposts, (int)curuser.lastlogin, curuser.lasthost, user_status); } } else if(!strcmp(proto, "USERDATA")) { if(!get_passwd(&curuser, arg1)) bzero(&curuser, sizeof(USEREC)); if(CheckUserPassword(arg1, arg2)!=Correct) fprintf(fp_out, "724 密碼錯誤\r\n"); else { fprintf(fp_out, "800 OK!!\r\n"); fprintf(fp_out, "%d\t%s\t%s\t%d\t%d\t%d\t%s\t%d\t%s\r\n", curuser.uid, curuser.userid, curuser.username, curuser.userlevel, curuser.numlogins, curuser.numposts, curuser.lasthost, curuser.lastctype, curuser.email); } } else if(!strcmp(proto, "USERPLAN")) { if (!get_passwd(&curuser, arg1)) { bzero(&curuser, sizeof(USEREC)); fprintf(fp_out, "621 使用者帳號不存在\r\n"); } else { char userfile[PATHLEN]; sethomefile(userfile, curuser.userid, UFNAME_PLANS); if(isfile(userfile)) { fprintf(fp_out, "800 OK!!\r\n"); ShowArticle(userfile, FALSE, FALSE); } else { fprintf(fp_out, "761 使用者無名片檔\r\n"); } } } else if(!strcmp(proto, "USERLIST")) { int start = 0, end = 0; if(*arg1) start = atoi(arg1); if(*arg2) end = atoi(arg2); #if 0 fprintf(fp_out, "%p %p", post_file, &post_file); fflush(fp_out); #else post_file->list_start = start; post_file->list_end = end; ShowUserList("KMP", post_file); #endif } #if 0 else if(!strcmp(proto, "USERLOGIN")) { result = user_login(&cutmp, &curuser, CTYPE_WEBBBS, arg1, arg2, r->fromhost); if (result == ULOGIN_OK) { memcpy(&uinfo, cutmp, sizeof(USER_INFO)); break; } else if (result == ULOGIN_PASSFAIL) { outs(_msg_formosa_27); continue; } outs(_msg_formosa_44); } #endif return WEB_OK; }
/******************************************************************* * 顯示 <BBS_User_xxxxx> TAG * 目前 UserQuery ,UserData 用的TAG一樣, 靠URLParaType區分 * * in UserQuery mode , curuser is target for query, not original userdata *******************************************************************/ void ShowUser(char *tag, USEREC * curuser) { if (request_rec->URLParaType != UserQuery && PSCorrect != Correct) return; if (!strcasecmp(tag, "ID")) { fputs(curuser->userid, fp_out); } else if (!strcasecmp(tag, "Name")) { char buf[STRLEN]; #if defined(NSYSUBBS1) if (request_rec->URLParaType == UserQuery && curuser->ident != 7) fputs("中山遊客", fp_out); else #endif { xstrncpy(buf, curuser->username, STRLEN); fputs(buf, fp_out); } } else if (!strcasecmp(tag, "Level")) { fprintf(fp_out, "%d", curuser->userlevel); } else if (!strcasecmp(tag, "Login")) { fprintf(fp_out, "%d", curuser->numlogins); } else if (!strcasecmp(tag, "Post")) { fprintf(fp_out, "%d", curuser->numposts); } #ifdef USE_IDENT else if (!strcasecmp(tag, "Ident")) { fputs(curuser->ident == 7 ? MSG_HasIdent : MSG_NotIdent, fp_out); } #endif else if (!strcasecmp(tag, "LastLogin")) { fputs(Ctime(&(curuser->lastlogin)), fp_out); } else if (!strcasecmp(tag, "LastHost")) { fputs(curuser->lasthost, fp_out); } else if (!strcasecmp(tag, "NewMail")) { if (curuser->flags[0] & FORWARD_FLAG) fputs(MSG_MailForwardON, fp_out); else if (!strcmp(curuser->userid, "guest")) fputs(MSG_MailHasRead, fp_out); else { if ((request_rec->URLParaType != UserQuery && PSCorrect != Correct) || !CheckNewmail(curuser->userid, TRUE)) { fputs(MSG_MailHasRead, fp_out); } else { fputs(MSG_MailNotRead, fp_out); } } } else if (!strcasecmp(tag, "Status")) /* print user online status */ { USER_INFO *quinf; if ((quinf = search_ulist(cmp_userid, curuser->userid)) && !(quinf->invisible)) { fprintf(fp_out, "線上狀態: %s, 呼喚鈴: %s.", modestring(quinf, 1), (quinf->pager != PAGER_QUIET) ? MSG_ON : MSG_OFF); } else fprintf(fp_out, "目前不在線上"); } else if (!strcasecmp(tag, "Plan")) { char userfile[PATHLEN]; sethomefile(userfile, curuser->userid, UFNAME_PLANS); if (request_rec->URLParaType == UserData) ShowArticle(userfile, FALSE, FALSE); else ShowArticle(userfile, FALSE, TRUE); } else { if (request_rec->URLParaType == UserQuery) /* bug fixed */ return; if (!strcasecmp(tag, "Email")) { fputs(curuser->email, fp_out); } else if (!strcasecmp(tag, "MailForward")) /* use in UserData only */ { fputs(curuser->flags[0] & FORWARD_FLAG ? "ON" : "OFF", fp_out); } else if (!strcasecmp(tag, "Friend")) { char userfile[PATHLEN]; sethomefile(userfile, curuser->userid, UFNAME_OVERRIDES); ShowArticle(userfile, FALSE, TRUE); } else if (strstr(tag, "Sign")) { FILE *fp; char fname[PATHLEN]; sethomefile(fname, curuser->userid, UFNAME_SIGNATURES); if ((fp = fopen(fname, "r")) != NULL) { int line = 0, num; char buffer[512]; GetPara3(buffer, "NUM", tag, 3, "-1"); num = atoi(buffer); for (line = 0; line < num * MAX_SIG_LINES && fgets(buffer, sizeof(buffer), fp); line++) { if (line < (num - 1) * MAX_SIG_LINES) continue; fprintf(fp_out, "%s", buffer); } fclose(fp); } } } }
int kick_user( struct user_info *userinfo ) { int id, ind; struct user_info uin; struct userec kuinfo; char kickuser[40], buffer[40]; if (uinfo.mode != LUSERS && uinfo.mode != OFFLINE && uinfo.mode != FRIEND) { modify_user_mode(ADMIN); stand_title("踢使用者下站"); move(1, 0); usercomplete("输入使用者帐号: ", kickuser); if (*kickuser == '\0') { clear(); return 0; } if (!(id = getuser(kickuser))) { move(3, 0); prints("无效的用户 ID!"); clrtoeol(); pressreturn(); clear(); return 0; } move(1, 0); clrtoeol(); sprintf(genbuf,"踢掉使用者 : [%s].", kickuser); move(2, 0); if (askyn(genbuf, NA, NA) == NA) { move(2, 0); prints("取消踢使用者..\n"); pressreturn(); clear(); return 0; } search_record(PASSFILE, &kuinfo, sizeof(kuinfo), cmpuids, kickuser); ind = search_ulist(&uin, t_cmpuids, id); } else { uin = *userinfo; strcpy(kickuser, uin.userid); ind = YEA; } if (!ind||!uin.active||(uin.pid && kill(uin.pid, 0)==-1)) { if(uinfo.mode!=LUSERS&&uinfo.mode!=OFFLINE&&uinfo.mode!=FRIEND) { move(3, 0); prints("用户 [%s] 不在线上",kickuser); clrtoeol(); pressreturn(); clear(); } return 0; } kill(uin.pid, SIGHUP); //sprintf(buffer, "kicked %s", kickuser); //report(buffer); if(strcmp(currentuser.userid , kickuser)) { char secu[STRLEN]; sprintf(secu, "将用户[%s]踢下站", kickuser); securityreport(secu); } sprintf(genbuf, "%s (%s)", kuinfo.userid, kuinfo.username); log_usies("KICK ", genbuf); move(2, 0); if(uinfo.mode!=LUSERS&&uinfo.mode!=OFFLINE&&uinfo.mode!=FRIEND) { prints("用户 [%s] 已经被踢下站.\n",kickuser); pressreturn(); clear(); } return 1; }