]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/meta.pm
load HTML::Entities at top
[ikiwiki.git] / IkiWiki / Plugin / meta.pm
index 849a13e37bfb2c437ba4bc7c998710548b943f49..8a9a5382b00823ffdcd2825f5db6ae9214490480 100644 (file)
@@ -18,7 +18,8 @@ sub needsbuild (@) { #{{{
        my $needsbuild=shift;
        foreach my $page (keys %pagestate) {
                if (exists $pagestate{$page}{meta}) {
-                       if (grep { $_ eq $pagesources{$page} } @$needsbuild) {
+                       if (exists $pagesources{$page} &&
+                           grep { $_ eq $pagesources{$page} } @$needsbuild) {
                                # remove state, it will be re-added
                                # if the preprocessor directive is still
                                # there during the rebuild
@@ -37,6 +38,17 @@ sub scrub ($) { #{{{
        }
 } #}}}
 
+sub safeurl ($) { #{{{
+       my $url=shift;
+       if (exists $IkiWiki::Plugin::htmlscrubber::{safe_url_regexp} &&
+           defined $IkiWiki::Plugin::htmlscrubber::safe_url_regexp) {
+               return $url=~/$IkiWiki::Plugin::htmlscrubber::safe_url_regexp/;
+       }
+       else {
+               return 1;
+       }
+} #}}}
+
 sub htmlize ($$$) { #{{{
        my $page = shift;
        my $destpage = shift;
@@ -87,7 +99,7 @@ sub preprocess (@) { #{{{
                # fallthorough
        }
        elsif ($key eq 'authorurl') {
-               $pagestate{$page}{meta}{authorurl}=$value;
+               $pagestate{$page}{meta}{authorurl}=$value if safeurl($value);
                # fallthrough
        }
 
@@ -105,8 +117,10 @@ sub preprocess (@) { #{{{
                }
        }
        elsif ($key eq 'permalink') {
-               $pagestate{$page}{meta}{permalink}=$value;
-               push @{$metaheaders{$page}}, scrub('<link rel="bookmark" href="'.encode_entities($value).'" />');
+               if (safeurl($value)) {
+                       $pagestate{$page}{meta}{permalink}=$value;
+                       push @{$metaheaders{$page}}, scrub('<link rel="bookmark" href="'.encode_entities($value).'" />');
+               }
        }
        elsif ($key eq 'stylesheet') {
                my $rel=exists $params{rel} ? $params{rel} : "alternate stylesheet";
@@ -123,12 +137,22 @@ sub preprocess (@) { #{{{
                        "\" type=\"text/css\" />";
        }
        elsif ($key eq 'openid') {
-               if (exists $params{server}) {
+               if (exists $params{server} && safeurl($params{server})) {
                        push @{$metaheaders{$page}}, '<link href="'.encode_entities($params{server}).
                                '" rel="openid.server" />';
+                       push @{$metaheaders{$page}}, '<link href="'.encode_entities($params{server}).
+                               '" rel="openid2.provider" />';
+               }
+               if (safeurl($value)) {
+                       push @{$metaheaders{$page}}, '<link href="'.encode_entities($value).
+                               '" rel="openid.delegate" />';
+                       push @{$metaheaders{$page}}, '<link href="'.encode_entities($value).
+                               '" rel="openid2.local_id" />';
+               }
+               if (exists $params{"xrds-location"} && safeurl($params{"xrds-location"})) {
+                       push @{$metaheaders{$page}}, '<meta http-equiv="X-XRDS-Location"'.
+                               'content="'.encode_entities($params{"xrds-location"}).'" />';
                }
-               push @{$metaheaders{$page}}, '<link href="'.encode_entities($value).
-                       '" rel="openid.delegate" />';
        }
        elsif ($key eq 'redir') {
                return "" if $page ne $destpage;
@@ -177,6 +201,10 @@ sub preprocess (@) { #{{{
                                " />\n");
                }
        }
+       elsif ($key eq 'robots') {
+               push @{$metaheaders{$page}}, '<meta name="robots"'.
+                       ' content="'.encode_entities($value).'" />';
+       }
        else {
                push @{$metaheaders{$page}}, scrub('<meta name="'.encode_entities($key).
                        '" content="'.encode_entities($value).'" />');