X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/be55f6fd7cf1a251c3977f857a44ee2769e39d8b..ad01bcd8b49deed11f602c43d1da8235280d5d6b:/IkiWiki/CGI.pm diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 53eda2158..ce4b6ada1 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -74,21 +74,28 @@ sub cgi_recentchanges ($) { #{{{ # during page builds as the return values may change, but they # won't here.) eval q{use Memoize}; + error($@) if $@; memoize("htmllink"); eval q{use Time::Duration}; + error($@) if $@; eval q{use CGI 'escapeHTML'}; + error($@) if $@; my $changelog=[rcs_recentchanges(100)]; foreach my $change (@$changelog) { $change->{when} = concise(ago($change->{when})); $change->{user} = htmllink("", "", escapeHTML($change->{user}), 1); + + my $is_excess = exists $change->{pages}[10]; # limit pages to first 10 + delete @{$change->{pages}}[10 .. @{$change->{pages}}] if $is_excess; $change->{pages} = [ map { $_->{link} = htmllink("", "", $_->{page}, 1); $_; } @{$change->{pages}} ]; + push @{$change->{pages}}, { link => '...' } if $is_excess; } my $template=template("recentchanges.tmpl"); @@ -110,9 +117,10 @@ sub cgi_signin ($$) { #{{{ my $session=shift; eval q{use CGI::FormBuilder}; + error($@) if $@; my $form = CGI::FormBuilder->new( title => "signin", - fields => [qw(do title page subpage from name password confirm_password email)], + fields => [qw(do title page subpage from name password)], header => 1, charset => "utf-8", method => 'POST', @@ -141,8 +149,13 @@ sub cgi_signin ($$) { #{{{ $form->field(name => "from", type => "hidden"); $form->field(name => "subpage", type => "hidden"); $form->field(name => "password", type => "password", required => 0); - $form->field(name => "confirm_password", type => "password", required => 0); - $form->field(name => "email", required => 0); + if ($form->submitted eq "Register" || $form->submitted eq "Create Account") { + $form->title("register"); + $form->text(""); + $form->fields(qw(do title page subpage from name password confirm_password email)); + $form->field(name => "confirm_password", type => "password"); + $form->field(name => "email", type => "text"); + } if ($q->param("do") ne "signin" && !$form->submitted) { $form->text("You need to log in first."); } @@ -151,7 +164,8 @@ sub cgi_signin ($$) { #{{{ # Set required fields based on how form was submitted. my %required=( "Login" => [qw(name password)], - "Register" => [qw(name password confirm_password email)], + "Register" => [], + "Create Account" => [qw(name password confirm_password email)], "Mail Password" => [qw(name)], ); foreach my $opt (@{$required{$form->submitted}}) { @@ -175,7 +189,8 @@ sub cgi_signin ($$) { #{{{ } # And make sure the entered name exists when logging # in or sending email, and does not when registering. - if ($form->submitted eq 'Register') { + if ($form->submitted eq 'Create Account' || + $form->submitted eq 'Register') { $form->field( name => "name", validate => sub { @@ -200,8 +215,6 @@ sub cgi_signin ($$) { #{{{ else { # First time settings. $form->field(name => "name", comment => "use FirstnameLastName"); - $form->field(name => "confirm_password", comment => "(only needed"); - $form->field(name => "email", comment => "for registration)"); if ($session->param("name")) { $form->field(name => "name", value => $session->param("name")); } @@ -224,7 +237,7 @@ sub cgi_signin ($$) { #{{{ redirect($q, $config{url}); } } - elsif ($form->submitted eq 'Register') { + elsif ($form->submitted eq 'Create Account') { my $user_name=$form->field('name'); if (userinfo_setall($user_name, { 'email' => $form->field('email'), @@ -233,12 +246,12 @@ sub cgi_signin ($$) { #{{{ })) { $form->field(name => "confirm_password", type => "hidden"); $form->field(name => "email", type => "hidden"); - $form->text("Registration successful. Now you can Login."); + $form->text("Account creation successful. Now you can Login."); printheader($session); print misctemplate($form->title, $form->render(submit => ["Login"])); } else { - error("Error saving registration."); + error("Error creating account."); } } elsif ($form->submitted eq 'Mail Password') { @@ -253,6 +266,7 @@ sub cgi_signin ($$) { #{{{ ); eval q{use Mail::Sendmail}; + error($@) if $@; sendmail( To => userinfo_get($user_name, "email"), From => "$config{wikiname} admin <$config{adminemail}>", @@ -263,9 +277,17 @@ sub cgi_signin ($$) { #{{{ $form->text("Your password has been emailed to you."); $form->field(name => "name", required => 0); printheader($session); - print misctemplate($form->title, $form->render(submit => ["Login", "Register", "Mail Password"])); + print misctemplate($form->title, $form->render(submit => ["Login", "Mail Password"])); + } + elsif ($form->submitted eq "Register") { + printheader($session); + print misctemplate($form->title, $form->render(submit => ["Create Account"])); } } + elsif ($form->submitted eq "Create Account") { + printheader($session); + print misctemplate($form->title, $form->render(submit => ["Create Account"])); + } else { printheader($session); print misctemplate($form->title, $form->render(submit => ["Login", "Register", "Mail Password"])); @@ -277,6 +299,7 @@ sub cgi_prefs ($$) { #{{{ my $session=shift; eval q{use CGI::FormBuilder}; + error($@) if $@; my $form = CGI::FormBuilder->new( title => "preferences", fields => [qw(do name password confirm_password email @@ -310,9 +333,11 @@ sub cgi_prefs ($$) { #{{{ comment => "(".htmllink("", "", "PageSpec", 1).")"); $form->field(name => "locked_pages", size => 50, comment => "(".htmllink("", "", "PageSpec", 1).")"); + $form->field(name => "banned_users", size => 50); if (! is_admin($user_name)) { $form->field(name => "locked_pages", type => "hidden"); + $form->field(name => "banned_users", type => "hidden"); } if ($config{httpauth}) { @@ -327,6 +352,10 @@ sub cgi_prefs ($$) { #{{{ value => userinfo_get($user_name, "subscriptions")); $form->field(name => "locked_pages", force => 1, value => userinfo_get($user_name, "locked_pages")); + if (is_admin($user_name)) { + $form->field(name => "banned_users", force => 1, + value => join(" ", get_banned_users())); + } } decode_form_utf8($form); @@ -346,6 +375,10 @@ sub cgi_prefs ($$) { #{{{ userinfo_set($user_name, $field, $form->field($field)) || error("failed to set $field"); } } + if (is_admin($user_name)) { + set_banned_users(grep { ! is_admin($_) } + split(' ', $form->field("banned_users"))); + } $form->text("Preferences saved."); } @@ -361,6 +394,7 @@ sub cgi_editpage ($$) { #{{{ my @buttons=("Save Page", "Preview", "Cancel"); eval q{use CGI::FormBuilder; use CGI::FormBuilder::Template::HTML}; + error($@) if $@; my $renderer=CGI::FormBuilder::Template::HTML->new( fields => \@fields, template_params("editpage.tmpl"), @@ -612,8 +646,8 @@ sub cgi_editpage ($$) { #{{{ } #}}} sub cgi () { #{{{ - eval q{use CGI}; - eval q{use CGI::Session}; + eval q{use CGI; use CGI::Session}; + error($@) if $@; my $q=CGI->new; @@ -667,7 +701,7 @@ sub cgi () { #{{{ } else { $session->param("name", $q->remote_user()); - if (!userinfo_get($session->param("name"),"regdate")) { + if (! userinfo_get($session->param("name"), "regdate")) { userinfo_setall($session->param("name"), { email => "", password => "", @@ -676,6 +710,13 @@ sub cgi () { #{{{ } } } + + if (defined $session->param("name") && userinfo_get($session->param("name"), "banned")) { + print $q->header(-status => "403 Forbidden"); + $session->delete(); + print "You are banned."; + exit; + } if ($do eq 'create' || $do eq 'edit') { cgi_editpage($q, $session);