use IkiWiki 3.00;
sub import {
+ hook(type => "checkconfig", id => "httpauth", call => \&checkconfig);
hook(type => "getsetup", id => "httpauth", call => \&getsetup);
hook(type => "auth", id => "httpauth", call => \&auth);
hook(type => "formbuilder_setup", id => "httpauth",
call => \&formbuilder_setup);
- hook(type => "canedit", id => "httpauth", call => \&canedit);
- hook(type => "pagetemplate", id => "httpauth", call => \&pagetemplate);
+ hook(type => "canedit", id => "httpauth", call => \&canedit,
+ first => 1);
}
sub getsetup () {
plugin => {
safe => 1,
rebuild => 0,
+ section => "auth",
},
cgiauthurl => {
type => "string",
rebuild => 0,
},
}
+
+sub checkconfig () {
+ if ($config{cgi} && defined $config{cgiauthurl} &&
+ keys %{$IkiWiki::hooks{auth}} < 2) {
+ # There are no other auth hooks registered, so avoid
+ # the normal signin form, and jump right to httpauth.
+ require IkiWiki::CGI;
+ inject(name => "IkiWiki::cgi_signin", call => sub ($$) {
+ my $cgi=shift;
+ redir_cgiauthurl($cgi, $cgi->query_string());
+ });
+ }
+}
sub redir_cgiauthurl ($;@) {
my $cgi=shift;
IkiWiki::redirect($cgi,
- IkiWiki::cgiurl(cgiurl => $config{cgiauthurl}, @_));
+ @_ > 1 ? IkiWiki::cgiurl(cgiurl => $config{cgiauthurl}, @_)
+ : $config{cgiauthurl}."?@_"
+ );
exit;
}
my $cgi=shift;
my $session=shift;
- if (defined $cgi->remote_user()) {
+ if (length $cgi->remote_user()) {
$session->param("name", $cgi->remote_user());
}
}
my $buttons=$params{buttons};
if ($form->title eq "signin" &&
- ! defined $cgi->remote_user() && defined $config{cgiauthurl}) {
+ ! length $cgi->remote_user() && defined $config{cgiauthurl}) {
my $button_text="Login with HTTP auth";
push @$buttons, $button_text;
}
}
-sub test_httpauth_pagespec ($) {
- my $page=shift;
-
- return defined $config{httpauth_pagespec} &&
- length $config{httpauth_pagespec} &&
- defined $config{cgiauthurl} &&
- pagespec_match($page, $config{httpauth_pagespec});
-}
-
sub canedit ($$$) {
my $page=shift;
my $cgi=shift;
my $session=shift;
- if (! defined $cgi->remote_user() && test_httpauth_pagespec($page)) {
+ if (! length $cgi->remote_user() &&
+ (! defined $session->param("name") ||
+ ! IkiWiki::userinfo_get($session->param("name"), "regdate")) &&
+ defined $config{httpauth_pagespec} &&
+ length $config{httpauth_pagespec} &&
+ defined $config{cgiauthurl} &&
+ pagespec_match($page, $config{httpauth_pagespec})) {
return sub {
- IkiWiki::redirect($cgi,
- $config{cgiauthurl}.'?'.$cgi->query_string());
- exit;
+ # bounce thru cgiauthurl and back to edit action
+ redir_cgiauthurl($cgi, $cgi->query_string());
};
}
else {
}
}
-sub pagetemplate (@_) {
- my %params=@_;
- my $template=$params{template};
-
- if ($template->param("editurl") &&
- test_httpauth_pagespec($params{page})) {
- # go directly to cgiauthurl when editing a page matching
- # the pagespec
- $template->param(editurl => IkiWiki::cgiurl(
- cgiurl => $config{cgiauthurl},
- do => "edit", page => $params{page}));
- }
-}
-
1