Get hostnames with reverse DNS
This commit is contained in:
		
							
								
								
									
										46
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								src/client.c
									
									
									
									
									
								
							| @@ -295,10 +295,7 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int | ||||
|         if (ret != 0) { | ||||
|             if (ret < 0) { | ||||
|                 goto abort; | ||||
|             } else { | ||||
|                 sprintf(err_msg, "Unable to communicate with PHP-FPM."); | ||||
|             } | ||||
|             res.status = http_get_status(502); | ||||
|             goto respond; | ||||
|         } | ||||
|         char *status = http_get_header_field(&res.hdr, "Status"); | ||||
| @@ -427,15 +424,39 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int | ||||
| int client_connection_handler(sock *client, unsigned long client_num) { | ||||
|     struct timespec begin, end; | ||||
|     int ret, req_num; | ||||
|     char buf[16]; | ||||
|     char buf[1024]; | ||||
|  | ||||
|     clock_gettime(CLOCK_MONOTONIC, &begin); | ||||
|  | ||||
|     // TODO get geoip data for ip address | ||||
|     // TODO Reverse DNS request | ||||
|     client_host_str = client_addr_str; | ||||
|     if (dns_server != NULL) { | ||||
|         sprintf(buf, "dig @%s +short +time=1 -x %s", dns_server, client_addr_str); | ||||
|         FILE *dig = popen(buf, "r"); | ||||
|         if (dig == NULL) { | ||||
|             fprintf(stderr, ERR_STR "Unable to start dig: %s" CLR_STR "\n", strerror(errno)); | ||||
|             goto dig_err; | ||||
|         } | ||||
|         unsigned long read = fread(buf, 1, sizeof(buf), dig); | ||||
|         ret = pclose(dig); | ||||
|         if (ret != 0) { | ||||
|             fprintf(stderr, ERR_STR "Dig terminated with exit code %i" CLR_STR "\n", ret); | ||||
|             goto dig_err; | ||||
|         } | ||||
|         char *ptr = memchr(buf, '\n', read); | ||||
|         if (ptr == buf || ptr == NULL) { | ||||
|             goto dig_err; | ||||
|         } | ||||
|         ptr[-1] = 0; | ||||
|         client_host_str = malloc(strlen(buf) + 1); | ||||
|         strcpy(client_host_str, buf); | ||||
|     } else { | ||||
|         dig_err: | ||||
|         client_host_str = NULL; | ||||
|     } | ||||
|  | ||||
|     print("Connection accepted from %s (%s) [%s]", client_addr_str, client_host_str, "N/A"); | ||||
|     // TODO get geoip data for ip address | ||||
|  | ||||
|     print("Connection accepted from %s %s%s%s[%s]", client_addr_str, client_host_str != NULL ? "(" : "", | ||||
|           client_host_str != NULL ? client_host_str : "", client_host_str != NULL ? ") " : "", "N/A"); | ||||
|  | ||||
|     client_timeout.tv_sec = CLIENT_TIMEOUT; | ||||
|     client_timeout.tv_usec = 0; | ||||
| @@ -524,9 +545,18 @@ int client_handler(sock *client, unsigned long client_num, struct sockaddr_in6 * | ||||
|  | ||||
|     ret = client_connection_handler(client, client_num); | ||||
|     free(client_addr_str_ptr); | ||||
|     client_addr_str_ptr = NULL; | ||||
|     free(server_addr_str_ptr); | ||||
|     server_addr_str_ptr = NULL; | ||||
|     if (client_host_str != NULL) { | ||||
|         free(client_host_str); | ||||
|         client_host_str = NULL; | ||||
|     } | ||||
|     free(log_conn_prefix); | ||||
|     log_conn_prefix = NULL; | ||||
|     free(log_req_prefix); | ||||
|     log_req_prefix = NULL; | ||||
|     free(log_client_prefix); | ||||
|     log_client_prefix = NULL; | ||||
|     return ret; | ||||
| } | ||||
|   | ||||
| @@ -118,17 +118,8 @@ int fastcgi_init(fastcgi_conn *conn, unsigned int client_num, unsigned int req_n | ||||
|     addr = (struct sockaddr_in6 *) &addr_storage; | ||||
|     sprintf(buf0, "%i", addr->sin6_port); | ||||
|     param_ptr = fastcgi_add_param(param_ptr, "REMOTE_PORT", buf0); | ||||
|  | ||||
|     char addr_str[INET6_ADDRSTRLEN]; | ||||
|     char *addr_ptr; | ||||
|     inet_ntop(addr->sin6_family, (void *) &addr->sin6_addr, addr_str, INET6_ADDRSTRLEN); | ||||
|     if (strncmp(addr_str, "::ffff:", 7) == 0) { | ||||
|         addr_ptr = addr_str + 7; | ||||
|     } else { | ||||
|         addr_ptr = addr_str; | ||||
|     } | ||||
|     param_ptr = fastcgi_add_param(param_ptr, "REMOTE_ADDR", addr_ptr); | ||||
|     param_ptr = fastcgi_add_param(param_ptr, "REMOTE_HOST", addr_ptr); | ||||
|     param_ptr = fastcgi_add_param(param_ptr, "REMOTE_ADDR", client_addr_str); | ||||
|     param_ptr = fastcgi_add_param(param_ptr, "REMOTE_HOST", client_host_str != NULL ? client_host_str : client_addr_str); | ||||
|     //param_ptr = fastcgi_add_param(param_ptr, "REMOTE_IDENT", ""); | ||||
|     //param_ptr = fastcgi_add_param(param_ptr, "REMOTE_USER", ""); | ||||
|  | ||||
| @@ -287,12 +278,12 @@ int fastcgi_header(fastcgi_conn *conn, http_res *res, char *err_msg) { | ||||
|             res->status = http_get_status(502); | ||||
|             sprintf(err_msg, "Unable to communicate with PHP-FPM."); | ||||
|             print(ERR_STR "Unable to receive from PHP-FPM: %s" CLR_STR, strerror(errno)); | ||||
|             return -1; | ||||
|             return 1; | ||||
|         } else if (ret != sizeof(header)) { | ||||
|             res->status = http_get_status(502); | ||||
|             sprintf(err_msg, "Unable to communicate with PHP-FPM."); | ||||
|             print(ERR_STR "Unable to receive from PHP-FPM" CLR_STR); | ||||
|             return -1; | ||||
|             return 1; | ||||
|         } | ||||
|         req_id = (header.requestIdB1 << 8) | header.requestIdB0; | ||||
|         content_len = (header.contentLengthB1 << 8) | header.contentLengthB0; | ||||
| @@ -303,13 +294,13 @@ int fastcgi_header(fastcgi_conn *conn, http_res *res, char *err_msg) { | ||||
|             sprintf(err_msg, "Unable to communicate with PHP-FPM."); | ||||
|             print(ERR_STR "Unable to receive from PHP-FPM: %s" CLR_STR, strerror(errno)); | ||||
|             free(content); | ||||
|             return -1; | ||||
|             return 1; | ||||
|         } else if (ret != (content_len + header.paddingLength)) { | ||||
|             res->status = http_get_status(502); | ||||
|             sprintf(err_msg, "Unable to communicate with PHP-FPM."); | ||||
|             print(ERR_STR "Unable to receive from PHP-FPM" CLR_STR); | ||||
|             free(content); | ||||
|             return -1; | ||||
|             return 1; | ||||
|         } | ||||
|  | ||||
|         if (req_id != conn->req_id) { | ||||
| @@ -329,7 +320,7 @@ int fastcgi_header(fastcgi_conn *conn, http_res *res, char *err_msg) { | ||||
|             close(conn->socket); | ||||
|             conn->socket = 0; | ||||
|             free(content); | ||||
|             return -2; | ||||
|             return 1; | ||||
|         } else if (header.type == FCGI_STDERR) { | ||||
|             err = err || fastcgi_php_error(content, content_len, err_msg); | ||||
|         } else if (header.type == FCGI_STDOUT) { | ||||
| @@ -342,7 +333,7 @@ int fastcgi_header(fastcgi_conn *conn, http_res *res, char *err_msg) { | ||||
|     } | ||||
|     if (err) { | ||||
|         res->status = http_get_status(500); | ||||
|         return -3; | ||||
|         return 2; | ||||
|     } | ||||
|  | ||||
|     conn->out_buf = content; | ||||
|   | ||||
| @@ -189,10 +189,11 @@ int main(int argc, const char *argv[]) { | ||||
|         const char *arg = argv[i]; | ||||
|         unsigned long len = strlen(arg); | ||||
|         if ((len == 2 && strncmp(arg, "-h", 2) == 0) || (len == 6 && strncmp(arg, "--help", 6) == 0)) { | ||||
|             printf("Usage: necronda-server [-h] -w <PATH> -c <CERT-FILE> -p <KEY-FILE> [-g <DB-FILE>]\n" | ||||
|             printf("Usage: necronda-server [-h] -w <PATH> -c <CERT-FILE> -p <KEY-FILE> [-g <DB-FILE>] [-d <DNS-SERVER>]\n" | ||||
|                    "\n" | ||||
|                    "Options:\n" | ||||
|                    "  -c, --cert <CERT-FILE>    path to the full chain certificate file\n" | ||||
|                    "  -d, --dns <DNS-SERVER>    ip address or hostname of a DNS server for dig\n" | ||||
|                    "  -g, --geoip <DB-FILE>     path to a Maxmind GeoIP Database file\n" | ||||
|                    "  -h, --help                print this dialogue\n" | ||||
|                    "  -p, --privkey <KEY-FILE>  path to the private key file\n" | ||||
| @@ -222,6 +223,12 @@ int main(int argc, const char *argv[]) { | ||||
|                 return 1; | ||||
|             } | ||||
|             geoip_file = argv[++i]; | ||||
|         } else if ((len == 2 && strncmp(arg, "-d", 2) == 0) || (len == 5 && strncmp(arg, "--dns", 5) == 0)) { | ||||
|             if (i == argc - 1) { | ||||
|                 fprintf(stderr, ERR_STR "Unable to parse argument %s, usage: --dns <DNS-SERVER>" CLR_STR "\n", arg); | ||||
|                 return 1; | ||||
|             } | ||||
|             dns_server = argv[++i]; | ||||
|         } else { | ||||
|             fprintf(stderr, ERR_STR "Unable to parse argument '%s'" CLR_STR "\n", arg); | ||||
|             return 1; | ||||
|   | ||||
| @@ -66,7 +66,7 @@ | ||||
| int sockets[NUM_SOCKETS]; | ||||
| pid_t children[MAX_CHILDREN]; | ||||
|  | ||||
| const char *cert_file, *key_file, *webroot_base, *geoip_file; | ||||
| const char *cert_file, *key_file, *webroot_base, *geoip_file, *dns_server; | ||||
|  | ||||
| typedef struct { | ||||
|     unsigned int enc:1; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user