char * wwwlogin(struct userec *user, int ipmask) { FILE *fp, *fp1; int n, dolog = 0, st, clubnum, uid, i, nsearch; struct user_info *u; char ULIST[STRLEN]; char genbuf[256], *urlbase, fname[80]; uid = getusernum(user->userid) + 1; if ((urlbase = check_multi(user->userid, uid))) return urlbase; if (strcasecmp(user->userid, "guest") && count_uindex(uid) >= 3) http_fatal("您已经登录了三个帐号,不能再登录了"); // 如果要限制WWW登录窗口数 就打开这个注释. lepton gethostname(genbuf, 256); sprintf(ULIST, MY_BBS_HOME "/%s.%s", ULIST_BASE, genbuf); fp = fopen(ULIST, "a"); flock(fileno(fp), LOCK_EX); nsearch = NSEARCH; //if (strcasecmp(user->userid, "guest")) // nsearch = MAXACTIVE / 4; for (i = 0, n = iphash(fromhost) * (MAXACTIVE / NHASH); i < nsearch; i++, n++) { if (n >= MAXACTIVE) n = 0; u = &(shm_utmp->uinfo[n]); if (u->active && u->pid == 1 && ((now_t - u->lasttime) > 20 * 60 || u->wwwinfo.iskicked)) { st = u->lasttime - u->wwwinfo.login_start_time; if (st > 86400) { errlog("Strange long stay time,%d!, drop %s", st, u->userid); st = 86400; } sprintf(genbuf, "%s drop %d www", u->userid, st); newtrace(genbuf); remove_uindex(u->uid, n + 1); bzero(u, sizeof (struct user_info)); } if (!dolog && u->active == 0) { u_info = u; bzero(u, sizeof (struct user_info)); u->active = 1; u->uid = uid; u->pid = 1; //u->pid = thispid; //modify by mintbaggio@BMY for kill www user u->mode = LOGIN; if (strcasecmp(user->userid, "guest")) u_info->unreadmsg = get_unreadmsg(user->userid); else u_info->unreadmsg = 0; u->userlevel = user->userlevel; u->lasttime = now_t; u->curboard = 0; if (user_perm(user, PERM_LOGINCLOAK) && (user->flags[0] & CLOAK_FLAG)) u->invisible = YEA; u->pager = 0; if (user->userdefine & DEF_FRIENDCALL) u->pager |= FRIEND_PAGER; if (user->flags[0] & PAGER_FLAG) { u->pager |= ALL_PAGER; u->pager |= FRIEND_PAGER; } if (user->userdefine & DEF_FRIENDMSG) u->pager |= FRIENDMSG_PAGER; if (user->userdefine & DEF_ALLMSG) { u->pager |= ALLMSG_PAGER; u->pager |= FRIENDMSG_PAGER; } strsncpy(u->from, fromhost, 24); strsncpy(u->username, user->username, NAMELEN); strsncpy(u->userid, user->userid, IDLEN + 1); getrandomstr(u->sessionid); if (strcasecmp(user->userid, "guest")) initfriends(u); else memset(u->friend, 0, sizeof (u->friend)); urlbase = makeurlbase(n); w_info = &(u_info->wwwinfo); w_info->login_start_time = now_t; w_info->ipmask = ipmask; if (strcasecmp(user->userid, "guest")) { sethomefile(fname, user->userid, "clubrights"); if ((fp1 = fopen(fname, "r")) == NULL) { memset(u_info->clubrights, 0, 4 * sizeof (int)); } else { while (fgets(genbuf, STRLEN, fp1) != NULL) { clubnum = atoi(genbuf); u_info->clubrights[clubnum / 32] |= (1 << clubnum % 32); } fclose(fp1); } set_my_cookie(); } else { memset(u_info->clubrights, 0, 4 * sizeof (int)); w_info->t_lines = 20; w_info->att_mode = 0; w_info->doc_mode = 1; } dolog = 1; add_uindex(u->uid, n + 1); } }
char * wwwlogin(struct userec *user, int ipmask) { FILE *fp1; int fd; int n, uid; struct user_info u; char *urlbase, fname[80]; char buf[20]; uid = getuser(user->userid, NULL); fd = open(MY_BBS_HOME "/" ULIST_BASE "." MY_BBS_DOMAIN, O_WRONLY); flock(fd, LOCK_EX); if ((urlbase = check_multi(user->userid, uid))) { flock(fd, LOCK_UN); close(fd); return urlbase; } if (strcasecmp(user->userid, "guest") && count_uindex(uid) >= 3) { flock(fd, LOCK_UN); close(fd); http_fatal("您已经登录了三个帐号,不能再登录了"); } bzero(&u, sizeof (struct user_info)); u.active = 1; u.uid = uid; u.pid = 1; u.mode = LOGIN; u.userlevel = user->userlevel; u.lasttime = now_t; u.curboard = 0; if (user_perm(user, PERM_LOGINCLOAK) && (user->flags[0] & CLOAK_FLAG)) u.invisible = YEA; u.pager = 0; if (user->userdefine & DEF_FRIENDCALL) u.pager |= FRIEND_PAGER; if (user->flags[0] & PAGER_FLAG) { u.pager |= ALL_PAGER; u.pager |= FRIEND_PAGER; } if (user->userdefine & DEF_FRIENDMSG) u.pager |= FRIENDMSG_PAGER; if (user->userdefine & DEF_ALLMSG) { u.pager |= ALLMSG_PAGER; u.pager |= FRIENDMSG_PAGER; } strsncpy(u.from, fromhost, sizeof (u.from)); u.fromIP = from_addr.s_addr; strsncpy(u.username, user->username, NAMELEN); strsncpy(u.userid, user->userid, IDLEN + 1); getrandomstr(u.sessionid); n = utmp_login(&u); if (n > MAXACTIVERUN || n <= 0) { flock(fd, LOCK_UN); close(fd); http_fatal ("抱歉,目前在线用户数已达上限%d,无法登录。请稍后再来。", MAXACTIVERUN); } flock(fd, LOCK_UN); close(fd); n--; urlbase = makeurlbase(n, uid); u_info = &(shm_utmp->uinfo[n]); w_info = &(u_info->wwwinfo); w_info->login_start_time = now_t; w_info->ipmask = ipmask; if (strcasecmp(user->userid, "guest")) { u_info->unreadmsg = get_unreadcount(user->userid); initfriends(u_info); sethomefile(fname, user->userid, "clubrights"); if ((fp1 = fopen(fname, "r")) == NULL) { memset(u_info->clubrights, 0, CLUB_SIZE * sizeof (int)); } else { fread(&(u_info->clubrights), sizeof (int), CLUB_SIZE, fp1); fclose(fp1); } if (readuservalue(user->userid, "signature", buf, sizeof (buf)) >= 0) u_info->signature = atoi(buf); w_info->edit_mode = 1; set_my_cookie(); } else { u_info->unreadmsg = 0; memset(u_info->friend, 0, sizeof (u.friend)); memset(u_info->clubrights, 0, CLUB_SIZE * sizeof (int)); w_info->t_lines = 20; w_info->att_mode = 0; w_info->doc_mode = 1; } if ((user->userlevel & PERM_BOARDS)) setbmstatus(user, 1); return urlbase; }