Jan F 9cefae
diff -up openssh-5.8p1/audit-linux.c.audit1a openssh-5.8p1/audit-linux.c
Jan F 9cefae
--- openssh-5.8p1/audit-linux.c.audit1a	2011-02-21 18:14:37.000000000 +0100
Jan F 9cefae
+++ openssh-5.8p1/audit-linux.c	2011-02-21 18:17:33.000000000 +0100
Jan F 9cefae
@@ -35,13 +35,20 @@
Jan F 9cefae
 
Jan F 9cefae
 #include "log.h"
Jan F 9cefae
 #include "audit.h"
Jan F 9cefae
+#include "key.h"
Jan F 9cefae
+#include "hostfile.h"
Jan F 9cefae
+#include "auth.h"
Jan F 9cefae
+#include "servconf.h"
Jan F 9cefae
 #include "canohost.h"
Jan F 9cefae
 
Jan F 9cefae
+extern ServerOptions options;
Jan F 9cefae
+extern Authctxt *the_authctxt;
Jan F 9cefae
+extern u_int utmp_len;
Jan F 9cefae
 const char* audit_username(void);
Jan F 9cefae
 
Jan F 9cefae
 static void
Jan F 9cefae
-linux_audit_user_login(int uid, const char *username,
Jan F 9cefae
-    const char *hostname, const char *ip, const char *ttyn, int success)
Jan F 9cefae
+linux_audit_user_logxxx(int uid, const char *username,
Jan F 9cefae
+    const char *hostname, const char *ip, const char *ttyn, int success, int event)
Jan F 9cefae
 {
Jan F 9cefae
 	int audit_fd, rc, saved_errno;
Jan F 9cefae
 
Jan F 9cefae
@@ -53,7 +60,7 @@ linux_audit_user_login(int uid, const ch
Jan F 9cefae
 		else
Jan F 9cefae
 			goto fatal_report; /* Must prevent login */
Jan F 9cefae
 	}
Jan F 9cefae
-	rc = audit_log_acct_message(audit_fd, AUDIT_USER_LOGIN,
Jan F 9cefae
+	rc = audit_log_acct_message(audit_fd, event,
Jan F 9cefae
 	    NULL, "login", username ? username : "(unknown)",
Jan F 9cefae
 	    username == NULL ? uid : -1, hostname, ip, ttyn, success);
Jan F 9cefae
 	saved_errno = errno;
Jan F 9cefae
@@ -77,19 +84,19 @@ linux_audit_user_auth(int uid, const cha
Jan F 9cefae
 {
Jan F 9cefae
 	int audit_fd, rc, saved_errno;
Jan F 9cefae
 	static const char *event_name[] = {
Jan F 9cefae
-		"exceed maxtries",
Jan F 9cefae
+		"maxtries exceeded",
Jan F 9cefae
 		"root denied",
Jan F 9cefae
 		"success",
Jan F 9cefae
 		"none",
Jan F 9cefae
-		"pasword",
Jan F 9cefae
-		"chalenge-response",
Jan F 9cefae
+		"password",
Jan F 9cefae
+		"challenge-response",
Jan F 9cefae
 		"pubkey",
Jan F 9cefae
 		"hostbased",
Jan F 9cefae
 		"gssapi",
Jan F 9cefae
 		"invalid user",
Jan F 9cefae
 		"nologin",
Jan F 9cefae
-		"connection close",
Jan F 9cefae
-		"connection abandon",
Jan F 9cefae
+		"connection closed",
Jan F 9cefae
+		"connection abandoned",
Jan F 9cefae
 		"unknown"
Jan F 9cefae
 	};
Jan F 9cefae
 
Jan F 9cefae
@@ -123,6 +130,8 @@ fatal_report:
Jan F 9cefae
 	}
Jan F 9cefae
 }
Jan F 9cefae
 
Jan F 9cefae
+static int user_login_count = 0;
Jan F 9cefae
+
Jan F 9cefae
 /* Below is the sshd audit API code */
Jan F 9cefae
 
Jan F 9cefae
 void
Jan F 9cefae
@@ -134,20 +143,31 @@ audit_connection_from(const char *host, 
Jan F 9cefae
 void
Jan F 9cefae
 audit_run_command(const char *command)
Jan F 9cefae
 {
Jan F 9cefae
-	/* not implemented */
Jan F 9cefae
+	linux_audit_user_logxxx(the_authctxt->pw->pw_uid, NULL, get_remote_name_or_ip(utmp_len, options.use_dns),
Jan F 9cefae
+	    NULL, "ssh", 1, AUDIT_USER_START);
Jan F 9cefae
+	if (!user_login_count++) 
Jan F 9cefae
+		linux_audit_user_logxxx(the_authctxt->pw->pw_uid, NULL, get_remote_name_or_ip(utmp_len, options.use_dns),
Jan F 9cefae
+		    NULL, "ssh", 1, AUDIT_USER_LOGIN);
Jan F 9cefae
 }
Jan F 9cefae
 
Jan F 9cefae
 void
Jan F 9cefae
 audit_session_open(struct logininfo *li)
Jan F 9cefae
 {
Jan F 9cefae
-	linux_audit_user_login(li->uid, NULL, li->hostname,
Jan F 9cefae
-	    NULL, li->line, 1);
Jan F 9cefae
+	linux_audit_user_logxxx(li->uid, NULL, li->hostname,
Jan F 9cefae
+	    NULL, li->line, 1, AUDIT_USER_START);
Jan F 9cefae
+	if (!user_login_count++) 
Jan F 9cefae
+		linux_audit_user_logxxx(li->uid, NULL, li->hostname,
Jan F 9cefae
+		    NULL, li->line, 1, AUDIT_USER_LOGIN);
Jan F 9cefae
 }
Jan F 9cefae
 
Jan F 9cefae
 void
Jan F 9cefae
 audit_session_close(struct logininfo *li)
Jan F 9cefae
 {
Jan F 9cefae
-	/* not implemented */
Jan F 9cefae
+	linux_audit_user_logxxx(li->uid, NULL, li->hostname,
Jan F 9cefae
+	    NULL, li->line, 1, AUDIT_USER_END);
Jan F 9cefae
+	if (!--user_login_count) 
Jan F 9cefae
+		linux_audit_user_logxxx(li->uid, NULL, li->hostname,
Jan F 9cefae
+		    NULL, li->line, 1, AUDIT_USER_LOGOUT);
Jan F 9cefae
 }
Jan F 9cefae
 
Jan F 9cefae
 void
Jan F 9cefae
@@ -163,8 +183,8 @@ audit_event(ssh_audit_event_t event)
Jan F 9cefae
 	case SSH_LOGIN_ROOT_DENIED:
Jan F 9cefae
 		linux_audit_user_auth(-1, audit_username(), NULL,
Jan F 9cefae
 			get_remote_ipaddr(), "sshd", 0, event);
Jan F 9cefae
-		linux_audit_user_login(-1, audit_username(), NULL,
Jan F 9cefae
-			get_remote_ipaddr(), "sshd", 0);
Jan F 9cefae
+		linux_audit_user_logxxx(-1, audit_username(), NULL,
Jan F 9cefae
+			get_remote_ipaddr(), "sshd", 0, AUDIT_USER_LOGIN);
Jan F 9cefae
 		break;
Jan F 9cefae
 
Jan F 9cefae
 	case SSH_LOGIN_EXCEED_MAXTRIES:
Jan F 9cefae
@@ -181,8 +201,8 @@ audit_event(ssh_audit_event_t event)
Jan F 9cefae
 	case SSH_CONNECTION_CLOSE:
Jan F 9cefae
 	case SSH_CONNECTION_ABANDON:
Jan F 9cefae
 	case SSH_INVALID_USER:
Jan F 9cefae
-		linux_audit_user_login(-1, audit_username(), NULL,
Jan F 9cefae
-			get_remote_ipaddr(), "sshd", 0);
Jan F 9cefae
+		linux_audit_user_logxxx(-1, audit_username(), NULL,
Jan F 9cefae
+			get_remote_ipaddr(), "sshd", 0, AUDIT_USER_LOGIN);
Jan F 9cefae
 		break;
Jan F 9cefae
 
Jan F 9cefae
 	default: