]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/CGI.pm
* Turn $config{wiki_file_prune_regexps} into an array that is easier to
[ikiwiki.git] / IkiWiki / CGI.pm
index 54c526c2cbf6402b4cf8205d6cb1caef8db48dac..a41349be518a648fa9f71cd5df83b4810a3ce98c 100644 (file)
@@ -168,6 +168,7 @@ sub cgi_postsignin ($$) { #{{{
                my $postsignin=CGI->new($session->param("postsignin"));
                $session->clear("postsignin");
                cgi($postsignin, $session);
+               cgi_savesession($session);
                exit;
        }
        else {
@@ -273,15 +274,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 +289,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 +303,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 +393,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;
@@ -478,20 +472,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 +487,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),
@@ -529,12 +517,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 +577,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 +607,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")) {
@@ -617,6 +618,7 @@ sub cgi (;$$) { #{{{
                print $q->header(-status => "403 Forbidden");
                $session->delete();
                print "You are banned.";
+               cgi_savesession($session);
                exit;
        }
        
@@ -657,12 +659,15 @@ 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]/;
                }
+               $display=~s!^https?://!!; # make sure this is removed
                return "<a href=\"$user\">".escapeHTML($display)."</a>";
        }
        else {
-               return htmllink("", "", escapeHTML($user), 1);
+               return htmllink("", "", escapeHTML(
+                       length $config{userdir} ? $config{userdir}."/".$user : $user
+               ), 1);
        }
 } #}}}