]> 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 968e6ccee789de718bac558f6dd30cf58b0acaab..4aa545a93a67c6aa759a4aa67d7aa2ff65e6c66a 100644 (file)
@@ -71,6 +71,7 @@ sub preprocess (@) { #{{{
                }
        }
        elsif ($key eq 'redir') {
+               return "" if $destpage ne $page;
                my $safe=0;
                if ($value !~ /^\w+:\/\//) {
                        add_depends($page, $value);
@@ -78,13 +79,21 @@ sub preprocess (@) { #{{{
                        if (! length $link) {
                                return "[[meta ".gettext("redir page not found")."]]";
                        }
+
+                       $value=urlto($link, $page);
+                       $safe=1;
+
+                       # redir cycle detection
                        $pagestate{$page}{meta}{redir}=$link;
-                       if ($pagestate{$link}{meta}{redir}) {
-                               # TODO: real cycle detection
-                               return "[[meta ".gettext("redir not allowed to point to a page that contains a redir")."]]";
+                       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};
                        }
-                       $value=urlto($link, $destpage);
-                       $safe=1;
                }
                else {
                        $value=encode_entities($value);