s3-util: Add a get_remote_hostname() function.
authorAndreas Schneider <asn@samba.org>
Wed, 8 Jun 2011 12:50:20 +0000 (14:50 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 4 Jul 2011 08:27:55 +0000 (18:27 +1000)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
source3/Makefile.in
source3/include/proto.h
source3/lib/util_sock.c
source3/wscript_build

index aaea79d0f3e2914b8572ba37d426e241d24a7cd4..f674500bca19e920ba876d34ab8d503355f087de 100644 (file)
@@ -436,7 +436,7 @@ CRYPTO_OBJ = ../lib/crypto/crc32.o ../lib/crypto/md5.o \
                         ../lib/crypto/sha256.o ../lib/crypto/hmacsha256.o \
                         ../lib/crypto/aes.o ../lib/crypto/rijndael-alg-fst.o
 
-LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) \
+LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) $(LIBTSOCKET_OBJ) \
          lib/messages.o librpc/gen_ndr/ndr_messaging.o lib/messages_local.o \
          lib/messages_ctdbd.o lib/ctdb_packet.o lib/ctdbd_conn.o \
          ../lib/socket/interfaces.o lib/memcache.o \
@@ -576,7 +576,7 @@ LIBTSOCKET_OBJ = ../lib/tsocket/tsocket.o \
 CLDAP_OBJ = libads/cldap.o \
        ../libcli/cldap/cldap.o \
        ../lib/util/idtree.o \
-       $(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ) $(LIBTSOCKET_OBJ)
+       $(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ)
 
 TLDAP_OBJ = lib/tldap.o lib/tldap_util.o lib/util_tsock.o
 
@@ -1038,7 +1038,7 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASSWD_UTIL_OBJ) $(PASSCHANGE_OBJ) \
                rpc_client/init_lsa.o
 
 PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \
-               $(LIBSAMBA_OBJ) $(LIBTSOCKET_OBJ) \
+               $(LIBSAMBA_OBJ) \
                $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) \
                $(LIBCLI_LDAP_NDR_OBJ) \
                $(DRSUAPI_OBJ) $(LIBNDR_GEN_OBJ0) \
@@ -1327,7 +1327,7 @@ PAM_SMBPASS_OBJ_0 = pam_smbpass/pam_smb_auth.o pam_smbpass/pam_smb_passwd.o \
 PAM_SMBPASS_OBJ = $(PAM_SMBPASS_OBJ_0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
                $(SMBLDAP_OBJ) $(LIBSAMBA_OBJ) \
                $(DRSUAPI_OBJ) $(LIBNDR_GEN_OBJ0) \
-               $(LIBTSOCKET_OBJ) $(PAM_ERRORS_OBJ)
+               $(PAM_ERRORS_OBJ)
 
 IDMAP_RW_OBJ = winbindd/idmap_rw.o
 
@@ -1505,7 +1505,7 @@ NTLM_AUTH_OBJ = ${NTLM_AUTH_OBJ1} $(LIBSAMBA_OBJ) $(POPT_LIB_OBJ) \
                ../lib/util/asn1.o ../libcli/auth/spnego_parse.o libsmb/clikrb5.o ../libcli/auth/krb5_wrap.o libads/kerberos.o \
                libsmb/samlogon_cache.o \
                $(LIBADS_SERVER_OBJ) \
-               $(PASSDB_OBJ) $(LIBTSOCKET_OBJ) $(GROUPDB_OBJ) \
+               $(PASSDB_OBJ) $(GROUPDB_OBJ) \
                $(SMBLDAP_OBJ) $(LIBNMB_OBJ) \
                $(WBCOMMON_OBJ) \
                $(LIBCLI_LDAP_NDR_OBJ) \
index 36ba416e7862d91e33742e81e10b198898554538..9e6cfc1c08df33f03bfbbb33699dff3a4a65fb6c 100644 (file)
@@ -788,6 +788,13 @@ NTSTATUS open_socket_out_defer_recv(struct tevent_req *req, int *pfd);
 int open_udp_socket(const char *host, int port);
 const char *get_peer_name(int fd, bool force_lookup);
 const char *get_peer_addr(int fd, char *addr, size_t addr_len);
+
+struct tsocket_address;
+
+int get_remote_hostname(const struct tsocket_address *remote_address,
+                       char **name,
+                       TALLOC_CTX *mem_ctx);
+
 int create_pipe_sock(const char *socket_dir,
                     const char *socket_name,
                     mode_t dir_perms);
index 9b8632b181a45d8646a97610cf559483a4a8de5c..a35bd58d11d415e77b943a57ff725ef15e39b174 100644 (file)
@@ -27,6 +27,7 @@
 #include "lib/socket/interfaces.h"
 #include "../lib/util/tevent_unix.h"
 #include "../lib/util/tevent_ntstatus.h"
+#include "../lib/tsocket/tsocket.h"
 
 const char *client_name(int fd)
 {
@@ -1126,6 +1127,113 @@ const char *get_peer_addr(int fd, char *addr, size_t addr_len)
        return get_peer_addr_internal(fd, addr, addr_len, NULL, NULL);
 }
 
+int get_remote_hostname(const struct tsocket_address *remote_address,
+                       char **name,
+                       TALLOC_CTX *mem_ctx)
+{
+       char name_buf[MAX_DNS_NAME_LENGTH];
+       char tmp_name[MAX_DNS_NAME_LENGTH];
+       struct name_addr_pair nc;
+       struct sockaddr_storage ss;
+       socklen_t len;
+       int rc;
+
+       if (!lp_hostname_lookups()) {
+               nc.name = tsocket_address_inet_addr_string(remote_address,
+                                                          mem_ctx);
+               if (nc.name == NULL) {
+                       return -1;
+               }
+
+               len = tsocket_address_bsd_sockaddr(remote_address,
+                                                  (struct sockaddr *) &nc.ss,
+                                                  sizeof(struct sockaddr_storage));
+               if (len < 0) {
+                       return -1;
+               }
+
+               store_nc(&nc);
+               lookup_nc(&nc);
+
+               if (nc.name == NULL) {
+                       *name = talloc_strdup(mem_ctx, "UNKNOWN");
+               } else {
+                       *name = talloc_strdup(mem_ctx, nc.name);
+               }
+               return 0;
+       }
+
+       lookup_nc(&nc);
+
+       ZERO_STRUCT(ss);
+
+       len = tsocket_address_bsd_sockaddr(remote_address,
+                                          (struct sockaddr *) &ss,
+                                          sizeof(struct sockaddr_storage));
+       if (len < 0) {
+               return -1;
+       }
+
+       /* it might be the same as the last one - save some DNS work */
+       if (sockaddr_equal((struct sockaddr *)&ss, (struct sockaddr *)&nc.ss)) {
+               if (nc.name == NULL) {
+                       *name = talloc_strdup(mem_ctx, "UNKNOWN");
+               } else {
+                       *name = talloc_strdup(mem_ctx, nc.name);
+               }
+               return 0;
+       }
+
+       /* Look up the remote host name. */
+       rc = sys_getnameinfo((struct sockaddr *) &ss,
+                            len,
+                            name_buf,
+                            sizeof(name_buf),
+                            NULL,
+                            0,
+                            0);
+       if (rc < 0) {
+               char *p;
+
+               p = tsocket_address_inet_addr_string(remote_address, mem_ctx);
+               if (p == NULL) {
+                       return -1;
+               }
+
+               DEBUG(1,("getnameinfo failed for %s with error %s\n",
+                        p,
+                        gai_strerror(rc)));
+               strlcpy(name_buf, p, sizeof(name_buf));
+
+               talloc_free(p);
+       } else {
+               if (!matchname(name_buf, (struct sockaddr *)&ss, len)) {
+                       DEBUG(0,("matchname failed on %s\n", name_buf));
+                       strlcpy(name_buf, "UNKNOWN", sizeof(name_buf));
+               }
+       }
+
+       strlcpy(tmp_name, name_buf, sizeof(tmp_name));
+       alpha_strcpy(name_buf, tmp_name, "_-.", sizeof(name_buf));
+       if (strstr(name_buf,"..")) {
+               strlcpy(name_buf, "UNKNOWN", sizeof(name_buf));
+       }
+
+       nc.name = name_buf;
+       nc.ss = ss;
+
+       store_nc(&nc);
+       lookup_nc(&nc);
+
+       if (nc.name == NULL) {
+               *name = talloc_strdup(mem_ctx, "UNKOWN");
+       } else {
+               *name = talloc_strdup(mem_ctx, nc.name);
+       }
+
+       return 0;
+}
+
 /*******************************************************************
  Create protected unix domain socket.
 
index 301d851dd38b94197b6b114ca4ac0007864e1a0b..33f242c9fe2df6dfe1361ded74a8a066c61ba113 100755 (executable)
@@ -800,7 +800,7 @@ bld.SAMBA3_SUBSYSTEM('KRBCLIENT',
 
 bld.SAMBA3_SUBSYSTEM('samba3core',
                    source=LIB_SRC,
-                   deps='LIBCRYPTO ndr security NDR_SECURITY samba-util NDR_MESSAGING LIBASYNC_REQ tdb-wrap3 UTIL_TDB UTIL_PW SAMBA_VERSION KRB5_WRAP flag_mapping util_reg PTHREADPOOL interfaces cap string_init param util_str CHARSET3 namearray dbwrap_util util_sec util_malloc memcache ccan errors3',
+                   deps='LIBTSOCKET LIBCRYPTO ndr security NDR_SECURITY samba-util NDR_MESSAGING LIBASYNC_REQ tdb-wrap3 UTIL_TDB UTIL_PW SAMBA_VERSION KRB5_WRAP flag_mapping util_reg PTHREADPOOL interfaces cap string_init param util_str CHARSET3 namearray dbwrap_util util_sec util_malloc memcache ccan errors3',
                    vars=locals())
 
 bld.SAMBA3_LIBRARY('smbd_shim',