Log incoming IP address when accepting a connection
authorJennifer Richards <jennifer@painless-security.com>
Thu, 26 Apr 2018 16:05:15 +0000 (12:05 -0400)
committerJennifer Richards <jennifer@painless-security.com>
Thu, 26 Apr 2018 16:05:15 +0000 (12:05 -0400)
common/tr_socket.c
include/tr_socket.h
mon/mons.c
tid/tids.c
tr/tr_trp.c
trp/trp_conn.c

index 7f1c917..1bb3cc2 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <tr_debug.h>
 #include <tr_socket.h>
 
 #include <tr_debug.h>
 #include <tr_socket.h>
+#include <errno.h>
 
 /**
  * Open sockets on all interface addresses
 
 /**
  * Open sockets on all interface addresses
@@ -137,3 +138,63 @@ nfds_t tr_sock_listen_all(unsigned int port, int *fd_out, nfds_t max_fd)
   return n_opened;
 }
 
   return n_opened;
 }
 
+/**
+ * Extract a string-formatted socket address from a struct sockaddr
+ *
+ * @param s
+ * @param dst pointer to allocated space of at least INET6_ADDRSLEN bytes
+ * @param dst_len size of space allocated at dst
+ * @return pointer to dst or null on error
+ */
+static const char *tr_sock_ip_address(struct sockaddr *s, char *dst, size_t dst_len)
+{
+  switch (s->sa_family) {
+    case AF_INET:
+      inet_ntop(AF_INET,
+                &(((struct sockaddr_in *)s)->sin_addr),
+                dst,
+                (socklen_t) dst_len);
+      break;
+
+    case AF_INET6:
+      inet_ntop(AF_INET6,
+                &(((struct sockaddr_in6 *)s)->sin6_addr),
+                dst,
+                (socklen_t) dst_len);
+      break;
+
+    default:
+      snprintf(dst, dst_len, "addr family %u", s->sa_family);
+      break;
+  }
+
+  return dst;
+}
+
+/**
+ * Accept a socket connection
+ *
+ * @param sock
+ * @return -1 on error, connection fd on success
+ */
+int tr_sock_accept(int sock)
+{
+  int conn = -1;
+  struct sockaddr_storage peeraddr;
+  socklen_t addr_len = sizeof(peeraddr);
+  char peeraddr_string[INET6_ADDRSTRLEN];
+  char err[80];
+
+  if (0 > (conn = accept(sock, (struct sockaddr *)&(peeraddr), &addr_len))) {
+    if (strerror_r(errno, err, sizeof(err)))
+      snprintf(err, sizeof(err), "errno = %d", errno);
+    tr_err("tr_sock_accept: Unable to accept connection: %s", err);
+  } else {
+    tr_notice("tr_sock_accept: Incoming connection on fd %d from %s",
+              conn,
+              tr_sock_ip_address((struct sockaddr *)&peeraddr,
+                                 peeraddr_string,
+                                 sizeof(peeraddr_string)));
+  }
+  return conn;
+}
index 064c6fc..e90a912 100644 (file)
@@ -37,7 +37,9 @@
 
 #include <stdlib.h>
 #include <poll.h> // for nfds_t
 
 #include <stdlib.h>
 #include <poll.h> // for nfds_t
+#include <sys/socket.h>
 
 nfds_t tr_sock_listen_all(unsigned int port, int *fd_out, nfds_t max_fd);
 
 nfds_t tr_sock_listen_all(unsigned int port, int *fd_out, nfds_t max_fd);
+int tr_sock_accept(int sock);
 
 #endif //TRUST_ROUTER_TR_SOCKET_H
 
 #endif //TRUST_ROUTER_TR_SOCKET_H
index f2e69c5..cb70d3b 100644 (file)
@@ -225,8 +225,8 @@ int mons_accept(MONS_INSTANCE *mons, int listen)
   int conn=-1;
   int pid=-1;
 
   int conn=-1;
   int pid=-1;
 
-  if (0 > (conn = accept(listen, NULL, NULL))) {
-    perror("Error from monitoring interface accept()");
+  if (0 > (conn = tr_sock_accept(listen))) {
+    tr_err("mons_accept: Error accepting connection");
     return 1;
   }
 
     return 1;
   }
 
index 6a5b172..e780a22 100644 (file)
@@ -399,8 +399,8 @@ int tids_accept(TIDS_INSTANCE *tids, int listen)
   int pipe_fd[2];
   struct tid_process tp = {0};
 
   int pipe_fd[2];
   struct tid_process tp = {0};
 
-  if (0 > (conn = accept(listen, NULL, NULL))) {
-    perror("Error from TIDS Server accept()");
+  if (0 > (conn = tr_sock_accept(listen))) {
+    tr_err("tids_accept: Error accepting connection");
     return 1;
   }
 
     return 1;
   }
 
index e075d58..ed276b0 100644 (file)
@@ -114,7 +114,7 @@ static int tr_trps_gss_handler(gss_name_t client_name, gss_buffer_t gss_name,
 
   tr_debug("tr_trps_gss_handler()");
 
 
   tr_debug("tr_trps_gss_handler()");
 
-  if ((!client_name) || (!gss_name) || (!trps) || (!cfg_mgr)) {
+  if ((!client_name) || (!trps) || (!cfg_mgr)) {
     tr_debug("tr_trps_gss_handler: Bad parameters.");
     return -1;
   }
     tr_debug("tr_trps_gss_handler: Bad parameters.");
     return -1;
   }
@@ -881,7 +881,11 @@ void tr_config_changed(TR_CFG *new_cfg, void *cookie)
     tr_debug("tr_config_changed: freeing tr->mons->authorized_gss_names");
     tr_gss_names_free(tr->mons->authorized_gss_names);
   }
     tr_debug("tr_config_changed: freeing tr->mons->authorized_gss_names");
     tr_gss_names_free(tr->mons->authorized_gss_names);
   }
-  tr->mons->authorized_gss_names = tr_gss_names_dup(tr->mons, new_cfg->internal->monitoring_credentials);
+  if (new_cfg->internal->monitoring_credentials != NULL) {
+    tr->mons->authorized_gss_names = tr_gss_names_dup(tr->mons, new_cfg->internal->monitoring_credentials);
+  } else {
+    tr->mons->authorized_gss_names = tr_gss_names_new(tr->mons);
+  }
   if (tr->mons->authorized_gss_names == NULL) {
     tr_err("tr_config_changed: Error configuring monitoring credentials");
   }
   if (tr->mons->authorized_gss_names == NULL) {
     tr_err("tr_config_changed: Error configuring monitoring credentials");
   }
index 64ddf3c..35ea2cb 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <tr_debug.h>
 #include <trp_internal.h>
 
 #include <tr_debug.h>
 #include <trp_internal.h>
+#include <tr_socket.h>
 
 /* Threading note: mutex lock is only used for protecting get_status() and set_status().
  * If needed, locking for other operations (notably adding/removing connections) must be managed
 
 /* Threading note: mutex lock is only used for protecting get_status() and set_status().
  * If needed, locking for other operations (notably adding/removing connections) must be managed
@@ -344,10 +345,10 @@ TRP_CONNECTION *trp_connection_accept(TALLOC_CTX *mem_ctx, int listen, TR_NAME *
   int conn_fd=-1;
   TRP_CONNECTION *conn=NULL;
 
   int conn_fd=-1;
   TRP_CONNECTION *conn=NULL;
 
-  conn_fd = accept(listen, NULL, NULL);
+  conn_fd = tr_sock_accept(listen);
 
   if (0 > conn_fd) {
 
   if (0 > conn_fd) {
-    tr_notice("trp_connection_accept: accept() returned error.");
+    tr_notice("trp_connection_accept: Error accepting connection.");
     return NULL;
   }
   conn=trp_connection_new(mem_ctx);
     return NULL;
   }
   conn=trp_connection_new(mem_ctx);