Committed to my tree as 0ae24edc55804c4749a9da880ec45050bead629e.
(Trailing whtiespace cleaned up first.)


Matt Simerson wrote:
> 
> 
> 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 $u...@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_na...@$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
> 

Reply via email to