File: ICAuth.php

package info (click to toggle)
simplesamlphp 1.13.1-2%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 11,304 kB
  • sloc: php: 65,124; xml: 629; python: 376; sh: 193; perl: 185; makefile: 43
file content (98 lines) | stat: -rw-r--r-- 3,027 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php

/*
* AUTHOR: Samuel Muñoz Hidalgo
* EMAIL: samuel.mh@gmail.com
* LAST REVISION: 22-DEC-08
* DESCRIPTION:
*  Authentication module.
*  Handles the login information
*  Infocard's claims are extracted passed as attributes.
*/


class sspmod_InfoCard_Auth_Source_ICAuth extends SimpleSAML_Auth_Source {

	//The string used to identify our states.
	const STAGEID = 'sspmod_core_Auth_UserPassBase.state';


	//The key of the AuthId field in the state.
	const AUTHID = 'sspmod_core_Auth_UserPassBase.AuthId';

	
	public function __construct($info, $config) {
		assert('is_array($info)');
		assert('is_array($config)');

		/* Call the parent constructor first, as required by the interface. */
		parent::__construct($info, $config);
	}
	
	
	public function authenticate(&$state) {
		assert('is_array($state)');

		/* We are going to need the authId in order to retrieve this authentication source later. */
		$state[self::AUTHID] = $this->authId;
		$id = SimpleSAML_Auth_State::saveState($state, self::STAGEID);
		$url = SimpleSAML_Module::getModuleURL('InfoCard/login-infocard.php');
		SimpleSAML_Utilities::redirectTrustedURL($url, array('AuthState' => $id));
	}
	

	public static function handleLogin($authStateId, $xmlToken) {
		assert('is_string($authStateId)');		

		$config = SimpleSAML_Configuration::getInstance();
		$autoconfig = $config->copyFromBase('logininfocard', 'config-login-infocard.php');
		$idp_key = $autoconfig->getValue('idp_key');
		$idp_pass = $autoconfig->getValue('idp_key_pass', NULL);
		$sts_crt = $autoconfig->getValue('sts_crt');
		$Infocard =   $autoconfig->getValue('InfoCard');

		$infocard = new sspmod_InfoCard_RP_InfoCard();
		$infocard->addIDPKey($idp_key, $idp_pass);
		$infocard->addSTSCertificate($sts_crt);	
		if (!$xmlToken)     
			SimpleSAML_Logger::debug("XMLtoken: ".$xmlToken);
    else
    	SimpleSAML_Logger::debug("NOXMLtoken: ".$xmlToken);
		$claims = $infocard->process($xmlToken);
 		if($claims->isValid()) {
			$attributes = array();
			foreach ($Infocard['requiredClaims'] as $claim => $data){
				$attributes[$claim] = array($claims->$claim);
			}
			foreach ($Infocard['optionalClaims'] as $claim => $data){
				$attributes[$claim] = array($claims->$claim);
			}

			// sanitize the input
			$sid = SimpleSAML_Utilities::parseStateID($authStateId);
			if (!is_null($sid['url'])) {
				SimpleSAML_Utilities::checkURLAllowed($sid['url']);
			}

			/* Retrieve the authentication state. */
			$state = SimpleSAML_Auth_State::loadState($authStateId, self::STAGEID);
			/* Find authentication source. */
			assert('array_key_exists(self::AUTHID, $state)');
			$source = SimpleSAML_Auth_Source::getById($state[self::AUTHID]);
			if ($source === NULL) {
				throw new Exception('Could not find authentication source with id ' . $state[self::AUTHID]);
			}			
			$state['Attributes'] = $attributes;	
			unset($infocard);
			unset($claims);
			SimpleSAML_Auth_Source::completeAuth($state);
		} else {
			unset($infocard);
			unset($claims);
			return 'wrong_IC';
		}
	}

}

?>