<?php
require 'tickets.php';
# set manually if called directly - ie not included from validate.php or cas.php
if (!$function) $function = 'serviceValidate';
/*
* Incomming parameters:
* service
* renew
* ticket
*
*/
if (array_key_exists('service', $_GET)) {
$service = $_GET['service'];
$ticket = $_GET['ticket'];
$forceAuthn = isset($_GET['renew']) && $_GET['renew'];
} else {
throw new Exception('Required URL query parameter [service] not provided. (CAS Server)');
}
try {
/* Load simpleSAMLphp, configuration and metadata */
$casconfig = SimpleSAML_Configuration::getConfig('module_casserver.php');
$path = $casconfig->resolvePath($casconfig->getValue('ticketcache', 'ticketcache'));
$ticketcontent = retrieveTicket($ticket, $path);
$usernamefield = $casconfig->getValue('attrname', 'eduPersonPrincipalName');
$dosendattributes = $casconfig->getValue('attributes', FALSE);
$attributes = $ticketcontent['attributes'];
$pgtiouxml = "";
if ($ticketcontent['service'] == $service
&& $ticketcontent['forceAuthn'] == $forceAuthn
&& array_key_exists($usernamefield, $attributes)
&& $ticketcontent['validbefore'] > time()) {
if (isset($_GET['pgtUrl'])) {
$pgtUrl = $_GET['pgtUrl'];
$pgtiou = str_replace( '_', 'PGTIOU-', SimpleSAML_Utilities::generateID());
$pgt = str_replace( '_', 'PGT-', SimpleSAML_Utilities::generateID());
$content = array(
'attributes' => $attributes,
'forceAuthn' => false,
'proxies' => array_merge(array($service), $ticketcontent['proxies']),
'validbefore' => time() + 60);
SimpleSAML_Utilities::fetch($pgtUrl . '?pgtIou=' . $pgtiou . '&pgtId=' . $pgt);
storeTicket($pgt, $path, $content);
$pgtiouxml = "\n<cas:proxyGrantingTicket>$pgtiou</cas:proxyGrantingTicket>\n";
}
$proxiesxml = join("\n", array_map(create_function('$a', 'return "<cas:proxy>$a</cas:proxy>";'), $ticketcontent['proxies']));
if ($proxiesxml) $proxiesxml = "<cas:proxies>\n$proxiesxml\n</cas:proxies>\n";
returnResponse('YES', $function, $attributes[$usernamefield][0], $dosendattributes ? $attributes : array(), $pgtiouxml.$proxiesxml);
} else {
returnResponse('NO', $function);
}
} catch (Exception $e) {
returnResponse('NO', $function, $e->getMessage());
}
function returnResponse($value, $function, $usrname = '', $attributes = array(), $xtraxml = "") {
if ($value === 'YES') {
if ($function != 'validate') {
$attributesxml = "";
foreach ($attributes as $attributename => $attributelist) {
$attr = htmlspecialchars($attributename);
foreach ($attributelist as $attributevalue) {
$attributesxml .= "<cas:$attr>" . htmlspecialchars($attributevalue) . "</cas:$attr>\n";
}
}
if (sizeof($attributes)) $attributesxml = "<cas:attributes>\n" . $attributesxml . "</cas:attributes>\n";
echo '<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>' . htmlspecialchars($usrname) . '</cas:user>' .
$xtraxml .
$attributesxml .
'</cas:authenticationSuccess>
</cas:serviceResponse>';
} else {
echo 'yes' . "\n" . $usrname;
}
} else {
if ($function != 'validate') {
echo '<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationFailure code="">
</cas:authenticationFailure>
</cas:serviceResponse>';
} else {
echo 'no';
}
}
}
?>
|