[svn:qpsmtpd] rev 402 - trunk/plugins/auth

[email protected] 30 Mar 2005 20:50:35 -0000
Newsgroups perl.cvs.qpsmtpd
Message-ID <[email protected]>
Author: msergeant
Date: Wed Mar 30 12:50:34 2005
New Revision: 402

Added:
   trunk/plugins/auth/auth_flat_file
Log:
Flat file auth plugin


Added: trunk/plugins/auth/auth_flat_file
==============================================================================
--- (empty file)
+++ trunk/plugins/auth/auth_flat_file	Wed Mar 30 12:50:34 2005
@@ -0,0 +1,75 @@
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+auth_flat_file - simple CRAM MD5 auth plugin using a flat password file
+
+=head1 SYNOPSIS
+
+in config/plugins:
+
+  auth/auth_flat_file
+
+in config/flat_auth_pw
+
+  username1:password1
+  username2:password2
+  ...
+
+=head1 DESCRIPTION
+
+This plugin implements a very simple authentication plugin using a flat password
+file containing username and password separated by colons.
+
+Note that this plugin enforces the use of a full email address (including
+@domain) as the username. There's no particular reason for this so feel free
+to modify the code to suit your setup.
+
+The password is stored on disk unencrypted, however authentication uses a HMAC
+algorithm so no password is transfered in the clear.
+
+=cut
+
+use Digest::HMAC_MD5 qw(hmac_md5_hex);
+
+sub register {
+    my ( $self, $qp ) = @_;
+
+    $self->register_hook("auth-cram-md5", "authsql");
+}
+
+sub authsql {
+    my ( $self, $transaction, $method, $user, $passClear, $passHash, $ticket ) =
+      @_;
+
+    my ( $pw_name, $pw_domain ) = split "@", lc($user);
+
+    unless ( defined $pw_domain ) {
+        return DECLINED;
+    }
+
+    $self->log(LOGINFO, "Authentication for: $pw_name\@$pw_domain");
+
+    my ($auth_line) = grep {/^$pw_name\@$pw_domain:/} $self->qp->config('flat_auth_pw');
+    
+    unless (defined $auth_line) {
+        return DECLINED;
+    }
+    
+    my ($auth_user, $auth_pass) = split(/:/, $auth_line, 2);
+    
+    # at this point we can assume the user name matched
+    if (
+        ( defined $passClear
+            and $auth_pass eq $passClear ) or
+        ( defined $passHash
+            and $passHash eq hmac_md5_hex($ticket, $auth_pass) )
+      )
+    {
+        return ( OK, "authflat/$method" );
+    }
+    else {
+        return ( DENY, "authflat/$method - wrong password" );
+    }
+}
+