X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/72b5ef2c5fb01751992c9400afe2690da5df611f..c928a118d6250f51effdbf2682d44d2d09eeb21d:/IkiWiki/CGI.pm

diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm
index 65136a269..532f9c5f6 100644
--- a/IkiWiki/CGI.pm
+++ b/IkiWiki/CGI.pm
@@ -78,9 +78,24 @@ sub check_canedit ($$$;$) { #{{{
 } #}}}
 
 sub decode_cgi_utf8 ($) { #{{{
-	my $cgi = shift;
-	foreach my $f ($cgi->param) {
-		$cgi->param($f, map { decode_utf8 $_ } $cgi->param($f));
+	# decode_form_utf8 method is needed for 5.10
+	if ($] < 5.01) {
+		my $cgi = shift;
+		foreach my $f ($cgi->param) {
+			$cgi->param($f, map { decode_utf8 $_ } $cgi->param($f));
+		}
+	}
+} #}}}
+
+sub decode_form_utf8 ($) { #{{{
+	if ($] >= 5.01) {
+		my $form = shift;
+		foreach my $f ($form->field) {
+			$form->field(name  => $f,
+			             value => decode_utf8($form->field($f)),
+		                     force => 1,
+			);
+		}
 	}
 } #}}}
 
@@ -127,10 +142,12 @@ sub cgi_signin ($$) { #{{{
 	$form->field(name => "do", type => "hidden", value => "signin",
 		force => 1);
 	
+	decode_form_utf8($form);
 	run_hooks(formbuilder_setup => sub {
 		shift->(form => $form, cgi => $q, session => $session,
 		        buttons => $buttons);
 	});
+	decode_form_utf8($form);
 
 	if ($form->submitted) {
 		$form->validate;
@@ -197,11 +214,13 @@ sub cgi_prefs ($$) { #{{{
 		],
 	);
 	my $buttons=["Save Preferences", "Logout", "Cancel"];
-
+	
+	decode_form_utf8($form);
 	run_hooks(formbuilder_setup => sub {
 		shift->(form => $form, cgi => $q, session => $session,
 		        buttons => $buttons);
 	});
+	decode_form_utf8($form);
 	
 	$form->field(name => "do", type => "hidden", value => "prefs",
 		force => 1);
@@ -256,7 +275,7 @@ sub cgi_editpage ($$) { #{{{
 	my $session=shift;
 	
 	decode_cgi_utf8($q);
-	
+
 	my @fields=qw(do rcsinfo subpage from page type editcontent comments);
 	my @buttons=("Save Page", "Preview", "Cancel");
 	eval q{use CGI::FormBuilder};
@@ -276,10 +295,12 @@ sub cgi_editpage ($$) { #{{{
 		wikiname => $config{wikiname},
 	);
 	
+	decode_form_utf8($form);
 	run_hooks(formbuilder_setup => sub {
 		shift->(form => $form, cgi => $q, session => $session,
 			buttons => \@buttons);
 	});
+	decode_form_utf8($form);
 	
 	# This untaint is safe because titlepage removes any problematic
 	# characters.
@@ -366,6 +387,7 @@ sub cgi_editpage ($$) { #{{{
 		}
 
 		my $content=$form->field('editcontent');
+
 		run_hooks(editcontent => sub {
 			$content=shift->(
 				content => $content,
@@ -379,7 +401,7 @@ sub cgi_editpage ($$) { #{{{
 			linkify($page, $page,
 			preprocess($page, $page,
 			filter($page, $page, $content), 0, 1))));
-		
+	
 		if ($new) {
 			delete $pagesources{$page};
 		}
@@ -503,7 +525,7 @@ sub cgi_editpage ($$) { #{{{
 		my $exists=-e "$config{srcdir}/$file";
 
 		if ($form->field("do") ne "create" && ! $exists &&
-		    ! eval { srcfile($file) }) {
+		    ! defined srcfile($file, 1)) {
 			$form->tmpl_param("page_gone", 1);
 			$form->field(name => "do", value => "create", force => 1);
 			$form->tmpl_param("page_select", 0);
@@ -615,6 +637,7 @@ sub cgi_getsession ($) { #{{{
 	my $q=shift;
 
 	eval q{use CGI::Session};
+	error($@) if $@;
 	CGI::Session->name("ikiwiki_session_".encode_utf8($config{wikiname}));
 	
 	my $oldmask=umask(077);
@@ -642,7 +665,9 @@ sub cgi (;$$) { #{{{
 		eval q{use CGI};
 		error($@) if $@;
 	
+		binmode(STDIN);
 		$q=CGI->new;
+		binmode(STDIN, ":utf8");
 	
 		run_hooks(cgi => sub { shift->($q) });
 	}