[interchange] * Add enclair_db option to UserDB.pm. Allows logging of enclair password

Mike Heins <[email protected]>
Newsgroups gmane.comp.web.interchange.cvs
Message-ID <[email protected]>
commit ed13ca36c04fac50064c2982223fcc3b70664cb0
Author: Mike Heins <[email protected]>
Date:   Fri Apr 5 09:52:49 2013 -0400

    * Add enclair_db option to UserDB.pm. Allows logging of enclair password
      to separate, presumably insert-only, database table. Designed to allow
      administration personnel to look at passwords, without allowing access
      to web-connected systems. Or perhaps more properly, to check prior
      MD5-encrypted password values for repeat passwords.
    
      Docs in UserDB.pm POD.

 dist/standard/catalog.cfg |   11 ++++++
 lib/Vend/UserDB.pm        |   78 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 0 deletions(-)
---
diff --git a/dist/standard/catalog.cfg b/dist/standard/catalog.cfg
index d034e83..da24bd9 100644
--- a/dist/standard/catalog.cfg
+++ b/dist/standard/catalog.cfg
@@ -280,6 +280,17 @@ UserDB    default    logfile       logs/userdb.log
 # UserDB    default    indirect_login  email
 # UserDB    default    assign_username 1
 
+# This makes the password be inserted in an insert-only table.
+#
+# UserDB      default     enclair_db  enclair
+#
+# You can set the following, which have the defaults shown in the
+# setting. You can also insert %M, which is the MD5 of the password, or
+# %D which is a datetime localtime value in the form YYYYmmddHHMMSS.
+#UserDB   default  enclair_key_field   username
+#UserDB   default  enclair_field       password
+#UserDB   default  enclair_query_template "INSERT INTO %t (%U,%P) values (%u,%p)"
+
 # minimal login stuff for affiliate
 UserDB    affiliate  user_field    affiliate
 UserDB    affiliate  database      affiliate
diff --git a/lib/Vend/UserDB.pm b/lib/Vend/UserDB.pm
index d2a320f..ffcfbd3 100644
--- a/lib/Vend/UserDB.pm
+++ b/lib/Vend/UserDB.pm
@@ -1372,6 +1372,80 @@ sub get_hash {
 	return $self->{$name}{$nick};
 }
 
+=over 4
+
+=item enclair_db
+
+Using set_enclair() allows logging of enclair password to separate
+database table. Designed to allow administration personnel to look
+at passwords, without allowing access to web-connected systems. Or
+perhaps more properly, to check prior MD5-encrypted password values 
+for repeat passwords.
+
+Designed to log to an insert-only handle on a table, with a database
+structure such as:
+
+  create table enclair (
+    username varchar(32),
+     password varchar(32),
+     update_date timestamp
+    )
+
+Then a program on a secure behind-firewall no-select write-only
+database can access the table, logged via request and username.
+
+Configured:
+
+	UserDB   default  enclair_db   some_table
+
+You can set the following, which have the defaults shown in the
+setting. You can also insert %M, which is the MD5 of the password, or
+%D which is a datetime localtime value in the form YYYYmmddHHMMSS.
+
+	#UserDB   default  enclair_key_field   username
+	#UserDB   default  enclair_field       password
+	#UserDB   default  enclair_query_template "INSERT INTO %t (%U,%P) values (%u,%p)"
+
+String substitutions:
+
+	%u  value of username
+	%p  value of password
+	%U  field of username
+	%P  field of password
+	%t  enclair table name
+	%D  datetime value of form YYYYmmddHHMMSS
+	%M  MD5 hashed value of password
+
+=back
+
+=cut
+
+sub set_enclair {
+	my $self = shift;
+	if( my $tab = $self->{OPTIONS}{enclair_db} ) {
+		eval {
+			my $dbh = dbref($tab)->dbh();
+			my $field = $self->{OPTIONS}{enclair_field} || 'password';
+			my $key   = $self->{OPTIONS}{enclair_key_field} || 'username';
+			my $datetime = POSIX::strftime('%Y%m%d%H%M%S', localtime());
+			my $md5 = generate_key($self->{PASSWORD});
+			my $q = $self->{OPTIONS}{enclair_query_template} || "INSERT INTO %t (%U,%P) values (%u,%p)";
+			$q =~ s/\%M/$dbh->quote($md5)/eg;
+			$q =~ s/\%D/$dbh->quote($datetime)/eg;
+			$q =~ s/\%t/$tab/g;
+			$q =~ s/\%U/$key/g;
+			$q =~ s/\%P/$field/g;
+			$q =~ s/\%u/$dbh->quote($self->{USERNAME})/eg;
+			$q =~ s/\%p/$dbh->quote($self->{PASSWORD})/eg;
+			$dbh->do($q);
+		};
+		if($@) {
+			$self->log_either("Failed to set enclair password for $self->{USERNAME}: $@");
+		}
+	}
+}
+
+
 sub login {
 	my $self;
 
@@ -1776,6 +1850,8 @@ sub change_pass {
 		die errmsg("Password and check value don't match.") . "\n"
 			unless $self->{PASSWORD} eq $self->{VERIFY};
 
+		$self->{OPTIONS}{enclair_db} and $self->set_enclair();
+
 		if ( $self->{CRYPT} ) {
 			$self->{PASSWORD} = $self->do_crypt(
 				$self->{PASSWORD},
@@ -1946,6 +2022,8 @@ sub new_account {
 				or die errmsg("Database access error.");
 		}
 
+		$self->{OPTIONS}{enclair_db} and $self->set_enclair();
+
 		my $pass = $udb->set_field(
 						$self->{USERNAME},
 						$self->{LOCATION}{PASSWORD},
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.