<?php

/*
* AUTHOR: Samuel Muñoz Hidalgo
* EMAIL: samuel.mh@gmail.com
* LAST REVISION: 13-FEB-09
* DESCRIPTION: InfoCard module metadata exchange (POLICY)
*/


$method = $_SERVER["REQUEST_METHOD"];

if ($method == "POST"){
	$use_soap = true;
	Header('Content-Type: application/soap+xml;charset=utf-8');
}else{
	$use_soap = false;
	Header('Content-Type: application/xml;charset=utf-8');
}


$config = SimpleSAML_Configuration::getInstance();
$autoconfig = $config->copyFromBase('logininfocard', 'config-login-infocard.php');
$ICconfig['tokenserviceurl'] = $autoconfig->getValue('tokenserviceurl');
$ICconfig['certificates'] = $autoconfig->getValue('certificates');
$ICconfig['UserCredential'] = $autoconfig->getValue('UserCredential');


// Grab the important parts of the token request.  That's pretty much just
// the request ID.
$request_id = '';
if ($use_soap && strlen($HTTP_RAW_POST_DATA))
{
    $token = new DOMDocument();
    $token->loadXML($HTTP_RAW_POST_DATA);
    $doc = $token->documentElement;
    $elements = $doc->getElementsByTagname('MessageID');
    $request_id = $elements->item(0)->nodeValue;
}

$buf = '<?xml version="1.0"?>';

$buf .= '<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing">';

	$buf .= '<S:Header>';
		$buf .= '<wsa:Action S:mustUnderstand="1">';
			$buf .= 'http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse';
		$buf .= '</wsa:Action>';
		$buf .= '<wsa:RelatesTo>';
			$buf .= $request_id;
		$buf .= '</wsa:RelatesTo>';
	$buf .= '</S:Header>';
	
	$buf .= '<S:Body>';	
		$buf .= '<Metadata xmlns="http://schemas.xmlsoap.org/ws/2004/09/mex">';
		
			$buf .= '<MetadataSection Dialect="http://schemas.xmlsoap.org/wsdl/" Identifier="http://schemas.xmlsoap.org/ws/2005/02/trust">';
				$buf .= '<wsdl:definitions name="STS_wsdl" targetNamespace="'.$ICconfig['tokenserviceurl'].'" xmlns:tns="'.$ICconfig['tokenserviceurl'].'" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:wsid="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ic="http://schemas.xmlsoap.org/ws/2005/05/identity" xmlns:q1="'.$ICconfig['tokenserviceurl'].'">';
				
					$buf .= '<wsdl:types>';
						$buf .= '<xs:schema targetNamespace="http://schemas.xmlsoap.org/ws/2005/02/trust/Imports">';
							$buf .= '<xs:import schemaLocation="" namespace="'.$ICconfig['tokenserviceurl'].'"/>';
						$buf .= '</xs:schema>';
					$buf .= '</wsdl:types>';
				
					$buf .= '<wsdl:message name="RequestSecurityTokenMsg">';
						$buf .= '<wsdl:part name="request" type="q1:MessageBody" />';
					$buf .= '</wsdl:message>';
					$buf .= '<wsdl:message name="RequestSecurityTokenResponseMsg">';
						$buf .= '<wsdl:part name="response" type="q1:MessageBody" />';
					$buf .= '</wsdl:message>';
					
					$buf .= '<wsdl:portType name="SecurityTokenService">';
						$buf .= '<wsdl:operation name="Issue">';
							$buf .= '<wsdl:input wsaw:Action="http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue" message="tns:RequestSecurityTokenMsg">';
							$buf .= '</wsdl:input>';
							$buf .= '<wsdl:output wsaw:Action="http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue" message="tns:RequestSecurityTokenResponseMsg">';
							$buf .= '</wsdl:output>';
						$buf .= '</wsdl:operation>';
					$buf .= '</wsdl:portType>';
					
					$buf .= '<wsp:Policy wsu:Id="STS_endpoint_policy">';
						$buf .= '<wsp:ExactlyOne>';
							$buf .= '<wsp:All>';
								$buf .= '<ic:RequireFederatedIdentityProvisioning />';
								$buf .= '<sp:TransportBinding>';
									$buf .= '<wsp:Policy>';
										$buf .= '<sp:TransportToken>';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:HttpsToken RequireClientCertificate="false" />';
											$buf .= '</wsp:Policy>';
										$buf .= '</sp:TransportToken>';
										$buf .= '<sp:AlgorithmSuite>';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:Basic256/>';
											$buf .= '</wsp:Policy>';
										$buf .= '</sp:AlgorithmSuite>';
										$buf .= '<sp:Layout>';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:Strict/>';
											$buf .= '</wsp:Policy>';
										$buf .= '</sp:Layout>';
										$buf .= '<sp:IncludeTimestamp/>';
									$buf .= '</wsp:Policy>';
								$buf .= '</sp:TransportBinding>';
								
								// Authentication token assertion
								switch($ICconfig['UserCredential']){
									case "UsernamePasswordCredential":
										$buf .= '<sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">';
													$buf .= '<wsp:Policy>';
														$buf .= '<sp:WssUsernameToken10/>';
													$buf .= '</wsp:Policy>';
												$buf .= '</sp:UsernameToken>';
											$buf .= '</wsp:Policy>';
										$buf .= '</sp:SignedSupportingTokens>';
										break;
									case "KerberosV5Credential":
										$buf .= '<sp:ProtectionToken>';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:KerberosToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Once">';
													$buf .= '<wsp:Policy>';
														$buf .= '<sp: WssGssKerberosV5ApReqToken11/>';
													$buf .= '</wsp:Policy>';
												$buf .= '</sp:KerberosToken>';
											$buf .= '<wsp:Policy>';
										$buf .= '</sp:ProtectionToken>';
										break;
									case "X509V3Credential":
										$buf .= '<sp:EndorsingSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">';
													$buf .= '<wsp:Policy>';
														$buf .= '<sp:WssX509V3Token10/>';
													$buf .= '</wsp:Policy>';
												$buf .= '</sp:X509Token>';
											$buf .= '</wsp:Policy>';
										$buf .= '</sp:EndorsingSupportingTokens>';
										break;
									case "SelfIssuedCredential":
										$buf .= '<sp:EndorsingSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust">';
											$buf .= '<wsp:Policy>';
												$buf .= '<sp:IssuedToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">';
													$buf .= '<sp:Issuer>';
														$buf .= '<wsa:Address>';
															$buf .= 'http://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self';
														$buf .= '</wsa:Address>';
													$buf .= '</sp:Issuer>';
													$buf .= '<sp:RequestSecurityTokenTemplate>';
														$buf .= '<wst:TokenType>';
															$buf .= 'urn:oasis:names:tc:SAML:1.0:assertion';
														$buf .= '</wst:TokenType>';
														$buf .= '<wst:KeyType>';
															$buf .= 'http://schemas.xmlsoap.org/ws/2005/02/trust/PublicKey';
														$buf .= '</wst:KeyType>';
														$buf .= '<wst:Claims xmlns:ic="http://schemas.xmlsoap.org/ws/2005/05/identity">';
															$buf .= '<ic:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>';
														$buf .= '</wst:Claims>';
													$buf .= '</sp:RequestSecurityTokenTemplate>';
													$buf .= '<wsp:Policy>';
														$buf .= '<sp:RequireInternalReference/>';
													$buf .= '</wsp:Policy>';
												$buf .= '</sp:IssuedToken>';
											$buf .= '</wsp:Policy>';
										$buf .= '</sp:EndorsingSupportingTokens>';
										break;
									default:
										break;
								}
								
								$buf .= '<sp:Wss11>';
									$buf .= '<wsp:Policy>';
										$buf .= '<sp:MustSupportRefThumbprint/>';
										$buf .= '<sp:MustSupportRefEncryptedKey/>';
									$buf .= '</wsp:Policy>';
								$buf .= '</sp:Wss11>';
								$buf .= '<sp:Trust10>';
									$buf .= '<wsp:Policy>';
										$buf .= '<sp:RequireClientEntropy/>';
										$buf .= '<sp:RequireServerEntropy/>';
									$buf .= '</wsp:Policy>';
								$buf .= '</sp:Trust10>';
								$buf .= '<wsaw:UsingAddressing wsdl:required="true" />';
							$buf .= '</wsp:All>';
						$buf .= '</wsp:ExactlyOne>';
					$buf .= '</wsp:Policy>';
					
					$buf .= '<wsdl:binding name="Transport_binding" type="tns:SecurityTokenService">';
						$buf .= '<wsp:PolicyReference URI="#STS_endpoint_policy"/>';
							$buf .= '<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>';
							$buf .= '<wsdl:operation name="Issue">';
								$buf .= '<soap12:operation soapAction="http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue" style="document"/>';
								$buf .= '<wsdl:input>';
									$buf .= '<soap12:body use="literal"/>';
								$buf .= '</wsdl:input>';
								$buf .= '<wsdl:output>';
									$buf .= '<soap12:body use="literal"/>';
								$buf .= '</wsdl:output>';
							$buf .= '</wsdl:operation>';
					$buf .= '</wsdl:binding>';
				
					$buf .= '<wsdl:service name="STS_0">';
						$buf .= '<wsdl:port name="STS_0_port" binding="tns:Transport_binding">';
							$buf .= '<soap12:address location="'.$ICconfig['tokenserviceurl'].'" />';
							$buf .= '<wsa:EndpointReference>';
								$buf .= '<wsa:Address>'.$ICconfig['tokenserviceurl'].'</wsa:Address>';
								$buf .= '<wsid:Identity>';
									$buf .= '<ds:KeyInfo>';
										$buf .= '<ds:X509Data>';
											$buf .= '<ds:X509Certificate>';
												$buf .= sspmod_InfoCard_Utils::takeCert($ICconfig['certificates'][0]);
											$buf .='</ds:X509Certificate>';
										$buf .= '</ds:X509Data>';
									$buf .= '</ds:KeyInfo>';
								$buf .= '</wsid:Identity>';
							$buf .= '</wsa:EndpointReference>';
						$buf .= '</wsdl:port>';
					$buf .= '</wsdl:service>';
					
				$buf .= '</wsdl:definitions>';
			$buf .= '</MetadataSection>';
		
		
			$buf .= '<MetadataSection Dialect="http://www.w3.org/2001/XMLSchema" Identifier="'.$ICconfig['tokenserviceurl'].'">';
				$buf .= '<xs:schema xmlns:tns="'.$ICconfig['tokenserviceurl'].'" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="'.$ICconfig['tokenserviceurl'].'">';
					$buf .= '<xs:complexType name="MessageBody">';
						$buf .= '<xs:sequence>';
							$buf .= '<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##any"/>';
						$buf .= '</xs:sequence>';
					$buf .= '</xs:complexType>';
				$buf .= '</xs:schema>';
			$buf .= '</MetadataSection>';
		
		$buf .= '</Metadata>';	
	$buf .= '</S:Body>';
	
$buf .= '</S:Envelope>';


print($buf);
