<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.32.2">
</HEAD>
<BODY>
On Tue, 2011-08-09 at 16:57 +0200, Mat&#283;j Cepl wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
<A HREF="https://bugzilla.redhat.com/469357">https://bugzilla.redhat.com/469357</A>
Patch by Steve Grubb &lt;sgrubb at redhat dot com&gt;

Signed-off-by: Mat&#283;j Cepl &lt;<A HREF="mailto:mcepl@redhat.com">mcepl@redhat.com</A>&gt;
---
 configure.ac    |   24 +++++++++++++++++++++++-
 greeter/greet.c |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletions(-)

diff --git a/configure.ac b/configure.ac
index 0c79999..f55455a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -145,6 +145,28 @@ if test &quot;x$USE_SELINUX&quot; != &quot;xno&quot; ; then
     )
 fi
 
+AC_ARG_WITH(libaudit, AS_HELP_STRING([--with-libaudit],
+        [Add Linux audit support (default=auto)]),
+    [with_libaudit=&quot;$withval&quot;], [with_libaudit=auto])
+
+# Check for Linux auditing API
+#
+# libaudit detection
+if test x$with_libaudit = xno ; then
+    have_libaudit=no;
+else
+    # See if we have audit daemon library
+    AC_CHECK_LIB(audit, audit_log_user_message,
+                 have_libaudit=yes, have_libaudit=no)
+fi
+
+AM_CONDITIONAL(HAVE_LIBAUDIT, test x$have_libaudit = xyes)
</PRE>
</BLOCKQUOTE>
This AM_CONDITIONAL is dead code. It would be used in Makefile.am to skip a section of the makefile (perhaps I missed it).
<BLOCKQUOTE TYPE=CITE>
<PRE>
+
+if test x$have_libaudit = xyes ; then
+    XDMGREET_LIBS=&quot;$XDMGREET_LIBS -laudit&quot;
+    AC_DEFINE(HAVE_LIBAUDIT,1,[linux audit support])
+fi
+
</PRE>
</BLOCKQUOTE>
Sorry, I had some more time to look at it :-)<BR>
<BR>
Assuming the default is &quot;auto&quot; and is acceptable for most users, there is a missing behaviour. When a user specifies &quot;--with-libaudit&quot;, he really wants it. If it is not installed, there is no feedback and it silently fails. So there is no difference between &quot;auto&quot; and &quot;yes&quot;. This is why you see statements similar to this:
<BLOCKQUOTE>
<PRE>
AC_MSG_ERROR([Linux Audit support requested, but audit_log_user_message not found.])
</PRE>
</BLOCKQUOTE>
This tells the user &quot;you want libaudit, but it's nowhere to be found&quot;. PAM and SELinux options are coded this way, it would be more consistent to have Linux Audit option coded the same way.<BR>
<BR>
This is the code I unit tested. It provides a complete implementation for the libaudit option. Some variable names may not match the C code patch.<BR>
<BR>
<BLOCKQUOTE>
<PRE>
# Check for Linux Audit support
AC_ARG_WITH(libaudit, AS_HELP_STRING([--with-libaudit],
        [Add support for Linux Audit (default is autodetected)]),
        [USE_LINUX_AUDIT=$withval], [USE_LINUX_AUDIT=auto])
if test &quot;x$USE_LINUX_AUDIT&quot; != &quot;xno&quot; ; then
&nbsp;&nbsp;&nbsp; AC_CHECK_LIB(audit, audit_log_user_message,
        [AC_DEFINE(USE_LINUX_AUDIT,1,[Use Linux Audit support])]
        XDMGREET_LIBS=&quot;$XDMGREET_LIBS -laudit&quot;,
        [AS_IF([test &quot;x$USE_LINUX_AUDIT&quot; = &quot;xyes&quot;],
        &nbsp;&nbsp;&nbsp; [AC_MSG_ERROR([Linux Audit support requested, but audit_log_user_message not found.])]
        )]
&nbsp;&nbsp;&nbsp; )
fi
</PRE>
</BLOCKQUOTE>
<BR>
<BLOCKQUOTE TYPE=CITE>
<PRE>
 # FIXME: Find better test for which OS'es use su -m  - for now, just try to
 # mirror the Imakefile setting of:
 # if  defined(OpenBSDArchitecture) || defined(NetBSDArchitecture) || defined(FreeBSDArchitecture) || defined(DarwinArchitecture)
@@ -171,7 +193,7 @@ AC_SUBST(SU)
 
 # Define a configure option to locate a special file (/dev/random or /dev/urandom)
 # that serves as a random or a pseudorandom number generator
-AC_ARG_WITH(random-device, AS_HELP_STRING([--with-random-device\[=&lt;pathname&gt;\]],
+AC_ARG_WITH(random-device, AS_HELP_STRING([--with-random-device=&lt;pathname&gt;],
         [Use &lt;pathname&gt; as a source of randomness (default is auto-detected)]),
         [USE_DEVICE=&quot;$withval&quot;], [USE_DEVICE=&quot;auto&quot;])
 if test x$USE_DEVICE != xno ; then
diff --git a/greeter/greet.c b/greeter/greet.c
index 87d2a83..2d26c69 100644
--- a/greeter/greet.c
+++ b/greeter/greet.c
@@ -86,6 +86,13 @@ from The Open Group.
 # endif
 #endif
 
+#ifdef HAVE_LIBAUDIT
+#include &lt;libaudit.h&gt;
+#include &lt;pwd.h&gt;
+#else
+#define log_to_audit_system(l,h,s)   do { ; } while (0)
+#endif
+
 #include &lt;string.h&gt;
 
 #if defined(SECURE_RPC) &amp;&amp; defined(sun)
@@ -415,6 +422,29 @@ FailedLogin (struct display *d, const char *username)
     DrawFail (login);
 }
 
+#ifdef USE_PAM
+#ifdef HAVE_LIBAUDIT
+static void
+log_to_audit_system(const pam_handle_t *pamhp, int success)
+{
+        struct passwd *pw = NULL;
+        char *hostname = NULL, *tty = NULL, *login=NULL;
+        int audit_fd;
+
+        audit_fd = audit_open();
+        pam_get_item(pamhp, PAM_RHOST, &amp;hostname);
+        pam_get_item(pamhp, PAM_TTY, &amp;tty);
+        pam_get_item(pamhp, PAM_USER, &amp;login);
+        if (login)
+                pw = getpwnam(login);
+                audit_log_acct_message(audit_fd, AUDIT_USER_LOGIN,
+                        NULL, &quot;login&quot;, login ? login : &quot;(unknown)&quot;,
+                        pw ? pw-&gt;pw_uid : -1, hostname, NULL, tty, success);
+        close(audit_fd);
+}
+#endif
+#endif
+
 _X_EXPORT
 greet_user_rtn GreetUser(
     struct display          *d,
@@ -600,6 +630,7 @@ greet_user_rtn GreetUser(
         if ((pam_error == PAM_SUCCESS) &amp;&amp; (Verify (d, greet, verify))) {
             SetPrompt (login, 1, &quot;Login Successful&quot;, LOGIN_TEXT_INFO, False);
             SetValue (login, 1, NULL);
+            log_to_audit_system(*pamhp, 1);
             break;
         } else {
             /* Try to fill in username for failed login error log */
@@ -611,6 +642,7 @@ greet_user_rtn GreetUser(
                                          (void *) &amp;username));
             }
             FailedLogin (d, username);
+            log_to_audit_system(*pamhp, 0);
             RUN_AND_CHECK_PAM_ERROR(pam_end,
                                     (*pamhp, pam_error));
         }
-- 
1.7.6

_______________________________________________
<A HREF="mailto:xorg-devel@lists.x.org">xorg-devel@lists.x.org</A>: X.Org development
Archives: <A HREF="http://lists.x.org/archives/xorg-devel">http://lists.x.org/archives/xorg-devel</A>
Info: <A HREF="http://lists.x.org/mailman/listinfo/xorg-devel">http://lists.x.org/mailman/listinfo/xorg-devel</A>
</PRE>
</BLOCKQUOTE>
<BR>
</BODY>
</HTML>