+ protected function getAllowedIframeSources(): array
+ {
+ $sources = explode(' ', config('app.iframe_sources', ''));
+ $sources[] = $this->getDrawioHost();
+
+ return array_filter($sources);
+ }
+
+ /**
+ * Extract the host name of the configured drawio URL for use in CSP.
+ * Returns empty string if not in use.
+ */
+ protected function getDrawioHost(): string
+ {
+ $drawioConfigValue = config('services.drawio');
+ if (!$drawioConfigValue) {
+ return '';
+ }
+
+ $drawioSource = is_string($drawioConfigValue) ? $drawioConfigValue : 'https://embed.diagrams.net/';
+ $drawioSourceParsed = parse_url($drawioSource);
+ $drawioHost = $drawioSourceParsed['scheme'] . '://' . $drawioSourceParsed['host'];
+ if (isset($drawioSourceParsed['port'])) {
+ $drawioHost .= ':' . $drawioSourceParsed['port'];
+ }
+
+ return $drawioHost;
+ }
+}