chiark / gitweb /
wip, before redo params
[cgi-auth-flexible.git] / cgi-auth-hybrid.pm
index f8c74ae63789b83927451bd939d761ed0c01a16c..35739b035ef967ba07023f1192bd6dc6a95b8f05 100644 (file)
@@ -31,6 +31,7 @@ our @EXPORT_OK;
 
 use DBI;
 use CGI;
+use Locale::Gettext;
 
 #---------- default callbacks ----------
 
@@ -75,12 +76,35 @@ sub do_redirect_cgi ($$$$) {
              -status => '303 See other',
              -location => $new_url);
     push @ha, (-cookie => $cookie) if defined $cookie;
-    $r->_ch('print')($c->header(@ha).
-                    $c->start_html('Redirection').
-                    $c->a({href=>$new_url},
-                          "If you aren't redirected, click to continue.").
-                    $c->end_html());
-}                      
+    $r->_print($c->header(@ha),
+              $r->_ch('gen_start_html')($r->_gt('Redirection')),
+              '<a href="'.escapeHTML($new_url).'">',
+              $r->_gt("If you aren't redirected, click to continue."),
+              "</a>",
+              $c->_ch('gen_end_html'));
+}
+
+sub gen_plain_login_form ($$) {
+    my ($c,$r, $params) = @_;
+    my @form;
+    push @form, ('<form method="POST" action="',
+                escapeHTML($r->_ch('get_url')).'>',
+                '<table>');
+    my $sz = 'size="'.$r->{S}{form_entry_size}.'"';
+    foreach my $up (@{ $r->{S}{username_param_names}}) {
+       push @form, ('<tr><td>',$r->_gt(ucfirst $up),'</td>',
+                    '<td><input type="text" ',$sz,
+                    ' name=',$up,'></td></tr>');
+    }
+    push @form, ('<tr><td>'.$r->_gt('Password'),'</td>',
+                '<td><input type="password" ',$sz,
+                ' name="'.$r->{S}{password_param_name}.'"></td></tr>');
+    push @form, ('<tr><td colspan="2">',
+                '<input type="submit"'.
+                ' name="'.$r->{S}{login_submit_name}.'"',
+                ' value="'.$r->_gt('Login').'"></td></tr></table>');
+    foreach my $p (@$params) {
+       
 
 #---------- verifier object methods ----------
 
@@ -98,7 +122,10 @@ sub new_verifier {
            login_timeout => 86400, # seconds
            assoc_param_name => 'cah_associd',
            password_param_name => 'password',
+           username_param_names => [qw(username)],
+           form_entry_size => 60,
            logout_param_names => [qw(cah_logout)],
+           login_submit_name => [qw(cah_login)],
            loggedout_param_names => [qw(cah_loggedout)],
            promise_check_mutate => 0,
            get_param => sub { $_[0]->param($_[2]) },
@@ -116,6 +143,10 @@ sub new_verifier {
            cookie_path => "/",
            get_cookie_domain => \&get_cookie_domain,
            encrypted_only => 0,
+           gen_start_html => sub { $_[0]->start_html($_[2]); },
+           gen_end_html => sub { $_[0]->end_html(); },
+           gen_login_form => \&gen_plain_login_form,
+           gettext => sub { gettext($_[2]); },
            };
        },
        Dbh => undef,
@@ -186,6 +217,9 @@ sub _rp ($$@) {
     my $p = scalar $r->_ch('get_param',$pn)
 }
 
+sub _gt ($$) { my ($r, $t) = @_; return $r->_ch('gettext')($t); }
+sub _print ($$) { my ($r, @t) = @_; return $r->_ch('print')(join '', @t); }
+
 # pages/param-sets are
 #   n normal non-mutating page
 #   r retrieval of information for JS, non-mutating
@@ -308,7 +342,7 @@ fixme needs wrapping with something to make and commit a transaction
        die unless $parmt;
        $r->_db_revoke($cookv);
        $r->_db_revoke($parmv);
-       return ({ Kind => 'REDIRECT/LOGGEDOUT',
+       return ({ Kind => 'REDIRECT-LOGGEDOUT',
                  Message => "Logging out...",
                  Cookie => '',
                  Params => [ ] });
@@ -317,7 +351,7 @@ fixme needs wrapping with something to make and commit a transaction
        die unless $meth eq 'GET';
        die unless $cookt;
        die unless $parmt;
-       return ({ Kind => 'SMALLPAGE/LOGGEDOUT',
+       return ({ Kind => 'SMALLPAGE-LOGGEDOUT',
                  Message => "You have been logged out.",
                  Cookie => '',
                  Params => [ ] });
@@ -483,7 +517,7 @@ sub check_ok ($) {
     my $cookie = $divert->{Cookie};
     my $params = $divert->{Params};
 
-    if ($kind =~ m#^REDIRECT/#) {
+    if ($kind =~ m/^REDIRECT-/) {
        # for redirects, we honour stored NextParams and SetCookie,
        # as we would for non-divert
        if ($divert_kind eq 'REDIRECT-LOGGEDOUT') {
@@ -498,7 +532,21 @@ sub check_ok ($) {
        $r->_ch('do_redirect')($new_url, $cookie);
        return 0;
     }
-    
+    $kind =~ m/^SMALLPAGE|^LOGIN/ or die;
+
+    my ($title, @body);
+    if ($kind =~ m/^LOGIN-/) {
+       $title = $r->_gt('Login');
+       push @body, $r->_gt($divert->{Message});
+       push @body, $r->_ch('gen_login_form', $params);
+       $body .= $r->_ch(
+
+       $r->_print(
+                  $r->_ch('start_html')($title),
+                  
+                  
+
+    if ($kind =~ m/^SMALLPAGE
 
 if (defined $cookie) {
         $r->_ch('header_out')($cookie);