目的是不用站长手工确认新注册帐号, 改由计算机及时自动确认.只对www方式注册的有效
.
可能对某些人有用.
十分感谢ytht源代码, 可惜我没有糊涂的注册帐号.
用以下代码代替/nju09/bbsdoreg.c, 备份原文件以方便随时改回来:)
//////////////////////////////////////////////////////////////////
#include "bbslib.h"
#if 0
int
badymd(int y, int m, int d)
{
int max[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
max[2] = 29;
if (y < 10 || y > 100 || m < 1 || m > 12)
return 1;
if (d < 0 || d > max[m])
return 1;
return 0;
}
#endif
const static char *field[] =
{ "usernum", "userid", "realname", "dept", "addr", "phone", "assoc",
NULL
};
int
bbsdoreg_main()
{
FILE *fout;
char buf2[256];
struct userec uinfo;
char fdata[7][STRLEN];
int i,unum;
FILE *fp;
struct userec x;
char buf[256], filename[80], pass1[80], pass2[80], dept[80], phone[80],
assoc[80], salt[3], words[1024], *ub = FIRST_PAGE;
int lockfd;
html_header(1);
printf("<body>");
bzero(&x, sizeof (x));
// xz=atoi(getparm("xz"));
strsncpy(x.userid, getparm("userid"), 13);
strsncpy(pass1, getparm("pass1"), 13);
strsncpy(pass2, getparm("pass2"), 13);
strsncpy(x.username, getparm("username"), 32);
strsncpy(x.realname, getparm("realname"), 32);
strsncpy(dept, getparm("dept"), 60);
strsncpy(x.address, getparm("address"), 60);
strsncpy(x.email, getparm("email"), 60);
strsncpy(phone, getparm("phone"), 60);
strsncpy(assoc, getparm("assoc"), 60);
strsncpy(words, getparm("words"), 1000);
// x.gender='M';
// if(atoi(getparm("gender"))) x.gender='F';
// x.birthyear=atoi(getparm("year"))-1900;
// x.birthmonth=atoi(getparm("month"));
// x.birthday=atoi(getparm("day"));
if (!goodgbid(x.userid))
http_fatal("帐号只能由英文字母和标准汉字组成");
if (strlen(x.userid) < 2)
http_fatal("帐号长度太短(2-12字符)");
if (strlen(pass1) < 4)
http_fatal("密码太短(至少4字符)");
if (strcmp(pass1, pass2))
http_fatal("两次输入的密码不一致, 请确认密码");
if (strlen(x.username) < 2)
http_fatal("请输入昵称(昵称长度至少2个字符)");
if (strlen(x.realname) < 4)
http_fatal("请输入真实姓名(请用中文, 至少2个字)");
// if(strlen(dept)<6) http_fatal("工作单位的名称长度至少要6个字符(或3个汉
字)");
if (strlen(x.address) < 6)
http_fatal("通讯地址长度至少要6个字符(或3个汉字)");
if (badstr(x.passwd) || badstr(x.username) || badstr(x.realname))
http_fatal("您的注册单中含有非法字符");
if (badstr(x.address) || badstr(x.email))
http_fatal("您的注册单中含有非法字符");
// if(badymd(x.birthyear, x.birthmonth, x.birthday)) http_fatal("请输入您
的出生年月");
if (is_bad_id(x.userid))
http_fatal("不雅帐号或禁止注册的id, 请重新选择");
if (getuser(x.userid))
http_fatal("此帐号已经有人使用,请重新选择。");
// sprintf(salt, "%c%c", 65+rand()*26, 65+rand()*26);
//add by lepton
getsalt(salt);
strsncpy(x.passwd, crypt1(pass1, salt), 14);
strcpy(x.lasthost, fromhost);
x.userlevel = PERM_BASIC;
x.firstlogin = now_t;
x.lastlogin = now_t;
x.userdefine = -1;
x.flags[0] = CURSOR_FLAG | PAGER_FLAG;
// if(xz==1) currentuser.userdefine ^= DEF_COLOREDSEX;
// if(xz==2) currentuser.userdefine ^= DEF_S_HOROSCOPE;
adduser(&x);
/*
lockfd = openlockfile(".lock_new_register", O_RDONLY, LOCK_EX);
fp = fopen("new_register", "a");
if (fp) {
fprintf(fp, "usernum: %d, %s\n", getusernum(x.userid) + 1,
Ctime(now_t));
fprintf(fp, "userid: %s\n", x.userid);
fprintf(fp, "realname: %s\n", x.realname);
fprintf(fp, "dept: %s\n", dept);
fprintf(fp, "addr: %s\n", x.address);
fprintf(fp, "phone: %s\n", phone);
fprintf(fp, "assoc: %s\n", assoc);
fprintf(fp, "----\n");
fclose(fp);
}
close(lockfd);
*/
sprintf(filename, "home/%c/%s", mytoupper(x.userid[0]), x.userid);
mkdir(filename, 0755);
sprintf(fdata[0], "%d", getusernum(x.userid) + 1);
sprintf(fdata[1], "%s", x.userid);
sprintf(fdata[2], "%s", x.realname);
sprintf(fdata[3], "%s", dept);
sprintf(fdata[4], "%s", x.address);
sprintf(fdata[5], "%s", phone);
sprintf(fdata[6], "%s", assoc);
if ((unum = getusernum(fdata[1]) + 1) <= 0) {
bzero(fdata, sizeof (fdata));
return 1;
}
if (atoi(fdata[0]) != unum) {
memset(fdata, 0, sizeof (fdata));
return 1;
}
uinfo = *getuser(fdata[1]);
if (uinfo.userlevel & PERM_LOGINOK)
return 1;
i = strlen(fdata[5]);
if (i + strlen(fdata[3]) > 60) {
if (i > 40)
fdata[5][i = 40] = '\0';
fdata[3][60 - i] = '\0';
}
strsncpy(uinfo.realname, fdata[2],
sizeof (uinfo.realname));
strsncpy(uinfo.address, fdata[4],
sizeof (uinfo.address));
sprintf(buf, "%s$%s@%s", fdata[3], fdata[5],
currentuser.userid);
strsncpy(uinfo.realmail, buf, sizeof (uinfo.realmail));
uinfo.userlevel |= PERM_DEFAULT; // by ylsdd
save_user_data(&uinfo);
sethomefile(buf, uinfo.userid, "sucessreg");
f_write(buf, "\n");
sethomefile(buf, uinfo.userid, "register");
if (file_exist(buf)) {
sethomefile(buf2, uinfo.userid, "register.old");
rename(buf, buf2);
}
if ((fout = fopen(buf, "w")) != NULL) {
for (i = 0; field[i] != NULL; i++)
fprintf(fout, "%s: %s\n", field[i],
fdata[i]);
fprintf(fout, "Date: %s\n", Ctime(time(NULL)));
fprintf(fout, "Approved: %s\n",
currentuser.userid);
fclose(fout);
}
mail_file("etc/s_fill", uinfo.userid,
"恭禧您通过身份验证", currentuser.userid);
mail_file("etc/s_fill2", uinfo.userid,
"欢迎加入" MY_BBS_NAME "大家庭",
currentuser.userid);
sethomefile(buf, uinfo.userid, "mailcheck");
unlink(buf);
sprintf(buf, "让 %s 通过身分确认.", uinfo.userid);
securityreport(buf, buf);
bzero(fdata, sizeof (fdata));
printf("<center><table><td><td><pre>\n");
printf("亲爱的新使用者,您好!\n\n");
printf("欢迎光临 本站, 您的新帐号已经成功被登记了。\n");
printf("您目前拥有本站基本的权限, 包括阅读文章、环顾四方、接收私人\n");
printf("信件、接收他人的消息、进入聊天室等等。当您通过本站的身份确\n");
printf("认手续之后,您还会获得更多的权限。目前您的注册单已经被提交\n");
printf("等待审阅。一般情况24小时以内就会有答复,请耐心等待。同时请\n");
printf("留意您的站内信箱。\n");
printf
("如果您有任何疑问,可以去sysop(站长的工作室)版发文求助。\n\n</pre></t
able>");
printf("<hr><br>您的基本资料如下:<br>\n");
printf("<table border=1 width=400>");
printf("<tr><td>帐号位置: <td>%d\n", getusernum(x.userid));
printf("<tr><td>使用者代号: <td>%s (%s)\n", x.userid, x.username);
printf("<tr><td>姓 名: <td>%s<br>\n", x.realname);
printf("<tr><td>昵 称: <td>%s<br>\n", x.username);
printf("<tr><td>上站位置: <td>%s<br>\n", x.lasthost);
printf("<tr><td>电子邮件: <td>%s<br></table><br>\n", x.email);
printf
("<center><form><input type=button onclick='window.close()' value=关闭
本窗口></form></center>\n");
newcomer(&x, words);
// sprintf(buf, "%s %-12s %d\n", Ctime(now_t)+4, x.userid, getusernum(x.u
serid));
// f_append("wwwreg.log", buf);
sprintf(buf, "%s newaccount %d %s www", x.userid, getusernum(x.userid),
fromhost);
newtrace(buf);
wwwstylenum = 1;
ub = wwwlogin(&x);
sprintf(buf, "%s enter %s www", x.userid, fromhost);
newtrace(buf);
printf("<script>opener.top.location.href=\"%s\";</script>", ub);
return 0;
}
int
badstr(unsigned char *s)
{
int i;
for (i = 0; s[i]; i++)
if (s[i] != 9 && (s[i] < 32 || s[i] == 255))
return 1;
return 0;
}
void
newcomer(struct userec *x, char *words)
{
FILE *fp;
char filename[80];
sprintf(filename, "tmpfast/%d.tmp", thispid);
fp = fopen(filename, "w");
fprintf(fp, "大家好, \n\n");
fprintf(fp, "我是 %s(%s), 来自 %s\n", x->userid, x->username, fromhost);
fprintf(fp, "今天初来此地报到, 请大家多多指教.\n\n");
fprintf(fp, "自我介绍:\n\n");
fprintf(fp, "%s", words);
fclose(fp);
post_article("newcomers", "WWW新手上路", filename, x->userid,
x->username, fromhost, -1, 0, 0, x->userid);
unlink(filename);
}
void
adduser(struct userec *x)
{
int i;
FILE *fp;
fp = fopen(".PASSWDS", "r+");
flock(fileno(fp), LOCK_EX);
for (i = 0; i < MAXUSERS; i++) {
if (shm_ucache->userid[i][0] == 0) {
if (i + 1 > shm_ucache->number)
shm_ucache->number = i + 1;
strncpy(shm_ucache->userid[i], x->userid, 13);
save_user_data(x);
break;
}
}
flock(fileno(fp), LOCK_UN);
fclose(fp);
utime(FLUSH, NULL);
}
--
FROM 160.39.33.71