unfinished file_prune revamp
authorJoey Hess <joey@kitenet.net>
Sat, 17 Apr 2010 23:05:40 +0000 (19:05 -0400)
committerJoey Hess <joey@kitenet.net>
Sat, 17 Apr 2010 23:05:40 +0000 (19:05 -0400)
Many calls to file_prune were incorrectly calling it with 2 parameters.
In cases where the filename being checked is relative to the srcdir,
that is not needed.

Made absolute filenames be pruned. (This won't work for the 2 parameter call
style.)

IkiWiki.pm
IkiWiki/Plugin/attachment.pm
IkiWiki/Plugin/comments.pm
IkiWiki/Plugin/editpage.pm
IkiWiki/Plugin/rename.pm
IkiWiki/Receive.pm
t/file_pruned.t

index b37b1f34485b6301dfd7847d75ebb625e8c6295d..a5f83ac7a85c8e72bd59d5e9cf600b84440919f0 100644 (file)
@@ -355,7 +355,7 @@ sub getsetup () {
        },
        wiki_file_prune_regexps => {
                type => "internal",
-               default => [qr/(^|\/)\.\.(\/|$)/, qr/^\./, qr/\/\./,
+               default => [qr/(^|\/)\.\.(\/|$)/, qr/^\//, qr/^\./, qr/\/\./,
                        qr/\.x?html?$/, qr/\.ikiwiki-new$/,
                        qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
                        qr/(^|\/)_MTN\//, qr/(^|\/)_darcs\//,
index ad1dd9bcaabdd24dbe111093b57face731ab3bbf..8c3ff887af16076e9f6d41126d11ddac47fb3567 100644 (file)
@@ -137,7 +137,7 @@ sub formbuilder (@) {
                $filename=linkpage(IkiWiki::possibly_foolish_untaint(
                                attachment_location($form->field('page')).
                                IkiWiki::basename($filename)));
-               if (IkiWiki::file_pruned($filename, $config{srcdir})) {
+               if (IkiWiki::file_pruned($filename)) {
                        error(gettext("bad attachment filename"));
                }
                
index 0aa043215b35a5ab32b2219dfc5410ac64c507cc..1c219b6c6adeb492a361e1459567b6a0614a4e44 100644 (file)
@@ -338,7 +338,7 @@ sub editcomment ($$) {
        my $page = $form->field('page');
        $page = IkiWiki::possibly_foolish_untaint($page);
        if (! defined $page || ! length $page ||
-               IkiWiki::file_pruned($page, $config{srcdir})) {
+               IkiWiki::file_pruned($page)) {
                error(gettext("bad page name"));
        }
 
@@ -548,7 +548,7 @@ sub commentmoderation ($$) {
                                # pending comment before untainting.
                                my ($f)= $id =~ /$config{wiki_file_regexp}/;
                                if (! defined $f || ! length $f ||
-                                   IkiWiki::file_pruned($f, $config{srcdir})) {
+                                   IkiWiki::file_pruned($f)) {
                                        error("illegal file");
                                }
 
index 44fe5514a7cf0017ce3a3f5c1193ed78c2af1108..ee1de8eaa10285a818be0205322348cc3a0a117f 100644 (file)
@@ -94,7 +94,7 @@ sub cgi_editpage ($$) {
        $page=possibly_foolish_untaint($page);
        my $absolute=($page =~ s#^/+##);
        if (! defined $page || ! length $page ||
-           file_pruned($page, $config{srcdir})) {
+           file_pruned($page)) {
                error(gettext("bad page name"));
        }
 
@@ -220,7 +220,7 @@ sub cgi_editpage ($$) {
                        my $best_loc;
                        if (! defined $from || ! length $from ||
                            $from ne $form->field('from') ||
-                           file_pruned($from, $config{srcdir}) ||
+                           file_pruned($from) ||
                            $from=~/^\// || 
                            $absolute ||
                            $form->submitted) {
index 1a9da6363165c3ef06cffd1855e9520926c310a2..69e615eadbda5d29834c9a37e9acf3f7127d8688 100644 (file)
@@ -63,9 +63,8 @@ sub check_canrename ($$$$$$) {
                        error(gettext("no change to the file name was specified"));
                }
 
-               # Must be a legal filename, and not absolute.
-               if (IkiWiki::file_pruned($destfile, $config{srcdir}) || 
-                   $destfile=~/^\//) {
+               # Must be a legal filename.
+               if (IkiWiki::file_pruned($destfile)) {
                        error(sprintf(gettext("illegal name")));
                }
 
index cd94d093853023b0c7e2c6f29649c4b6d920c220..ae1bd8bef44c8b6918f2d2ced55c2074d8bbca13 100644 (file)
@@ -82,7 +82,7 @@ sub test () {
                my ($file)=$change->{file}=~/$config{wiki_file_regexp}/;
                $file=IkiWiki::possibly_foolish_untaint($file);
                if (! defined $file || ! length $file ||
-                   IkiWiki::file_pruned($file, $config{srcdir})) {
+                   IkiWiki::file_pruned($file)) {
                        error(gettext("bad file name %s"), $file);
                }
 
index f9c1c257e75d4775b3e850f16a08b1e6c2181a1b..4335ed91704cf6bae56b9eb21c6153628a77867b 100755 (executable)
@@ -1,41 +1,75 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 27;
+use Test::More tests => 54;
 
 BEGIN { use_ok("IkiWiki"); }
 
 %config=IkiWiki::defaultconfig();
 
 ok(IkiWiki::file_pruned("src/.htaccess", "src"));
+ok(IkiWiki::file_pruned(".htaccess"));
 ok(IkiWiki::file_pruned("src/.ikiwiki/", "src"));
+ok(IkiWiki::file_pruned(".ikiwiki/"));
 ok(IkiWiki::file_pruned("src/.ikiwiki/index", "src"));
+ok(IkiWiki::file_pruned(".ikiwiki/index"));
 ok(IkiWiki::file_pruned("src/CVS/foo", "src"));
+ok(IkiWiki::file_pruned("CVS/foo"));
 ok(IkiWiki::file_pruned("src/subdir/CVS/foo", "src"));
+ok(IkiWiki::file_pruned("subdir/CVS/foo"));
 ok(IkiWiki::file_pruned("src/.svn", "src"));
+ok(IkiWiki::file_pruned(".svn"));
 ok(IkiWiki::file_pruned("src/subdir/.svn", "src"));
+ok(IkiWiki::file_pruned("subdir/.svn"));
 ok(IkiWiki::file_pruned("src/subdir/.svn/foo", "src"));
+ok(IkiWiki::file_pruned("subdir/.svn/foo"));
 ok(IkiWiki::file_pruned("src/.git", "src"));
+ok(IkiWiki::file_pruned(".git"));
 ok(IkiWiki::file_pruned("src/subdir/.git", "src"));
+ok(IkiWiki::file_pruned("subdir/.git"));
 ok(IkiWiki::file_pruned("src/subdir/.git/foo", "src"));
+ok(IkiWiki::file_pruned("subdir/.git/foo"));
 ok(! IkiWiki::file_pruned("src/svn/fo", "src"));
+ok(! IkiWiki::file_pruned("svn/fo"));
 ok(! IkiWiki::file_pruned("src/git", "src"));
+ok(! IkiWiki::file_pruned("git"));
 ok(! IkiWiki::file_pruned("src/index.mdwn", "src"));
+ok(! IkiWiki::file_pruned("index.mdwn"));
 ok(! IkiWiki::file_pruned("src/index.", "src"));
+ok(! IkiWiki::file_pruned("index."));
 
 # these are ok because while the filename starts with ".", the canonpathed
 # version does not
 ok(! IkiWiki::file_pruned("src/.", "src"));
 ok(! IkiWiki::file_pruned("src/./", "src"));
+# OTOH, without a srcdir, no canonpath, so they're not allowed.
+ok(IkiWiki::file_pruned("."));
+ok(IkiWiki::file_pruned("./"));
+
+# Without a srcdir, absolute filenames are not allowed.
+ok(IkiWiki::file_pruned("/etc/passwd"));
+ok(IkiWiki::file_pruned("//etc/passwd"));
+ok(IkiWiki::file_pruned("/"));
+ok(IkiWiki::file_pruned("//"));
+ok(IkiWiki::file_pruned("///"));
+
 
 ok(IkiWiki::file_pruned("src/..", "src"));
+ok(IkiWiki::file_pruned(".."));
 ok(IkiWiki::file_pruned("src/../", "src"));
+ok(IkiWiki::file_pruned("../"));
 ok(IkiWiki::file_pruned("src/../", "src"));
+ok(IkiWiki::file_pruned("../"));
 
+# This is perhaps counterintuitive.
 ok(! IkiWiki::file_pruned("src", "src"));
+
+# Dots, etc, in the srcdir are ok.
 ok(! IkiWiki::file_pruned("/.foo/src", "/.foo/src"));
 ok(IkiWiki::file_pruned("/.foo/src/.foo/src", "/.foo/src"));
 ok(! IkiWiki::file_pruned("/.foo/src/index.mdwn", "/.foo/src/index.mdwn"));
 
-ok(IkiWiki::file_pruned("x/y/foo.dpkg-tmp", "src"));
-ok(IkiWiki::file_pruned("x/y/foo.ikiwiki-new", "src"));
+ok(IkiWiki::file_pruned("src/y/foo.dpkg-tmp", "src"));
+ok(IkiWiki::file_pruned("y/foo.dpkg-tmp"));
+ok(IkiWiki::file_pruned("src/y/foo.ikiwiki-new", "src"));
+ok(IkiWiki::file_pruned("y/foo.ikiwiki-new"));