aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki/Plugin/passwordauth.pm200
1 files changed, 200 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/passwordauth.pm b/IkiWiki/Plugin/passwordauth.pm
new file mode 100644
index 000000000..03000c800
--- /dev/null
+++ b/IkiWiki/Plugin/passwordauth.pm
@@ -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