void secure_channel_setup(jnx_hashmap *config) { JNX_LOG(DEFAULT_CONTEXT,"Starting secure socket channel...\n"); configuration = config; char *sport = jnx_hash_get(configuration,"SECUREPORT"); JNXCHECK(sport); secure_socket = jnx_socket_tcp_create(AF_INET); ASYNC_START(secure_listener_start,sport); }
size_t secure_channel_send(session *s, char *message, size_t msg_len) { if(s->current_state != SESSION_CONNECTED) { jnx_term_printf_in_color(JNX_COL_RED,"Unable to send message with session\n"); return -1; } jnx_socket *sec = jnx_socket_tcp_create(AF_INET); JNX_LOG(DEFAULT_CONTEXT,"encrypting \n%s\nwith %s\n",message,s->shared_secret); char *buffer = des_encrypt(s->shared_secret,message,msg_len); if(strcmp(jnx_hash_get(configuration,"DEBUG"),"YES") == 0) { jnx_socket_tcp_send(sec,"localhost",s->foriegn_peer->secure_port,buffer,strlen(buffer)); } else { jnx_socket_tcp_send(sec,s->foriegn_peer->ip,s->foriegn_peer->secure_port,buffer,strlen(buffer)); } free(buffer); jnx_socket_destroy(&sec); }
jnx_tcp_listener* jnx_socket_tcp_listener_create(jnx_char *port, jnx_unsigned_int family, jnx_int max_connections) { JNXCHECK(max_connections <= 200); struct addrinfo hints; struct addrinfo *result, *rp; jnx_int on = 1,s; jnx_tcp_listener *l = malloc(sizeof(jnx_tcp_listener)); l->socket = jnx_socket_tcp_create(family); l->hint_exit = 0; memset (&hints, 0, sizeof (struct addrinfo)); hints.ai_family = family; hints.ai_socktype = l->socket->stype; hints.ai_flags = AI_PASSIVE; s = getaddrinfo (NULL, port, &hints, &result); if (s != 0) { fprintf (stderr, "getaddrinfo: %s\n", gai_strerror (s)); JNXFAIL("getaddrinfo failure"); } s = ioctl(l->socket->socket,FIONBIO,(char*)&on); for (rp = result; rp != NULL; rp = rp->ai_next) { JNXCHECK(s == 0); s = bind (l->socket->socket, rp->ai_addr, rp->ai_addrlen); if (s == 0) { break; } jnx_socket_tcp_listener_destroy(&l); JNXFAIL("bind failure"); } JNXCHECK(l->socket->socket); s = listen(l->socket->socket,max_connections); JNXCHECK(s == 0); l->ufds[0].fd = l->socket->socket; l->ufds[0].events = POLLIN; l->poll_timeout = 500; l->nfds = 1; return l; }
size_t jnx_http_request(JNX_HTTP_TYPE type, const jnx_char *hostname, const jnx_char *page, jnx_char *args, jnx_uint8 **out_reply,jnx_size *out_len) { JNXCHECK(hostname); JNXCHECK(page); JNXCHECK(type == JNX_HTTP_POST || type == JNX_HTTP_GET); jnx_char *verb = NULL; jnx_char *out_ip; switch(type) { case JNX_HTTP_POST: verb = "POST"; break; case JNX_HTTP_GET: verb = "GET"; break; } JNXCHECK(verb); jnx_unsigned_int out_family; jnx_int32 ret = jnx_network_hostname_to_ip(AF_INET,(jnx_char*)hostname,&out_ip,&out_family); JNXCHECK(ret == 0); jnx_socket *sock = jnx_socket_tcp_create(out_family); JNXCHECK(sock); jnx_char sendbuffer[2048]; snprintf(sendbuffer,sizeof(sendbuffer), "%s %s HTTP/1.0\r\n" "Host: %s\r\n" "Content-type: application/x-www-form-urlencoded\r\n" "Content-length: %zu\r\n\r\n" "%s\r\n",verb, page, hostname, strlen(args),args); jnx_size l = jnx_socket_tcp_send_with_receipt(sock, (jnx_char*)hostname,"80",(jnx_uint8*)sendbuffer, (jnx_size)strlen(sendbuffer),out_reply); *out_len = l; if(!l) { return JNX_HTTP_STATE_UNKNOWN; } return JNX_HTTP_STATE_OKAY; }