]> sipb.mit.edu Git - ikiwiki.git/commitdiff
add
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Mon, 20 Nov 2006 20:55:37 +0000 (20:55 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Mon, 20 Nov 2006 20:55:37 +0000 (20:55 +0000)
IkiWiki/Plugin/passwordauth.pm [new file with mode: 0644]

diff --git a/IkiWiki/Plugin/passwordauth.pm b/IkiWiki/Plugin/passwordauth.pm
new file mode 100644 (file)
index 0000000..03000c8
--- /dev/null
@@ -0,0 +1,200 @@
+#!/usr/bin/perl
+# Ikiwiki password authentication.
+package IkiWiki::Plugin::passwordauth;
+
+use warnings;
+use strict;
+use IkiWiki;
+
+sub import { #{{{
+        hook(type => "formbuilder_setup", id => "passwordauth",
+               call => \&formbuilder_setup);
+        hook(type => "formbuilder", id => "passwordauth",
+               call => \&formbuilder);
+} # }}}
+
+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") {
+               $form->field(name => "name", required => 0, size => 30);
+               $form->field(name => "password", type => "password", required => 0);
+               
+               if ($form->submitted eq "Register" || $form->submitted eq "Create Account") {
+                       $form->field(name => "confirm_password", type => "password");
+                       $form->field(name => "email", size => 50);
+                       $form->title("register");
+                       $form->text("");
+               }
+
+               if ($form->submitted) {
+                       my $submittype=$form->submitted;
+                       # Set required fields based on how form was submitted.
+                       my %required=(
+                               "Login" => [qw(name password)],
+                               "Register" => [],
+                               "Create Account" => [qw(name password confirm_password email)],
+                               "Mail Password" => [qw(name)],
+                       );
+                       foreach my $opt (@{$required{$submittype}}) {
+                               $form->field(name => $opt, required => 1);
+                       }
+       
+                       if ($submittype eq "Create Account") {
+                               $form->field(
+                                       name => "confirm_password",
+                                       validate => sub {
+                                               shift eq $form->field("password");
+                                       },
+                               );
+                               $form->field(
+                                       name => "email",
+                                       validate => "EMAIL",
+                               );
+                       }
+
+                       # Validate password against name for Login.
+                       if ($submittype eq "Login") {
+                               $form->field(
+                                       name => "password",
+                                       validate => sub {
+                                               length $form->field("name") &&
+                                               shift eq IkiWiki::userinfo_get($form->field("name"), 'password');
+                                       },
+                               );
+                       }
+                       elsif ($submittype eq "Register" ||
+                              $submittype eq "Create Account" ||
+                              $submittype eq "Mail Password") {
+                               $form->field(name => "password", validate => 'VALUE');
+                       }
+                       
+                       # And make sure the entered name exists when logging
+                       # in or sending email, and does not when registering.
+                       if ($submittype eq 'Create Account' ||
+                           $submittype eq 'Register') {
+                               $form->field(
+                                       name => "name",
+                                       validate => sub {
+                                               my $name=shift;
+                                               length $name &&
+                                               $name=~/$config{wiki_file_regexp}/ &&
+                                               ! IkiWiki::userinfo_get($name, "regdate");
+                                       },
+                               );
+                       }
+                       elsif ($submittype eq "Login" ||
+                              $submittype eq "Mail Password") {
+                               $form->field( 
+                                       name => "name",
+                                       validate => sub {
+                                               my $name=shift;
+                                               length $name &&
+                                               IkiWiki::userinfo_get($name, "regdate");
+                                       },
+                               );
+                       }
+               }
+               else {
+                       # First time settings.
+                       $form->field(name => "name", comment => "use FirstnameLastName");
+                       if ($session->param("name")) {
+                               $form->field(name => "name", value => $session->param("name"));
+                       }
+               }
+       }
+       elsif ($form->title eq "preferences") {
+               $form->field(name => "name", disabled => 1, value =>
+                       $session->param("name"), force => 1);
+               $form->field(name => "password", type => "password");
+               $form->field(name => "confirm_password", type => "password",
+                       validate => sub {
+                               shift eq $form->field("password");
+                       });
+               
+       }
+}
+
+sub formbuilder (@) { #{{{
+       my %params=@_;
+
+       my $form=$params{form};
+       my $session=$params{session};
+       my $cgi=$params{cgi};
+       my $buttons=$params{buttons};
+
+       if ($form->title eq "signin" || $form->title eq "register") {
+               if ($form->submitted && $form->validate) {
+                       if ($form->submitted eq 'Login') {
+                               $session->param("name", $form->field("name"));
+                               IkiWiki::cgi_postsignin($cgi, $session);
+                       }
+                       elsif ($form->submitted eq 'Create Account') {
+                               my $user_name=$form->field('name');
+                               if (IkiWiki::userinfo_setall($user_name, {
+                                       'email' => $form->field('email'),
+                                       'password' => $form->field('password'),
+                                       'regdate' => time})) {
+                                       $form->field(name => "confirm_password", type => "hidden");
+                                       $form->field(name => "email", type => "hidden");
+                                       $form->text("Account creation successful. Now you can Login.");
+                               }
+                               else {
+                                       error("Error creating account.");
+                               }
+                       }
+                       elsif ($form->submitted eq 'Mail Password') {
+                               my $user_name=$form->field("name");
+                               my $template=template("passwordmail.tmpl");
+                               $template->param(
+                                       user_name => $user_name,
+                                       user_password => IkiWiki::userinfo_get($user_name, "password"),
+                                       wikiurl => $config{url},
+                                       wikiname => $config{wikiname},
+                                       REMOTE_ADDR => $ENV{REMOTE_ADDR},
+                               );
+                       
+                               eval q{use Mail::Sendmail};
+                               error($@) if $@;
+                               sendmail(
+                                       To => IkiWiki::userinfo_get($user_name, "email"),
+                                       From => "$config{wikiname} admin <$config{adminemail}>",
+                                       Subject => "$config{wikiname} information",
+                                       Message => $template->output,
+                               ) or error("Failed to send mail");
+                       
+                               $form->text("Your password has been emailed to you.");
+                               $form->field(name => "name", required => 0);
+                               push @$buttons, "Mail Password";
+                       }
+                       elsif ($form->submitted eq "Register") {
+                               @$buttons="Create Account";
+                       }
+               }
+               elsif ($form->submitted eq "Create Account") {
+                       @$buttons="Create Account";
+               }
+               else {
+                       push @$buttons, "Register", "Mail Password";
+               }
+       }
+       elsif ($form->title eq "preferences") {
+               if ($form->submitted eq "Save Preferences" && $form->validate) {
+                       my $user_name=$form->field('name');
+                       foreach my $field (qw(password)) {
+                               if (defined $form->field($field) && length $form->field($field)) {
+                                       userinfo_set($user_name, $field, $form->field($field)) || error("failed to set $field");
+                               }
+                       }
+               }
+       }
+       
+       IkiWiki::printheader($session);
+       print IkiWiki::misctemplate($form->title, $form->render(submit => $buttons));
+} #}}}
+
+1