diff --git a/lib/SimpleSAML/Metadata/SAMLParser.php b/lib/SimpleSAML/Metadata/SAMLParser.php index f85c7b894f2429f6d43e41c7251ff6736834cca0..f330b82d4057af8fcf81927d9f9db1ebfd75bcda 100644 --- a/lib/SimpleSAML/Metadata/SAMLParser.php +++ b/lib/SimpleSAML/Metadata/SAMLParser.php @@ -1089,8 +1089,8 @@ class SAMLParser foreach ($e->getKeywords() as $uiItem) { if (!($uiItem instanceof \SAML2\XML\mdui\Keywords) - || ($uiItem->getKeywords() !== []) - || ($uiItem->getLanguage() !== null) + || ($uiItem->getKeywords() === []) + || ($uiItem->getLanguage() === null) ) { continue; } @@ -1098,9 +1098,9 @@ class SAMLParser } foreach ($e->getLogo() as $uiItem) { if (!($uiItem instanceof \SAML2\XML\mdui\Logo) - || ($uiItem->getUrl() !== null) - || ($uiItem->getHeight() !== null) - || ($uiItem->getWidth() !== null) + || ($uiItem->getUrl() === null) + || ($uiItem->getHeight() === null) + || ($uiItem->getWidth() === null) ) { continue; } diff --git a/tests/lib/SimpleSAML/Metadata/SAMLParserTest.php b/tests/lib/SimpleSAML/Metadata/SAMLParserTest.php index 94c25ba9d982df936ec1fd9f3f6e5ef4a143dbfd..9490336ec34d0ca5ab1f8a350d3bbb3bdccd3a14 100644 --- a/tests/lib/SimpleSAML/Metadata/SAMLParserTest.php +++ b/tests/lib/SimpleSAML/Metadata/SAMLParserTest.php @@ -235,4 +235,82 @@ XML } } } + + /** + * Test RoleDescriptor/Extensions is parsed + */ + public function testRoleDescriptorExtensions() + { + $expected = [ + 'scope' => [ + 'example.org', + 'example.net', + ], + 'UIInfo' => [ + 'DisplayName' => ['en' => 'DisplayName', 'af' => 'VertoonNaam'], + 'Description' => ['en' => 'Description',], + 'InformationURL' => ['en' => 'https://localhost/information',], + 'PrivacyStatementURL' => ['en' => 'https://localhost/privacypolicy',], + 'Logo' => [ + [ + 'url' => 'https://localhost/logo', + 'height' => 16, + 'width' => 17, + ], + [ + 'url' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=', + 'height' => 2, + 'width' => 1, + ], + ], + ], + 'DiscoHints' => [ + 'IPHint' => ['127.0.0.1', '127.0.0.2',], + 'DomainHint' => ['example.net', 'example.org',], + 'GeolocationHint' => ['geo:-29.00000,24.00000;u=830000',], + ], + 'name' => ['en' => 'DisplayName', 'af' => 'VertoonNaam'], + ]; + + $document = \SAML2\DOMDocumentFactory::fromString( + <<<XML +<EntitiesDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:mdrpi="urn:oasis:names:tc:SAML:metadata:rpi" xmlns:shibmd="urn:mace:shibboleth:metadata:1.0" xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui"> + <EntityDescriptor entityID="theEntityID"> + <IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> + <Extensions> + <shibmd:Scope regexp="false">example.org</shibmd:Scope> + <shibmd:Scope regexp="false">example.net</shibmd:Scope> + <mdui:UIInfo> + <mdui:DisplayName xml:lang="en">DisplayName</mdui:DisplayName> + <mdui:DisplayName xml:lang="af">VertoonNaam</mdui:DisplayName> + <mdui:Description xml:lang="en">Description</mdui:Description> + <mdui:PrivacyStatementURL xml:lang="en">https://localhost/privacypolicy</mdui:PrivacyStatementURL> + <mdui:InformationURL xml:lang="en">https://localhost/information</mdui:InformationURL> + <mdui:Logo width="17" height="16">https://localhost/logo</mdui:Logo> + <mdui:Logo width="1" height="2">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=</mdui:Logo> + </mdui:UIInfo> + <mdui:DiscoHints> + <mdui:IPHint>127.0.0.1</mdui:IPHint> + <mdui:IPHint>127.0.0.2</mdui:IPHint> + <mdui:DomainHint>example.net</mdui:DomainHint> + <mdui:DomainHint>example.org</mdui:DomainHint> + <mdui:GeolocationHint>geo:-29.00000,24.00000;u=830000</mdui:GeolocationHint> + </mdui:DiscoHints> + </Extensions> + <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://IdentityProvider.com/SAML/SSO/Browser"/> + </IDPSSODescriptor> + </EntityDescriptor> +</EntitiesDescriptor> +XML + ); + + $entities = \SimpleSAML\Metadata\SAMLParser::parseDescriptorsElement($document->documentElement); + $this->assertArrayHasKey('theEntityID', $entities); + // Various MDUI elements are accessible + $metadata = $entities['theEntityID']->getMetadata20IdP(); + $this->assertEquals($expected['scope'], $metadata['scope'], 'shibmd:Scope elements not reflected in parsed metadata'); + $this->assertEquals($expected['UIInfo'], $metadata['UIInfo'], 'mdui:UIInfo elements not reflected in parsed metadata'); + $this->assertEquals($expected['DiscoHints'], $metadata['DiscoHints'], 'mdui:DiscoHints elements not reflected in parsed metadata'); + $this->assertEquals($expected['name'], $metadata['name']); + } }