void Run() { do { // wait for a connection NPT_Socket* client = NULL; NPT_LOG_FINE_1("waiting for connection on port %d...", m_Port); NPT_Result result = m_Socket.WaitForNewClient(client, NPT_TIMEOUT_INFINITE); if (NPT_FAILED(result) || client == NULL) return; NPT_SocketInfo client_info; client->GetInfo(client_info); NPT_LOG_FINE_2("client connected (%s -> %s)", client_info.local_address.ToString().GetChars(), client_info.remote_address.ToString().GetChars()); // get the output stream NPT_OutputStreamReference output; client->GetOutputStream(output); // generate policy based on our current IP NPT_String policy = "<cross-domain-policy>"; policy += "<allow-access-from domain=\""+client_info.local_address.GetIpAddress().ToString()+"\" to-ports=\""+m_AuthorizedPorts+"\"/>"; policy += "<allow-access-from domain=\""+client_info.remote_address.GetIpAddress().ToString()+"\" to-ports=\""+m_AuthorizedPorts+"\"/>"; policy += "</cross-domain-policy>"; NPT_MemoryStream* mem_input = new NPT_MemoryStream(); mem_input->Write(policy.GetChars(), policy.GetLength()); NPT_InputStreamReference input(mem_input); NPT_StreamToStreamCopy(*input, *output); delete client; } while (!m_Aborted); }
/*---------------------------------------------------------------------- | TcpServerLoop +---------------------------------------------------------------------*/ static void TcpServerLoop(int port) { NPT_TcpServerSocket listener; NPT_Result result = listener.Bind(NPT_SocketAddress(NPT_IpAddress::Any, port)); if (NPT_FAILED(result)) { NPT_Debug("ERROR: Bind() failed (%d)\n", result); } NPT_Socket* client; for (;;) { NPT_Debug("waiting for client on port %d\n", port); NPT_Result result = listener.WaitForNewClient(client); NPT_SocketInfo socket_info; client->GetInfo(socket_info); NPT_Debug("client connected from %s:%d\n", socket_info.remote_address.GetIpAddress().ToString().GetChars(), socket_info.remote_address.GetPort()); NPT_InputStreamReference input; client->GetInputStream(input); NPT_OutputStreamReference output; client->GetOutputStream(output); do { char buffer[1024]; NPT_Size bytes_read; result = input->Read(buffer, sizeof(buffer), &bytes_read); if (NPT_SUCCEEDED(result)) { NPT_Debug("read %ld bytes\n", bytes_read); output->Write(buffer, bytes_read); } } while (NPT_SUCCEEDED(result)); delete client; } }
void TlsTestServer::Run() { printf("@@@ starting TLS server\n"); NPT_TcpServerSocket socket; NPT_SocketAddress address(NPT_IpAddress::Any, 0); NPT_Result result = socket.Bind(address); if (NPT_FAILED(result)) { fprintf(stderr, "@@@ Bind failed (%d)\n", result); return; } result = socket.GetInfo(m_SocketInfo); if (NPT_FAILED(result)) { fprintf(stderr, "@@@ GetInfo failed (%d)\n", result); return; } m_Ready.SetValue(1); printf("@@@ Waiting for connection\n"); NPT_Socket* client = NULL; socket.WaitForNewClient(client); printf("@@@ Client connected\n"); NPT_TlsContextReference tls_context; if (m_Mode == 0) { tls_context = new NPT_TlsContext(); } else if (m_Mode == 1) { /* require client authentication */ tls_context = new NPT_TlsContext(NPT_TLS_CONTEXT_OPTION_REQUIRE_CLIENT_CERTIFICATE | NPT_TLS_CONTEXT_OPTION_VERIFY_LATER); } /* self-signed cert */ result = tls_context->LoadKey(NPT_TLS_KEY_FORMAT_PKCS8, TestClient_p8_1, TestClient_p8_1_len, "neptune"); CHECK(result == NPT_SUCCESS); result = tls_context->SelfSignCertificate("MyServerCommonName", "MyServerOrganization", "MyServerOrganizationalName"); NPT_InputStreamReference socket_input; NPT_OutputStreamReference socket_output; client->GetInputStream(socket_input); client->GetOutputStream(socket_output); NPT_TlsServerSession session(tls_context, socket_input, socket_output); delete client; result = session.Handshake(); if (m_Mode == 1) { /* expect a self-signed client cert */ result = session.VerifyPeerCertificate(); printf("@@@ Certificate Verification Result = %d (%s)\n", result, NPT_ResultText(result)); if (result != NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED) { printf("!ERROR, cert verification expected %d, got %d\n", NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED, result); return; } NPT_TlsCertificateInfo cert_info; result = session.GetPeerCertificateInfo(cert_info); CHECK(result == NPT_SUCCESS); PrintCertificateInfo(cert_info); } else { if (NPT_FAILED(result)) { fprintf(stderr, "@@@ Handshake failed (%d : %s)\n", result, NPT_ResultText(result)); return; } } NPT_OutputStreamReference tls_output; session.GetOutputStream(tls_output); tls_output->WriteString("Hello, Client\n"); printf("@@@ TLS server done\n"); //NPT_System::Sleep(1.0); }
/*---------------------------------------------------------------------- | GetEndPointStreams +---------------------------------------------------------------------*/ static NPT_Result GetEndPointStreams(EndPoint* endpoint, NPT_InputStreamReference* input_stream, NPT_OutputStreamReference* output_stream) { // default return values if (input_stream) *input_stream = NULL; if (output_stream) *output_stream = NULL; switch (endpoint->type) { case ENDPOINT_TYPE_UDP_CLIENT: { NPT_UdpSocket sender; // info if (Options.verbose) { NPT_Debug("sending to %s on port %d\n", endpoint->info.udp_client.hostname, endpoint->info.udp_client.port); } // resolve name NPT_IpAddress address; NPT_CHECK(address.ResolveName(endpoint->info.udp_client.hostname)); // connect socket NPT_CHECK(sender.Connect(NPT_SocketAddress(address, endpoint->info.udp_client.port))); // get the streams if (input_stream) { NPT_CHECK(sender.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(sender.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; case ENDPOINT_TYPE_TCP_CLIENT: { NPT_TcpClientSocket client; // info if (Options.verbose) { NPT_Debug("connecting to %s on port %d\n", endpoint->info.tcp_client.hostname, endpoint->info.tcp_client.port); } // resolve the name NPT_IpAddress address; NPT_CHECK(address.ResolveName(endpoint->info.tcp_client.hostname)); // connect NPT_CHECK(client.Connect(NPT_SocketAddress(address, endpoint->info.tcp_client.port))); // info if (Options.verbose) { NPT_Debug("connected\n"); } // get the streams if (input_stream) { NPT_CHECK(client.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(client.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; case ENDPOINT_TYPE_MULTICAST_CLIENT: { NPT_UdpMulticastSocket sender; // info if (Options.verbose) { NPT_Debug("sending to %s on port %d\n", endpoint->info.multicast_client.groupname, endpoint->info.multicast_client.port); } // set time to live NPT_CHECK(sender.SetTimeToLive(endpoint->info.multicast_client.ttl)); // resolve name NPT_IpAddress address; NPT_CHECK(address.ResolveName(endpoint->info.multicast_client.groupname)); // connect socket NPT_CHECK(sender.Connect(NPT_SocketAddress(address, endpoint->info.multicast_client.port))); // get the streams if (input_stream) { NPT_CHECK(sender.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(sender.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; case ENDPOINT_TYPE_UDP_SERVER: { NPT_UdpSocket listener; // info if (Options.verbose) { NPT_Debug("listening on port %d", endpoint->info.udp_server.port); } // listen on port, any addr NPT_CHECK(listener.Bind(NPT_SocketAddress(NPT_IpAddress::Any, endpoint->info.udp_server.port))); // get the streams if (input_stream) { NPT_CHECK(listener.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(listener.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; case ENDPOINT_TYPE_TCP_SERVER: { NPT_TcpServerSocket server; NPT_Socket* client; // info if (Options.verbose) { NPT_Debug("waiting for client on port %d\n", endpoint->info.tcp_server.port); } // bind to the address NPT_CHECK(server.Bind(NPT_SocketAddress(NPT_IpAddress::Any, endpoint->info.tcp_server.port))); // wait for connection NPT_CHECK(server.WaitForNewClient(client)); // info if (Options.verbose) { NPT_Debug("client connected\n"); } // get the streams if (input_stream) { NPT_CHECK(client->GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(client->GetOutputStream(*output_stream)); } delete client; return NPT_SUCCESS; } break; case ENDPOINT_TYPE_MULTICAST_SERVER: { NPT_UdpMulticastSocket listener; // info if (Options.verbose) { NPT_Debug("listening on port %d\n", endpoint->info.multicast_server.port); } // listen on port, any addr NPT_CHECK(listener.Bind(NPT_SocketAddress(NPT_IpAddress::Any, endpoint->info.multicast_server.port))); // info if (Options.verbose) { NPT_Debug("joining multicast group %s\n", endpoint->info.multicast_server.groupname); } // resolve name NPT_IpAddress address; NPT_CHECK(address.ResolveName(endpoint->info.multicast_server.groupname)); // join the group NPT_CHECK(listener.JoinGroup(address)); // get the streams if (input_stream) { NPT_CHECK(listener.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(listener.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; case ENDPOINT_TYPE_FILE: { // create a file object NPT_File file(endpoint->info.file.name); if (endpoint->direction == ENDPOINT_DIRECTION_IN) { NPT_CHECK(file.Open(NPT_FILE_OPEN_MODE_READ | NPT_FILE_OPEN_MODE_UNBUFFERED)); } else { NPT_CHECK(file.Open(NPT_FILE_OPEN_MODE_WRITE | NPT_FILE_OPEN_MODE_CREATE| NPT_FILE_OPEN_MODE_UNBUFFERED)); } // get the streams if (input_stream) { NPT_CHECK(file.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(file.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; case ENDPOINT_TYPE_SERIAL_PORT: { // create a serial port object NPT_SerialPort serial_port(endpoint->info.serial_port.name); NPT_CHECK(serial_port.Open(endpoint->info.serial_port.speed)); // get the streams if (input_stream) { NPT_CHECK(serial_port.GetInputStream(*input_stream)); } if (output_stream) { NPT_CHECK(serial_port.GetOutputStream(*output_stream)); } return NPT_SUCCESS; } break; } return NPT_SUCCESS; }