rendered paste body/* onettunel.c v. 2010-4 (2008 - 2010) Zakodowane przez Olo unix.onlinewebshop.net / Gaahl586@wp.pl program do laczenia sie klientem IRC do czat.onet.pl ----------- kompilacja ( -std=c89 ): - Win32: gcc onettunel.c -o tunel -lws2_32 lub: gcc onettunel.c -o tunel -L"/mingw/lib/" /mingw/lib/libws2_32.a - *BSD, POSIX, Linux: gcc onettunel.c -o tunel -lpthread ----------- uzycie: ./tunel wybrany_port ,jesli nie wybierzesz portu zostanie zabindowany 8899 w irssi: /set nick twoj_nick /server 127.0.0.1 8899 twoje_haslo_do_nicka*/#define WERSJA "2010-4_test.1"/************** CONFIG *******************//* zamiast 1 daj 0 aby wylaczyc opcje */#define CONFIG_817_HISTORY 1 /* historia rozmowy */#define CONFIG_819_820_SLIST 1 /* lista kanalow */#define CONFIG_CS_HOMES 1 /* lista twoich kanalow */#define CONFIG_MODERMSG 1 /* obsluga MODERMSG jako PRIVMSG */#define CONFIG_BOLD 1 /* obsluga pogrubienia czcionki */#define CONFIG_COLOR 1 /* obsluga kolorow, */#define CONFIG_CP1250 1 /* obsluga MS CP-1250 */ /* ustawiajac na 0 usuniesz ja */ /* statycznie z kodu *//****************************************/#include <stdio.h>#include <ctype.h>#include <string.h>#include <time.h>#if __WIN32__#include <winsock.h>#define WYKREUJ_THREAD \ CreateThread(NULL, 0, (PVOID)jedziemy, (PVOID)klientfd, 0, &it);#else#include <stdlib.h>#include <arpa/inet.h>#include <unistd.h>#include <netdb.h>#include <sys/socket.h>#include <sys/select.h>#include <netinet/in.h>#include <pthread.h>#define closesocket close#define WYKREUJ_THREAD \ pthread_create(&it, NULL, (void*)jedziemy, (void *)klientfd);#endif#define AUT "by Olo , unix.onlinewebshop.net"typedef struct{ char *a; int b; } mem;char irc_kolor_tab[2][14][4]= {{{0x03,'1','4',0}, {0x03,'5',0}, {0x03,'7',0}, {0x03,'5',0}, {0x03,'1','3',0}, {0x03,'4',0}, {0x03,'1','2',0}, {0x03,'3',0}, {0x03,'1','0',0}, {0x03,'1','1',0}, {0x03,'6',0}, {0x03,'2',0}, {0x03,'7',0}, {0x03,'4',0}}, {{0x03,'1','4',0}, {0x03,'0','5',0}, {0x03,'0','7',0}, {0x03,'0','5',0}, {0x03,'1','3',0}, {0x03,'0','4',0}, {0x03,'1','2',0}, {0x03,'0','3',0}, {0x03,'1','0',0}, {0x03,'1','1',0}, {0x03,'0','6',0}, {0x03,'0','2',0}, {0x03,'0','7',0}, {0x03,'0','4',0}}};char *onet_kolor_tab[14] = {"%C959595%", "%C990033%", "%Cc86c00%", "%C623c00%", "%Cce00ff%", "%Ce40f0f%", "%C3030ce%", "%C008100%", "%C1a866e%", "%C006699%", "%C8800ab%", "%C0f2ab1%", "%Cff6500%", "%Cff0000%"};char *fbold_tab[12] = {"%Fb%", "%Fbi%", "%Fb:arial%", "%Fb:courier%", "%Fb:tahoma%", "%Fb:times%", "%Fbi:arial%", "%Fbi:courier%", "%Fbi:tahoma%", "%Fbi:times%", /* T2: */ "%Fb:verdana%", "%Fbi:verdana%"};char *ffont_tab[11] = {"%Fi%", "%F:arial%", "%F:courier%", "%F:tahoma%", "%F:times%", "%Fi:arial%", "%Fi:courier%", "%Fi:tahoma%", "%Fi:times%", /* znacznik dla verdany dodawany tylko przez klienta Taboret2 */ "%F:verdana%", "%Fi:verdana%"};short int mstat[4]= {#if CONFIG_CP1250 && __WIN32__ 1, /* CP-1250 */#else 0,#endif CONFIG_BOLD, /* BOLD */ CONFIG_COLOR, /* kolory */ CONFIG_817_HISTORY /* historia rozmowy */ };char *mstat_tab = "tunel - USTAWIENIA TUNELA DLA TWOJEGO POLACZENIA:\r\n" "tunel - KOLORY: %d\r\n" "tunel - BOLD: %d\r\n" "tunel - CP1250: %d\r\n" "tunel - HIST: %d\r\n" ; /* auth() zmontuj authkey`a do autoryzacji */void auth(char *stringbuffer){ int f1[] = { 29, 43, 7, 5, 52, 58, 30, 59, 26, 35, 35, 49, 45, 4, 22, 4, 0, 7, 4, 30, 51, 39, 16, 6, 32, 13, 40, 44, 14, 58, 27, 41, 52, 33, 9, 30, 30, 52, 16, 45, 43, 18, 27, 52, 40, 52, 10, 8, 10, 14, 10, 38, 27, 54, 48, 58, 17, 34, 6, 29, 53, 39, 31, 35, 60, 44, 26, 34, 33, 31, 10, 36, 51, 44, 39, 53, 5, 56 }; int f2[] = { 7, 32, 25, 39, 22, 26, 32, 27, 17, 50, 22, 19, 36, 22, 40, 11, 41, 10, 10, 2, 10, 8, 44, 40, 51, 7, 8, 39, 34, 52, 52, 4, 56, 61, 59, 26, 22, 15, 17, 9, 47, 38, 45, 10, 0, 12, 9, 20, 51, 59, 32, 58, 19, 28, 11, 40, 8, 28, 6, 0, 13, 47, 34, 60, 4, 56, 21, 60, 59, 16, 38, 52, 61, 44, 8, 35, 4, 11 }; int f3[] = { 60, 30, 12, 34, 33, 7, 15, 29, 16, 20, 46, 25, 8, 31, 4, 48, 6, 44, 57, 16, 12, 58, 48, 59, 21, 32, 2, 18, 51, 8, 50, 29, 58, 6, 24, 34, 11, 23, 57, 43, 59, 50, 10, 56, 27, 32, 12, 59, 16, 4, 40, 39, 26, 10, 49, 56, 51, 60, 21, 37, 12, 56, 39, 15, 53, 11, 33, 43, 52, 37, 30, 25, 19, 55, 7, 34, 48, 36 }; int p1[] = { 11, 9, 12, 0, 1, 4, 10, 13, 3, 6, 7, 8, 15, 5, 2, 14 }; int p2[] = { 1, 13, 5, 8, 7, 10, 0, 15, 12, 3, 14, 11, 2, 9, 6, 4 }; int i = 0; int ai[16], ai1[16]; if(strlen(stringbuffer) < 16) return; do { char c = stringbuffer[i]; ai[i] = (c > '9' ? c > 'Z' ? (c - 97) + 36 : (c - 65) + 10 : c - 48); } while(++i < 16); for(i = 0; i < 16; i++) ai[i] = f1[ai[i] + i]; memcpy(ai1, ai, sizeof(ai1)); for(i = 0; i < 16; i++) ai[i] = (ai[i] + ai1[p1[i]]) % 62; for(i = 0; i < 16; i++) ai[i] = f2[ai[i] + i]; memcpy(ai1, ai, sizeof(ai1)); for(i = 0; i < 16; i++) ai[i] = (ai[i] + ai1[p2[i]]) % 62; for(i = 0; i < 16; i++) ai[i] = f3[ai[i] + i]; i = 0; do { int j = ai[i]; ai[i] = j >= 10 ? j >= 36 ? (97 + j) - 36 : (65 + j) - 10 : 48 + j; } while(++i < 16); for(i = 0; i < 16; i++) stringbuffer[i] = (char)ai[i]; stringbuffer[16] = '\0';}int dawaj_pamiec(mem *a2, unsigned b2){ char *test; if(a2->b > 0){ test = (char *)realloc(a2->a,a2->b + b2); if(test == NULL){ fprintf(stderr, "dawaj_pamiec(%d): system nie przydzielil pamieci!\n",a2->b + b2); return 1; } a2->a = test; a2->b += b2; return 0; } a2->a=(char*)malloc(b2); if(a2->a == NULL){ fprintf(stderr, "dawaj_pamiec(%d): system nie przydzielil pamieci!\n",b2); return 1; } a2->b=b2; return 0;}void zwolnij_pamiec(mem *a2){ free(a2->a); a2->b = 0;}int ot_send(int a, char *b){ return send(a,b,strlen(b),0);}int http_1(char *host, char *z, mem *cookies, char *uo, int suo, int klient){ int s, i; mem buf; buf.b=0; char tmp_buf[1024], *u, *u2; struct sockaddr_in www; struct hostent *hostname; hostname = gethostbyname(host); if(hostname == NULL){ sprintf(tmp_buf,"tunel - http_1(): Nie mozna pobrac adresu hosta: %s\r\n", host); ot_send(klient, tmp_buf); return 1; } s = socket(AF_INET, SOCK_STREAM, 0); www.sin_family = AF_INET; www.sin_port = htons(80); www.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)hostname->h_addr))); memset(&(www.sin_zero), '\0', 8); if(connect(s, (struct sockaddr *)&www, sizeof(struct sockaddr)) == -1){ sprintf(tmp_buf, "tunel - http_1(): Problem z polaczniem do %s\n", host); ot_send(klient, tmp_buf); closesocket(s); return 1; } ot_send(s,z); if(dawaj_pamiec(&buf,1024)==1){ closesocket(s); return 2; } buf.a[0]='\0'; while((i=recv(s,tmp_buf,1000,0)) > 0){ tmp_buf[i]='\0'; strcat(buf.a, tmp_buf); if(dawaj_pamiec(&buf,1008) == 1) break; } closesocket(s); u=strstr(buf.a,"Set-Cookie:"); if(!u) goto dalej; while( (u=strstr(u,"Set-Cookie:"))!=NULL ){ u+=12; u2=strchr(u,';'); if(u2){ i=strlen(u)-strlen(u2)+1; if(dawaj_pamiec(cookies,i+4)==1) break; strncat(cookies->a,u,i); strcat(cookies->a," "); } } dalej: if(suo == 1){ u = strstr(buf.a, "uoKey"); if(u){ memcpy(uo, u + 6, 32); uo[32] = '\0'; } else{ ot_send(klient,buf.a); ot_send(klient, "tunel - PROBLEM: nie znaleziono uoKey`a !!!\r\n"); zwolnij_pamiec(&buf); return 3; } } zwolnij_pamiec(&buf); return 0;}int http_2(char *host, char *loc, mem *cookies, char *uo, int suo, char *POST, int klient){ char *zp,*zp2,*z; int ret; mem zap; zap.b=0; zp = "%s %s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: Mozilla/5.0 Linux\r\n" "Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n" "Content-Type: application/x-www-form-urlencoded\r\n"; zp2 = "Cache-Control: no-cache\r\n" "Pragma: no-cache\r\n" "Connection: close\r\n"; if(dawaj_pamiec(&zap, strlen(zp)+strlen(zp2)+strlen(host)+strlen(POST)+strlen(cookies->a)+500)==1){ return 2; } sprintf(zap.a, zp, (*POST=='\0')?"GET":"POST", loc, host); if(*POST!='\0') sprintf(zap.a, "%sContent-Length: %d\r\n", zap.a,strlen(POST)); strcat(zap.a,zp2); strcat(zap.a,cookies->a); strcat(zap.a,"\r\n\r\n"); if(*POST!='\0') strcat(zap.a,POST); z=zap.a; ret=http_1(host, z, cookies, uo, suo, klient); zwolnij_pamiec(&zap); return ret;}/* onethttpauth() autoryzacja http dla czat.onet.pl , zassanie UOkey`a */int onethttpauth(char *nick, char *pass, char *UO, int klient){ mem cookies; int i; char POST[516]; cookies.b=0; if(dawaj_pamiec(&cookies, 20) == 1) return 2; i = 1; strcpy(cookies.a, "Cookie: "); http_2("kropka.onet.pl","/_s/kropka/1?DV=czat",&cookies,UO,0,"",klient); http_2("czat.onet.pl","/myimg.gif",&cookies,UO,0,"",klient); if(*nick!='~'){ sprintf(POST, "r=&url=&login=%s&haslo=%s&app_id=20&ssl=1&ok=1", nick, pass); http_2("secure.onet.pl","/mlogin.html",&cookies,UO,0,POST,klient); i = 0; } sprintf(POST,"api_function=getUoKey¶ms=a:3:{s:4:\"nick\";s:%d:\"%s\";" "s:8:\"tempNick\";i:%d;" "s:7:\"version\";s:22:\"1.0(20090306-1441 - R)\";}", strlen(nick) - i, nick + i, i); i=http_2("czat.onet.pl","/include/ajaxapi.xml.php3",&cookies,UO,1,POST,klient); zwolnij_pamiec(&cookies); return i;}/* replace() zamiana w tablicy znakow a, ciagu znakow b na ciag znakow c */void replace(mem *a, char *b, char *c){ char *u,*d; int i; if(*b=='\0') return; u=a->a; for(i=0;(u = strstr(u, b))!=NULL;i++) u++; if(i==0) return; i=strlen(a->a) - i*strlen(b) + i*strlen(c) + 1000; d = (char*)malloc(i); if(d == NULL) return; if(i>a->b) if(dawaj_pamiec(a,i)==1){ free(d); return; } u=a->a; while((u = strstr(u, b))!=NULL){ i=strlen(a->a) - strlen(u); memcpy(d, a->a, i); d[i] = '\0'; strcat(d, c); strcat(d, u + strlen(b)); strcpy(a->a, d); u+=strlen(c); } free(d);}/* czas() - przerob "1254576332" na "15:25:32" */char *czas(char *czczas){ time_t zczas; char *a; zczas = atoi(czczas); a = ctime(&zczas); if(a == NULL) return czczas; a += 11; *(a + 8) = '\0'; strcpy(czczas, a); return czczas;}/* obsluga przesylanych informacji, dla WIN32 translacja polskich znakow z CP1250 na ISO8859-2 i odwrotnie zamiana kolorow appletu czat.onet na kolory w IRC i odwrotnie */int wyslij(int from, int to, int onet, short int *lmstat){ char linia[1028], list_linia[1028], a1[1028], a2[1028], a3[52], a4[104], a5[24], a6[104]; char *u, *u2, *bufor, *tmpbufor, *bold; int i, i2; mem bufor_t,tmpbufor_t; bufor_t.b=0; tmpbufor_t.b=0; if(dawaj_pamiec(&tmpbufor_t,1028) == 1) return 1; if(dawaj_pamiec(&bufor_t,1028) == 1){ zwolnij_pamiec(&tmpbufor_t); return 1; } bufor_t.a[0] = '\0'; while((i=recv(from,tmpbufor_t.a,1024,0)) > 0){ tmpbufor_t.a[i]='\0'; strcat(bufor_t.a, tmpbufor_t.a); if(tmpbufor_t.a[i-1]=='\n') break; if(dawaj_pamiec(&bufor_t,1028) == 1) break; } if(bufor_t.a[0] == '\0'){ zwolnij_pamiec(&bufor_t); zwolnij_pamiec(&tmpbufor_t); return 1; } bufor=bufor_t.a; if(from == onet){ i=dawaj_pamiec(&tmpbufor_t,bufor_t.b); tmpbufor=tmpbufor_t.a;#if CONFIG_CP1250 if(lmstat[0] == 1){ u = bufor; while((u = strchr(u, '\xa1'))!=NULL) *u = '\xa5'; u = bufor; while((u = strchr(u, '\xb1'))!=NULL) *u = '\xb9'; u = bufor; while((u = strchr(u, '\xa6'))!=NULL) *u = '\x8c'; u = bufor; while((u = strchr(u, '\xb6'))!=NULL) *u = '\x9c'; u = bufor; while((u = strchr(u, '\xac'))!=NULL) *u = '\x8f'; u = bufor; while((u = strchr(u, '\xbc'))!=NULL) *u = '\x9f'; }#endif#if CONFIG_COLOR if(lmstat[2] == 1){ if(strstr(bufor,"%C")) for(i2=0;i2<14;i2++) { replace(&bufor_t, onet_kolor_tab[i2], irc_kolor_tab[1][i2]); bufor=bufor_t.a; } } else{#endif if(strstr(bufor,"%C")) for(i2=0;i2<14;i2++) { replace(&bufor_t, onet_kolor_tab[i2], ""); bufor=bufor_t.a; }#if CONFIG_COLOR }#endif /* tutaj obsluga pogrubienia czcionki ;S */ if(strstr(bufor,"%Fb")){#if CONFIG_BOLD if(lmstat[1] == 1) bold="\x02"; else bold="";#else bold="";#endif for(i2=0;i2<12;i2++) { replace(&bufor_t, fbold_tab[i2], bold); bufor=bufor_t.a; } } if(strstr(bufor,"%F")){ /* wywal kursywe i czcionki z appletu */ for(i2=0;i2<11;i2++) { replace(&bufor_t, ffont_tab[i2], ""); bufor=bufor_t.a; } } if(i == 1) goto odratuj; while(1){ /* potnij bufor na linie zakonczone '\n' a2 = 817: historia rozmowy a2 = 819: lista kanalow: /SLIST a2 = 820: koniec listy kanalow zrob tabelke dla: /quote cs homes */ u = strchr(bufor, '\n'); if(!u) break; u++; if((strlen(bufor) - strlen(u)) > 1026) break; strcpy(tmpbufor, u); memcpy(linia, bufor, strlen(bufor) - strlen(u)); linia[strlen(bufor) - strlen(u)] = '\0'; strcpy(bufor, tmpbufor); if(sscanf(linia, "%1000s %1000s", a1, a2) == 2){#if CONFIG_817_HISTORY if(lmstat[3]==1&&(!strcmp(a2, "817")) &&sscanf(linia, "%1000s %1000s %50s %100s %20s %100s", a1, a2, a3, a4, a5, a6) == 6 &&(u = strchr(linia + 2, ':'))){ strcpy(a1, u); sprintf(linia, ":_-_!name@host.org PRIVMSG %s :%s <%s> %s", a4, czas(a5), a6, a1 + 1); }#endif#if CONFIG_819_820_SLIST if((!strcmp(a2, "819")) && sscanf(linia, "%1000s %1000s %50s", a1, a2, a3) == 3){ u = strchr(linia + 2, ':'); u++; while(1){ for(i=0;i<strlen(u);i++){ if(u[i] == ',' || u[i] == '\r' || u[i] == '\n') break; a6[i] = u[i]; } a6[i] = '\0'; u2 = strchr(a6, ':'); if(!u2) break; memcpy(a4, a6, strlen(a6) - strlen(u2)); a4[strlen(a6) - strlen(u2)] = '\0'; u2 = strrchr(u2, ':') + 1; if(!u2) break; strcpy(a5, u2); sprintf(list_linia, "%s 322 %s %s %s :\r\n", a1, a3, a4, a5); ot_send(to, list_linia); if(u[i] == '\r' || u[i] == '\n') break; u = u + i + 1; } } if((!strcmp(a2, "820")) && sscanf(linia, "%1000s %1000s %50s", a1, a2, a3) == 3){ sprintf(linia, "%s 323 %s :End of LIST\r\n", a1, a3); }#endif#if CONFIG_CS_HOMES if((!strcmp(a2, "NOTICE")) && sscanf(linia, "%1000s %1000s %50s %100s", a1, a2, a3, a4) == 4 && (!strcmp(a4, ":151"))){ u = strrchr(linia, ':'); if(!u) break; u++; ot_send(to, "tunel : Status: Nazwa kanalu:\n"); while(1){ for(i = 0; i < strlen(u) && i < 104;i++){ if(u[i] == ' ' || u[i] == '\r' || u[i] == '\n') break; a6[i] = u[i]; } a6[i] = '\0'; if(a6[0] == 'o') sprintf(tmpbufor, "tunel : [@ +o ] operator | %s\n", a6 + 1); else if(a6[0] == 'q') sprintf(tmpbufor, "tunel : [` +qo] owner | %s\n", a6 + 1); else if(a6[0] == 'h') sprintf(tmpbufor, "tunel : [%% +h ] halfop | %s\n", a6 + 1); else sprintf(tmpbufor, "tunel : [ +%c ] ???????? | %s\n", a6[0], a6 + 1); ot_send(to, tmpbufor); if(u[i] == '\r' || u[i] == '\n') break; u = u + i + 1; } }#endif#if CONFIG_MODERMSG if(((!strcmp(a2, "MODERMSG")) &&sscanf(linia, "%1000s %1000s %50s - %100s",a1,a2,a3,a4)==4) &&(u = strchr(linia + 2, ':'))){ strcpy(a1,u); sprintf(linia,":%s!host@local PRIVMSG %s %s", a3,a4,a1); }#endif } ot_send(to, linia); } odratuj: if(*bufor != '\0') ot_send(to, bufor); } else{ if(sscanf(bufor,"%20s",a1) == 1) if(strcasecmp(a1,"SETS") == 0){ if(sscanf(bufor,"%20s %20s %1d",a1,a2,&i2) == 3){ if(strcasecmp(a2,"CP1250") == 0) lmstat[0] = (i2==0||i2==1)?i2:lmstat[0]; else if(strcasecmp(a2,"BOLD") == 0) lmstat[1] = (i2==0||i2==1)?i2:lmstat[1]; else if(strcasecmp(a2,"KOLORY") == 0) lmstat[2] = (i2==0||i2==1)?i2:lmstat[2]; else if(strcasecmp(a2,"HIST") == 0) lmstat[3] = (i2==0||i2==1)?i2:lmstat[3]; } dawaj_pamiec(&tmpbufor_t, strlen(mstat_tab)+100); sprintf(tmpbufor_t.a, mstat_tab, lmstat[2], lmstat[1], lmstat[0], lmstat[3]); bufor[0] = '\0'; ot_send(from, tmpbufor_t.a); }#if CONFIG_CP1250 if(lmstat[0] == 1){ u = bufor; while((u = strchr(u, '\xa5'))!=NULL) *u = '\xa1'; u = bufor; while((u = strchr(u, '\xb9'))!=NULL) *u = '\xb1'; u = bufor; while((u = strchr(u, '\x8c'))!=NULL) *u = '\xa6'; u = bufor; while((u = strchr(u, '\x9c'))!=NULL) *u = '\xb6'; u = bufor; while((u = strchr(u, '\x8f'))!=NULL) *u = '\xac'; u = bufor; while((u = strchr(u, '\x9f'))!=NULL) *u = '\xbc'; }#endif#if CONFIG_COLOR if(lmstat[2] == 1) if(strchr(bufor,0x03)) for(i2=0;i2<14;i2++) { replace(&bufor_t, irc_kolor_tab[0][i2], onet_kolor_tab[i2]); bufor=bufor_t.a; }#endif#if CONFIG_BOLD if(lmstat[1] == 1){ replace(&bufor_t, "\x02", "%Fb%"); bufor=bufor_t.a; }#endif if(*bufor!='\0') ot_send(to, bufor); } zwolnij_pamiec(&bufor_t); zwolnij_pamiec(&tmpbufor_t); return 0;}void jedziemy(int klient){ int fdmax, onet, koniec = 0, i; time_t c1,c2; short int lmstat[4]; char bufor[1028], nickname[52], password[200], authkey[52], ircname[200]; char *u; struct sockaddr_in onetaddr; fd_set mfd; fd_set tmpfd; nickname[0] = '\0'; password[0] = '\0'; FD_ZERO(&mfd); memcpy(lmstat,mstat,sizeof(mstat)); onetaddr.sin_family = AF_INET; onetaddr.sin_port = htons(5015); onetaddr.sin_addr.s_addr = inet_addr("213.180.130.192"); memset(&(onetaddr.sin_zero), '\0', 8); u= "tunel - $$$ onettunel.c v. "WERSJA" / "AUT" $$$\r\n\r\n"; ot_send(klient,u); u = #if CONFIG_CS_HOMES "tunel - komendy: /quote cs homes <-- pokazuje Twoje pokoje i statusy\r\n"#endif#if CONFIG_819_820_SLIST "tunel - /quote SLIST <-- lista kanalow\r\n"#endif "tunel - \r\n" "tunel - dodatkowe opcje:\r\n"; ot_send(klient, u); u = "tunel - /server 127.0.0.1 8899 haslo_do_nicka:ircname=Twoje_IRCname\r\n" "tunel - jesli ircname=Twoje_IRCname <-- ustawia ircname na Twoje_IRCname\r\n" "tunel - \r\n"; ot_send(klient, u); u = "tunel - USTAWIENIA TUNELU:\r\n" "tunel - /quote SETS <-- pokazuje ustawienia tunelu\r\n"#if CONFIG_COLOR "tunel - /quote SETS KOLORY 0 <-- wylacz kolory, 1 aby wlaczyc\r\n"#endif#if CONFIG_CP1250 "tunel - /quote SETS CP1250 0 <-- wylacz kodowanie CP1250 (Win), 1 aby wlaczyc\r\n"#endif#if CONFIG_BOLD "tunel - /quote SETS BOLD 0 <-- wylacz pogrubienie czcionki, 1 wlacza\r\n"#endif#if CONFIG_817_HISTORY "tunel - HIST <-- historia rozmowy w pokoju widoczna po wejsciu\r\n"#endif "tunel - /quote SETS OPCJA 0 <-- wlacza/wylacza wybrana opcje z listy /quote SETS\r\n"; ot_send(klient, u); while(1){ i = recv(klient, bufor, 1024, 0); if(i <= 0) goto koniec1; u = strstr(bufor, "NICK"); if(u){ u = u + 5; for(i = 0; i < 50 && *u!='\0'; u++,i++){ if(*u == '\r' || *u == '\n') break; nickname[i] = *u; } nickname[i] = '\0'; if(nickname[0] == '~') break; } u = strstr(bufor, "PASS"); if(u){ u = u + 5; for(i = 0; i < 196 && *u!='\0'; u++,i++){ if(*u == '\r' || *u == '\n') break; password[i] = *u; } password[i] = '\0'; } if(nickname[0] != '\0' && password[0] != '\0') break; } strcpy(ircname, nickname); if(strchr(password, ':')){ u = strstr(password, "ircname"); if(u){ u += 8; for(i = 0; *u!='\0'; u++,i++) if(*u == '\r' || *u == '\n' || *u == ':') break; else ircname[i] = *u; ircname[i] = '\0'; } u = strchr(password, ':'); *u = '\0'; } time(&c1); if(onethttpauth(nickname, password, authkey, klient) != 0){ ot_send(klient, "onethttpauth(): blad autoryzacji http, sprawdz nick/haslo lub zmiany autoryzacji\r\n"); goto koniec1; } time(&c2); sprintf(bufor, "tunel - \x03%cczas autoryzacji http: %d sekundy\r\n",'4',(int)(c2-c1)); ot_send(klient,bufor); onet = socket(AF_INET, SOCK_STREAM, 0); FD_SET(onet, &mfd); FD_SET(klient, &mfd); if(connect(onet, (struct sockaddr *)&onetaddr, sizeof(struct sockaddr)) == -1){ ot_send(klient, "connect(): nie mozna polaczyc sie do serwera IRC onetu\r\n"); closesocket(onet); goto koniec1; } i = recv(onet, bufor, 1024, 0); if(i <= 0) goto koniec1; bufor[i] = '\0'; ot_send(klient, bufor); ot_send(onet, "AUTHKEY\r\n"); sprintf(bufor, "NICK %s\r\n", nickname); ot_send(onet, bufor); sprintf(bufor, "USER * %s czat-app.onet.pl :%s\r\n", authkey, ircname); ot_send(onet, bufor); i = recv(onet, bufor, 1024, 0); if(i <= 0) goto koniec1; bufor[i] = '\0'; u = strstr(bufor, "unknown"); if(!u){ ot_send(klient, "tunel - AUTHKEY: zmiana autoryzacji\r\n"); goto koniec1; } memcpy(authkey, strchr(u, ':') + 1, 16); authkey[16] = '\0'; auth(authkey); sprintf(bufor, "AUTHKEY %s\r\n", authkey); ot_send(onet, bufor); if(onet > klient) fdmax = onet; else fdmax = klient; while(koniec == 0){ tmpfd = mfd; select(fdmax + 1, &tmpfd, NULL, NULL, NULL); if(FD_ISSET(onet, &tmpfd)) koniec = wyslij(onet, klient, onet, lmstat); if(FD_ISSET(klient, &tmpfd)) koniec = wyslij(klient, onet, onet, lmstat); } closesocket(onet); koniec1: closesocket(klient); return;}int main(int a, char *b[]){ int serwer, klientfd, klen, BindPort; char mojhost[650]; /* 650 bajtow na wszelki wypadek */ struct sockaddr_in serw, klient; struct hostent *myhost;#if __WIN32__ WSADATA wd; WSAStartup(267, &wd); DWORD it;#else pthread_t it;#endif puts("$$$ onettunel.c v. "WERSJA" / "AUT" $$$");#if __GNUC__ && __GNUC_MINOR__ printf("kompilacja: GCC %d.%d.? , "__DATE__" " __TIME__"\n\n", __GNUC__, __GNUC_MINOR__);#else#warning nieznany kompilator! puts("kompilacja: CC nieznany , "__DATE__" " __TIME__"\n");#endif if(a == 1) BindPort = 8899; else BindPort = atoi(b[1]); if(gethostname(mojhost,600) != 0) strcpy(mojhost, "localhost"); myhost = gethostbyname(mojhost); serw.sin_family = AF_INET; serw.sin_port = htons(BindPort); serw.sin_addr.s_addr = INADDR_ANY; memset(&(serw.sin_zero), '\0', 8); serwer = socket(AF_INET, SOCK_STREAM, 0); if(bind(serwer, (struct sockaddr *)&serw, sizeof(serw)) == -1){ printf("- error_bind: nie mozna zabindowac portu %d, wybierz inny\n", BindPort); closesocket(serwer);#if __WIN32__ WSACleanup();#endif exit(1); } listen(serwer, 3); if(myhost == NULL) printf("+ serwer: %s.%d\r\n", mojhost, BindPort); else printf("+ serwer: %s.%d nazwa hosta: %s\r\n", (char*)inet_ntoa(*((struct in_addr *)myhost->h_addr)), BindPort, mojhost); klen = sizeof(klient); while(1){ klientfd = accept(serwer, (struct sockaddr *)&klient, &klen); WYKREUJ_THREAD } closesocket(serwer);#if __WIN32__ WSACleanup();#endif return 0;}