]> sipb.mit.edu Git - ikiwiki.git/commitdiff
allow multiple setup file types, and support safe parsing
authorJoey Hess <joey@gnu.kitenet.net>
Fri, 19 Mar 2010 18:52:17 +0000 (14:52 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Fri, 19 Mar 2010 18:52:17 +0000 (14:52 -0400)
Finally removed the last hardcoding of IkiWiki::Setup::Standard.
Take the first "IkiWiki::Setup::*" in the setup file to define the
setuptype, and remember that type to use in dumping later. (But it can be
overridden using --set, etc.)

Also, support setup file types that are not evaled.

IkiWiki.pm
IkiWiki/Setup.pm
IkiWiki/Setup/Standard.pm

index 6e333504e841d4bc7dc1b831188a58520587d7b7..241fb45b7f09cfdbab4cf285fd63f78406ee5b4e 100644 (file)
@@ -467,6 +467,13 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
+       setuptype => {
+               type => "internal",
+               default => "IkiWiki::Setup::Standard",
+               description => "perl class to use to dump setup file",
+               safe => 0,
+               rebuild => 0,
+       },
        allow_symlinks_before_srcdir => {
                type => "boolean",
                default => 0,
index a3fd5ce66466f45e1480776e31be39ece90f592b..3accf35919cb13c7123eb9d4c4ce254e75beaa39 100644 (file)
@@ -1,6 +1,8 @@
 #!/usr/bin/perl
-# Ikiwiki setup files are perl files that 'use IkiWiki::Setup::foo',
-# passing it some sort of configuration data.
+# Ikiwiki setup files can be perl files that 'use IkiWiki::Setup::foo',
+# passing it some sort of configuration data. Or, they can contain
+# the module name at the top, without the 'use', and the whole file is
+# then fed into that module.
 
 package IkiWiki::Setup;
 
@@ -10,24 +12,39 @@ use IkiWiki;
 use open qw{:utf8 :std};
 use File::Spec;
 
-sub load ($) {
+sub load ($;$) {
        my $setup=IkiWiki::possibly_foolish_untaint(shift);
+       my $safemode=shift;
+
        $config{setupfile}=File::Spec->rel2abs($setup);
 
        #translators: The first parameter is a filename, and the second
        #translators: is a (probably not translated) error message.
        open (IN, $setup) || error(sprintf(gettext("cannot read %s: %s"), $setup, $!));
-       my $code;
+       my $content;
        {
                local $/=undef;
-               $code=<IN> || error("$setup: $!");
+               $content=<IN> || error("$setup: $!");
        }
-       
-       ($code)=$code=~/(.*)/s;
        close IN;
 
-       eval $code;
-       error("$setup: ".$@) if $@;
+       if ($content=~/(use\s+)?(IkiWiki::Setup::\w+)/) {
+               $config{setuptype}=$2;
+               if ($1) {
+                       error sprintf(gettext("cannot load %s in safe mode"), $setup)
+                               if $safemode;
+                       eval IkiWiki::possibly_foolish_untaint($content);
+                       error("$setup: ".$@) if $@;
+               }
+               else {
+                       eval qq{require $config{setuptype}};
+                       error $@ if $@;
+                       $config{setuptype}->loaddump(IkiWiki::possibly_foolish_untaint($content));
+               }
+       }
+       else {
+               error sprintf(gettext("failed to parse %s"), $setup);
+       }
 }
 
 sub merge ($) {
@@ -133,8 +150,9 @@ sub getsetup () {
 sub dump ($) {
        my $file=IkiWiki::possibly_foolish_untaint(shift);
        
-       require IkiWiki::Setup::Standard;
-       my @dump=IkiWiki::Setup::Standard::gendump("Setup file for ikiwiki.");
+       eval qq{require $config{setuptype}};
+       error $@ if $@;
+       my @dump=$config{setuptype}->gendump("Setup file for ikiwiki.");
 
        open (OUT, ">", $file) || die "$file: $!";
        print OUT "$_\n" foreach @dump;
index f7a322317f549b9affb08730c53e685710f5930f..4022ff03cb14941296e03f87288e3f2e2f890130 100644 (file)
@@ -82,8 +82,10 @@ sub dumpvalues ($@) {
        return @ret;
 }
 
-sub gendump ($) {
+sub gendump ($$) {
+       my $class=shift;
        my $description=shift;
+
        my %setup=(%config);
        my @ret;