chiark / gitweb /
change login/password protocol to support custom error messages
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 15 Jan 2013 17:18:32 +0000 (17:18 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Tue, 15 Jan 2013 17:18:32 +0000 (17:18 +0000)
cgi-auth-flexible.pm
test.cgi

index 61955c9..49b3303 100644 (file)
@@ -93,8 +93,8 @@ sub login_ok_password ($$) {
     my $username_params = $r->{S}{username_param_names};
     my $username = $r->_ch('get_param',$username_params->[0]);
     my $password = $r->_rp('password_param_name');
     my $username_params = $r->{S}{username_param_names};
     my $username = $r->_ch('get_param',$username_params->[0]);
     my $password = $r->_rp('password_param_name');
-    return undef unless $r->_ch('username_password_ok', $username, $password);
-    return $username;
+    my $error = $r->_ch('username_password_error', $username, $password);
+    return defined($error) ? (undef,$error) : ($username,undef);
 }
 
 sub do_redirect_cgi ($$$$) {
 }
 
 sub do_redirect_cgi ($$$$) {
@@ -209,7 +209,7 @@ sub new_verifier {
            get_url => sub { $_[0]->url(); },
             is_login => sub { defined $_[1]->_rp('password_param_name') },
             login_ok => \&login_ok_password,
            get_url => sub { $_[0]->url(); },
             is_login => sub { defined $_[1]->_rp('password_param_name') },
             login_ok => \&login_ok_password,
-            username_password_ok => sub { die },
+            username_password_error => sub { die },
            is_logout => sub { $_[1]->has_a_param('logout_param_names') },
            is_loggedout => sub { $_[1]->has_a_param('loggedout_param_names') },
            is_page => sub { return 1 },
            is_logout => sub { $_[1]->has_a_param('logout_param_names') },
            is_loggedout => sub { $_[1]->has_a_param('loggedout_param_names') },
            is_page => sub { return 1 },
@@ -540,10 +540,12 @@ sub _check_divert_core ($) {
                       Params => { } })
         }
        die unless $parmt eq 't' || $parmt eq 'y';
                       Params => { } })
         }
        die unless $parmt eq 't' || $parmt eq 'y';
-       my $username = $r->_ch('login_ok');
+       my ($username, $login_errormessage) = $r->_ch('login_ok');
         unless (defined $username && length $username) {
         unless (defined $username && length $username) {
+            $login_errormessage = $r->_gt("Incorrect username/password.")
+                if !$login_errormessage;
             return ({ Kind => 'LOGIN-BAD',
             return ({ Kind => 'LOGIN-BAD',
-                      Message => $r->_gt("Incorrect username/password."),
+                      Message => $login_errormessage,
                       CookieSecret => $cooks,
                       Params => $r->chain_params() })
         }
                       CookieSecret => $cooks,
                       Params => $r->chain_params() })
         }
index 0715861..92fb7ee 100755 (executable)
--- a/test.cgi
+++ b/test.cgi
@@ -13,7 +13,10 @@ $SIG{__DIE__} = sub { Carp::confess(@_) };
 my $dump = "$ENV{'CAHTEST_HOME'}/dump";
 
 my $verifier = CGI::Auth::Flexible->new_verifier(
 my $dump = "$ENV{'CAHTEST_HOME'}/dump";
 
 my $verifier = CGI::Auth::Flexible->new_verifier(
-    username_password_ok => sub { my ($c,$r,$u,$p)=@_; return $p eq 'sesame'; },
+    username_password_error => sub {
+        my ($c,$r,$u,$p)=@_;
+        return $p eq 'sesame' ? undef : 'wrong password'
+    },
     encrypted_only => 0,
     promise_check_mutate => 1,
     dir => $dump,
     encrypted_only => 0,
     promise_check_mutate => 1,
     dir => $dump,