Skip to content

SAML: Keine libxml-Warnings mehr, wenn die IdP-Metadaten nicht abrufbar sind - #547

Open
dergel wants to merge 1 commit into
mainfrom
saml-idp-metadata-warnings
Open

SAML: Keine libxml-Warnings mehr, wenn die IdP-Metadaten nicht abrufbar sind#547
dergel wants to merge 1 commit into
mainfrom
saml-idp-metadata-warnings

Conversation

@dergel

@dergel dergel commented Aug 4, 2026

Copy link
Copy Markdown
Member

Problem

Auf einer Login-Seite mit ycom_auth_saml erscheinen zwei PHP-Warnings im Seiten-Output:

Warning: DOMDocument::loadXML(): StartTag: invalid element name in Entity, line: 1
  in vendor/onelogin/php-saml/src/Saml2/Utils.php on line 88
Warning: DOMDocument::loadXML(): Extra content at the end of the document in Entity, line: 1
  in vendor/onelogin/php-saml/src/Saml2/Utils.php on line 88

Ursache ist enterObject():

$idpSettings = IdPMetadataParser::parseRemoteXML($settings['idp']['metadataUrl'] ?? $settings['idp']['entityId']);

Ist in der saml.php keine metadataUrl gesetzt, wird die entityId abgerufen. Antwortet der IdP unter dieser Adresse nicht mit Metadaten, sondern mit HTML – 404-Seite, Redirect auf ein Login, leerer Body –, landet das in Utils::loadXML(). libxml meldet das als PHP-Warning, und die werden vom umgebenden try/catch nicht erfasst, weil libxml-Meldungen keine Exceptions sind.

Reproduziert mit einer entityId, die auf eine HTML-Seite zeigt:

$dom = new DOMDocument();
$dom->loadXML('<!doctype html><html lang="de"><head><meta charset="utf-8"></head><body>x</body></html>');
// -> exakt die beiden Warnings oben, Rückgabe false

Änderung

Der Block wandert in auth_injectIdpMetadata():

  • libxml_use_internal_errors(true) um den Aufruf, im finally zurückgesetzt. Am Kontrollfluss ändert sich nichts: loadXML() gibt weiterhin false zurück, parseXML() wirft Error parsing metadata, parseRemoteXML() wrappt das, und der bestehende catch benutzt die statische Konfiguration unverändert weiter.
  • Abgerufen wird nur, wenn der Wert wie eine http(s)-URL aussieht. Bei einer entityId in URN-Form (urn:…) lief bisher bei jedem Aufruf der Login-Seite ein Request ins Leere.

Der Fallback von metadataUrl auf entityId bleibt, weil bei vielen IdPs die entityId tatsächlich die Metadata-URL ist.

Test

Lokal gegen eine SAML-Login-Seite mit entityId, die HTML liefert: Warnings verschwunden, Login-Formular unverändert, statische IdP-Konfiguration greift weiter. php-cs-fixer mit der Repo-Config: keine Findings.

Kein CHANGELOG-Eintrag, da hier keine Version gebumpt wird – gern beim nächsten Release mitnehmen.

…ar sind

parseRemoteXML() bekommt ohne konfigurierte metadataUrl die entityId. Ist die
eine URL, die kein XML liefert – HTML-Fehlerseite, Redirect auf ein Login,
leerer Body –, meldet libxml aus Utils::loadXML() zwei PHP-Warnings, die im
Output der Login-Seite landen. Das try/catch drumherum greift nicht, weil
libxml-Meldungen keine Exceptions sind.

libxml_use_internal_errors() sammelt sie jetzt intern. Am Kontrollfluss ändert
sich nichts: loadXML() gibt weiterhin false zurück, parseXML() wirft wie gehabt
"Error parsing metadata", und die statische Konfiguration wird unverändert
weiterbenutzt.

Abgerufen wird außerdem nur noch, wenn der Wert wie eine http(s)-URL aussieht.
Bei einer entityId in URN-Form lief bisher bei jedem Aufruf der Login-Seite ein
Request ins Leere.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant