Ejemplo n.º 1
0
//процесс аутентификации
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
/** 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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
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;
}