#include #include #include #include #include #include #include #include #include #include #include #include //#define LOCK_EX 2 /* exclusive lock */ //#define LOCK_UN 8 char tpl[15000]; char xchat[15000]; char tchat[15000]; char mothersucker[15000]; char envstring[8192]; // Надеюсь, этого хватит. char *keys[255], *values[255]; int totalkeys=0; struct dirent *namelist; struct utimbuf timbuf; struct timeb tp; struct stat st; int n; char* xz; char* xy; char* xx; char* temp1; char* temp2; char* chatblock; char* nickchange; char* joinblock; char* quitblock; char* action; char* s; char name[127]; char namex[127]; char namez[127]; char idname[127]; FILE *zlo, *chat; DIR *dirr; int i=0, fuckinlog; char* fetch(char* src,char* lb,char* rb) { register char *s,*e,*p; int len; s=strstr(src,lb); p=NULL; if( s ) { s+=strlen(lb); e=strstr(s,rb); if( e ) { len=e-s; p=(char*)calloc(len+1,sizeof(char)); memcpy(p,s,len); } } return p; } char* replace(char* where,char* lb,char* rb,char* what) { register char *s,*e,*p,*ss; int len,nlen; s=strstr(where,lb); p=NULL; if( s ) { ss=s; s+=strlen(lb); e=strstr(s,rb); if( e ) { len=e-s; nlen=strlen(where)-len+strlen(what)+1; p=(char*)calloc(nlen,sizeof(char)); if(!p) return NULL; memcpy(p,where,ss-where); memcpy(p+(ss-where),what,strlen(what)); memcpy(p+(ss-where)+strlen(what),e+strlen(rb),where+strlen(where)-e-strlen(rb)); } } return p; } int parse_env() { char *envptr, *fromp; int newkey=0, lastkeys=0; totalkeys=0; envptr = getenv("QUERY_STRING"); if( envptr != NULL ) { if( strlen(envptr) > 8190 ) { envptr[8190] = 0; } sprintf(envstring, "&%s", envptr); fromp = envstring; while( *fromp!=0 ) { if( newkey == 1 ) { newkey=0; lastkeys=totalkeys; keys[totalkeys++]=fromp; } if( newkey == 2 ) { newkey=0; values[lastkeys]=fromp; } if( *fromp == '&' ) { newkey=1; *fromp=0; } if( *fromp == '=' ) { newkey=2; *fromp=0; } fromp++; } } } char *get_value(char *name) { char *fromp, *top; char searchname[256]; // Не делаю тут защиты. Кому нужно более длинное имя ключа?? int i; int packed; unsigned char pack1, pack2; for( i=0; i10?pack1-7:pack1)*16 + (pack2>10?pack2-7:pack2); if(*top=='<') { strcpy(top, "<"); top+=4; } else { top++;} fromp+=2; } else if( *fromp == '+' ) { // Пробел *(top++)=' '; } else // Обычный символ { *(top++) = *fromp; } fromp++; } *top=0; return mothersucker; } } return NULL; } int show_text() { int temp; if (get_value("id")!=NULL) strcpy(idname,get_value("id")); else strcpy(idname,"none"); // env("QUERY_STRING")); if (!(zlo=fopen("/bhome/part2/01/vh01002/vcgi/chat/tpl/chat_insidex.html","r"))) { printf("Error"); return(-1); } fread(tpl,15000,1,zlo); fclose(zlo); if (!(chat=fopen("/bhome/part2/01/vh01002/vcgi/chat/chats/chat.football","r"))) { printf("Error"); return(-1); } fseek(chat,-3000,SEEK_END); xchat[fread(&xchat,1,15000,chat)]=0; fclose(chat); //printf("%s",xchat); xz=fetch(tpl,"::header","header::"); xx=replace(xz,"::i","d::",idname); printf("%s",xx); free(xx);free(xz); chatblock=fetch(tpl,"::chatblock","chatblock::"); nickchange=fetch(tpl,"::nickchangeblock","nickchangeblock::"); joinblock=fetch(tpl,"::joinedblock","joinedblock::"); quitblock=fetch(tpl,"::quitblock","quitblock::"); action=fetch(tpl,"::actionblock","actionblock::"); s=strstr(xchat,"::"); i=(int)((long)(s)-(long)(&xchat)); //printf("%d\n",i); //return(0); //i=0; while (xchat[i++]!=0) { if ((xchat[i]=='\n')||(i==1)) { i++; if (xchat[i]==':') { xz=fetch(&(xchat[i]),"::",":::"); // printf("%s",xz); if (strcmp(xz,"quit")==0) { xx=fetch(&(xchat[i]),":::",":::"); temp1=replace(quitblock,"::quitn","ick::",xx); temp2=replace(temp1,"::quitre","ason::","ping timeout"); //printf("%s",temp2); free(temp2);free(temp1);free(xx); } if (strcmp(xz,"joined")==0) { xx=fetch(&(xchat[i]),":::","\n"); temp1=replace( joinblock,"::joinedn","ick::",xx); //printf("%s",temp1); free(temp1);free(xx); } // printf("\n"); free(xz); } else { xz=fetch(&(xchat[i]),"",":::"); xx=fetch(&(xchat[i]),":::","\n"); if (xz!=0) { temp1=replace(chatblock,"::chatn","ame::",xz); temp2=replace(temp1,"::chatt","ext::",xx); printf("%s",temp2); free(temp2);free(temp1); } free(xx); free(xz); } } // printf("%c",xchat[i]); } xz=fetch(tpl,"::footer","footer::"); printf("%s",xz); free(xz); free(chatblock); free(nickchange); free(joinblock); free(quitblock); free(action); n=0; dirr = opendir("/bhome/part2/01/vh01002/vcgi/chat/users"); //n = readdir(dirr, &namelist, 100); //printf("%s\n\n",&idname); //n = scandir("/usr/local/www/cgi-bin/www.gazeta.ru/chat/users", &namelist, 0, 0); //if (n > 0) while((namelist=readdir(dirr))!=NULL) { s=strrchr(namelist->d_name,'.')+1; if (strcmp(s,"")!=0) { xz=fetch(namelist->d_name,".","."); if (strcmp(idname,xz)==0) { sprintf(name,"/bhome/part2/01/vh01002/vcgi/chat/users/user.%s.%s",xz,s); // printf("%s\n",name); // ftime(&tp); // stat(name,&st); // printf("%d\n",st.st_mtime); timbuf.actime=time(NULL);//tp.time; timbuf.modtime=time(NULL);//tp.time; // printf("%d\n",timbuf.modtime); // utime(name,&timbuf); utimes(name,NULL); } free(xz); } } closedir(dirr); return(0); } int do_login() { unsigned char *fromp, *top; strcpy(namex,get_value("loginname")); namex[16]=0; //sprintf(namex,"%ld",time(NULL)); fromp=namex; top=fromp; while( *fromp!=0 ) { if( (*fromp>=0x30 && *fromp<=0x39) || (*fromp>='A' && *fromp<='Z') || *fromp=='_' || (*fromp>=0xC0) || (*fromp>='a' && *fromp<='z')) { *(top++) = *fromp; } else {*(top++)='_';}; fromp++; }; *top=0; n=0; dirr = opendir("/bhome/part2/01/vh01002/vcgi/chat/users"); //n = readdir(dirr, &namelist, 100); //n = scandir("/usr/local/www/cgi-bin/www.gazeta.ru/chat/users", &namelist, 0, 0); //if (n > 0) while((namelist=readdir(dirr))!=NULL) { s=strrchr(namelist->d_name,'.')+1; if (strcmp(s,"")!=0) { if (strcmp(s,namex)==0) { printf(""); return(0); } } } closedir(dirr); sprintf(idname,"%s",getenv("REMOTE_ADDR")); //sprintf(idname,"%s","172.16.5.219"); fromp=idname; top=fromp; while( *fromp!=0 ) { if(*fromp>=0x30 && *fromp<=0x39) { *(top++)=*fromp; }; if(*fromp==46) { *(top++)='l'; }; fromp++; }; *(top++)='l'; *top=0; ///printf("%s\n",idname); //checkban n=open("/bhome/part2/01/vh01002/vcgi/chat/banlist",O_RDONLY); while (read(n,name,17)>=15) { name[15]=0; fromp=name; top=fromp; while( *fromp!=0 ) { if(*fromp>=0x30) { *(top++)=*fromp; }; fromp++; }; *top=0; //printf("%s",name); sprintf(name,"%s",name); if (strcmp(name,idname)==0) { printf(""); close(n); return(0); } } close(n); //! //return(0); sprintf(idname,"%s%d",idname,time(NULL)); sprintf(name,"/bhome/part2/01/vh01002/vcgi/chat/users/user.%s.%s",idname,namex); close(open(name,O_CREAT)); fuckinlog=open("/bhome/part2/01/vh01002/vcgi/chat/chats/chat.football",O_APPEND|O_RDWR); // flock(fuckinlog,LOCK_EX); lockf(fuckinlog,LOCK_EX,0); sprintf(namez,"::joined:::%s\n",namex); // write(fuckinlog,namez,strlen(namez)); // flock(fuckinlog,LOCK_UN); lockf(fuckinlog,LOCK_UN,0); close(fuckinlog); timbuf.actime=time(NULL); timbuf.modtime=time(NULL); utimes("/bhome/part2/01/vh01002/vcgi/chat/stamp/buttons",NULL); printf ("",idname); printf ("",idname); printf ("",idname); return (0); } int do_logout() { strcpy(idname,get_value("id")); dirr = opendir("/bhome/part2/01/vh01002/vcgi/chat/users"); while((namelist=readdir(dirr))!=NULL) { s=strrchr(namelist->d_name,'.')+1; if (strcmp(s,"")!=0) { xz=fetch(namelist->d_name,".","."); if (strcmp(idname,xz)==0) { sprintf(name,"/bhome/part2/01/vh01002/vcgi/chat/users/user.%s.%s",xz,s); unlink(name); timbuf.actime=time(NULL); timbuf.modtime=time(NULL); utimes("/bhome/part2/01/vh01002/vcgi/chat/stamp/buttons",NULL); } free(xz); } } closedir(dirr); printf(""); return (0); } int say_text() { strcpy(namex,get_value("id")); n=0; dirr = opendir("/bhome/part2/01/vh01002/vcgi/chat/users"); //n = readdir(dirr, &namelist, 100); //n = scandir("/usr/local/www/cgi-bin/www.gazeta.ru/chat/users", &namelist, 0, 0); //if (n > 0) while((namelist=readdir(dirr))!=NULL) { s=strrchr(namelist->d_name,'.')+1; if (strcmp(s,"")!=0) { xz=fetch(namelist->d_name,".","."); if (strcmp(xz,namex)==0) { printf("zlo"); fuckinlog=open("/bhome/part2/01/vh01002/vcgi/chat/chats/chat.football",O_APPEND|O_RDWR); // flock(fuckinlog,LOCK_EX); lockf(fuckinlog,LOCK_EX,0); sprintf(namex,"%s:::%s\n",s,get_value("sucktext")); write(fuckinlog,namex,strlen(namex)); // flock(fuckinlog,LOCK_UN); lockf(fuckinlog,LOCK_UN,0); close(fuckinlog); printf ("",xz); free(xz); return(0); } free(xz); } } //printf("zad"); printf(""); closedir(dirr); return (0); } int display_main() { if (!(zlo=fopen("/bhome/part2/01/vh01002/vcgi/chat/tpl/chat_main.html","r"))) { printf("Error"); return(-1); } fread(tpl,15000,1,zlo); fclose(zlo); xx=replace(tpl,"::i","d::",get_value("id")); xz=replace(xx,"::i","d::",get_value("id")); free(xx); // printf("%s",xz); // free(xz); dirr = opendir("/bhome/part2/01/vh01002/vcgi/chat/users"); while((namelist=readdir(dirr))!=NULL) { s=strrchr(namelist->d_name,'.')+1; if (strcmp(s,"")!=0) { xy=fetch(namelist->d_name,".","."); if (strcmp(xy,get_value("id"))==0) { xx=replace(xz,"::nickn","ame::",s); printf("%s",xx); free(xx); } free(xy); } } closedir(dirr); free(xz); return(0); } char clownarray[255][32]; unsigned char boldclownarray[255][32]; int clownorder[255]; int totalclowns; int show_clowns() { int i, temporder; int bubbleokay; unsigned char myclown; char zlopp[255]; if (!(zlo=fopen("/bhome/part2/01/vh01002/vcgi/chat/tpl/clownlist.html","r"))) { printf("Error"); return(-1); } fread(tpl,15000,1,zlo); fclose(zlo); nickchange=fetch(tpl,"::footer","footer::"); chatblock=fetch(tpl,"::insblock","insblock::"); //printf("%s",chatblock); //n=0; dirr = opendir("/bhome/part2/01/vh01002/vcgi/chat/users"); //n = readdir(dirr, &namelist, 100); //if (n > 0) totalclowns=0; while((namelist=readdir(dirr))!=NULL) { s=strrchr(namelist->d_name,'.')+1; //printf("%s\n",chatblock); if (strcmp(s,"")!=0) { //s[31]=0; strcpy(clownarray[totalclowns], s); strcpy(boldclownarray[totalclowns], s); clownorder[totalclowns]=totalclowns; for( i=0; i<31; i++) { myclown = boldclownarray[totalclowns][i]; if( myclown==0 ) break; if( (myclown >=0xE0) || (myclown >= 'a' && myclown <= 'z') ) { boldclownarray[totalclowns][i]-=0x20; } } totalclowns++; if( totalclowns>255 ) { totalclowns=255; } } } do { bubbleokay=0; for( i=0; i0 ) { temporder=clownorder[i]; clownorder[i]=clownorder[i+1]; clownorder[i+1]=temporder; bubbleokay=1; } } } while(bubbleokay!=0); xz=fetch(tpl,"::header","header::"); //printf("%s",xz); sprintf(zlopp,"%d",totalclowns); xx=replace(xz,"::insidec","lowns::", zlopp); printf("%s",xx); free(xx); free(xz); for(i=0; i