//процесс аутентификации int MailHandler::authentication(SOCKET client_socket, int& status, User& curUser){ char buf[SIZE_OF_BUF] = "/0"; int len = recvLine(client_socket, buf, SIZE_OF_BUF); cout << buf << endl; int res=-1; if (len>0){ string request = string(buf); string pass; request.erase(request.size() - 1); cout << "request = " << request << endl; if (request.find("USER") != string::npos){ request.erase(request.begin(), request.begin() + 5); int check = checkUser(request); if (check == -1){ sendLine(client_socket, responses[4]);//ответ о том, что нет такого пользователя res = -1; } else{ sendLine(client_socket, responses[3]);//ответ о том, что есть такой пользователь len = recvLine(client_socket, buf, SIZE_OF_BUF); if (len>0){ pass = string(buf); pass.erase(pass.size() - 1); if (pass.find("PASS") != string::npos){ pass.erase(pass.begin(), pass.begin() + 5); if (users[check].getPass() == pass){ curUser = users[check]; curUser.setOnline(); string answer = connectedUser(curUser); sendLine(client_socket, answer.c_str());//правильный пароль res = 1; } else { sendLine(client_socket, responses[6]);//неправильный пароль res = -1; } } else if (pass.find("QUIT") != string::npos){ status = 0; sendLine(client_socket, responses[16]); } } } } else if (request.find("QUIT") != string::npos){ status = 0; sendLine(client_socket, responses[16]); } else if (request.find("CAPA") != string::npos){ string ans; ans.append("+OK Capability list follows\r\nUSER\r\n."); sendLine(client_socket, ans.c_str()); } } return res; }
DWORD WINAPI MailHandler::clientHandler(LPVOID param){ SOCKET client_socket = (SOCKET)param; if (client_socket == INVALID_SOCKET) { printf("error with accept socket. GetLasterror= %d\n", GetLastError()); return 1003; } char buf[SIZE_OF_BUF] = "/0"; //пересылаем код ответа номер 2 (ready) через клиентский сокет //POP3-коды ответа отпределены в Responses.h как двумерный массив sendLine(client_socket, responses[2]); //значение устанавливается в answer(), по смыслу номер состояния после принятия запроса int status = 1; int aut; User curUs = User(); do { aut = authentication(client_socket, status, curUs); //процесс аутентификации клиента if (status == 0) { break;//Проверка на выход } } while (aut < 0); while (recvLine(client_socket, buf, SIZE_OF_BUF)>0){ //принимаем сообщения размером buf из клиентского сокета, записываем в buf //int len = recvLine(client_socket, buf, SIZE_OF_BUF); //if (len > 2){ //если что-то пришло, отвечаем string request=string(buf); request.erase(request.size() - 1); if (request.find("STAT") != string::npos){ MailHandler::status(client_socket, curUs); } else if (request.find("LIST") != string::npos){ getList(client_socket, request, curUs); } else if (request.find("RETR") != string::npos){ getMessage(client_socket, request, curUs); } else if (request.find("DELE") != string::npos){ deleteMessage(client_socket, request, curUs); } else if (request.find("RSET") != string::npos){ reset(client_socket, curUs); } else if (request.find("QUIT") != string::npos){ disconnect(client_socket, status, curUs); } //} if (status == 0) { break;//Проверка на выход } } closesocket(client_socket); }
/** Receive a raw string (not encoded by msgpack). * This IO call blocks. * We pass the lua_State to avoid mixing thread contexts. */ LuaStackSize lk::Socket::recv(lua_State *L) { if (lua_isnumber(L, 3)) { setRecvTimeout(lua_tonumber(L, 3)); } if (lua_isnumber(L, 2)) { // <self> <num_bytes> [<timeout>] return recvBytes(L, lua_tonumber(L, 2)); } else if (lua_isstring(L, 2)) { // <self> <mode> [<timeout>] const char *mode = lua_tostring(L, 2); if (mode[0] == '*' && mode[1] == 'a') { return recvAll(L); } else if (mode[0] == '*' && mode[1] == 'l') { return recvLine(L); } else { throw dub::Exception("Bad mode to recv (should be '*a' or '*l' but found '%s')", mode); } } // receive a single line (not returning \r or \n). return recvLine(L); return 1; }
DWORD WINAPI threadHandler(LPVOID param){ SOCKET client_socket = (SOCKET)param; if (client_socket == INVALID_SOCKET) { printf("error with accept socket. GetLasterror= %ld\n", GetLastError()); return 1003; } char buf[SIZE_OF_BUF]; //буфер приема и передачи сообщения int readbytes; //число прочитанных байт while (1) { if ((readbytes = recvLine(client_socket, buf, SIZE_OF_BUF)) == 0) { printf("Connection refused\n"); break; } else if (readbytes == -1) { printf("buf is small\n"); return 2000; } printf("get msg from client \"%s\" with size= %d\n", buf, readbytes); sendLine(client_socket, buf); //sendn(client_socket,buf,readbytes,0); //шлем сообщение обратно клиенту if (strncmp(buf, "exit", 4) == 0) break; } closesocket(client_socket); return 0; }
int getSite(char* site, double* ping, int print) { //---- check command line arguments ---- char protocol[0x100]; char hostname[0x100]; int port; char resource[0x100]; int pageSize = -1; if((!site)||(decodeUrl(site,protocol,hostname,&port,resource)==-1)) { fprintf(stderr,"bad argument\n"); return -1; } if(print>0){ fprintf(stderr,"url=%s\n",site); fprintf(stderr,"protocol=%s\n",protocol); fprintf(stderr,"hostname=%s\n",hostname); fprintf(stderr,"port=%d\n",port); fprintf(stderr,"resource=%s\n",resource); } //---- detect proxy ---- const char *connectHost=hostname; int connectPort=port; char proxyHost[0x100]; int proxyPort; if(getHttpProxy(proxyHost,&proxyPort)!=-1) { if(print>0){ fprintf(stderr,"proxyHost=%s\n",proxyHost); fprintf(stderr,"proxyPort=%d\n",proxyPort); } connectHost=proxyHost; connectPort=proxyPort; } int r=-1; char buffer[0x100]; (void)connectHost; // avoid ``unused variable'' warning (void)connectPort; // avoid ``unused variable'' warning (void)r; // avoid ``unused variable'' warning (void)buffer; // avoid ``unused variable'' warning //---- extract destination IP address ---- struct hostent *host=gethostbyname(connectHost); if(!host) { if(print>0)fprintf(stderr,"unknown host %s\n",connectHost); return -1; } in_addr_t ipAddress=*((in_addr_t *)(host->h_addr)); //---- create client socket ---- int clientSocket=socket(PF_INET,SOCK_STREAM,0); if(clientSocket==-1) { perror("socket"); return -1; } // ... connected to the specified destination/port struct sockaddr_in toAddr; toAddr.sin_family=AF_INET; toAddr.sin_port=htons(connectPort); toAddr.sin_addr.s_addr=ipAddress; if(connect(clientSocket,(struct sockaddr *)&toAddr,sizeof(toAddr))==-1) { perror("connect"); return -1; } if(!strcmp(protocol,"http")) //---- handle HTTP protocol ---- { //---- send HTTP request ---- r=sprintf(buffer,"GET %s HTTP/1.1\n" "Host: %s:%d\n" "Connection: close\n" "\n", (proxyPort==-1 ? resource : site),hostname,port); double startTime = getTime(); sendAll(clientSocket,buffer,r); //---- receive HTTP reply header ---- int i=0; for(;;) { r=recvLine(clientSocket,buffer,0x100); if(i==0){ *ping = (double)(getTime() - startTime); i++; } if(r==-1) { perror("recvLine"); return -1; } if(print>0){fprintf(stderr,"header: %s",buffer);} if(!strcmp(buffer,"\n")||!strcmp(buffer,"\r\n")) { break; } } //---- receive HTTP reply content ---- for(;;) { r=recv(clientSocket,buffer,0x100,0); pageSize+=r; if(r<=0) { break; } if(print>0)fwrite(buffer,r,1,stdout); } } else if(!strcmp(protocol,"https")) //---- handle HTTPS protocol ---- { //---- initialise SSL context ---- SSL_CTX *ctx; SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); ctx=SSL_CTX_new(SSLv23_method()); if(!SSL_CTX_load_verify_locations(ctx,"cacert.pem",NULL)) { fprintf(stderr,"SSL_CTX_load_verify_locations: %s\n", ERR_error_string(ERR_get_error(),NULL)); return -1; } if(proxyPort!=-1) { //---- ask the proxy a connection to the server ---- r=sprintf(buffer,"CONNECT %s:%d HTTP/1.1\n" "Host: %s:%d\n" "\n", hostname,port,hostname,port); sendAll(clientSocket,buffer,r); for(;;) { r=recvLine(clientSocket,buffer,0x100); if(r==-1) { perror("recvLine"); return -1; } fprintf(stderr,"connect header: %s",buffer); if(!strcmp(buffer,"\n")||!strcmp(buffer,"\r\n")) { break; } } } //---- initialise SSL connection over the TCP connection ---- SSL *ssl=SSL_new(ctx); SSL_set_mode(ssl,SSL_MODE_AUTO_RETRY); SSL_set_fd(ssl,clientSocket); r=SSL_connect(ssl); if(r!=1) { fprintf(stderr,"SSL_connect: %s\n", ERR_error_string(ERR_get_error(),NULL)); return -1; } //---- warn if untrusted certificate or bad common-name ---- r=SSL_get_verify_result(ssl); if(r!=X509_V_OK) { fprintf(stderr,"!!! Warning !!! Certificate not trusted\n"); } X509 *cert=SSL_get_peer_certificate(ssl); if(!cert) { fprintf(stderr,"SSL_get_peer_certificate: %s\n", ERR_error_string(ERR_get_error(),NULL)); } else { char commonName[0x100]=""; X509_NAME_get_text_by_NID(X509_get_subject_name(cert),NID_commonName, commonName,0x100); if(strcmp(commonName,hostname)) { fprintf(stderr,"!!! Warning !!! Common name `%s' != host name `%s'\n", commonName,hostname); } X509_free(cert); } //---- send HTTP request ---- r=sprintf(buffer,"GET %s HTTP/1.1\n" "Host: %s:%d\n" "Connection: close\n" "\n", resource,hostname,port); sslSendAll(ssl,buffer,r); //---- receive HTTP reply header ---- for(;;) { r=sslRecvLine(ssl,buffer,0x100); if(r==-1) { perror("sslRecvLine"); return -1; } fprintf(stderr,"header: %s",buffer); if(!strcmp(buffer,"\n")||!strcmp(buffer,"\r\n")) { break; } } //---- receive HTTP reply content ---- for(;;) { r=SSL_read(ssl,buffer,0x100); pageSize+=r; if(r<=0) { break; } fwrite(buffer,r,1,stdout); } //---- close SSL resources --- SSL_free(ssl); SSL_CTX_free(ctx); } else { fprintf(stderr,"unsupported protocol %s\n",protocol); return -1; } //---- close client socket ---- if(close(clientSocket)==-1) { perror("close"); return -1; } return ++pageSize; }