X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/e6678275a98bd00e888018409998fd67686149c8..3fe434189b99daf3d8cc075186c4ed4ebdd43b8f:/IkiWiki/Plugin/httpauth.pm

diff --git a/IkiWiki/Plugin/httpauth.pm b/IkiWiki/Plugin/httpauth.pm
index 5b7d65253..76d574b2a 100644
--- a/IkiWiki/Plugin/httpauth.pm
+++ b/IkiWiki/Plugin/httpauth.pm
@@ -7,12 +7,13 @@ use strict;
 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 () {
@@ -20,6 +21,7 @@ sub getsetup () {
 		plugin => {
 			safe => 1,
 			rebuild => 0,
+			section => "auth",
 		},
 		cgiauthurl => {
 			type => "string",
@@ -36,12 +38,27 @@ sub getsetup () {
 			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;
 }
 
@@ -75,30 +92,21 @@ sub formbuilder_setup (@) {
 	}
 }
 
-sub need_httpauth_pagespec () {
-	return defined $config{httpauth_pagespec} &&
-	       length $config{httpauth_pagespec} &&
-	       defined $config{cgiauthurl};
-}
-
-sub test_httpauth_pagespec ($) {
-	my $page=shift;
-
-	pagespec_match($page, $config{httpauth_pagespec});
-}
-
 sub canedit ($$$) {
 	my $page=shift;
 	my $cgi=shift;
 	my $session=shift;
 
 	if (! defined $cgi->remote_user() &&
-	    need_httpauth_pagespec() &&
-    	    ! test_httpauth_pagespec($page)) {
+	    (! 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 {
@@ -106,19 +114,4 @@ sub canedit ($$$) {
 	}
 }
 
-sub pagetemplate (@_) {
-	my %params=@_;
-	my $template=$params{template};
-
-	if ($template->param("editurl") &&
-	    need_httpauth_pagespec() &&
-	    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