<?php

/*
* AUTHOR: Samuel Muñoz Hidalgo
* EMAIL: samuel.mh@gmail.com
* LAST REVISION: 13-FEB-09
* DESCRIPTION: Web interface for the token generator
*/


//Borrowed from xlmseclibs, TEMPORAL
function decryptMcrypt($data,$key) {
	$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,'');
	$iv_length = mcrypt_enc_get_iv_size($td);

	$iv = substr($data, 0, $iv_length);
	$data = substr($data, $iv_length);

	mcrypt_generic_init($td, $key, $iv);
	$decrypted_data = mdecrypt_generic($td, $data);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	
	$dataLen = strlen($decrypted_data);
	$paddingLength = substr($decrypted_data, $dataLen - 1, 1);
	$decrypted_data = substr($decrypted_data, 0, $dataLen - ord($paddingLength));
	
	return $decrypted_data;
}



//Input: self issued saml token
//Returns ppid coded in base 64
	function getppid($samlToken){
	$token = new DOMDocument();
	$token->loadXML($samlToken);
	$doc = $token->documentElement;
	return($doc->getElementsByTagname('AttributeValue')->item(0)->nodeValue);
}


// grab the important parts of the token request.  these are the username,
// password, and cardid.

Header('Content-Type: application/soap+xml;charset=utf-8');

$config = SimpleSAML_Configuration::getInstance();
SimpleSAML_Logger::debug('Tokenservice');

$token = new DOMDocument();
$token->loadXML($HTTP_RAW_POST_DATA);
$doc = $token->documentElement;

$cardId  =  $doc->getElementsByTagname('CardId')->item(0)->nodeValue;

$authenticated = false;


$autoconfig = $config->copyFromBase('logininfocard', 'config-login-infocard.php');
$ICconfig['UserCredential'] = $autoconfig->getValue('UserCredential');
$debugDir = $autoconfig->getValue('debugDir');


SimpleSAML_Logger::debug('USERCREDENTIAL: '.$ICconfig['UserCredential']);
switch($ICconfig['UserCredential']){
	case "UsernamePasswordCredential":
		$username = $doc->getElementsByTagname('Username')->item(0)->nodeValue;
		$password = $doc->getElementsByTagname('Password')->item(0)->nodeValue;
		if (sspmod_InfoCard_UserFunctions::validateUser(array('username'=>$username,'password'=>$password),$ICconfig['UserCredential'])){
			$authenticated = true;
		}
		break;
	case "KerberosV5Credential":
		break;
	case "X509V3Credential":
		break;
	case "SelfIssuedCredential":
		//Obtener clave simétrica
		$encKey = base64_decode($doc->getElementsByTagname('CipherValue')->item(0)->nodeValue);
		$sts_key = $autoconfig->getValue('sts_key');
		$privkey = openssl_pkey_get_private(file_get_contents($sts_key));
		$key=NULL;
		openssl_private_decrypt($encKey,$key,$privkey,OPENSSL_PKCS1_OAEP_PADDING);
		openssl_free_key($privkey);
		
		//Recuperar información
		$encSamlToken = base64_decode($doc->getElementsByTagname('CipherValue')->item(1)->nodeValue);
		$samlToken=decryptMcrypt($encSamlToken,$key);
		SimpleSAML_Logger::debug('$samlToken'.$samlToken);
		$ppid=getppid($samlToken);
		SimpleSAML_Logger::debug('PPID: '.$ppid);

		if (sspmod_InfoCard_UserFunctions::validateUser(array('PPID'=>$ppid),$ICconfig['UserCredential'])){
			$authenticated = true;
		}
		break;
	default:
		break;
}


$messageid = $doc->getElementsByTagname('MessageID')->item(0)->nodeValue;

if ($authenticated){
	$ICconfig['InfoCard'] = $autoconfig->getValue('InfoCard');
	$ICconfig['issuer'] =  $autoconfig->getValue('issuer');
	$ICconfig['sts_crt'] = $autoconfig->getValue('sts_crt');
	$ICconfig['sts_key'] = $autoconfig->getValue('sts_key');
	
	$requiredClaims = sspmod_InfoCard_Utils::extractClaims($ICconfig['InfoCard']['schema'], $doc->getElementsByTagname('ClaimType'));
	$claimValues = sspmod_InfoCard_UserFunctions::fillClaims($username, $ICconfig['InfoCard']['requiredClaims'], $ICconfig['InfoCard']['optionalClaims'],$requiredClaims);
	
	$response = sspmod_InfoCard_STS::createToken($claimValues,$ICconfig,$messageid);
	

}else{
	$response = sspmod_InfoCard_STS::errorMessage('Wrong Credentials',$messageid);
}


Header('Content-length: '.strlen($response)+1);
print($response);

//LOG
if ($debugDir!=null){
	$handle=fopen($debugDir.'/'.$messageid.'.log','w');
	fwrite($handle,"  ------ InfoCard simpleSAMLphp Module LOG ------\n\n");
	fwrite($handle,"-- TIME: ".gmdate('Y-m-d').' '.gmdate('H:i:s')."\n");
	fwrite($handle,"-- MESSAGE ID: ".$messageid."\n\n\n");
	fwrite($handle,"-- RST\n");
	fwrite($handle,$HTTP_RAW_POST_DATA);
	fwrite($handle,"\n\n\n-- RSTR\n");
	fwrite($handle,$response);
	fclose($handle);
}
