Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# REDAXO consent_manager - Changelog

## Version 5.6.5 - 30.05.2026

- **Fix (oEmbed):** Robustes Domain-Fallback in `OEmbedParser`, damit auch in Proxy-/CLI-Kontexten ohne `HTTP_HOST` keine Type-Fehler auftreten.
- **Fix (Rexstan):** Null-sichere Rückgabe in `parse()` ergänzt (`preg_replace_callback`-Fallback), Signaturen/Guards bereinigt und auf striktere Analyse ausgerichtet.
- **Kompatibilität (Addon-übergreifend):** Optionale Vidstack-Integration defensiv entkoppelt (`class_exists`/`method_exists`), damit fehlende oder inkompatible Vidstack-Klassen keine Folgefehler erzeugen.

## Version 5.6.3 - 08.04.2026

- **Fix (Frontend):** Verbesserte Consent Debug-Infos (klarerer Status, bevor der Nutzer eingewilligt hat, Erklärung teilweise abgelehnter Dienste).
Expand Down
37 changes: 29 additions & 8 deletions lib/OEmbedParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
namespace FriendsOfRedaxo\ConsentManager;

use Exception;
use FriendsOfRedaxo\VidStack\Video;
use rex;
use rex_addon;
use rex_clang;
Expand Down Expand Up @@ -42,7 +41,6 @@ public static function register(?string $domain = null): void
* rex_extension::register nur ausgeführt wird, wenn ...
*/
rex_extension::register('OUTPUT_FILTER', static function (rex_extension_point $ep) use ($domain) {
/** @var string $content */
$content = $ep->getSubject();

/**
Expand Down Expand Up @@ -73,7 +71,7 @@ public static function parse(string $content, ?string $domain = null): string
{
// Domain ermitteln falls nicht übergeben
if (null === $domain) {
$domain = rex_request::server('HTTP_HOST', 'string', $domain);
$domain = rex_request::server('HTTP_HOST', 'string', rex::getServer());
}

// Domain-Config laden
Expand All @@ -87,10 +85,12 @@ public static function parse(string $content, ?string $domain = null): string
// Regex für <oembed url="..."></oembed>
$pattern = '/<oembed\s+url=["\']([^"\']+)["\']\s*><\/oembed>/i';

return preg_replace_callback($pattern, static function ($matches) use ($domain) {
$parsedContent = preg_replace_callback($pattern, static function ($matches) use ($domain) {
$url = $matches[1];
return self::processOembed($url, $domain);
}, $content);

return null !== $parsedContent ? $parsedContent : $content;
}

/**
Expand Down Expand Up @@ -128,7 +128,12 @@ private static function processOembed(string $url, ?string $domain): string
}

// Domain-spezifische Konfiguration laden
$config = self::getDomainConfig($domain ?? rex::getServer());
$configDomain = $domain;
if (null === $configDomain || '' === $configDomain) {
$configDomain = rex::getServer();
}

$config = self::getDomainConfig($configDomain);

// Optionen für Inline-Blocker
$options = [
Expand Down Expand Up @@ -202,7 +207,7 @@ private static function serviceExists(string $serviceKey): bool
* @api
* @return array<string, mixed> Konfiguration
*/
private static function getDomainConfig(string $domain): array
private static function getDomainConfig(?string $domain): array
{
// Standard-Konfiguration
$defaultConfig = [
Expand All @@ -213,6 +218,11 @@ private static function getDomainConfig(string $domain): array
];

// Domain aus Datenbank laden
// Defensive guard: HTTP_HOST / rex::getServer() können in Proxy/CLI-Kontexten leer sein
if (null === $domain || '' === $domain) {
return $defaultConfig;
}
Comment thread
skerbis marked this conversation as resolved.

try {
$sql = rex_sql::factory();
// TODO: Query ändern in setTable/setWhere/select
Expand Down Expand Up @@ -287,8 +297,18 @@ private static function generateVidstackEmbed(string $videoUrl, array $options):
return '<!-- Vidstack Player nicht verfügbar -->';
}

$videoClass = 'FriendsOfRedaxo\\VidStack\\Video';
if (!class_exists($videoClass)) {
return '<!-- Vidstack Player Klasse nicht verfügbar -->';
}

try {
$player = new Video($videoUrl);
/** @var object $player */
$player = new $videoClass($videoUrl);

if (!method_exists($player, 'setAttributes') || !method_exists($player, 'generate')) {
return '<!-- Vidstack Player API nicht kompatibel -->';
}

// Attribute für den Player setzen
$attributes = [
Expand All @@ -308,7 +328,8 @@ private static function generateVidstackEmbed(string $videoUrl, array $options):

// Nur generate() verwenden - OHNE Vidstack Consent
// Der Consent Manager Inline-Blocker kommt davor (via doConsent)
return $player->generate();
$generated = $player->generate();
return is_string($generated) ? $generated : '';
} catch (Exception $e) {
if (rex::isDebugMode()) {
// TODO: Texte über .lang aufbauen
Expand Down
2 changes: 1 addition & 1 deletion package.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package: consent_manager
version: "5.6.4"
version: "5.6.5"
author: "Friends Of REDAXO"
supportpage: https://redaxo.org/support/community/#slack

Expand Down
Loading