]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/meta.pm
don't duplicate code from editpage, just pull the values it sets out of the
[ikiwiki.git] / IkiWiki / Plugin / meta.pm
index a0dd66376b295cc574f75ad6cdcad2473c832d8f..4aa545a93a67c6aa759a4aa67d7aa2ff65e6c66a 100644 (file)
@@ -24,6 +24,7 @@ sub filter (@) { #{{{
        my %params=@_;
        
        $meta{$params{page}}='';
+       delete $pagestate{$params{page}}{meta}{redir};
 
        return $params{content};
 } # }}}
@@ -70,14 +71,29 @@ sub preprocess (@) { #{{{
                }
        }
        elsif ($key eq 'redir') {
+               return "" if $destpage ne $page;
                my $safe=0;
-               if ($value =~ /^$config{wiki_link_regexp}$/) {
+               if ($value !~ /^\w+:\/\//) {
+                       add_depends($page, $value);
                        my $link=bestlink($page, $value);
                        if (! length $link) {
                                return "[[meta ".gettext("redir page not found")."]]";
                        }
-                       $value=urlto($link, $destpage);
+
+                       $value=urlto($link, $page);
                        $safe=1;
+
+                       # redir cycle detection
+                       $pagestate{$page}{meta}{redir}=$link;
+                       my $at=$page;
+                       my %seen;
+                       while (exists $pagestate{$at}{meta}{redir}) {
+                               if ($seen{$at}) {
+                                       return "[[meta ".gettext("redir cycle is not allowed")."]]";
+                               }
+                               $seen{$at}=1;
+                               $at=$pagestate{$at}{meta}{redir};
+                       }
                }
                else {
                        $value=encode_entities($value);