]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/meta.pm
* The calendar plugin stores state about when it needs to be updated,
[git.ikiwiki.info.git] / IkiWiki / Plugin / meta.pm
index 134c0ce5d1065f5520407c2d671c52073c569040..4aa545a93a67c6aa759a4aa67d7aa2ff65e6c66a 100644 (file)
@@ -13,7 +13,6 @@ my %author;
 my %authorurl;
 my %license;
 my %copyright;
-my %redirected;
 
 sub import { #{{{
        hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
@@ -25,6 +24,7 @@ sub filter (@) { #{{{
        my %params=@_;
        
        $meta{$params{page}}='';
+       delete $pagestate{$params{page}}{meta}{redir};
 
        return $params{content};
 } # }}}
@@ -71,20 +71,29 @@ sub preprocess (@) { #{{{
                }
        }
        elsif ($key eq 'redir') {
-               $redirected{$page}=1;
+               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")."]]";
                        }
-                       if ($redirected{$link}) {
-                               # TODO this is a cheap way of avoiding
-                               # redir cycles, but it is really too strict.
-                               return "[[meta ".gettext("redir to page that itself redirs is not allowed")."]]";
-                       }
-                       $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);