diff options
author | Andrew Dolgov <[email protected]> | 2017-02-10 10:25:10 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2017-02-10 10:30:48 +0300 |
commit | c4ebf01e69ba553f566879f526b68a9853567fff (patch) | |
tree | c0173ca1c4e24f186d17c5cc020b57b8d59c92eb | |
parent | 70c0a8c2e020f30e1b9f5cd8de18e01c80e0a1c6 (diff) |
add af_zz_imgproxy (initial)
-rw-r--r-- | plugins/af_zz_imgproxy/init.php | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/plugins/af_zz_imgproxy/init.php b/plugins/af_zz_imgproxy/init.php new file mode 100644 index 000000000..b13117570 --- /dev/null +++ b/plugins/af_zz_imgproxy/init.php @@ -0,0 +1,133 @@ +<?php +class Af_Zz_ImgProxy extends Plugin { + private $host; + + function about() { + return array(1.0, + "Load insecure images via built-in proxy (no caching)", + "fox"); + } + + function flags() { + return array("needs_curl" => true); + } + + function init($host) { + $this->host = $host; + + $host->add_hook($host::HOOK_RENDER_ARTICLE, $this); + $host->add_hook($host::HOOK_RENDER_ARTICLE_CDM, $this); + $host->add_hook($host::HOOK_RENDER_ARTICLE_API, $this); + } + + function hook_render_article($article) { + return $this->hook_render_article_cdm($article); + } + + function hook_render_article_api($headline) { + return $this->hook_render_article_cdm($headline["headline"], true); + } + + /*public function vidproxy() { + $url = $_REQUEST["url"]; + + if (preg_match("/\.(mp4|webm|gifv)/", $url, $matches)) { + $type = $matches[1]; + $embed_url = $url; + + if ($type == "gifv") { + $type = "mp4"; + $embed_url = str_replace(".gifv", ".mp4", $embed_url); + } + + header("Content-type: text/html"); + + $embed_url = htmlspecialchars("backend.php?op=pluginhandler&plugin=af_zz_imgproxy&method=imgproxy&url=" . + urlencode($embed_url)); + + print "<video class=\"\" autoplay=\"true\" controls=\"true\" loop=\"true\">"; + print "<source src=\"$embed_url\" type=\"video/$type\">"; + print "</video>"; + } else { + header("Location: " . htmlspecialchars($url)); + } + }*/ + + public function imgproxy() { + $url = rewrite_relative_url(SELF_URL_PATH, $_REQUEST["url"]); + + if (function_exists("getimagesize")) { + $is = @getimagesize($url); + header("Content-type: " . $is["mime"]); + } + + print fetch_file_contents(array("url" => $url)); + } + + function rewrite_url_if_needed($url) { + $scheme = parse_url($url, PHP_URL_SCHEME); + + if ($scheme != 'https' && $scheme != "") { + $url = "backend.php?op=pluginhandler&plugin=af_zz_imgproxy&method=imgproxy&url=" . + htmlspecialchars($url); + + } + + return $url; + } + + function hook_render_article_cdm($article, $api_mode = false) { + + $need_saving = false; + + $doc = new DOMDocument(); + if (@$doc->loadHTML($article["content"])) { + $xpath = new DOMXPath($doc); + $imgs = $xpath->query("//img[@src]"); + + foreach ($imgs as $img) { + $new_src = $this->rewrite_url_if_needed($img->getAttribute("src")); + + if ($new_src != $img->getAttribute("src")) { + $img->setAttribute("src", $new_src); + + $need_saving = true; + } + } + + $vids = $xpath->query("//video"); + + foreach ($vids as $vid) { + if ($vid->hasAttribute("poster")) { + $new_src = $this->rewrite_url_if_needed($vid->getAttribute("poster")); + + if ($new_src != $vid->getAttribute("poster")) { + $vid->setAttribute("poster", $new_src); + + $need_saving = true; + } + } + + $vsrcs = $xpath->query("source", $vid); + + foreach ($vsrcs as $vsrc) { + $new_src = $this->rewrite_url_if_needed($vsrc->getAttribute("src")); + + if ($new_src != $vsrc->getAttribute("src")) { + $vid->setAttribute("src", $new_src); + + $need_saving = true; + } + } + } + } + + if ($need_saving) $article["content"] = $doc->saveXML(); + + return $article; + } + + function api_version() { + return 2; + } +}
\ No newline at end of file |