X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/fc0b70e700ca9d029e5aedd013b00de0cf793993..8daaa11baa70e07f6405ccb4474e97cac9627961:/IkiWiki/CGI.pm diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 54c526c2c..85fc1a386 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -45,8 +45,12 @@ sub page_locked ($$;$) { #{{{ my $locked_pages=userinfo_get($admin, "locked_pages"); if (pagespec_match($page, userinfo_get($admin, "locked_pages"))) { return 1 if $nonfatal; - error(htmllink("", "", $page, 1)." is locked by ". - userlink($admin)." and cannot be edited."); + + #translators: The first parameter is a page name, + #translators: second is the user who locked it. + error(sprintf(gettext("%s is locked by %s and cannot be edited"), + htmllink("", "", $page, 1), + userlink($admin))); } } @@ -134,7 +138,7 @@ sub cgi_signin ($$) { #{{{ $form->field(name => "do", type => "hidden"); if ($q->param("do") ne "signin" && !$form->submitted) { - $form->text("You need to log in first."); + $form->text(gettext("You need to log in first.")); } run_hooks(formbuilder_setup => sub { @@ -168,6 +172,7 @@ sub cgi_postsignin ($$) { #{{{ my $postsignin=CGI->new($session->param("postsignin")); $session->clear("postsignin"); cgi($postsignin, $session); + cgi_savesession($session); exit; } else { @@ -241,7 +246,7 @@ sub cgi_prefs ($$) { #{{{ redirect($q, $config{url}); return; } - elsif ($form->submitted eq "Save Preferences" && $form->validate) { + elsif ($form->submitted eq 'Save Preferences' && $form->validate) { foreach my $field (qw(email subscriptions locked_pages)) { if (defined $form->field($field) && length $form->field($field)) { userinfo_set($user_name, $field, $form->field($field)) || error("failed to set $field"); @@ -251,7 +256,7 @@ sub cgi_prefs ($$) { #{{{ set_banned_users(grep { ! is_admin($_) } split(' ', $form->field("banned_users"))); } - $form->text("Preferences saved."); + $form->text(gettext("Preferences saved.")); } if (exists $hooks{formbuilder}) { @@ -273,15 +278,8 @@ sub cgi_editpage ($$) { #{{{ my @fields=qw(do rcsinfo subpage from page type editcontent comments); my @buttons=("Save Page", "Preview", "Cancel"); - eval q{use CGI::FormBuilder; use CGI::FormBuilder::Template::HTML}; + eval q{use CGI::FormBuilder}; error($@) if $@; - my $renderer=CGI::FormBuilder::Template::HTML->new( - fields => \@fields, - template_params("editpage.tmpl"), - ); - run_hooks(pagetemplate => sub { - shift->(page => "", destpage => "", template => $renderer->engine); - }); my $form = CGI::FormBuilder->new( fields => \@fields, header => 1, @@ -295,7 +293,8 @@ sub cgi_editpage ($$) { #{{{ params => $q, action => $config{cgiurl}, table => 0, - template => $renderer, + template => (-e "$config{templatedir}/editpage.tmpl" ? + {template_params("editpage.tmpl")} : ""), ); run_hooks(formbuilder_setup => sub { @@ -308,8 +307,7 @@ sub cgi_editpage ($$) { #{{{ # characters. my ($page)=$form->field('page'); $page=titlepage(possibly_foolish_untaint($page)); - if (! defined $page || ! length $page || - $page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) { + if (! defined $page || ! length $page || file_pruned($page, $config{srcdir}) || $page=~/^\//) { error("bad page name"); } @@ -399,7 +397,7 @@ sub cgi_editpage ($$) { #{{{ my $best_loc; if (! defined $from || ! length $from || $from ne $form->field('from') || - $from=~/$config{wiki_file_prune_regexp}/ || + file_pruned($from, $config{srcdir}) || $from=~/^\// || $form->submitted eq "Preview") { @page_locs=$best_loc=$page; @@ -409,7 +407,7 @@ sub cgi_editpage ($$) { #{{{ $dir=~s![^/]+/+$!!; if ((defined $form->field('subpage') && length $form->field('subpage')) || - $page eq 'discussion') { + $page eq gettext('discussion')) { $best_loc="$from/$page"; } else { @@ -423,6 +421,8 @@ sub cgi_editpage ($$) { #{{{ push @page_locs, $dir.$page; } } + push @page_locs, "$config{userdir}/$page" + if length $config{userdir}; @page_locs = grep { ! exists $pagecase{lc $_} && @@ -446,7 +446,7 @@ sub cgi_editpage ($$) { #{{{ options => \@page_locs, value => $best_loc); $form->field(name => "type", type => 'select', options => \@page_types); - $form->title("creating ".pagetitle($page)); + $form->title(sprintf(gettext("creating %s"), pagetitle($page))); } elsif ($form->field("do") eq "edit") { page_locked($page, $session); @@ -463,7 +463,7 @@ sub cgi_editpage ($$) { #{{{ $form->tmpl_param("page_select", 0); $form->field(name => "page", type => 'hidden'); $form->field(name => "type", type => 'hidden'); - $form->title("editing ".pagetitle($page)); + $form->title(sprintf(gettext("editing %s"), pagetitle($page))); } print $form->render(submit => \@buttons); @@ -478,20 +478,13 @@ sub cgi_editpage ($$) { #{{{ $content=~s/\r/\n/g; writefile($file, $config{srcdir}, $content); - my $message="web commit "; - if (defined $session->param("name") && - length $session->param("name")) { - $message.="by ".$session->param("name"); - } - else { - $message.="from $ENV{REMOTE_ADDR}"; - } - if (defined $form->field('comments') && - length $form->field('comments')) { - $message.=": ".$form->field('comments'); - } - if ($config{rcs}) { + my $message=""; + if (defined $form->field('comments') && + length $form->field('comments')) { + $message=$form->field('comments'); + } + if ($newfile) { rcs_add($file); } @@ -500,7 +493,8 @@ sub cgi_editpage ($$) { #{{{ # presumably the commit will trigger an update # of the wiki my $conflict=rcs_commit($file, $message, - $form->field("rcsinfo")); + $form->field("rcsinfo"), + $session->param("name"), $ENV{REMOTE_ADDR}); if (defined $conflict) { $form->field(name => "rcsinfo", value => rcs_prepedit($file), @@ -512,7 +506,7 @@ sub cgi_editpage ($$) { #{{{ $form->tmpl_param("page_select", 0); $form->field(name => "page", type => 'hidden'); $form->field(name => "type", type => 'hidden'); - $form->title("editing $page"); + $form->title(sprintf(gettext("editing %s"), $page)); print $form->render(submit => \@buttons); return; } @@ -529,12 +523,35 @@ sub cgi_editpage ($$) { #{{{ } } #}}} +sub cgi_getsession ($) { #{{{ + my $q=shift; + + eval q{use CGI::Session}; + CGI::Session->name("ikiwiki_session_".encode_utf8($config{wikiname})); + + my $oldmask=umask(077); + my $session = CGI::Session->new("driver:DB_File", $q, + { FileName => "$config{wikistatedir}/sessions.db" }); + umask($oldmask); + + return $session; +} #}}} + +sub cgi_savesession ($) { #{{{ + my $session=shift; + + # Force session flush with safe umask. + my $oldmask=umask(077); + $session->flush; + umask($oldmask); +} + sub cgi (;$$) { #{{{ my $q=shift; my $session=shift; if (! $q) { - eval q{use CGI; use CGI::Session}; + eval q{use CGI}; error($@) if $@; $q=CGI->new; @@ -566,12 +583,7 @@ sub cgi (;$$) { #{{{ lockwiki(); if (! $session) { - CGI::Session->name("ikiwiki_session_".encode_utf8($config{wikiname})); - - my $oldmask=umask(077); - $session = CGI::Session->new("driver:DB_File", $q, - { FileName => "$config{wikistatedir}/sessions.db" }); - umask($oldmask); + $session=cgi_getsession($q); } # Auth hooks can sign a user in. @@ -601,12 +613,7 @@ sub cgi (;$$) { #{{{ $session->param(postsignin => $ENV{QUERY_STRING}); } cgi_signin($q, $session); - - # Force session flush with safe umask. - my $oldmask=umask(077); - $session->flush; - umask($oldmask); - + cgi_savesession($session); return; } elsif (defined $session->param("postsignin")) { @@ -616,7 +623,8 @@ 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."; + print gettext("You are banned."); + cgi_savesession($session); exit; } @@ -628,6 +636,7 @@ sub cgi (;$$) { #{{{ } elsif ($do eq 'blog') { my $page=titlepage(decode_utf8($q->param('title'))); + $page=~s/(\/)/"__".ord($1)."__"/eg; # escape slashes too # if the page already exists, munge it to be unique my $from=$q->param('from'); my $add=""; @@ -657,12 +666,19 @@ sub userlink ($) { #{{{ my $display=$oid->display; # Convert "user.somehost.com" to "user [somehost.com]". if ($display !~ /\[/) { - $display=~s/^(.*?)\.([^.]+.[^.]+)$/$1 [$2]/; + $display=~s/^(.*?)\.([^.]+\.[a-z]+)$/$1 [$2]/; + } + # Convert "http://somehost.com/user" to "user [somehost.com]". + if ($display !~ /\[/) { + $display=~s/^https?:\/\/(.+)\/([^\/]+)$/$2 [$1]/; } + $display=~s!^https?://!!; # make sure this is removed return "".escapeHTML($display).""; } else { - return htmllink("", "", escapeHTML($user), 1); + return htmllink("", "", escapeHTML( + length $config{userdir} ? $config{userdir}."/".$user : $user + ), 1); } } #}}}