| Viewing file:  metadata.php (7.57 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?php
 if (!array_key_exists('PATH_INFO', $_SERVER)) {
 throw new SimpleSAML_Error_BadRequest('Missing authentication source id in metadata URL');
 }
 
 $config = SimpleSAML_Configuration::getInstance();
 $sourceId = substr($_SERVER['PATH_INFO'], 1);
 $source = SimpleSAML_Auth_Source::getById($sourceId);
 if ($source === NULL) {
 throw new SimpleSAML_Error_NotFound('Could not find authentication source with id ' . $sourceId);
 }
 
 if (!($source instanceof sspmod_saml_Auth_Source_SP)) {
 throw new SimpleSAML_Error_NotFound('Source isn\'t a SAML SP: ' . var_export($sourceId, TRUE));
 }
 
 $entityId = $source->getEntityId();
 $spconfig = $source->getMetadata();
 
 $metaArray20 = array(
 'SingleLogoutService' => SimpleSAML_Module::getModuleURL('saml/sp/saml2-logout.php/' . $sourceId),
 );
 
 $store = SimpleSAML_Store::getInstance();
 if ($store instanceof SimpleSAML_Store_SQL) {
 /* We can properly support SOAP logout. */
 $metaArray20['SingleLogoutService'] = array(
 array(
 'Binding' => SAML2_Const::BINDING_HTTP_REDIRECT,
 'Location' => SimpleSAML_Module::getModuleURL('saml/sp/saml2-logout.php/' . $sourceId),
 ),
 array(
 'Binding' => SAML2_Const::BINDING_SOAP,
 'Location' => SimpleSAML_Module::getModuleURL('saml/sp/saml2-logout.php/' . $sourceId),
 ),
 );
 }
 
 $assertionsconsumerservicesdefault = array(
 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact',
 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01',
 );
 
 if ($spconfig->getString('ProtocolBinding', '') == 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser') {
 $assertionsconsumerservicesdefault[] =     'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser';
 }
 
 $assertionsconsumerservices = $spconfig->getArray('acs.Bindings', $assertionsconsumerservicesdefault);
 
 $index = 0;
 $eps = array();
 foreach ($assertionsconsumerservices as $services) {
 
 $acsArray = array('index' => $index);
 switch ($services) {
 case 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST':
 $acsArray['Binding'] = SAML2_Const::BINDING_HTTP_POST;
 $acsArray['Location'] = SimpleSAML_Module::getModuleURL('saml/sp/saml2-acs.php/' . $sourceId);
 break;
 case 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post':
 $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post';
 $acsArray['Location'] = SimpleSAML_Module::getModuleURL('saml/sp/saml1-acs.php/' . $sourceId);
 break;
 case 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact':
 $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact';
 $acsArray['Location'] = SimpleSAML_Module::getModuleURL('saml/sp/saml2-acs.php/' . $sourceId);
 break;
 case 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01':
 $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01';
 $acsArray['Location'] = SimpleSAML_Module::getModuleURL('saml/sp/saml1-acs.php/' . $sourceId . '/artifact');
 break;
 case 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser':
 $acsArray['Binding'] = 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser';
 $acsArray['Location'] = SimpleSAML_Module::getModuleURL('saml/sp/saml2-acs.php/' . $sourceId);
 $acsArray['hoksso:ProtocolBinding'] = SAML2_Const::BINDING_HTTP_REDIRECT;
 break;
 }
 $eps[] = $acsArray;
 $index++;
 }
 
 $metaArray20['AssertionConsumerService'] = $eps;
 
 $keys = array();
 $certInfo = SimpleSAML_Utilities::loadPublicKey($spconfig, FALSE, 'new_');
 if ($certInfo !== NULL && array_key_exists('certData', $certInfo)) {
 $hasNewCert = TRUE;
 
 $certData = $certInfo['certData'];
 
 $keys[] = array(
 'type' => 'X509Certificate',
 'signing' => TRUE,
 'encryption' => TRUE,
 'X509Certificate' => $certInfo['certData'],
 );
 } else {
 $hasNewCert = FALSE;
 }
 
 $certInfo = SimpleSAML_Utilities::loadPublicKey($spconfig);
 if ($certInfo !== NULL && array_key_exists('certData', $certInfo)) {
 $certData = $certInfo['certData'];
 
 $keys[] = array(
 'type' => 'X509Certificate',
 'signing' => TRUE,
 'encryption' => ($hasNewCert ? FALSE : TRUE),
 'X509Certificate' => $certInfo['certData'],
 );
 } else {
 $certData = NULL;
 }
 
 $name = $spconfig->getLocalizedString('name', NULL);
 $attributes = $spconfig->getArray('attributes', array());
 
 if ($name !== NULL && !empty($attributes)) {
 $metaArray20['name'] = $name;
 $metaArray20['attributes'] = $attributes;
 $metaArray20['attributes.required'] = $spconfig->getArray('attributes.required', array());
 
 $description = $spconfig->getArray('description', NULL);
 if ($description !== NULL) {
 $metaArray20['description'] = $description;
 }
 
 $nameFormat = $spconfig->getString('attributes.NameFormat', NULL);
 if ($nameFormat !== NULL) {
 $metaArray20['attributes.NameFormat'] = $nameFormat;
 }
 }
 
 // add organization info
 $orgName = $spconfig->getLocalizedString('OrganizationName', NULL);
 if ($orgName !== NULL) {
 $metaArray20['OrganizationName'] = $orgName;
 
 $metaArray20['OrganizationDisplayName'] = $spconfig->getLocalizedString('OrganizationDisplayName', NULL);
 if ($metaArray20['OrganizationDisplayName'] === NULL) {
 $metaArray20['OrganizationDisplayName'] = $orgName;
 }
 
 $metaArray20['OrganizationURL'] = $spconfig->getLocalizedString('OrganizationURL', NULL);
 if ($metaArray20['OrganizationURL'] === NULL) {
 throw new SimpleSAML_Error_Exception('If OrganizationName is set, OrganizationURL must also be set.');
 }
 }
 
 // add technical contact
 $email = $config->getString('technicalcontact_email', 'na@example.org');
 if ( $email != 'na@example.org') {
 
 $contact = array('emailAddress' => $email);
 
 $name = $config->getString('technicalcontact_name', NULL);
 if ($name === NULL) {
 /* Nothing to do here... */
 } elseif (preg_match('@^(.*?)\s*,\s*(.*)$@D', $name, $matches)) {
 $contact['surName'] = $matches[1];
 $contact['givenName'] = $matches[2];
 } elseif (preg_match('@^(.*?)\s+(.*)$@D', $name, $matches)) {
 $contact['givenName'] = $matches[1];
 $contact['surName'] = $matches[2];
 } else {
 $contact['givenName'] = $name;
 }
 }
 
 // add additional contacts
 $contacts = $spconfig->getArray('contacts', array());
 
 // add certificate
 if (count($keys) === 1) {
 $metaArray20['certData'] = $keys[0]['X509Certificate'];
 } elseif (count($keys) > 1) {
 $metaArray20['keys'] = $keys;
 }
 
 // add UIInfo extension
 if ($spconfig->hasValue('UIInfo')) {
 $metaArray20['UIInfo'] = $spconfig->getArray('UIInfo');
 }
 
 $supported_protocols = array('urn:oasis:names:tc:SAML:1.1:protocol', SAML2_Const::NS_SAMLP);
 
 $metaArray20['metadata-set'] = 'saml20-sp-remote';
 $metaArray20['entityid'] = $entityId;
 
 $metaBuilder = new SimpleSAML_Metadata_SAMLBuilder($entityId);
 $metaBuilder->addMetadataSP20($metaArray20, $supported_protocols);
 $metaBuilder->addOrganizationInfo($metaArray20);
 if ( !empty($contact) ) $metaBuilder->addContact('technical', $contact);
 foreach ($contacts as $c) {
 $metaBuilder->addContact($c['contactType'], $c);
 }
 
 $xml = $metaBuilder->getEntityDescriptorText();
 
 unset($metaArray20['attributes.required']);
 unset($metaArray20['UIInfo']);
 unset($metaArray20['metadata-set']);
 unset($metaArray20['entityid']);
 
 /* Sign the metadata if enabled. */
 $xml = SimpleSAML_Metadata_Signer::sign($xml, $spconfig->toArray(), 'SAML 2 SP');
 
 if (array_key_exists('output', $_REQUEST) && $_REQUEST['output'] == 'xhtml') {
 
 $t = new SimpleSAML_XHTML_Template($config, 'metadata.php', 'admin');
 
 $t->data['header'] = 'saml20-sp';
 $t->data['metadata'] = htmlspecialchars($xml);
 $t->data['metadataflat'] = '$metadata[' . var_export($entityId, TRUE) . '] = ' . var_export($metaArray20, TRUE) . ';';
 $t->data['metaurl'] = $source->getMetadataURL();
 $t->show();
 } else {
 header('Content-Type: application/samlmetadata+xml');
 echo($xml);
 }
 ?>
 
 |