X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/b74b7ab68b983b3f7d9e561eb991b21764cdb3be..5f33532468fbd52b15ab599a3198749efcfc7710:/IkiWiki/Plugin/passwordauth.pm

diff --git a/IkiWiki/Plugin/passwordauth.pm b/IkiWiki/Plugin/passwordauth.pm
index a3fd2d4ed..baddca093 100644
--- a/IkiWiki/Plugin/passwordauth.pm
+++ b/IkiWiki/Plugin/passwordauth.pm
@@ -4,35 +4,41 @@ package IkiWiki::Plugin::passwordauth;
 
 use warnings;
 use strict;
-use IkiWiki 2.00;
+use IkiWiki 3.00;
 
-sub import { #{{{
+sub import {
 	hook(type => "getsetup", id => "passwordauth", "call" => \&getsetup);
-        hook(type => "formbuilder_setup", id => "passwordauth", call => \&formbuilder_setup);
-        hook(type => "formbuilder", id => "passwordauth", call => \&formbuilder);
+	hook(type => "formbuilder_setup", id => "passwordauth", call => \&formbuilder_setup);
+	hook(type => "formbuilder", id => "passwordauth", call => \&formbuilder);
 	hook(type => "sessioncgi", id => "passwordauth", call => \&sessioncgi);
-} # }}}
+	hook(type => "auth", id => "passwordauth", call => \&auth);
+}
 
-sub getsetup () { #{{{
+sub getsetup () {
 	return
+		plugin => {
+			safe => 1,
+			rebuild => 0,
+			section => "auth",
+		},
 		account_creation_password => {
 			type => "string",
-			default => "",
+			example => "s3cr1t",
 			description => "a password that must be entered when signing up for an account",
 			safe => 1,
 			rebuild => 0,
 		},
 		password_cost => {
 			type => "integer",
-			default => 8,
+			example => 8,
 			description => "cost of generating a password using Authen::Passphrase::BlowfishCrypt",
 			safe => 1,
 			rebuild => 0,
 		},
-} #}}}
+}
 
 # Checks if a string matches a user's password, and returns true or false.
-sub checkpassword ($$;$) { #{{{
+sub checkpassword ($$;$) {
 	my $user=shift;
 	my $password=shift;
 	my $field=shift || "password";
@@ -70,9 +76,9 @@ sub checkpassword ($$;$) { #{{{
 	}
 
 	return $ret;
-} #}}}
+}
 
-sub setpassword ($$;$) { #{{{
+sub setpassword ($$;$) {
 	my $user=shift;
 	my $password=shift;
 	my $field=shift || "password";
@@ -90,22 +96,26 @@ sub setpassword ($$;$) { #{{{
 	else {
 		IkiWiki::userinfo_set($user, $field, $password);
 	}
-} #}}}
+}
 
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
 	my %params=@_;
 
 	my $form=$params{form};
 	my $session=$params{session};
 	my $cgi=$params{cgi};
 
-	if ($form->title eq "signin" || $form->title eq "register") {
+	my $do_register=defined $cgi->param("do") && $cgi->param("do") eq "register";
+
+	if ($form->title eq "signin" || $form->title eq "register" || $do_register) {
 		$form->field(name => "name", required => 0);
 		$form->field(name => "password", type => "password", required => 0);
 		
-		if ($form->submitted eq "Register" || $form->submitted eq "Create Account") {
+		if ($form->submitted eq "Register" || $form->submitted eq "Create Account" || $do_register) {
 			$form->field(name => "confirm_password", type => "password");
-			$form->field(name => "account_creation_password", type => "password") if (length $config{account_creation_password});
+			$form->field(name => "account_creation_password", type => "password")
+				 if (defined $config{account_creation_password} &&
+				     length $config{account_creation_password});
 			$form->field(name => "email", size => 50);
 			$form->title("register");
 			$form->text("");
@@ -142,7 +152,8 @@ sub formbuilder_setup (@) { #{{{
 						shift eq $config{account_creation_password};
 					},
 					required => 1,
-				) if (length $config{account_creation_password});
+				) if (defined $config{account_creation_password} &&
+				      length $config{account_creation_password});
 				$form->field(
 					name => "email",
 					validate => "EMAIL",
@@ -199,23 +210,38 @@ sub formbuilder_setup (@) { #{{{
 		}
 	}
 	elsif ($form->title eq "preferences") {
-		$form->field(name => "name", disabled => 1, 
-			value => $session->param("name"), force => 1,
-			fieldset => "login");
-		$form->field(name => "password", type => "password",
-			fieldset => "login",
-			validate => sub {
-				shift eq $form->field("confirm_password");
-			}),
-		$form->field(name => "confirm_password", type => "password",
-			fieldset => "login",
-			validate => sub {
-				shift eq $form->field("password");
-			}),
+		my $user=$session->param("name");
+		if (! IkiWiki::openiduser($user)) {
+			$form->field(name => "name", disabled => 1, 
+				value => $user, force => 1,
+				fieldset => "login");
+			$form->field(name => "password", type => "password",
+				fieldset => "login",
+				validate => sub {
+					shift eq $form->field("confirm_password");
+				});
+			$form->field(name => "confirm_password", type => "password",
+				fieldset => "login",
+				validate => sub {
+					shift eq $form->field("password");
+				});
+			
+			my $userpage=IkiWiki::userpage($user);
+			if (exists $pagesources{$userpage}) {
+				$form->text(gettext("Your user page: ").
+					htmllink("", "", $userpage,
+						noimageinline => 1));
+			}
+			else {
+				$form->text("<a href=\"".
+					IkiWiki::cgiurl(do => "edit", page => $userpage).
+					"\">".gettext("Create your user page")."</a>");
+			}
+		}
 	}
 }
 
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
 	my %params=@_;
 
 	my $form=$params{form};
@@ -223,8 +249,10 @@ sub formbuilder (@) { #{{{
 	my $cgi=$params{cgi};
 	my $buttons=$params{buttons};
 
+	my $do_register=defined $cgi->param("do") && $cgi->param("do") eq "register";
+
 	if ($form->title eq "signin" || $form->title eq "register") {
-		if ($form->submitted && $form->validate) {
+		if (($form->submitted && $form->validate) || $do_register) {
 			if ($form->submitted eq 'Login') {
 				$session->param("name", $form->field("name"));
 				IkiWiki::cgi_postsignin($cgi, $session);
@@ -276,7 +304,9 @@ sub formbuilder (@) { #{{{
 				error($@) if $@;
 				sendmail(
 					To => IkiWiki::userinfo_get($user_name, "email"),
-					From => "$config{wikiname} admin <$config{adminemail}>",
+					From => "$config{wikiname} admin <".
+						(defined $config{adminemail} ? $config{adminemail} : "")
+						.">",
 					Subject => "$config{wikiname} information",
 					Message => $template->output,
 				) or error(gettext("Failed to send mail"));
@@ -285,7 +315,7 @@ sub formbuilder (@) { #{{{
 				$form->field(name => "name", required => 0);
 				push @$buttons, "Reset Password";
 			}
-			elsif ($form->submitted eq "Register") {
+			elsif ($form->submitted eq "Register" || $do_register) {
 				@$buttons="Create Account";
 			}
 		}
@@ -304,9 +334,9 @@ sub formbuilder (@) { #{{{
 			}
 		}
 	}
-} #}}}
+}
 
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
 	my $q=shift;
 	my $session=shift;
 
@@ -326,6 +356,20 @@ sub sessioncgi ($$) { #{{{
 		IkiWiki::cgi_prefs($q, $session);
 		exit;
 	}
-} #}}}
+	elsif ($q->param("do") eq "register") {
+		# After registration, need to go somewhere, so show prefs page.
+		$session->param(postsignin => "do=prefs");
+		# Due to do=register, this will run in registration-only
+		# mode.
+		IkiWiki::cgi_signin($q, $session);
+		exit;
+	}
+}
+
+sub auth ($$) {
+	# While this hook is not currently used, it needs to exist
+	# so ikiwiki knows that the wiki supports logins, and will
+	# enable the Preferences page.
+}
 
 1