Front page | perl.qpsmtpd |
Postings from May 2010
[PATCH 02/28] updates to auth_vpopmail_sql module
Thread Next
From:
Matt Simerson
Date:
May 10, 2010 16:13
Subject:
[PATCH 02/28] updates to auth_vpopmail_sql module
Message ID:
1273533195-80970-1-git-send-email-matt@tnpi.net
updates to auth_vpopmail_sql module
- moved vpopmail database parameters into config files
- added LIMITATIONS section to POD, noting no support for alias domains
- renamed sub from authsql (too generic) to auth_vmysql
---
plugins/auth/auth_vpopmail_sql | 63 ++++++++++++++++++++++++----------------
1 files changed, 38 insertions(+), 25 deletions(-)
diff --git a/plugins/auth/auth_vpopmail_sql b/plugins/auth/auth_vpopmail_sql
index 7c8626d..1a61bd4 100644
--- a/plugins/auth/auth_vpopmail_sql
+++ b/plugins/auth/auth_vpopmail_sql
@@ -15,18 +15,34 @@ to compare the crypted password.
=head1 CONFIGURATION
-Decide which authentication methods you are willing to support and uncomment
+ echo "dbi:mysql:dbname=vpopmail;host=127.0.0.1" > config/vpopmail_mysql_dsn
+ echo "vpopmailuser" > config/vpopmail_mysql_user
+ echo "vpoppasswd" > config/vpopmail_mysql_pass
+
+This can be a read-only database user since the plugin does not update the
+last accessed time (yet, see below).
+
+This module supports PLAIN, LOGIN, and CRAM-MD5 authentication methods. You
+can disable undesired methods by editing this module and uncommenting
the lines in the register() sub. See the POD for Qspmtpd::Auth for more
details on the ramifications of supporting various authentication methods.
-Then, change the database information at the top of the authsql() sub so that
-the module can access the database. This can be a read-only account since
-the plugin does not update the last accessed time (yet, see below).
The remote user must login with a fully qualified e-mail address (i.e. both
account name and domain), even if they don't normally need to. This is
because the vpopmail table has a unique index on pw_name/pw_domain, and this
module requires that only a single record be returned from the database.
+=head1 LIMITATIONS
+
+This authentication modules does not recognize domain aliases. So, if you have
+the domain example.com, with domain aliases for example.org and example.net,
+smtp-auth will only work for $user@example.com. If you have domain aliases,
+consider using the auth_checkpassword plugin.
+
+The checkpassword plugin only supports plain and login authentications, where
+this plugin also supports CRAM-MD5. I use both modules together. I use this one
+for CRAM-MD5 and the checkpassword plugin for plain and login.
+
=head1 FUTURE DIRECTION
The default MySQL configuration for vpopmail includes a table to log access,
@@ -50,41 +66,38 @@ Please see the LICENSE file included with qpsmtpd for details.
sub register {
my ( $self, $qp ) = @_;
- $self->register_hook("auth-plain", "authsql" );
- $self->register_hook("auth-login", "authsql" );
- $self->register_hook("auth-cram-md5", "authsql");
-
+ $self->register_hook("auth-plain", "auth_vmysql" );
+ $self->register_hook("auth-login", "auth_vmysql" );
+ $self->register_hook("auth-cram-md5", "auth_vmysql");
}
-sub authsql {
+sub auth_vmysql {
+ my ( $self, $transaction, $method, $user, $passClear, $passHash, $ticket ) = @_;
+
use DBI;
use Qpsmtpd::Constants;
use Digest::HMAC_MD5 qw(hmac_md5_hex);
# $DB::single = 1;
- my $connect = "dbi:mysql:dbname=vpopmail";
- my $dbuser = "vpopmailuser";
- my $dbpasswd = "vpoppasswd";
+ my $dsn = $self->qp->config("vpopmail_mysql_dsn") || "dbi:mysql:dbname=vpopmail;host=127.0.0.1";
+ my $dbuser = $self->qp->config("vpopmail_mysql_user") || "vpopmailuser";
+ my $dbpass = $self->qp->config("vpopmail_mysql_pass") || "vpoppasswd";
- my $dbh = DBI->connect( $connect, $dbuser, $dbpasswd );
+ my $dbh = DBI->connect( $dsn, $dbuser, $dbpass );
$dbh->{ShowErrorStatement} = 1;
- my ( $self, $transaction, $method, $user, $passClear, $passHash, $ticket ) =
- @_;
- my ( $pw_name, $pw_domain ) = split "@", lc($user);
+ my ( $pw_name, $pw_domain ) = split '@', lc($user);
- unless ( defined $pw_domain ) {
- return DECLINED;
- }
+ return DECLINED if ! defined $pw_domain;
$self->log(LOGINFO,
"Authentication to vpopmail via mysql: $pw_name\@$pw_domain");
my $sth = $dbh->prepare(<<SQL);
-select *
-from vpopmail
-where pw_name = ? and pw_domain = ?
+SELECT *
+FROM vpopmail
+WHERE pw_name = ? AND pw_domain = ?
SQL
$sth->execute( $pw_name, $pw_domain );
@@ -107,7 +120,7 @@ SQL
# user doesn't exist in this domain
( not defined $pw_passwd )
) {
- return ( DECLINED, "authsql/$method" );
+ return ( DECLINED, "auth_vmysql/$method" );
}
# at this point we can assume the user name matched
@@ -123,10 +136,10 @@ SQL
)
{
- return ( OK, "authsql/$method" );
+ return ( OK, "auth_vmysql/$method" );
}
else {
- return ( DENY, "authsql/$method - wrong password" );
+ return ( DENY, "auth_vmysql/$method - wrong password" );
}
}
--
1.7.0.6
Thread Next
-
[PATCH 02/28] updates to auth_vpopmail_sql module
by Matt Simerson