X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/5f162cfd344f6b75fa39a57be4b3d488cadd1535..10b8557946c7a5e4ef2210ac448365ffc6174f81:/IkiWiki/CGI.pm?ds=sidebyside diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index a8e610e2d..cd6ddc034 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -89,7 +89,9 @@ sub cgi_recentchanges ($) { #{{{ delete @{$change->{pages}}[10 .. @{$change->{pages}}] if $is_excess; $change->{pages} = [ map { - $_->{link} = htmllink("", "", $_->{page}, 1, 0, pagetitle($_->{page})); + $_->{link} = htmllink("", "", $_->{page}, + noimageinline => 1, + linktext => pagetitle($_->{page})); $_; } @{$change->{pages}} ]; @@ -178,13 +180,20 @@ sub cgi_signin ($$) { #{{{ sub cgi_postsignin ($$) { #{{{ my $q=shift; my $session=shift; - + # Continue with whatever was being done before the signin process. - my $postsignin=CGI->new($session->param("postsignin")); - $session->clear("postsignin"); - cgi($postsignin, $session); - cgi_savesession($session); - exit; + if (defined $session->param("postsignin")) { + my $postsignin=CGI->new($session->param("postsignin")); + $session->clear("postsignin"); + cgi($postsignin, $session); + cgi_savesession($session); + exit; + } + else { + # This can occur, for example, if a user went to the signin + # url via a bookmark. + redirect($q, $config{url}); + } } #}}} sub cgi_prefs ($$) { #{{{ @@ -219,7 +228,7 @@ sub cgi_prefs ($$) { #{{{ $form->field(name => "do", type => "hidden"); $form->field(name => "email", size => 50); $form->field(name => "subscriptions", size => 50, - comment => "(".htmllink("", "", "PageSpec", 1).")"); + comment => "(".htmllink("", "", "PageSpec", noimageinline => 1).")"); $form->field(name => "banned_users", size => 50); my $user_name=$session->param("name"); @@ -252,12 +261,15 @@ sub cgi_prefs ($$) { #{{{ elsif ($form->submitted eq 'Save Preferences' && $form->validate) { foreach my $field (qw(email subscriptions)) { if (defined $form->field($field) && length $form->field($field)) { - userinfo_set($user_name, $field, $form->field($field)) || error("failed to set $field"); + 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"))); + split(' ', + $form->field("banned_users"))) || + error("failed saving changes"); } $form->text(gettext("Preferences saved.")); } @@ -278,7 +290,8 @@ sub cgi_editpage ($$) { #{{{ my $q=shift; my $session=shift; - my @fields=qw(do rcsinfo subpage from page type editcontent comments); + my @fields=qw(do rcsinfo subpage from page type editcontent comments + newfile); my @buttons=("Save Page", "Preview", "Cancel"); eval q{use CGI::FormBuilder}; @@ -323,6 +336,9 @@ sub cgi_editpage ($$) { #{{{ if (exists $pagesources{$page}) { $file=$pagesources{$page}; $type=pagetype($file); + if (! defined $type) { + error(sprintf(gettext("%s is not an editable page"), $page)); + } } else { $type=$form->param('type'); @@ -337,10 +353,6 @@ sub cgi_editpage ($$) { #{{{ $file=$page.".".$type; } - my $newfile=0; - if (! -e "$config{srcdir}/$file") { - $newfile=1; - } $form->field(name => "do", type => 'hidden'); $form->field(name => "from", type => 'hidden'); @@ -351,21 +363,25 @@ sub cgi_editpage ($$) { #{{{ $form->field(name => "comments", type => "text", size => 80); $form->field(name => "editcontent", type => "textarea", rows => 20, cols => 80); + $form->field(name => "newfile", type => 'hidden'); $form->tmpl_param("can_commit", $config{rcs}); $form->tmpl_param("indexlink", indexlink()); $form->tmpl_param("helponformattinglink", - htmllink("", "", "HelpOnFormatting", 1)); + htmllink("", "", "HelpOnFormatting", noimageinline => 1)); $form->tmpl_param("baseurl", baseurl()); if (! $form->submitted) { $form->field(name => "rcsinfo", value => rcs_prepedit($file), force => 1); + $form->field(name => "newfile", + value => ! -e "$config{srcdir}/$file", + force => 1); } if ($form->submitted eq "Cancel") { - if ($newfile && defined $from) { + if ($form->field(name => "newfile") && defined $from) { redirect($q, "$config{url}/".htmlpage($from)); } - elsif ($newfile) { + elsif ($form->field(name => "newfile")) { redirect($q, $config{url}); } else { @@ -451,7 +467,8 @@ sub cgi_editpage ($$) { #{{{ $form->tmpl_param("page_select", 1); $form->field(name => "page", type => 'select', - options => \@editable_locs, value => $best_loc); + options => { map { $_ => pagetitle($_, 1) } @editable_locs }, + value => $best_loc); $form->field(name => "type", type => 'select', options => \@page_types); $form->title(sprintf(gettext("creating %s"), pagetitle($page))); @@ -479,13 +496,40 @@ sub cgi_editpage ($$) { #{{{ else { # save page check_canedit($page, $q, $session); + if (! -e "$config{srcdir}/$file" && ! $form->field(name => 'newfile')){ + $form->tmpl_param("page_gone", 1); + $form->field(name => "newfile", + value => 1, force => 1); + $form->tmpl_param("page_select", 0); + $form->field(name => "page", type => 'hidden'); + $form->field(name => "type", type => 'hidden'); + print $form->render(submit => \@buttons); + return; + } my $content=$form->field('editcontent'); $content=~s/\r\n/\n/g; $content=~s/\r/\n/g; - writefile($file, $config{srcdir}, $content); + + $config{cgi}=0; # avoid cgi error message + eval { writefile($file, $config{srcdir}, $content) }; + $config{cgi}=1; + if ($@) { + $form->field(name => "rcsinfo", value => rcs_prepedit($file), + force => 1); + $form->tmpl_param("failed_save", 1); + $form->tmpl_param("error_message", $@); + $form->field("editcontent", value => $content, force => 1); + $form->tmpl_param("page_select", 0); + $form->field(name => "page", type => 'hidden'); + $form->field(name => "type", type => 'hidden'); + $form->title(sprintf(gettext("editing %s"), $page)); + print $form->render(submit => \@buttons); + return; + } + my $conflict; if ($config{rcs}) { my $message=""; if (defined $form->field('comments') && @@ -493,47 +537,46 @@ sub cgi_editpage ($$) { #{{{ $message=$form->field('comments'); } - if ($newfile) { + if ($form->field(name => "newfile")) { rcs_add($file); } - # prevent deadlock with post-commit hook - unlockwiki(); - # presumably the commit will trigger an update - # of the wiki - my $conflict=rcs_commit($file, $message, + + # Prevent deadlock with post-commit hook by + # signaling to it that it should not try to + # do anything (except send commit mails). + disable_commit_hook(); + $conflict=rcs_commit($file, $message, $form->field("rcsinfo"), $session->param("name"), $ENV{REMOTE_ADDR}); + enable_commit_hook(); + rcs_update(); + } - if (defined $conflict) { - $form->field(name => "rcsinfo", value => rcs_prepedit($file), - force => 1); - $form->tmpl_param("page_conflict", 1); - $form->field("editcontent", value => $conflict, force => 1); - $form->field(name => "comments", value => $form->field('comments'), force => 1); - $form->field("do", "edit)"); - $form->tmpl_param("page_select", 0); - $form->field(name => "page", type => 'hidden'); - $form->field(name => "type", type => 'hidden'); - $form->title(sprintf(gettext("editing %s"), $page)); - print $form->render(submit => \@buttons); - return; - } - else { - # Make sure that the repo is up-to-date; - # locking prevents the post-commit hook - # from updating it. - rcs_update(); - } + # Refresh even if there was a conflict, since other changes + # may have been committed while the post-commit hook was + # disabled. + require IkiWiki::Render; + refresh(); + saveindex(); + + if (defined $conflict) { + $form->field(name => "rcsinfo", value => rcs_prepedit($file), + force => 1); + $form->tmpl_param("page_conflict", 1); + $form->field("editcontent", value => $conflict, force => 1); + $form->field("do", "edit", force => 1); + $form->tmpl_param("page_select", 0); + $form->field(name => "page", type => 'hidden'); + $form->field(name => "type", type => 'hidden'); + $form->title(sprintf(gettext("editing %s"), $page)); + print $form->render(submit => \@buttons); + return; } else { - require IkiWiki::Render; - refresh(); - saveindex(); + # The trailing question mark tries to avoid broken + # caches and get the most recent version of the page. + redirect($q, "$config{url}/".htmlpage($page)."?updated"); } - - # The trailing question mark tries to avoid broken - # caches and get the most recent version of the page. - redirect($q, "$config{url}/".htmlpage($page)."?updated"); } } #}}} @@ -613,7 +656,7 @@ sub cgi (;$$) { #{{{ email => "", password => "", regdate => time, - }); + }) || error("failed adding user"); } } } @@ -685,7 +728,7 @@ sub userlink ($) { #{{{ else { return htmllink("", "", escapeHTML( length $config{userdir} ? $config{userdir}."/".$user : $user - ), 1); + ), noimageinline => 1); } } #}}}