Blame SOURCES/0005-Use-hostname-when-calling-PAM-authentication-module.patch

d7fdbd
From 08c49b78942d40c99fae8c40e7668aa73e1bd695 Mon Sep 17 00:00:00 2001
d7fdbd
From: Martin Sehnoutka <msehnout@redhat.com>
d7fdbd
Date: Tue, 6 Sep 2016 15:01:23 +0200
d7fdbd
Subject: [PATCH 05/59] Use hostname when calling PAM authentication module.
d7fdbd
d7fdbd
Currently the vsftpd passes all logins as IP addresses
d7fdbd
into PAM. This prevents administrators from setting up
d7fdbd
ACLs based on domain (e.g. .example.com). This patch
d7fdbd
enables reverse host lookup and use hostname instead
d7fdbd
of address if there is one.
d7fdbd
---
d7fdbd
 sysdeputil.c | 19 ++++++++++++++++---
d7fdbd
 1 file changed, 16 insertions(+), 3 deletions(-)
d7fdbd
d7fdbd
diff --git a/sysdeputil.c b/sysdeputil.c
d7fdbd
index 06f01f4..b2782da 100644
d7fdbd
--- a/sysdeputil.c
d7fdbd
+++ b/sysdeputil.c
d7fdbd
@@ -16,6 +16,10 @@
d7fdbd
 #include "tunables.h"
d7fdbd
 #include "builddefs.h"
d7fdbd
 
d7fdbd
+/* For gethostbyaddr, inet_addr */
d7fdbd
+#include <netdb.h>
d7fdbd
+#include <arpa/inet.h>
d7fdbd
+
d7fdbd
 /* For Linux, this adds nothing :-) */
d7fdbd
 #include "port/porting_junk.h"
d7fdbd
 
d7fdbd
@@ -323,6 +327,10 @@ vsf_sysdep_check_auth(struct mystr* p_user_str,
d7fdbd
                       const struct mystr* p_remote_host)
d7fdbd
 {
d7fdbd
   int retval = -1;
d7fdbd
+#ifdef PAM_RHOST
d7fdbd
+  struct sockaddr_in sin;
d7fdbd
+  struct hostent *host;
d7fdbd
+#endif
d7fdbd
   pam_item_t item;
d7fdbd
   const char* pam_user_name = 0;
d7fdbd
   struct pam_conv the_conv =
d7fdbd
@@ -346,7 +354,12 @@ vsf_sysdep_check_auth(struct mystr* p_user_str,
d7fdbd
     return 0;
d7fdbd
   }
d7fdbd
 #ifdef PAM_RHOST
d7fdbd
-  retval = pam_set_item(s_pamh, PAM_RHOST, str_getbuf(p_remote_host));
d7fdbd
+  sin.sin_addr.s_addr = inet_addr(str_getbuf(p_remote_host));
d7fdbd
+  host = gethostbyaddr((char*)&sin.sin_addr.s_addr,sizeof(struct in_addr),AF_INET);
d7fdbd
+  if (host != (struct hostent*)0)
d7fdbd
+    retval = pam_set_item(s_pamh, PAM_RHOST, host->h_name);
d7fdbd
+  else
d7fdbd
+    retval = pam_set_item(s_pamh, PAM_RHOST, str_getbuf(p_remote_host));
d7fdbd
   if (retval != PAM_SUCCESS)
d7fdbd
   {
d7fdbd
     (void) pam_end(s_pamh, retval);
d7fdbd
@@ -559,7 +572,7 @@ vsf_sysdep_has_capabilities(void)
d7fdbd
   }
d7fdbd
   return s_runtime_has_caps;
d7fdbd
 }
d7fdbd
-  
d7fdbd
+
d7fdbd
   #ifndef VSF_SYSDEP_HAVE_LIBCAP
d7fdbd
 static int
d7fdbd
 do_checkcap(void)
d7fdbd
@@ -1081,7 +1094,7 @@ vsf_sysutil_recv_fd(const int sock_fd)
d7fdbd
   msg.msg_flags = 0;
d7fdbd
   /* In case something goes wrong, set the fd to -1 before the syscall */
d7fdbd
   p_fd = (int*)CMSG_DATA(CMSG_FIRSTHDR(&msg));
d7fdbd
-  *p_fd = -1;  
d7fdbd
+  *p_fd = -1;
d7fdbd
   retval = recvmsg(sock_fd, &msg, 0);
d7fdbd
   if (retval != 1)
d7fdbd
   {
d7fdbd
-- 
d7fdbd
2.14.4
d7fdbd