/*===============================*/
/*== 申請新ip Ptt ==*/
/*===============================*/
#include "bbs.h"
#define DORMNET "dormnet"
#define MAX_IP 4 /* 一間寢室最多有幾個 */
enum
{
CHKREGNO,CHKBLK,CHKADDR
};
enum
{
BYADM,BYID
};
int dorm;
char buf[256];
int getgroup()
{
char string[50];
FILE *fp;
if(fp=fopen("ipreg/chosegroup","r"))
{
while(fgets(buf,127,fp))
{
if(buf[0]!='#')
{
sscanf(buf,"%d %s",&dorm,string);
if(strstr_lower(fromhost,string)) {fclose(fp);return 1;}
}
}
fclose(fp);
}
return 0;
}
char NetAdm[14],NetName[20],isOpen,isAdm;
void
outinfo()
{
clear();
sprintf(buf,"ipreg/dorm%d",dorm);
if(more(buf,YEA)==-1)
{
clear();
outs("\n網管的話:\n\n 大家好...");
pressanykey();
}
}
void
T_ip(char *cip,unsigned long int ip)
{
unsigned char a[4],c;
for (c=0;c<4;c++)
{
a[c]=ip%256;
ip=ip/256;
}
sprintf(cip,"%u.%u.%u.%u",a[3],a[2],a[1],a[0]);
}
unsigned long int
ip_T(char cip[])
{
char c,d=0;
unsigned long int ip=0;
for(c=0;cip[c];c++)
{
if(cip[c]=='.')
{
cip[c]=0;
ip= ip*256 + atoi(cip+d);
cip[c]='.';
d=c+1;
}
}
ip= ip*256 + atoi(cip+d);
return ip;
}
void outipdata()
{
FILE *fp;
unsigned long int ip;
char key[21],cip[21]="",regno[21]="",name[21]=""
,card_no[21]="",dorm_no[21]="",grade[21]="",domain[21]="",email[51]="",k;
clear();
sprintf(buf,"ipreg/ipdata%d",dorm);
if(fp=fopen(buf,"r"))
{
move(1,0);
outs("請輸入[<學號>|<人名>|<寢室號碼>|<卡號>|<電腦名>]\n");
getdata(2, 0, " 任何一個 或 直接[Enter]瀏覽:",key,20, LCECHO);
while(fgets(buf,255,fp))
{
if(buf[0]!='#')
{
if(sscanf(buf,"%lx %s %s %s %s %s %s %s"
,&ip,regno,grade,name,dorm_no,card_no,domain,email))
{
T_ip(cip,ip);
if( strstr(buf,key))
{
clear();
sprintf(buf,"\n\n IP 位址 :%s\n",cip); outs(buf);
sprintf(buf," 學 號 :%s\n",regno); outs(buf);
if(isAdm){ sprintf(buf," 系 級 :%s\n",grade); outs(buf);}
sprintf(buf," 姓 名 :%s\n",name); outs(buf);
sprintf(buf," 寢室號碼:%s\n",dorm_no); outs(buf);
sprintf(buf," 網路卡號:%s\n",card_no); outs(buf);
sprintf(buf," domain :%s\n",domain); outs(buf);
if(isAdm) {sprintf(buf," E-mail :%s\n",email);outs(buf);}
outs(buf+111);
outs("\n\n\n\n Q:離開 或 任意鍵:往下搜尋 \n ");
k=igetch();
if (k == 'q' || k == 'Q') break;
}
}
}
}
fclose(fp);
}
else
{
outs("\n網管的話:\n\n 尚無任何ip資料...");
pressanykey();
}
}
void outipfault()
{
clear();
sprintf(buf,"ipreg/regfault%d",dorm);
if(more(buf,YEA)==-1)
{
clear();
outs("\n網管的話:\n\n 尚無任何申請失敗ip資料...");
pressanykey();
}
}
int getinfo(int type)
{
FILE *fp;
int a;
if(fp=fopen("ipreg/dormdata","r"))
{
while(fgets(buf,127,fp))
{
if(buf[0]!='#')
{
sscanf(buf,"%d %s %s %d",&a,NetAdm,NetName,&isOpen);
if(type==BYID && a==dorm){outinfo(); return 1;}
if(type==BYADM && !strcmp(NetAdm,cuser.userid)){outinfo(); return 1;}
}
}
fclose(fp);
}
return 0;
}
int mail2adm()
{
time_t timenow;
struct tm *gtime;
fileheader mhdr;
char path[256]="home/",save_title[TTLEN];
time(&timenow);
gtime = localtime(&timenow);
sprintf(buf,"/love%d%d",gtime->tm_sec,gtime->tm_min);
strcat(path,cuser.userid);
strcat(path,buf);
getdata(18, 0, "主 題:", save_title, TTLEN, DOECHO);
if (vedit(path, YEA) == -1)
{
unlink(path);
clear();
outs("\n\n 放棄寄給網管.\n");
pressanykey();
return -2;
}
sethomepath(buf, NetAdm);
stampfile(buf, &mhdr);
Rename(path, buf);
strncpy(mhdr.title, save_title, TTLEN);
strcpy(mhdr.owner, cuser.userid);
mhdr.savemode = '\0';
sethomedir(path, NetAdm);
if (append_record(path, &mhdr, sizeof(mhdr)) == -1)
return -1;
hold_mail(buf, NetAdm);
return 1;
}
void
edAdmsay()
{
sprintf(buf,"ipreg/dorm%d",dorm);
vedit(buf,NA);
}
void
ediprange()
{
sprintf(buf,"ipreg/iprange%d",dorm);
vedit(buf,NA);
}
void
edipda()
{
vedit("ipreg/chosegroup",NA);
}
void edipfault()
{
sprintf(buf,"ipreg/regfault%d",dorm);
vedit(buf,NA);
}
void
post2board()
{
brc_initial(DORMNET);
set_board();
do_post();
}
int
re_check(int type,char a[])
{
int b,value;
switch(type)
{
case CHKBLK:
if(a[0]=='\0') {
if(!isAdm) {
outs("想資料不全?重填!");return 1;
}
else
{
a[0]='.';a[1]=0; return 0;
}
}
for(b=0;a[b]!='\0';b++)
if(a[b]==' ') {outs("資料中不要有空白鍵") ;return 1;}
break;
case CHKADDR: /* <MAX_IP */
break;
case CHKREGNO:
break;
}
return 0;
}
static void afield(int line,char *info,char *desc,char *buf1, int len)
{
char prompt[STRLEN];
char genbuf[200];
sprintf(genbuf, "若直接Enter設為:%-30.20s (%s)", buf1, info);
move(line, 2);
outs(genbuf);
sprintf(prompt, "%s:", desc);
do{
if (getdata(line + 1, 2, prompt, genbuf, len, DOECHO))
strcpy(buf1, genbuf);
}while(re_check(CHKBLK,buf1));
move(line, 2);
clrtoeol();
prints("%s:%s", desc, buf1);
}
int chkip(unsigned long int ip)
{
FILE *fr;
char tmp[20];
unsigned long int t;
int a,b,c,d;
sprintf(buf,"ipreg/iprange%d",dorm);
if ((fr = fopen(buf, "r")) == NULL)
{
outs("資料檔iprange開不起來!!請快Ptt站長解決");
pressanykey();
return 0;
}
a=1;
while(fgets(buf,127,fr))
{
if(buf[0]!='#')
{
if(sscanf(buf,"%s %d %d",tmp,&b,&c))
{
t=(unsigned long int)ip_T(tmp)*256;
d=(int) ip - t;
if(d>=b && d<=c && ip >= t ) a=0;
}
}
}
if(a==1) outs("\nIP超出可用範圍!!");
return a;
}
void
edipdata()
{
char regno[10]="",degree[10]="",ip[17]=""
,rname[13]="",addr[5]="",cardnum[19]="",domain[11]="",email[31]="";
char ans[3],ipdata[25];
unsigned long int ipt,tmp;
FILE *fn,*fip;
time_t now;
sprintf(ipdata,"ipreg/ipdata%d",dorm);
while(1)
{
strcpy(rname, cuser.realname);
clear();
prints("\n 請填寫以下的有關IP的資料: ");
do{
afield(4, "輸入\"000\"離開", "IP位址",ip, 16);
if(ip[0]=='0') return;
ipt=ip_T(ip);
{
if(fip=fopen(ipdata,"r"))
{
while(fgets(buf,255,fip))
{
if(buf[0]!='#')
{
sscanf(buf,"%lx",&tmp);
if(ipt==tmp)
{
sscanf(buf,"%lx %s %s %s %s %s %s %s"
,&tmp,regno,degree,rname,addr,cardnum,domain,email);
}
}
}
fclose(fip);
}
}
}while(chkip(ipt));
do{
afield(6, "如.b83504102", "學 號",regno, 10);
}while(re_check(CHKREGNO,regno));
afield(8, "如.資訊三", "系 級",degree, 10);
afield(10, "如.杜奕瑾", "真實姓名", rname, 12);
do{
afield(12, "請全用數字 如.618", "寢室號碼", addr, 4);
}while(re_check(CHKADDR,addr));
afield(14, "如.00:80:c8:36:c4:8e", "網路卡卡號", cardnum, 18);
afield(16, "填電腦名就好 如. ptt","DomainName",domain,10);
afield(18, "如b83504102@cc.ntu.edu.tw"
,"Email地址",email,30);
getdata(20, 0, "是否寫入(Y/N)?[N] ",ans, 3, LCECHO);
if (ans[0] == 'y')
{
if (fn = fopen(ipdata, "a"))
{
now = time(NULL);
fprintf(fn,"%8lx %-10s %-10s %-12s %-4s %-18s %-10s %-30s ",
ipt,regno,degree,rname,addr,cardnum,domain,email);
fprintf(fn,"| 審核人:%-13s 審核通過日期:%-24s",cuser.userid,ctime(&now));
regno[0]=0;degree[0]=0;ip[0]=0;rname[0]=0;
addr[0]=0;cardnum[0]=0;domain[0]=0;email[0]=0;
fclose(fn);
}
}
}
}
int
regip()
{
char regno[10]="",degree[10]="",
rname[13]="",addr[5]="",cardnum[19]="",domain[11]="",email[31]="";
char ans[3];
FILE *fn;
time_t now;
if(!isOpen)
{
outs("對不起! 現在網管暫停線上申請Ip功\能");
pressanykey();
return;
}
while(1)
{
strcpy(rname, cuser.realname);
clear();
prints("\n %s(%s) 您好,請據實填寫以下的有關申請IP的資料:",
cuser.userid, cuser.username);
do{
afield(6, "如.b83504102", "學 號",regno, 10);
}while(re_check(CHKREGNO,regno));
afield(8, "如.資訊三", "系 級",degree, 10);
afield(10, "如.杜奕瑾", "真實姓名", rname, 12);
do{
afield(12, "請全用數字 如.618", "寢室號碼", addr, 4);
}while(re_check(CHKADDR,addr));
afield(14, "如.00:80:c8:36:c4:8e", "網路卡卡號", cardnum, 18);
afield(16, "填電腦名就好 如. ptt","DomainName",domain,10);
afield(18, "沒有就寫'null'"
,"Email地址",email,30);
getdata(20, 0, "以上資料是否正確(Y/N)?(Q)取消申請 [N] ",ans, 3, LCECHO);
if (ans[0] == 'q')
return 0;
if (ans[0] == 'y')
break;
}
sprintf(buf,"ipreg/register%d",dorm);
if (fn = fopen(buf, "a"))
{
now = time(NULL);
fprintf(fn, " 學 號 : %s\n", regno);
fprintf(fn, " 系 級 : %s\n", degree);
fprintf(fn, " 姓 名 : %s\n", rname);
fprintf(fn, "寢室號碼: %s\n", addr);
fprintf(fn, "網路卡號: %s\n", cardnum);
fprintf(fn, "domainN : %s\n", domain);
fprintf(fn, "Email ad: %s\n", email);
fprintf(fn, "ID /time: %s /%s\n", cuser.userid,ctime(&now));
fprintf(fn, "----\n");
fclose(fn);
}
}
char
isused(unsigned long int ip)
{
FILE *fp;
unsigned long int temp;
sprintf(buf,"ipreg/ipdata%d",dorm);
if(!(fp=fopen(buf,"r")))
{
return 0;
}
else
{
while(fgets(buf,127,fp))
{
if(buf[0]!='#')
{
sscanf(buf,"%lx",&temp);
if(temp==ip) {fclose(fp);return 1;}
}
}
fclose(fp);
return 0;
}
}
static int
check_reg()
{
FILE *fn,*fo,*fok,*fs,*fr;
int state,line,out,oe;
unsigned long int upperbound=1,lowerbound=0;
char ans[4];
char genbuf[9][50];
time_t now;
now = time(NULL);
sprintf(buf,"ipreg/register%d",dorm);
if ((fn = fopen(buf, "r")) == NULL)
{
outs("目前並無新申請資料");
pressanykey();
return ;
}
sprintf(buf,"ipreg/register%d.o",dorm);
if(dashd(buf))
{
outs("有別人正在審核!!");
pressanykey();
return ;
}
if(!(fo=fopen(buf,"w")))
{
outs("暫存檔開ipdata.o不起來!!請快Ptt站長解決");
pressanykey();
return ;
}
sprintf(buf,"ipreg/ipdata%d",dorm);
if(!(fok=fopen(buf,"a")))
{
outs("資料檔ipdata開不起來!!請快Ptt站長解決");
pressanykey();
return ;
}
sprintf(buf,"ipreg/regfault%d",dorm);
if ((fs = fopen(buf, "w")) == NULL)
{
outs("資料檔regfault開不起來!!請快Ptt站長解決");
pressanykey();
return ;
}
sprintf(buf,"ipreg/iprange%d",dorm);
if ((fr = fopen(buf, "r")) == NULL)
{
outs("資料檔iprange開不起來!!請快Ptt站長解決");
pressanykey();
return ;
}
line=0;state=0;out=0;oe=0;
clear();
stand_title("審核註冊新ip資料");
while (fgets(genbuf[line], STRLEN, fn))
{
if (!strncmp(genbuf[line], " 學 號 :", 9)){
strcpy(genbuf[0],genbuf[line]);state=1;line=0;}
outs(genbuf[line]);
if (!strncmp(genbuf[line], "---", 3))
{ state=0;
if(!out)
{
getdata(20, 0,
"請選擇(1)接受(2)使用者重覆(3)同寢過多(4)其它原因[S]skip(Q)停止審核):",buf, 3,
LCECHO);
clear();
stand_title("審核註冊新ip資料");
}
else
{
buf[0]='s';
}
switch(buf[0])
{
case '1':
{
char tmp[40];
unsigned long int ip;
do
{
upperbound++;
if (upperbound>lowerbound)
{
while(fgets(buf,127,fr))
{
if(buf[0]!='#')
{
if(sscanf(buf,"%s %d %d",tmp,
&upperbound,&lowerbound))
{
upperbound=(unsigned long int)ip_T(tmp)*256+upperbound;
lowerbound=(unsigned long int)ip_T(tmp)*256+lowerbound;
break;
}
}
}
}
}while(isused(upperbound));
if (upperbound>lowerbound) /* ip不夠用了 */
{
oe++;
for(line=0;line<=7;line++)
fprintf(fo,"%s",genbuf[line]);
fprintf(fo,"\n-------\n");
out=1;
clear();
outs(" IP不夠分配了!! [anykey 離開]\n "
" 方法 a.向學校要求新ip範圍\n"
" b.做IP確認工作\n"
" c.砍掉不必要的IP\n");
pressanykey();
clear();
break;
}
for(line=0;line<=7;line++)
{
genbuf[line][strlen(genbuf[line])-1]=0;
}
fprintf(fok,"%8lx %-10s %-10s %-12s %-4s %-18s %-10s %-30s ",
upperbound,genbuf[0]+10,genbuf[1]+10,genbuf[2]+10,genbuf[3]+10,
genbuf[4]+10,genbuf[5]+10,genbuf[6]+10,genbuf[7]+10);
fprintf(fok,"| 審核人:%-13s 審核通過日期:%-24s"
,cuser.userid,ctime(&now));
break;
}
case '2':
strcpy(buf,"同一人重覆申請!! ");
case '3':
if(buf[0]=='3') strcpy(buf,"同一寢室申請太多個!! ");
case '4':
if(buf[0]=='4') getdata(20, 0,"輸入不接受理由:",buf, 50, DOECHO);
fprintf(fs,"\n");
fprintf(fs,"不通過原因:%s\n",buf);
for(line=0;line<=7;line++) fprintf(fs,"%s",genbuf[line]);
fprintf(fs,"\n審核日期:%s 審核人:%s \n\n------\n"
,ctime(&now),cuser.userid);
break;
case 'q':
out=1;
default:
oe++;
for(line=0;line<=7;line++) fprintf(fo,"%s",genbuf[line]);
fprintf(fo,"\n-------\n");
break;
}
}
if(line <8) line++;
}
fclose(fn);
sprintf(buf,"ipreg/register%d",dorm);
unlink(buf);
fclose(fs);
fclose(fo);
sprintf(buf,"ipreg/register%d.o",dorm);
sprintf(genbuf[0],"ipreg/register%d",dorm);
if(!oe)
{
unlink(buf);
}
else
{
Rename(buf,genbuf[0]);
}
fclose(fok);
outs("申請單審核完畢");
pressanykey();
return;
}
void
changestate()
{
FILE *fp,*fo;
int a,t;
char c[80]="",d[80]="";
if(isOpen) isOpen=0;
else isOpen =1;
if((fp=fopen("ipreg/dormdata","r")) && (fo=fopen("ipreg/dormdata.t","w")))
{
while(fgets(buf,127,fp))
{
if(buf[0]!='#')
{
sscanf(buf,"%d %s %s %d",&a,c,d,&t);
if(a==dorm){sprintf(buf," %-10d %-13s %-40s %-5d"
,a,c,d,isOpen);}
}
fprintf(fo,"%s",buf);
}
fclose(fp);
fclose(fo);
unlink("ipreg/dormdata");
Rename("ipreg/dormdata.t","ipreg/dormdata");
}
}
/* main */
int
x_ipreg()
{
isAdm=0;
setutmpmode(IPREG);
clear();
if(!getgroup())
{
if(!getinfo(BYADM))
{
FILE *fp;
outs(" \n!![注意] 請從加入線上申請ip的網路連過來!!\n");
outs(" 目前加入線上申請ip的網域\n---------------------------\n");
outs("#[網域編號] [網管 ID ] [網域名稱] "
"[現在開放申請ip?]\n");
if(fp=fopen("ipreg/dormdata","r"))
{
while(fgets(buf,127,fp))
{
if(buf[0]!='#')
{
outs(buf);
}
}
}
fclose(fp);
pressanykey();
return 0;
}
else
{
isAdm==1;
}
}
else
{
/*temp use */
if(!strcmp("Ptt",cuser.userid))
{
isAdm=1;scanf("%d",&dorm);
}
if(!getinfo(BYID))
{outs("讀取此網域資料出問題,請速連絡站長");
pressanykey();
return 0;
}
if(!strcmp(NetAdm,cuser.userid))
{
isAdm=1;
setutmpmode(NAdm);
}
}
do{
clear();
sprintf(buf,"網管[%s] 你[%s] 家[%s] 網域為[%s] 開放申請[%d] 網域ID[%d]\n "
,NetAdm,cuser.userid,fromhost,NetName,isOpen,dorm);
outs(buf);
if(!isAdm)
{
sprintf(buf,"您好:您現在從 %s 網域上來 網管 %s 在此為您服務.",NetName,NetAdm);
}
else
{
sprintf(buf,"嗨嗨! %s %s網管大人,歹勢啦, 來辦公呀...",NetName,NetAdm);
}
outs(buf);
outs("\n請選擇功\能:\n");
outs("\n (0)看網管的話");
outs("\n (1)填寫IP申請單");
outs("\n (2)查詢已申請完成 ip 資料表");
outs("\n (3)列出/搜尋申請失敗 ip 資料表");
outs("\n (4)mail給網管");
outs("\n (5)Post到椰林宿網版");
if(isAdm)
{
outs("\n\n------網管專權區-------");
outs("\n (6)審核新申請的ip");
outs("\n (7)編輯網管的話");
outs("\n (8)新增/修改 已申請完成的ip資料檔");
outs("\n (9)編輯申請失敗ip資料檔");
outs("\n (A)切換 開放/停止 申請ip");
outs("\n (B)編籍可申請的ip範圍");
outs("\n (C)各網管ip負責判定");
}
outs("\n 直接按Enter離開.");
getdata(20, 0, " 請選擇:",buf, 4, LCECHO);
switch(buf[0])
{
case '0':
outinfo();
break;
case '1':
regip();
break;
case '2':
outipdata();
break;
case '3':
outipfault();
break;
case '4':
mail2adm();
break;
case '5':
post2board();
break;
case '6':
if(isAdm) check_reg();
break;
case '7':
if(isAdm) edAdmsay();
break;
case '8':
if(isAdm) edipdata();
break;
case '9':
if(isAdm) edipfault();
break;
case 'a':
if(isAdm) changestate();
break;
case 'b':
if(isAdm) ediprange();
break;
case 'c':
if(isAdm) edipda();
break;
}
}while(buf[0]!=0);
}