]> git.wh0rd.org - tt-rss.git/commitdiff
add af_zz_imgproxy (initial)
authorAndrew Dolgov <noreply@fakecake.org>
Fri, 10 Feb 2017 07:25:10 +0000 (10:25 +0300)
committerAndrew Dolgov <noreply@fakecake.org>
Fri, 10 Feb 2017 07:30:48 +0000 (10:30 +0300)
plugins/af_zz_imgproxy/init.php [new file with mode: 0644]

diff --git a/plugins/af_zz_imgproxy/init.php b/plugins/af_zz_imgproxy/init.php
new file mode 100644 (file)
index 0000000..b131175
--- /dev/null
@@ -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