Quoting Matt Brookings <m...@inter7.com>:
-----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On 11/09/2010 01:45 PM, Rick Romero wrote:
>> I'm interested in knowing not only what IP the user last auth'd, but
>> also how they connected. That gives me more info right from the tables
>> on how a particular is using the system, and how the system is utilized
>> overall.
>>
>> I attached a patch and honestly I haven't even tested yet - just thought
>> I'd throw it out there..
>>
>> - It utilizes a new field 'type' char(10), and puts the text AuthType in
>> there. I'm not sure if a table change is handled via README or
automated..
>> - It also adjusts the vget_lastauth to grab the 'latest' record for that
>> user from the lastauth table, no matter how they auth'd.
>> - The new info is only accessible by direct query.
>
> 5.4 is feature-frozen. It only accepts bugfixes. If you would like
> to work on the patch for 5.5, it would be appreciated.
How's this? I did change the fieldname from 'type' to 'authtype'.
I also modified all the backends as described above, except for ldap,
openldap and cdb. Those 3 will accept the 'authtype' parameter in the
function for completeness, but will not use it.
I've never done Oracle, but I tried to use the rank() function to get a
single 'latest' result for the vget_lastauth function. Not sure about that
one..
Rick
!DSPAM:4cd9bdf632711223351550!
diff -ru vpopmail-5.5.0-orig/backends/cdb/vcdb.c vpopmail-5.5.0/backends/cdb/vcdb.c
--- vpopmail-5.5.0-orig/backends/cdb/vcdb.c 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/cdb/vcdb.c 2010-11-09 14:56:12.000000000 -0600
@@ -1074,7 +1074,7 @@
return(unlink(dir_control_file));
}
-int set_lastauth(char *user, char *domain, char *remoteip )
+int set_lastauth(char *user, char *domain, char *remoteip, char *authtype)
{
char *tmpbuf;
FILE *fs;
diff -ru vpopmail-5.5.0-orig/backends/ldap/vldap.c vpopmail-5.5.0/backends/ldap/vldap.c
--- vpopmail-5.5.0-orig/backends/ldap/vldap.c 2010-11-05 13:37:24.000000000 -0500
+++ vpopmail-5.5.0/backends/ldap/vldap.c 2010-11-09 14:36:14.000000000 -0600
@@ -1235,7 +1235,7 @@
}
-int set_lastauth(char *user, char *domain, char *remoteip ) {
+int set_lastauth(char *user, char *domain, char *remoteip, char *authtype ) {
return(vset_lastauth_time(user, domain, remoteip, time(NULL) ));
}
diff -ru vpopmail-5.5.0-orig/backends/mysql/vmysql.c vpopmail-5.5.0/backends/mysql/vmysql.c
--- vpopmail-5.5.0-orig/backends/mysql/vmysql.c 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/mysql/vmysql.c 2010-11-09 14:51:10.000000000 -0600
@@ -1298,7 +1298,7 @@
/************************************************************************/
#ifdef ENABLE_AUTH_LOGGING
-int set_lastauth(char *user, char *domain, char *remoteip )
+int set_lastauth(char *user, char *domain, char *remoteip, char *authtype )
{
int err;
@@ -1307,11 +1307,11 @@
qnprintf( SqlBufUpdate, SQL_BUF_SIZE,
"INSERT INTO lastauth "
"SET user = '%s', domain = '%s', "
- "remote_ip = '%s', timestamp = %lu "
+ "remote_ip = '%s', timestamp = %lu, authtype = '%s' "
"ON DUPLICATE KEY UPDATE "
"user = '%s', domain = '%s', "
"remote_ip = '%s', timestamp = %lu",
- user, domain, remoteip, time(NULL),
+ user, domain, remoteip, time(NULL), authtype,
user, domain, remoteip, time(NULL));
if (mysql_query(&mysql_update,SqlBufUpdate)) {
vcreate_lastauth_table();
@@ -1332,7 +1332,7 @@
if ( (err=vauth_open_read()) != 0 ) return(err);
qnprintf( SqlBufRead, SQL_BUF_SIZE,
- "SELECT timestamp FROM lastauth WHERE user='%s' AND domain='%s'",
+ "SELECT timestamp FROM lastauth WHERE user='%s' AND domain='%s' order by timestamp LIMIT 1",
pw->pw_name, domain);
if (mysql_query(&mysql_read,SqlBufRead)) {
vcreate_lastauth_table();
@@ -1359,7 +1359,7 @@
if ( vauth_open_read() != 0 ) return(NULL);
qnprintf( SqlBufRead, SQL_BUF_SIZE,
- "SELECT remote_ip FROM lastauth WHERE user='%s' AND domain='%s'",
+ "SELECT remote_ip FROM lastauth WHERE user='%s' AND domain='%s' order by timestamp LIMIT 1",
pw->pw_name, domain);
if (mysql_query(&mysql_read,SqlBufRead)) {
vcreate_lastauth_table();
diff -ru vpopmail-5.5.0-orig/backends/mysql/vmysql.h.in vpopmail-5.5.0/backends/mysql/vmysql.h.in
--- vpopmail-5.5.0-orig/backends/mysql/vmysql.h.in 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/mysql/vmysql.h.in 2010-11-09 14:52:02.000000000 -0600
@@ -96,6 +96,7 @@
domain char(96) NOT NULL,\
remote_ip char(18) not null, \
timestamp bigint default 0 NOT NULL, \
+authtype char(10) NOT NULL ,\
primary key (user, domain)"
char *vauth_munch_domain(char *);
diff -ru vpopmail-5.5.0-orig/backends/openldap/vopenldap.c vpopmail-5.5.0/backends/openldap/vopenldap.c
--- vpopmail-5.5.0-orig/backends/openldap/vopenldap.c 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/openldap/vopenldap.c 2010-11-09 14:52:48.000000000 -0600
@@ -856,7 +856,7 @@
return(0);
}
-int set_lastauth(char *user, char *domain, char *remoteip ) {
+int set_lastauth(char *user, char *domain, char *remoteip, char *authtype ) {
return(set_lastauth_time(user, domain, remoteip, time(NULL) ));
}
diff -ru vpopmail-5.5.0-orig/backends/oracle/voracle.h vpopmail-5.5.0/backends/oracle/voracle.h
--- vpopmail-5.5.0-orig/backends/oracle/voracle.h 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/oracle/voracle.h 2010-11-09 15:00:55.000000000 -0600
@@ -82,6 +82,7 @@
pw_domain char(96) NOT NULL,\
remote_ip char(18) not null, \
timestamp int default 0 NOT NULL, \
+authtype char(10) NOT NULL, \
primary key (pw_user, pw_domain)"
char *vauth_munch_domain(char *);
diff -ru vpopmail-5.5.0-orig/backends/oracle/voracle.pc vpopmail-5.5.0/backends/oracle/voracle.pc
--- vpopmail-5.5.0-orig/backends/oracle/voracle.pc 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/oracle/voracle.pc 2010-11-09 14:45:05.000000000 -0600
@@ -1115,7 +1115,7 @@
}
#ifdef ENABLE_AUTH_LOGGING
-int vset_lastauth(char *user, char *domain, char *remoteip )
+int vset_lastauth(char *user, char *domain, char *remoteip, char *authtype )
{
int err;
@@ -1123,7 +1123,7 @@
qnprintf( SqlBufUpdate, SQL_BUF_SIZE,
"update lastauth set pw_user='%s', pw_domain='%s', \
-remote_ip='%s', timestamp=%lu", user, domain, remoteip, time(NULL));
+remote_ip='%s', timestamp=%lu, authtype='%s'", user, domain, remoteip, time(NULL), authtype);
fprintf(stderr, "auth log: %s\n", SqlBufUpdate);
EXEC SQL PREPARE S FROM :SqlBufUpdate;
@@ -1141,7 +1141,7 @@
qnprintf( SqlBufUpdate, SQL_BUF_SIZE,
- "select timestamp from lastauth where pw_user='%s' and pw_domain='%s'",
+ "select timestamp from (select timstamp rank() over (order by timestamp) r from lastauth where pw_user='%s' and pw_domain='%s') where r=1",
pw->pw_name, domain);
EXEC SQL PREPARE SD FROM :SqlBufUpdate;
EXEC SQL DECLARE CD CURSOR FOR SD;
diff -ru vpopmail-5.5.0-orig/backends/postgres/vpgsql.c vpopmail-5.5.0/backends/postgres/vpgsql.c
--- vpopmail-5.5.0-orig/backends/postgres/vpgsql.c 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/postgres/vpgsql.c 2010-11-09 15:10:25.000000000 -0600
@@ -1177,7 +1177,7 @@
}
#ifdef ENABLE_AUTH_LOGGING
-int set_lastauth(char *user, char *domain, char *remoteip )
+int set_lastauth(char *user, char *domain, char *remoteip, char *authtype )
{
PGresult *pgres;
int err=0;
@@ -1185,7 +1185,7 @@
if ( (err=vauth_open(1)) != 0 ) return(err);
qnprintf( SqlBufUpdate, SQL_BUF_SIZE,
- "UPDATE lastauth SET remote_ip='%s', timestamp=%lu " \
+ "UPDATE lastauth SET remote_ip='%s', timestamp=%lu, authtype='%s' " \
"WHERE userid='%s' AND domain='%s'", remoteip, time(NULL), user, domain);
#ifdef DEBUG
@@ -1203,8 +1203,8 @@
if( pgres ) PQclear(pgres);
qnprintf( SqlBufUpdate, SQL_BUF_SIZE,
- "INSERT INTO lastauth (userid, domain, remote_ip, timestamp) " \
- "VALUES ('%s', '%s', '%s', %lu)", user, domain, remoteip, time(NULL));
+ "INSERT INTO lastauth (userid, domain, remote_ip, timestamp, authtype) " \
+ "VALUES ('%s', '%s', '%s', %lu, '%s')", user, domain, remoteip, time(NULL), authtype);
#ifdef DEBUG
fprintf(stderr,"INSERT command to run is \n\n%s\n\n", SqlBufUpdate);
@@ -1226,8 +1226,8 @@
/* and try INSERTing now... */
qnprintf( SqlBufUpdate, SQL_BUF_SIZE,
- "INSERT INTO lastauth (userid, domain, remote_ip, timestamp) " \
- "VALUES ('%s', '%s', '%s', %lu)", user, domain, remoteip, time(NULL));
+ "INSERT INTO lastauth (userid, domain, remote_ip, timestamp, authtype) " \
+ "VALUES ('%s', '%s', '%s', %lu, '%s')", user, domain, remoteip, time(NULL), authtype);
pgres=PQexec(pgc, SqlBufUpdate);
}
@@ -1249,14 +1249,14 @@
if ( (err=vauth_open(0)) != 0 ) return(err);
- qnprintf( SqlBufRead, SQL_BUF_SIZE, "SELECT timestamp FROM lastauth WHERE userid='%s' AND domain='%s'", pw->pw_name, domain);
+ qnprintf( SqlBufRead, SQL_BUF_SIZE, "SELECT timestamp FROM lastauth WHERE userid='%s' AND domain='%s' ORDER BY timestamp LIMIT 1", pw->pw_name, domain);
pgres=PQexec(pgc, SqlBufRead);
if ( !pgres || PQresultStatus(pgres) != PGRES_TUPLES_OK ) {
if( pgres ) PQclear(pgres);
vcreate_lastauth_table();
- qnprintf( SqlBufRead, SQL_BUF_SIZE, "SELECT timestamp FROM lastauth WHERE userid='%s' AND domain='%s'", pw->pw_name, domain);
+ qnprintf( SqlBufRead, SQL_BUF_SIZE, "SELECT timestamp FROM lastauth WHERE userid='%s' AND domain='%s' ORDER BY timestamp LIMIT 1", pw->pw_name, domain);
pgres=PQexec(pgc, SqlBufRead);
if ( !pgres || PQresultStatus(pgres) != PGRES_TUPLES_OK ) {
fprintf(stderr,"vpgsql: sql error[g]: %s\n", PQerrorMessage(pgc));
@@ -1281,13 +1281,13 @@
if ( vauth_open(0) != 0 ) return(NULL);
- qnprintf( SqlBufRead, SQL_BUF_SIZE, "select remote_ip from lastauth where userid='%s' and domain='%s'", pw->pw_name, domain);
+ qnprintf( SqlBufRead, SQL_BUF_SIZE, "select remote_ip from lastauth where userid='%s' and domain='%s' ORDER BY timestamp LIMIT 1", pw->pw_name, domain);
pgres=PQexec(pgc, SqlBufRead);
if ( !pgres || PQresultStatus(pgres) != PGRES_TUPLES_OK ) {
if( pgres ) PQclear(pgres);
vcreate_lastauth_table();
- qnprintf( SqlBufRead, SQL_BUF_SIZE, "select remote_ip from lastauth where userid='%s' and domain='%s'", pw->pw_name, domain);
+ qnprintf( SqlBufRead, SQL_BUF_SIZE, "select remote_ip from lastauth where userid='%s' and domain='%s' ORDER BY timestamp LIMIT 1", pw->pw_name, domain);
pgres=PQexec(pgc, SqlBufRead);
if ( !pgres || PQresultStatus(pgres) != PGRES_TUPLES_OK ) {
diff -ru vpopmail-5.5.0-orig/backends/postgres/vpgsql.h.in vpopmail-5.5.0/backends/postgres/vpgsql.h.in
--- vpopmail-5.5.0-orig/backends/postgres/vpgsql.h.in 2010-11-05 13:37:23.000000000 -0500
+++ vpopmail-5.5.0/backends/postgres/vpgsql.h.in 2010-11-09 14:59:59.000000000 -0600
@@ -87,6 +87,7 @@
domain varchar(96) NOT NULL,\
remote_ip varchar(18) NOT NULL, \
timestamp bigint default 0 NOT NULL, \
+authtype varchar(10) NOT NULL, \
PRIMARY key (userid, domain)"
char *vauth_munch_domain(char *);
diff -ru vpopmail-5.5.0-orig/vauthmodule.h vpopmail-5.5.0/vauthmodule.h
--- vpopmail-5.5.0-orig/vauthmodule.h 2010-11-05 13:37:24.000000000 -0500
+++ vpopmail-5.5.0/vauthmodule.h 2010-11-09 14:34:40.000000000 -0600
@@ -24,7 +24,7 @@
int (*vread_dir_control)(vdir_type *vdir, char *domain, uid_t uid, gid_t gid );
int (*vwrite_dir_control)(vdir_type *vdir, char *domain, uid_t uid, gid_t gid);
int (*vdel_dir_control)(char *domain);
-int (*vset_lastauth)( char *user, char *domain, char *remoteip);
+int (*vset_lastauth)( char *user, char *domain, char *remoteip, char *authtype );
time_t (*vget_lastauth)( struct vqpasswd *pw, char *domain);
char *(*vget_lastauthip)( struct vqpasswd *pw, char *domain);
char *(*valias_select)( char *alias, char *domain );
diff -ru vpopmail-5.5.0-orig/vchkpw.c vpopmail-5.5.0/vchkpw.c
--- vpopmail-5.5.0-orig/vchkpw.c 2010-11-05 13:37:24.000000000 -0500
+++ vpopmail-5.5.0/vchkpw.c 2010-11-09 14:34:13.000000000 -0600
@@ -600,7 +600,7 @@
#ifdef MIN_LOGIN_INTERVAL
last_time = vget_lastauth(vpw, TheDomain );
#endif
- vset_lastauth(TheUser,TheDomain,IpAddr);
+ vset_lastauth(TheUser,TheDomain,IpAddr,AuthType);
#ifdef MIN_LOGIN_INTERVAL
if(( vget_lastauth(vpw,TheDomain ) - last_time ) < MIN_LOGIN_INTERVAL ) {
vchkpw_exit(1);
diff -ru vpopmail-5.5.0-orig/vpopmail.c vpopmail-5.5.0/vpopmail.c
--- vpopmail-5.5.0-orig/vpopmail.c 2010-11-05 13:37:24.000000000 -0500
+++ vpopmail-5.5.0/vpopmail.c 2010-11-09 14:32:40.000000000 -0600
@@ -755,7 +755,7 @@
#endif
if (vauth_module_feature("AUTH_LOGGING")) {
- if (vset_lastauth(username,domain,NULL_REMOTE_IP) !=0) {
+ if (vset_lastauth(username,domain,NULL_REMOTE_IP, "") !=0) {
/* should we back out of all the work we have done so far? */
chdir(calling_dir);
fprintf (stderr, "Failed to create create lastauth entry\n");