diff --git a/Web/Models/Entities/Note.php b/Web/Models/Entities/Note.php index b2a832e3..932c1fc9 100644 --- a/Web/Models/Entities/Note.php +++ b/Web/Models/Entities/Note.php @@ -12,8 +12,17 @@ class SecurityFilter extends HTMLPurifier_Filter '/]*src\s*=\s*["\']([^"\']*)["\'][^>]*>/i', function ($matches) { $originalSrc = $matches[1]; - $encodedSrc = '/image.php?url=' . base64_encode($originalSrc); - return str_replace($originalSrc, $encodedSrc, $matches[0]); + $src = $originalSrc; + if (!str_contains($src, "/image.php?url=")) { + $src = '/image.php?url=' . base64_encode($originalSrc); + } else { + if (!OPENVK_ROOT_CONF["openvk"]["preferences"]["imagesProxy"]["replaceInNotes"]) { + $src = preg_replace_callback('/(.*)\/image\.php\?url=(.*)/i', function ($matches) { + return base64_decode($matches[2]); + }, $src); + } + } + return str_replace($originalSrc, $src, $matches[0]); }, $html ); @@ -34,7 +43,7 @@ class Note extends Postable { protected $tableName = "notes"; - protected function renderHTML(): string + protected function renderHTML(?string $content = NULL): string { $config = HTMLPurifier_Config::createDefault(); $config->set("Attr.AllowedClasses", []); @@ -103,14 +112,16 @@ class Note extends Postable ]); $config->set('Filter.Custom', [new SecurityFilter()]); - $source = NULL; - if(is_null($this->getRecord())) { - if(isset($this->changes["source"])) - $source = $this->changes["source"]; - else - throw new \LogicException("Can't render note without content set."); - } else { - $source = $this->getRecord()->source; + $source = $content; + if (!$source) { + if (is_null($this->getRecord())) { + if (isset($this->changes["source"])) + $source = $this->changes["source"]; + else + throw new \LogicException("Can't render note without content set."); + } else { + $source = $this->getRecord()->source; + } } $purifier = new HTMLPurifier($config); @@ -138,8 +149,8 @@ class Note extends Postable $this->setCached_Content($cached); $this->save(); } - - return $cached; + + return $this->renderHTML($cached); } function getSource(): string diff --git a/Web/Presenters/ImagesProxyPresenter.php b/Web/Presenters/ImagesProxyPresenter.php index f58cb309..6a86b21f 100644 --- a/Web/Presenters/ImagesProxyPresenter.php +++ b/Web/Presenters/ImagesProxyPresenter.php @@ -26,7 +26,14 @@ final class ImagesProxyPresenter extends OpenVKPresenter public function renderIndex(): void { - $url = base64_decode($this->requestParam("url")); + $this->assertUserLoggedIn(); + + $url = $this->requestParam("url"); + if (OPENVK_ROOT_CONF["openvk"]["preferences"]["imagesProxy"]["settings"]["base64_decode_url"]) { + $url = base64_decode($url); + } + + $url = OPENVK_ROOT_CONF["openvk"]["preferences"]["imagesProxy"]["settings"]["url_prefix"] . $url; if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) { $this->placeholder(); } diff --git a/openvk-example.yml b/openvk-example.yml index e3fd1c3a..8cf75b1d 100644 --- a/openvk-example.yml +++ b/openvk-example.yml @@ -102,6 +102,11 @@ openvk: fartscroll: false testLabel: false defaultMobileTheme: "" + imagesProxy: + replaceInNotes: true + settings: + url_prefix: "" + base64_decode_url: true telemetry: plausible: