精華區beta SetupBBS 關於我們 聯絡資訊
/*===============================*/ /*== 申請新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); }