X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/506bcbac0420a46997ad531961d543e62c011513..d85c9660c5ce6f9749f3afc5c51342caf7713263:/IkiWiki/Plugin/external.pm diff --git a/IkiWiki/Plugin/external.pm b/IkiWiki/Plugin/external.pm index e3504a30d..4c2e5d2fe 100644 --- a/IkiWiki/Plugin/external.pm +++ b/IkiWiki/Plugin/external.pm @@ -20,7 +20,8 @@ sub import { #{{{ return unless defined $plugin; my ($plugin_read, $plugin_write); - my $pid = open2($plugin_read, $plugin_write, $plugin); + my $pid = open2($plugin_read, $plugin_write, + IkiWiki::possibly_foolish_untaint($plugin)); # open2 doesn't respect "use open ':utf8'" binmode($plugin_read, ':utf8'); @@ -28,6 +29,7 @@ sub import { #{{{ $plugins{$plugin}={in => $plugin_read, out => $plugin_write, pid => $pid, accum => ""}; + $RPC::XML::ENCODING="utf-8"; rpc_call($plugins{$plugin}, "import"); } #}}} @@ -57,15 +59,17 @@ sub rpc_call ($$;@) { #{{{ error("XML RPC parser failure: $r") unless ref $r; if ($r->isa('RPC::XML::response')) { my $value=$r->value; - if ($value->isa('RPC::XML::array')) { + if ($r->is_fault($value)) { + # throw the error as best we can + print STDERR $value->string."\n"; + return ""; + } + elsif ($value->isa('RPC::XML::array')) { return @{$value->value}; } elsif ($value->isa('RPC::XML::struct')) { return %{$value->value}; } - elsif ($value->isa('RPC::XML::fault')) { - die $value->string; - } else { return $value->value; } @@ -107,6 +111,7 @@ sub rpc_call ($$;@) { #{{{ } #}}} package IkiWiki::RPC::XML; +use Memoize; sub getvar ($$$) { #{{{ my $plugin=shift; @@ -123,13 +128,46 @@ sub setvar ($$$;@) { #{{{ my $plugin=shift; my $varname="IkiWiki::".shift; my $key=shift; + my $value=shift; no strict 'refs'; - my $ret=$varname->{$key}=@_; + my $ret=$varname->{$key}=$value; use strict 'refs'; return $ret; } #}}} +sub getstate ($$$$) { #{{{ + my $plugin=shift; + my $page=shift; + my $id=shift; + my $key=shift; + + return $IkiWiki::pagestate{$page}{$id}{$key}; +} #}}} + +sub setstate ($$$$;@) { #{{{ + my $plugin=shift; + my $page=shift; + my $id=shift; + my $key=shift; + my $value=shift; + + return $IkiWiki::pagestate{$page}{$id}{$key}=$value; +} #}}} + +sub getargv ($) { #{{{ + my $plugin=shift; + + return \@ARGV; +} #}}} + +sub setargv ($@) { #{{{ + my $plugin=shift; + my $array=shift; + + @ARGV=@$array; +} #}}} + sub inject ($@) { #{{{ # Bind a given perl function name to a particular RPC request. my $plugin=shift; @@ -142,6 +180,7 @@ sub inject ($@) { #{{{ IkiWiki::Plugin::external::rpc_call($plugin, $params{call}, @_) }; eval qq{*$params{name}=\$sub}; + memoize($params{name}) if $params{memoize}; return 1; } #}}} @@ -155,7 +194,8 @@ sub hook ($@) { #{{{ delete $params{call}; IkiWiki::hook(%params, call => sub { - IkiWiki::Plugin::external::rpc_call($plugin, $callback, @_) + my $ret=IkiWiki::Plugin::external::rpc_call($plugin, $callback, @_); + return $ret; }); } #}}}