forked from GNUsocial/gnu-social
Bump to phpCAS 1.1.0RC6
This commit is contained in:
parent
ddf3614c84
commit
358556057a
@ -14,7 +14,7 @@ if (!$_SERVER['REQUEST_URI']) {
|
||||
// another one by Vangelis Haniotakis also to make phpCAS work with PHP5
|
||||
//
|
||||
if (version_compare(PHP_VERSION,'5','>=')) {
|
||||
require_once(dirname(__FILE__).'/CAS/domxml-php4-php5.php');
|
||||
require_once(dirname(__FILE__).'/CAS/domxml-php4-to-php5.php');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -35,7 +35,7 @@ if (version_compare(PHP_VERSION,'5','>=')) {
|
||||
/**
|
||||
* phpCAS version. accessible for the user by phpCAS::getVersion().
|
||||
*/
|
||||
define('PHPCAS_VERSION','1.0.1');
|
||||
define('PHPCAS_VERSION','1.1.0RC6');
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// CAS VERSIONS
|
||||
@ -54,6 +54,63 @@ define("CAS_VERSION_1_0",'1.0');
|
||||
*/
|
||||
define("CAS_VERSION_2_0",'2.0');
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// SAML defines
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* SAML protocol
|
||||
*/
|
||||
define("SAML_VERSION_1_1", 'S1');
|
||||
|
||||
/**
|
||||
* XML header for SAML POST
|
||||
*/
|
||||
define("SAML_XML_HEADER", '<?xml version="1.0" encoding="UTF-8"?>');
|
||||
|
||||
/**
|
||||
* SOAP envelope for SAML POST
|
||||
*/
|
||||
define ("SAML_SOAP_ENV", '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/>');
|
||||
|
||||
/**
|
||||
* SOAP body for SAML POST
|
||||
*/
|
||||
define ("SAML_SOAP_BODY", '<SOAP-ENV:Body>');
|
||||
|
||||
/**
|
||||
* SAMLP request
|
||||
*/
|
||||
define ("SAMLP_REQUEST", '<samlp:Request xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" MajorVersion="1" MinorVersion="1" RequestID="_192.168.16.51.1024506224022" IssueInstant="2002-06-19T17:03:44.022Z">');
|
||||
define ("SAMLP_REQUEST_CLOSE", '</samlp:Request>');
|
||||
|
||||
/**
|
||||
* SAMLP artifact tag (for the ticket)
|
||||
*/
|
||||
define ("SAML_ASSERTION_ARTIFACT", '<samlp:AssertionArtifact>');
|
||||
|
||||
/**
|
||||
* SAMLP close
|
||||
*/
|
||||
define ("SAML_ASSERTION_ARTIFACT_CLOSE", '</samlp:AssertionArtifact>');
|
||||
|
||||
/**
|
||||
* SOAP body close
|
||||
*/
|
||||
define ("SAML_SOAP_BODY_CLOSE", '</SOAP-ENV:Body>');
|
||||
|
||||
/**
|
||||
* SOAP envelope close
|
||||
*/
|
||||
define ("SAML_SOAP_ENV_CLOSE", '</SOAP-ENV:Envelope>');
|
||||
|
||||
/**
|
||||
* SAML Attributes
|
||||
*/
|
||||
define("SAML_ATTRIBUTES", 'SAMLATTRIBS');
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
/**
|
||||
* @addtogroup publicPGTStorage
|
||||
@ -304,7 +361,7 @@ class phpCAS
|
||||
phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');
|
||||
}
|
||||
|
||||
// store where the initialzer is called from
|
||||
// store where the initializer is called from
|
||||
$dbg = phpCAS::backtrace();
|
||||
$PHPCAS_INIT_CALL = array('done' => TRUE,
|
||||
'file' => $dbg[0]['file'],
|
||||
@ -739,7 +796,7 @@ class phpCAS
|
||||
if ( gettype($table) != 'string' ) {
|
||||
phpCAS::error('type mismatched for parameter $table (should be `string\')');
|
||||
}
|
||||
$PHPCAS_CLIENT->setPGTStorageDB($this,$user,$password,$hostname,$port,$database,$table);
|
||||
$PHPCAS_CLIENT->setPGTStorageDB($user,$password,$database_type,$hostname,$port,$database,$table);
|
||||
phpCAS::traceEnd();
|
||||
}
|
||||
|
||||
@ -797,6 +854,7 @@ class phpCAS
|
||||
*
|
||||
* @param $url a string giving the URL of the service, including the mailing box
|
||||
* for IMAP URLs, as accepted by imap_open().
|
||||
* @param $service a string giving for CAS retrieve Proxy ticket
|
||||
* @param $flags options given to imap_open().
|
||||
* @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
|
||||
* success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
|
||||
@ -808,7 +866,7 @@ class phpCAS
|
||||
* @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
|
||||
* gives the reason why it failed and $err_msg contains an error message).
|
||||
*/
|
||||
function serviceMail($url,$flags,&$err_code,&$err_msg,&$pt)
|
||||
function serviceMail($url,$service,$flags,&$err_code,&$err_msg,&$pt)
|
||||
{
|
||||
global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
|
||||
|
||||
@ -833,7 +891,7 @@ class phpCAS
|
||||
phpCAS::error('type mismatched for parameter $flags (should be `integer\')');
|
||||
}
|
||||
|
||||
$res = $PHPCAS_CLIENT->serviceMail($url,$flags,$err_code,$err_msg,$pt);
|
||||
$res = $PHPCAS_CLIENT->serviceMail($url,$service,$flags,$err_code,$err_msg,$pt);
|
||||
|
||||
phpCAS::traceEnd($res);
|
||||
return $res;
|
||||
@ -1022,6 +1080,27 @@ class phpCAS
|
||||
return $PHPCAS_CLIENT->getUser();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the CAS user's login name.
|
||||
* @warning should not be called only after phpCAS::forceAuthentication()
|
||||
* or phpCAS::checkAuthentication().
|
||||
*
|
||||
* @return the login name of the authenticated user
|
||||
*/
|
||||
function getAttributes()
|
||||
{
|
||||
global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
|
||||
if ( !is_object($PHPCAS_CLIENT) ) {
|
||||
phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
|
||||
}
|
||||
if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {
|
||||
phpCAS::error('this method should only be called after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
|
||||
}
|
||||
if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {
|
||||
phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');
|
||||
}
|
||||
return $PHPCAS_CLIENT->getAttributes();
|
||||
}
|
||||
/**
|
||||
* Handle logout requests.
|
||||
*/
|
||||
@ -1070,6 +1149,71 @@ class phpCAS
|
||||
phpCAS::traceEnd();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the serviceValidate URL of the CAS server.
|
||||
* @param $url the serviceValidate URL
|
||||
* @since 1.1.0 by Joachim Fritschi
|
||||
*/
|
||||
function setServerServiceValidateURL($url='')
|
||||
{
|
||||
global $PHPCAS_CLIENT;
|
||||
phpCAS::traceBegin();
|
||||
if ( !is_object($PHPCAS_CLIENT) ) {
|
||||
phpCAS::error('this method should only be called after
|
||||
'.__CLASS__.'::client()');
|
||||
}
|
||||
if ( gettype($url) != 'string' ) {
|
||||
phpCAS::error('type mismatched for parameter $url (should be
|
||||
`string\')');
|
||||
}
|
||||
$PHPCAS_CLIENT->setServerServiceValidateURL($url);
|
||||
phpCAS::traceEnd();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the proxyValidate URL of the CAS server.
|
||||
* @param $url the proxyValidate URL
|
||||
* @since 1.1.0 by Joachim Fritschi
|
||||
*/
|
||||
function setServerProxyValidateURL($url='')
|
||||
{
|
||||
global $PHPCAS_CLIENT;
|
||||
phpCAS::traceBegin();
|
||||
if ( !is_object($PHPCAS_CLIENT) ) {
|
||||
phpCAS::error('this method should only be called after
|
||||
'.__CLASS__.'::client()');
|
||||
}
|
||||
if ( gettype($url) != 'string' ) {
|
||||
phpCAS::error('type mismatched for parameter $url (should be
|
||||
`string\')');
|
||||
}
|
||||
$PHPCAS_CLIENT->setServerProxyValidateURL($url);
|
||||
phpCAS::traceEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the samlValidate URL of the CAS server.
|
||||
* @param $url the samlValidate URL
|
||||
* @since 1.1.0 by Joachim Fritschi
|
||||
*/
|
||||
function setServerSamlValidateURL($url='')
|
||||
{
|
||||
global $PHPCAS_CLIENT;
|
||||
phpCAS::traceBegin();
|
||||
if ( !is_object($PHPCAS_CLIENT) ) {
|
||||
phpCAS::error('this method should only be called after
|
||||
'.__CLASS__.'::client()');
|
||||
}
|
||||
if ( gettype($url) != 'string' ) {
|
||||
phpCAS::error('type mismatched for parameter $url (should be
|
||||
`string\')');
|
||||
}
|
||||
$PHPCAS_CLIENT->setServerSamlValidateURL($url);
|
||||
phpCAS::traceEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the URL to be used to login.
|
||||
* or phpCAS::isAuthenticated().
|
||||
|
@ -352,6 +352,43 @@ class CASClient
|
||||
return $this->_server['login_url'] = $url;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method sets the serviceValidate URL of the CAS server.
|
||||
* @param $url the serviceValidate URL
|
||||
* @private
|
||||
* @since 1.1.0 by Joachim Fritschi
|
||||
*/
|
||||
function setServerServiceValidateURL($url)
|
||||
{
|
||||
return $this->_server['service_validate_url'] = $url;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method sets the proxyValidate URL of the CAS server.
|
||||
* @param $url the proxyValidate URL
|
||||
* @private
|
||||
* @since 1.1.0 by Joachim Fritschi
|
||||
*/
|
||||
function setServerProxyValidateURL($url)
|
||||
{
|
||||
return $this->_server['proxy_validate_url'] = $url;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method sets the samlValidate URL of the CAS server.
|
||||
* @param $url the samlValidate URL
|
||||
* @private
|
||||
* @since 1.1.0 by Joachim Fritschi
|
||||
*/
|
||||
function setServerSamlValidateURL($url)
|
||||
{
|
||||
return $this->_server['saml_validate_url'] = $url;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method is used to retrieve the service validating URL of the CAS server.
|
||||
* @return a URL.
|
||||
@ -373,7 +410,25 @@ class CASClient
|
||||
// return $this->_server['service_validate_url'].'?service='.preg_replace('/&/','%26',$this->getURL());
|
||||
return $this->_server['service_validate_url'].'?service='.urlencode($this->getURL());
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to retrieve the SAML validating URL of the CAS server.
|
||||
* @return a URL.
|
||||
* @private
|
||||
*/
|
||||
function getServerSamlValidateURL()
|
||||
{
|
||||
phpCAS::traceBegin();
|
||||
// the URL is build only when needed
|
||||
if ( empty($this->_server['saml_validate_url']) ) {
|
||||
switch ($this->getServerVersion()) {
|
||||
case SAML_VERSION_1_1:
|
||||
$this->_server['saml_validate_url'] = $this->getServerBaseURL().'samlValidate';
|
||||
break;
|
||||
}
|
||||
}
|
||||
phpCAS::traceEnd($this->_server['saml_validate_url'].'?TARGET='.urlencode($this->getURL()));
|
||||
return $this->_server['saml_validate_url'].'?TARGET='.urlencode($this->getURL());
|
||||
}
|
||||
/**
|
||||
* This method is used to retrieve the proxy validating URL of the CAS server.
|
||||
* @return a URL.
|
||||
@ -497,31 +552,51 @@ class CASClient
|
||||
|
||||
phpCAS::traceBegin();
|
||||
|
||||
if (!$this->isLogoutRequest() && !empty($_GET['ticket']) && $start_session) {
|
||||
// copy old session vars and destroy the current session
|
||||
// the redirect header() call and DOM parsing code from domxml-php4-php5.php won't work in PHP4 compatibility mode
|
||||
if (version_compare(PHP_VERSION,'5','>=') && ini_get('zend.ze1_compatibility_mode')) {
|
||||
phpCAS::error('phpCAS cannot support zend.ze1_compatibility_mode. Sorry.');
|
||||
}
|
||||
// skip Session Handling for logout requests and if don't want it'
|
||||
if ($start_session && !$this->isLogoutRequest()) {
|
||||
phpCAS::trace("Starting session handling");
|
||||
// Check for Tickets from the CAS server
|
||||
if (empty($_GET['ticket'])){
|
||||
phpCAS::trace("No ticket found");
|
||||
// only create a session if necessary
|
||||
if (!isset($_SESSION)) {
|
||||
phpCAS::trace("No session found, creating new session");
|
||||
session_start();
|
||||
}
|
||||
}else{
|
||||
phpCAS::trace("Ticket found");
|
||||
// We have to copy any old data before renaming the session
|
||||
if (isset($_SESSION)) {
|
||||
phpCAS::trace("Old active session found, saving old data and destroying session");
|
||||
$old_session = $_SESSION;
|
||||
session_destroy();
|
||||
}else{
|
||||
session_start();
|
||||
phpCAS::trace("Starting possible old session to copy variables");
|
||||
$old_session = $_SESSION;
|
||||
session_destroy();
|
||||
}
|
||||
// set up a new session, of name based on the ticket
|
||||
$session_id = preg_replace('/[^\w]/','',$_GET['ticket']);
|
||||
phpCAS::LOG("Session ID: " . $session_id);
|
||||
session_id($session_id);
|
||||
if (!isset($_SESSION)) {
|
||||
session_start();
|
||||
}
|
||||
// restore old session vars
|
||||
if(isset($old_session)){
|
||||
phpCAS::trace("Restoring old session vars");
|
||||
$_SESSION = $old_session;
|
||||
// Redirect to location without ticket.
|
||||
header('Location: '.$this->getURL());
|
||||
}
|
||||
}
|
||||
}else{
|
||||
phpCAS::trace("Skipping session creation");
|
||||
}
|
||||
|
||||
//activate session mechanism if desired
|
||||
if (!$this->isLogoutRequest() && $start_session) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// are we in proxy mode ?
|
||||
$this->_proxy = $proxy;
|
||||
|
||||
//check version
|
||||
@ -533,6 +608,8 @@ class CASClient
|
||||
break;
|
||||
case CAS_VERSION_2_0:
|
||||
break;
|
||||
case SAML_VERSION_1_1:
|
||||
break;
|
||||
default:
|
||||
phpCAS::error('this version of CAS (`'
|
||||
.$server_version
|
||||
@ -590,8 +667,12 @@ class CASClient
|
||||
}
|
||||
break;
|
||||
case CAS_VERSION_2_0: // check for a Service or Proxy Ticket
|
||||
if( preg_match('/^[SP]T-/',$ticket) ) {
|
||||
phpCAS::trace('ST or PT \''.$ticket.'\' found');
|
||||
if (preg_match('/^ST-/', $ticket)) {
|
||||
phpCAS::trace('ST \'' . $ticket . '\' found');
|
||||
$this->setST($ticket);
|
||||
unset ($_GET['ticket']);
|
||||
} else if (preg_match('/^PT-/', $ticket)) {
|
||||
phpCAS::trace('PT \'' . $ticket . '\' found');
|
||||
$this->setPT($ticket);
|
||||
unset($_GET['ticket']);
|
||||
} else if ( !empty($ticket) ) {
|
||||
@ -599,6 +680,16 @@ class CASClient
|
||||
phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
|
||||
}
|
||||
break;
|
||||
case SAML_VERSION_1_1: // SAML just does Service Tickets
|
||||
if( preg_match('/^[SP]T-/',$ticket) ) {
|
||||
phpCAS::trace('SA \''.$ticket.'\' found');
|
||||
$this->setSA($ticket);
|
||||
unset($_GET['ticket']);
|
||||
} else if ( !empty($ticket) ) {
|
||||
//ill-formed ticket, halt
|
||||
phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
phpCAS::traceEnd();
|
||||
@ -653,6 +744,45 @@ class CASClient
|
||||
return $this->_user;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************************************
|
||||
* Atrributes section
|
||||
*
|
||||
* @author Matthias Crauwels <matthias.crauwels@ugent.be>, Ghent University, Belgium
|
||||
*
|
||||
***********************************************************************************************************************/
|
||||
/**
|
||||
* The Authenticated users attributes. Written by CASClient::setAttributes(), read by CASClient::getAttributes().
|
||||
* @attention client applications should use phpCAS::getAttributes().
|
||||
*
|
||||
* @hideinitializer
|
||||
* @private
|
||||
*/
|
||||
var $_attributes = array();
|
||||
|
||||
function setAttributes($attributes)
|
||||
{ $this->_attributes = $attributes; }
|
||||
|
||||
function getAttributes() {
|
||||
if ( empty($this->_user) ) { // if no user is set, there shouldn't be any attributes also...
|
||||
phpCAS::error('this method should be used only after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
|
||||
}
|
||||
return $this->_attributes;
|
||||
}
|
||||
|
||||
function hasAttributes()
|
||||
{ return !empty($this->_attributes); }
|
||||
|
||||
function hasAttribute($key)
|
||||
{ return (is_array($this->_attributes) && array_key_exists($key, $this->_attributes)); }
|
||||
|
||||
function getAttribute($key) {
|
||||
if($this->hasAttribute($key)) {
|
||||
return $this->_attributes[$key];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called to renew the authentication of the user
|
||||
* If the user is authenticated, renew the connection
|
||||
@ -778,7 +908,7 @@ class CASClient
|
||||
* This method is called to check if the user is authenticated (previously or by
|
||||
* tickets given in the URL).
|
||||
*
|
||||
* @return TRUE when the user is authenticated.
|
||||
* @return TRUE when the user is authenticated. Also may redirect to the same URL without the ticket.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
@ -794,7 +924,8 @@ class CASClient
|
||||
phpCAS::trace('user was already authenticated, no need to look for tickets');
|
||||
$res = TRUE;
|
||||
}
|
||||
elseif ( $this->hasST() ) {
|
||||
else {
|
||||
if ( $this->hasST() ) {
|
||||
// if a Service Ticket was given, validate it
|
||||
phpCAS::trace('ST `'.$this->getST().'\' is present');
|
||||
$this->validateST($validate_url,$text_response,$tree_response); // if it fails, it halts
|
||||
@ -820,10 +951,26 @@ class CASClient
|
||||
$_SESSION['phpCAS']['user'] = $this->getUser();
|
||||
$res = TRUE;
|
||||
}
|
||||
elseif ( $this->hasSA() ) {
|
||||
// if we have a SAML ticket, validate it.
|
||||
phpCAS::trace('SA `'.$this->getSA().'\' is present');
|
||||
$this->validateSA($validate_url,$text_response,$tree_response); // if it fails, it halts
|
||||
phpCAS::trace('SA `'.$this->getSA().'\' was validated');
|
||||
$_SESSION['phpCAS']['user'] = $this->getUser();
|
||||
$_SESSION['phpCAS']['attributes'] = $this->getAttributes();
|
||||
$res = TRUE;
|
||||
}
|
||||
else {
|
||||
// no ticket given, not authenticated
|
||||
phpCAS::trace('no ticket found');
|
||||
}
|
||||
if ($res) {
|
||||
// if called with a ticket parameter, we need to redirect to the app without the ticket so that CAS-ification is transparent to the browser (for later POSTS)
|
||||
// most of the checks and errors should have been made now, so we're safe for redirect without masking error messages.
|
||||
header('Location: '.$this->getURL());
|
||||
phpCAS::log( "Prepare redirect to : ".$this->getURL() );
|
||||
}
|
||||
}
|
||||
|
||||
phpCAS::traceEnd($res);
|
||||
return $res;
|
||||
@ -889,6 +1036,9 @@ class CASClient
|
||||
if ( $this->isSessionAuthenticated() ) {
|
||||
// authentication already done
|
||||
$this->setUser($_SESSION['phpCAS']['user']);
|
||||
if(isset($_SESSION['phpCAS']['attributes'])){
|
||||
$this->setAttributes($_SESSION['phpCAS']['attributes']);
|
||||
}
|
||||
phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\'');
|
||||
$auth = TRUE;
|
||||
} else {
|
||||
@ -917,6 +1067,7 @@ class CASClient
|
||||
|
||||
printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
|
||||
$this->printHTMLFooter();
|
||||
|
||||
phpCAS::traceExit();
|
||||
exit();
|
||||
}
|
||||
@ -962,11 +1113,15 @@ class CASClient
|
||||
$cas_url = $cas_url . $paramSeparator . "service=" . urlencode($params['service']);
|
||||
}
|
||||
header('Location: '.$cas_url);
|
||||
phpCAS::log( "Prepare redirect to : ".$cas_url );
|
||||
|
||||
session_unset();
|
||||
session_destroy();
|
||||
|
||||
$this->printHTMLHeader($this->getString(CAS_STR_LOGOUT));
|
||||
printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
|
||||
$this->printHTMLFooter();
|
||||
|
||||
phpCAS::traceExit();
|
||||
exit();
|
||||
}
|
||||
@ -1009,10 +1164,10 @@ class CASClient
|
||||
}
|
||||
$client_ip = $_SERVER['REMOTE_ADDR'];
|
||||
$client = gethostbyaddr($client_ip);
|
||||
phpCAS::log("Client: ".$client);
|
||||
phpCAS::log("Client: ".$client."/".$client_ip);
|
||||
$allowed = false;
|
||||
foreach ($allowed_clients as $allowed_client) {
|
||||
if ($client == $allowed_client) {
|
||||
if (($client == $allowed_client) or ($client_ip == $allowed_client)) {
|
||||
phpCAS::log("Allowed client '".$allowed_client."' matches, logout request is allowed");
|
||||
$allowed = true;
|
||||
break;
|
||||
@ -1285,6 +1440,151 @@ class CASClient
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ########################################################################
|
||||
// SAML VALIDATION
|
||||
// ########################################################################
|
||||
/**
|
||||
* @addtogroup internalBasic
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* This method is used to validate a SAML TICKET; halt on failure, and sets $validate_url,
|
||||
* $text_reponse and $tree_response on success. These parameters are used later
|
||||
* by CASClient::validatePGT() for CAS proxies.
|
||||
*
|
||||
* @param $validate_url the URL of the request to the CAS server.
|
||||
* @param $text_response the response of the CAS server, as is (XML text).
|
||||
* @param $tree_response the response of the CAS server, as a DOM XML tree.
|
||||
*
|
||||
* @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
function validateSA($validate_url,&$text_response,&$tree_response)
|
||||
{
|
||||
phpCAS::traceBegin();
|
||||
|
||||
// build the URL to validate the ticket
|
||||
$validate_url = $this->getServerSamlValidateURL();
|
||||
|
||||
// open and read the URL
|
||||
if ( !$this->readURL($validate_url,''/*cookies*/,$headers,$text_response,$err_msg) ) {
|
||||
phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
|
||||
$this->authError('SA not validated', $validate_url, TRUE/*$no_response*/);
|
||||
}
|
||||
|
||||
phpCAS::trace('server version: '.$this->getServerVersion());
|
||||
|
||||
// analyze the result depending on the version
|
||||
switch ($this->getServerVersion()) {
|
||||
case SAML_VERSION_1_1:
|
||||
|
||||
// read the response of the CAS server into a DOM object
|
||||
if ( !($dom = domxml_open_mem($text_response))) {
|
||||
phpCAS::trace('domxml_open_mem() failed');
|
||||
$this->authError('SA not validated',
|
||||
$validate_url,
|
||||
FALSE/*$no_response*/,
|
||||
TRUE/*$bad_response*/,
|
||||
$text_response);
|
||||
}
|
||||
// read the root node of the XML tree
|
||||
if ( !($tree_response = $dom->document_element()) ) {
|
||||
phpCAS::trace('document_element() failed');
|
||||
$this->authError('SA not validated',
|
||||
$validate_url,
|
||||
FALSE/*$no_response*/,
|
||||
TRUE/*$bad_response*/,
|
||||
$text_response);
|
||||
}
|
||||
// insure that tag name is 'Envelope'
|
||||
if ( $tree_response->node_name() != 'Envelope' ) {
|
||||
phpCAS::trace('bad XML root node (should be `Envelope\' instead of `'.$tree_response->node_name().'\'');
|
||||
$this->authError('SA not validated',
|
||||
$validate_url,
|
||||
FALSE/*$no_response*/,
|
||||
TRUE/*$bad_response*/,
|
||||
$text_response);
|
||||
}
|
||||
// check for the NameIdentifier tag in the SAML response
|
||||
if ( sizeof($success_elements = $tree_response->get_elements_by_tagname("NameIdentifier")) != 0) {
|
||||
phpCAS::trace('NameIdentifier found');
|
||||
$user = trim($success_elements[0]->get_content());
|
||||
phpCAS::trace('user = `'.$user.'`');
|
||||
$this->setUser($user);
|
||||
$this->setSessionAttributes($text_response);
|
||||
} else {
|
||||
phpCAS::trace('no <NameIdentifier> tag found in SAML payload');
|
||||
$this->authError('SA not validated',
|
||||
$validate_url,
|
||||
FALSE/*$no_response*/,
|
||||
TRUE/*$bad_response*/,
|
||||
$text_response);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// at this step, ST has been validated and $this->_user has been set,
|
||||
phpCAS::traceEnd(TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method will parse the DOM and pull out the attributes from the SAML
|
||||
* payload and put them into an array, then put the array into the session.
|
||||
*
|
||||
* @param $text_response the SAML payload.
|
||||
* @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
function setSessionAttributes($text_response)
|
||||
{
|
||||
phpCAS::traceBegin();
|
||||
|
||||
$result = FALSE;
|
||||
|
||||
if (isset($_SESSION[SAML_ATTRIBUTES])) {
|
||||
phpCAS::trace("session attrs already set."); //testbml - do we care?
|
||||
}
|
||||
|
||||
$attr_array = array();
|
||||
|
||||
if (($dom = domxml_open_mem($text_response))) {
|
||||
$xPath = $dom->xpath_new_context();
|
||||
$xPath->xpath_register_ns('samlp', 'urn:oasis:names:tc:SAML:1.0:protocol');
|
||||
$xPath->xpath_register_ns('saml', 'urn:oasis:names:tc:SAML:1.0:assertion');
|
||||
$nodelist = $xPath->xpath_eval("//saml:Attribute");
|
||||
$attrs = $nodelist->nodeset;
|
||||
phpCAS::trace($text_response);
|
||||
foreach($attrs as $attr){
|
||||
$xres = $xPath->xpath_eval("saml:AttributeValue", $attr);
|
||||
$name = $attr->get_attribute("AttributeName");
|
||||
$value_array = array();
|
||||
foreach($xres->nodeset as $node){
|
||||
$value_array[] = $node->get_content();
|
||||
|
||||
}
|
||||
phpCAS::trace("* " . $name . "=" . $value_array);
|
||||
$attr_array[$name] = $value_array;
|
||||
}
|
||||
$_SESSION[SAML_ATTRIBUTES] = $attr_array;
|
||||
// UGent addition...
|
||||
foreach($attr_array as $attr_key => $attr_value) {
|
||||
if(count($attr_value) > 1) {
|
||||
$this->_attributes[$attr_key] = $attr_value;
|
||||
}
|
||||
else {
|
||||
$this->_attributes[$attr_key] = $attr_value[0];
|
||||
}
|
||||
}
|
||||
$result = TRUE;
|
||||
}
|
||||
phpCAS::traceEnd($result);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
@ -1495,6 +1795,7 @@ class CASClient
|
||||
$this->storePGT($pgt,$pgt_iou);
|
||||
$this->printHTMLFooter();
|
||||
phpCAS::traceExit();
|
||||
exit();
|
||||
}
|
||||
|
||||
/** @} */
|
||||
@ -1585,7 +1886,7 @@ class CASClient
|
||||
}
|
||||
|
||||
// create the storage object
|
||||
$this->_pgt_storage = &new PGTStorageFile($this,$format,$path);
|
||||
$this->_pgt_storage = new PGTStorageFile($this,$format,$path);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1622,7 +1923,7 @@ class CASClient
|
||||
trigger_error('PGT storage into database is an experimental feature, use at your own risk',E_USER_WARNING);
|
||||
|
||||
// create the storage object
|
||||
$this->_pgt_storage = & new PGTStorageDB($this,$user,$password,$database_type,$hostname,$port,$database,$table);
|
||||
$this->_pgt_storage = new PGTStorageDB($this,$user,$password,$database_type,$hostname,$port,$database,$table);
|
||||
}
|
||||
|
||||
// ########################################################################
|
||||
@ -1643,7 +1944,8 @@ class CASClient
|
||||
*/
|
||||
function validatePGT(&$validate_url,$text_response,$tree_response)
|
||||
{
|
||||
phpCAS::traceBegin();
|
||||
// here cannot use phpCAS::traceBegin(); alongside domxml-php4-to-php5.php
|
||||
phpCAS::log('start validatePGT()');
|
||||
if ( sizeof($arr = $tree_response->get_elements_by_tagname("proxyGrantingTicket")) == 0) {
|
||||
phpCAS::trace('<proxyGrantingTicket> not found');
|
||||
// authentication succeded, but no PGT Iou was transmitted
|
||||
@ -1666,7 +1968,8 @@ class CASClient
|
||||
}
|
||||
$this->setPGT($pgt);
|
||||
}
|
||||
phpCAS::traceEnd(TRUE);
|
||||
// here, cannot use phpCAS::traceEnd(TRUE); alongside domxml-php4-to-php5.php
|
||||
phpCAS::log('end validatePGT()');
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -1819,7 +2122,15 @@ class CASClient
|
||||
if ($this->_cas_server_cert == '' && $this->_cas_server_ca_cert == '' && !$this->_no_cas_server_validation) {
|
||||
phpCAS::error('one of the methods phpCAS::setCasServerCert(), phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.');
|
||||
}
|
||||
if ($this->_cas_server_cert != '' ) {
|
||||
if ($this->_cas_server_cert != '' && $this->_cas_server_ca_cert != '') {
|
||||
// This branch added by IDMS. Seems phpCAS implementor got a bit confused about the curl options CURLOPT_SSLCERT and CURLOPT_CAINFO
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
|
||||
curl_setopt($ch, CURLOPT_SSLCERT, $this->_cas_server_cert);
|
||||
curl_setopt($ch, CURLOPT_CAINFO, $this->_cas_server_ca_cert);
|
||||
curl_setopt($ch, CURLOPT_VERBOSE, '1');
|
||||
phpCAS::trace('CURL: Set all required opts for mutual authentication ------');
|
||||
} else if ($this->_cas_server_cert != '' ) {
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
|
||||
curl_setopt($ch, CURLOPT_SSLCERT, $this->_cas_server_cert);
|
||||
} else if ($this->_cas_server_ca_cert != '') {
|
||||
@ -1839,11 +2150,28 @@ class CASClient
|
||||
if ( is_array($cookies) ) {
|
||||
curl_setopt($ch,CURLOPT_COOKIE,implode(';',$cookies));
|
||||
}
|
||||
// add extra stuff if SAML
|
||||
if ($this->hasSA()) {
|
||||
$more_headers = array ("soapaction: http://www.oasis-open.org/committees/security",
|
||||
"cache-control: no-cache",
|
||||
"pragma: no-cache",
|
||||
"accept: text/xml",
|
||||
"connection: keep-alive",
|
||||
"content-type: text/xml");
|
||||
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $more_headers);
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
$data = $this->buildSAMLPayload();
|
||||
//phpCAS::trace('SAML Payload: '.print_r($data, TRUE));
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
|
||||
}
|
||||
// perform the query
|
||||
$buf = curl_exec ($ch);
|
||||
//phpCAS::trace('CURL: Call completed. Response body is: \''.$buf.'\'');
|
||||
if ( $buf === FALSE ) {
|
||||
phpCAS::trace('curl_exec() failed');
|
||||
$err_msg = 'CURL error #'.curl_errno($ch).': '.curl_error($ch);
|
||||
//phpCAS::trace('curl error: '.$err_msg);
|
||||
// close the CURL session
|
||||
curl_close ($ch);
|
||||
$res = FALSE;
|
||||
@ -1859,6 +2187,27 @@ class CASClient
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to build the SAML POST body sent to /samlValidate URL.
|
||||
*
|
||||
* @return the SOAP-encased SAMLP artifact (the ticket).
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
function buildSAMLPayload()
|
||||
{
|
||||
phpCAS::traceBegin();
|
||||
|
||||
//get the ticket
|
||||
$sa = $this->getSA();
|
||||
//phpCAS::trace("SA: ".$sa);
|
||||
|
||||
$body=SAML_SOAP_ENV.SAML_SOAP_BODY.SAMLP_REQUEST.SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE.SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
|
||||
|
||||
phpCAS::traceEnd($body);
|
||||
return ($body);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is the callback used by readURL method to request HTTP headers.
|
||||
*/
|
||||
@ -1951,6 +2300,7 @@ class CASClient
|
||||
*
|
||||
* @param $url a string giving the URL of the service, including the mailing box
|
||||
* for IMAP URLs, as accepted by imap_open().
|
||||
* @param $service a string giving for CAS retrieve Proxy ticket
|
||||
* @param $flags options given to imap_open().
|
||||
* @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
|
||||
* success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
|
||||
@ -1964,11 +2314,11 @@ class CASClient
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
function serviceMail($url,$flags,&$err_code,&$err_msg,&$pt)
|
||||
function serviceMail($url,$service,$flags,&$err_code,&$err_msg,&$pt)
|
||||
{
|
||||
phpCAS::traceBegin();
|
||||
// at first retrieve a PT
|
||||
$pt = $this->retrievePT($target_service,$err_code,$output);
|
||||
$pt = $this->retrievePT($service,$err_code,$output);
|
||||
|
||||
$stream = FALSE;
|
||||
|
||||
@ -2049,6 +2399,29 @@ class CASClient
|
||||
*/
|
||||
function hasPT()
|
||||
{ return !empty($this->_pt); }
|
||||
/**
|
||||
* This method returns the SAML Ticket provided in the URL of the request.
|
||||
* @return The SAML ticket.
|
||||
* @private
|
||||
*/
|
||||
function getSA()
|
||||
{ return 'ST'.substr($this->_sa, 2); }
|
||||
|
||||
/**
|
||||
* This method stores the SAML Ticket.
|
||||
* @param $sa The SAML Ticket.
|
||||
* @private
|
||||
*/
|
||||
function setSA($sa)
|
||||
{ $this->_sa = $sa; }
|
||||
|
||||
/**
|
||||
* This method tells if a SAML Ticket was stored.
|
||||
* @return TRUE if a SAML Ticket has been stored.
|
||||
* @private
|
||||
*/
|
||||
function hasSA()
|
||||
{ return !empty($this->_sa); }
|
||||
|
||||
/** @} */
|
||||
// ########################################################################
|
||||
@ -2213,8 +2586,13 @@ class CASClient
|
||||
}
|
||||
}
|
||||
|
||||
$final_uri .= strtok($_SERVER['REQUEST_URI'],"?");
|
||||
$cgi_params = '?'.strtok("?");
|
||||
$php_is_for_sissies = split("\?", $_SERVER['REQUEST_URI'], 2);
|
||||
$final_uri .= $php_is_for_sissies[0];
|
||||
if(sizeof($php_is_for_sissies) > 1){
|
||||
$cgi_params = '?' . $php_is_for_sissies[1];
|
||||
} else {
|
||||
$cgi_params = '?';
|
||||
}
|
||||
// remove the ticket if present in the CGI parameters
|
||||
$cgi_params = preg_replace('/&ticket=[^&]*/','',$cgi_params);
|
||||
$cgi_params = preg_replace('/\?ticket=[^&;]*/','?',$cgi_params);
|
||||
|
@ -1,277 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @file domxml-php4-php5.php
|
||||
* Require PHP5, uses built-in DOM extension.
|
||||
* To be used in PHP4 scripts using DOMXML extension.
|
||||
* Allows PHP4/DOMXML scripts to run on PHP5/DOM.
|
||||
* (Requires PHP5/XSL extension for domxml_xslt functions)
|
||||
*
|
||||
* Typical use:
|
||||
* <pre>
|
||||
* {
|
||||
* if (version_compare(PHP_VERSION,'5','>='))
|
||||
* require_once('domxml-php4-to-php5.php');
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* Version 1.5.5, 2005-01-18, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
|
||||
*
|
||||
* ------------------------------------------------------------------<br>
|
||||
* Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/
|
||||
*
|
||||
* Copyright 2004, Licence: Creative Commons "Attribution-ShareAlike 2.0 France" BY-SA (FR),
|
||||
* http://creativecommons.org/licenses/by-sa/2.0/fr/
|
||||
* http://alexandre.alapetite.net/divers/apropos/#by-sa
|
||||
* - Attribution. You must give the original author credit
|
||||
* - Share Alike. If you alter, transform, or build upon this work,
|
||||
* you may distribute the resulting work only under a license identical to this one
|
||||
* - The French law is authoritative
|
||||
* - Any of these conditions can be waived if you get permission from Alexandre Alapetite
|
||||
* - Please send to Alexandre Alapetite the modifications you make,
|
||||
* in order to improve this file for the benefit of everybody
|
||||
*
|
||||
* If you want to distribute this code, please do it as a link to:
|
||||
* http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
|
||||
*/
|
||||
|
||||
function domxml_new_doc($version) {return new php4DOMDocument('');}
|
||||
function domxml_open_file($filename) {return new php4DOMDocument($filename);}
|
||||
function domxml_open_mem($str)
|
||||
{
|
||||
$dom=new php4DOMDocument('');
|
||||
$dom->myDOMNode->loadXML($str);
|
||||
return $dom;
|
||||
}
|
||||
function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->query($eval_str,$contextnode);}
|
||||
function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);}
|
||||
|
||||
class php4DOMAttr extends php4DOMNode
|
||||
{
|
||||
function php4DOMAttr($aDOMAttr) {$this->myDOMNode=$aDOMAttr;}
|
||||
function Name() {return $this->myDOMNode->name;}
|
||||
function Specified() {return $this->myDOMNode->specified;}
|
||||
function Value() {return $this->myDOMNode->value;}
|
||||
}
|
||||
|
||||
class php4DOMDocument extends php4DOMNode
|
||||
{
|
||||
function php4DOMDocument($filename='')
|
||||
{
|
||||
$this->myDOMNode=new DOMDocument();
|
||||
if ($filename!='') $this->myDOMNode->load($filename);
|
||||
}
|
||||
function create_attribute($name,$value)
|
||||
{
|
||||
$myAttr=$this->myDOMNode->createAttribute($name);
|
||||
$myAttr->value=$value;
|
||||
return new php4DOMAttr($myAttr,$this);
|
||||
}
|
||||
function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);}
|
||||
function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);}
|
||||
function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);}
|
||||
function create_text_node($content) {return new php4DOMNode($this->myDOMNode->createTextNode($content),$this);}
|
||||
function document_element() {return new php4DOMElement($this->myDOMNode->documentElement,$this);}
|
||||
function dump_file($filename,$compressionmode=false,$format=false) {return $this->myDOMNode->save($filename);}
|
||||
function dump_mem($format=false,$encoding=false) {return $this->myDOMNode->saveXML();}
|
||||
function get_element_by_id($id) {return new php4DOMElement($this->myDOMNode->getElementById($id),$this);}
|
||||
function get_elements_by_tagname($name)
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i))
|
||||
{
|
||||
$nodeSet[]=new php4DOMElement($node,$this);
|
||||
$i++;
|
||||
}
|
||||
return $nodeSet;
|
||||
}
|
||||
function html_dump_mem() {return $this->myDOMNode->saveHTML();}
|
||||
function root() {return new php4DOMElement($this->myDOMNode->documentElement,$this);}
|
||||
}
|
||||
|
||||
class php4DOMElement extends php4DOMNode
|
||||
{
|
||||
function get_attribute($name) {return $this->myDOMNode->getAttribute($name);}
|
||||
function get_elements_by_tagname($name)
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i))
|
||||
{
|
||||
$nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
|
||||
$i++;
|
||||
}
|
||||
return $nodeSet;
|
||||
}
|
||||
function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);}
|
||||
function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);}
|
||||
function set_attribute($name,$value) {return $this->myDOMNode->setAttribute($name,$value);}
|
||||
function tagname() {return $this->myDOMNode->tagName;}
|
||||
}
|
||||
|
||||
class php4DOMNode
|
||||
{
|
||||
var $myDOMNode;
|
||||
var $myOwnerDocument;
|
||||
function php4DOMNode($aDomNode,$aOwnerDocument)
|
||||
{
|
||||
$this->myDOMNode=$aDomNode;
|
||||
$this->myOwnerDocument=$aOwnerDocument;
|
||||
}
|
||||
function __get($name)
|
||||
{
|
||||
if ($name=='type') return $this->myDOMNode->nodeType;
|
||||
elseif ($name=='tagname') return $this->myDOMNode->tagName;
|
||||
elseif ($name=='content') return $this->myDOMNode->textContent;
|
||||
else
|
||||
{
|
||||
$myErrors=debug_backtrace();
|
||||
trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function append_child($newnode) {return new php4DOMElement($this->myDOMNode->appendChild($newnode->myDOMNode),$this->myOwnerDocument);}
|
||||
function append_sibling($newnode) {return new php4DOMElement($this->myDOMNode->parentNode->appendChild($newnode->myDOMNode),$this->myOwnerDocument);}
|
||||
function attributes()
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->attributes;
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i))
|
||||
{
|
||||
$nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument);
|
||||
$i++;
|
||||
}
|
||||
return $nodeSet;
|
||||
}
|
||||
function child_nodes()
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->childNodes;
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i))
|
||||
{
|
||||
$nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
|
||||
$i++;
|
||||
}
|
||||
return $nodeSet;
|
||||
}
|
||||
function children() {return $this->child_nodes();}
|
||||
function clone_node($deep=false) {return new php4DOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);}
|
||||
function first_child() {return new php4DOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);}
|
||||
function get_content() {return $this->myDOMNode->textContent;}
|
||||
function has_attributes() {return $this->myDOMNode->hasAttributes();}
|
||||
function has_child_nodes() {return $this->myDOMNode->hasChildNodes();}
|
||||
function insert_before($newnode,$refnode) {return new php4DOMElement($this->myDOMNode->insertBefore($newnode->myDOMNode,$refnode->myDOMNode),$this->myOwnerDocument);}
|
||||
function is_blank_node()
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->childNodes;
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i))
|
||||
{
|
||||
if (($node->nodeType==XML_ELEMENT_NODE)||
|
||||
(($node->nodeType==XML_TEXT_NODE)&&!ereg('^([[:cntrl:]]|[[:space:]])*$',$node->nodeValue)))
|
||||
return false;
|
||||
$i++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function last_child() {return new php4DOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);}
|
||||
function new_child($name,$content)
|
||||
{
|
||||
$mySubNode=$this->myDOMNode->ownerDocument->createElement($name);
|
||||
$mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode($content));
|
||||
$this->myDOMNode->appendChild($mySubNode);
|
||||
return new php4DOMElement($mySubNode,$this->myOwnerDocument);
|
||||
}
|
||||
function next_sibling() {return new php4DOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);}
|
||||
function node_name() {return $this->myDOMNode->localName;}
|
||||
function node_type() {return $this->myDOMNode->nodeType;}
|
||||
function node_value() {return $this->myDOMNode->nodeValue;}
|
||||
function owner_document() {return $this->myOwnerDocument;}
|
||||
function parent_node() {return new php4DOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);}
|
||||
function prefix() {return $this->myDOMNode->prefix;}
|
||||
function previous_sibling() {return new php4DOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);}
|
||||
function remove_child($oldchild) {return new php4DOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);}
|
||||
function replace_child($oldnode,$newnode) {return new php4DOMElement($this->myDOMNode->replaceChild($oldnode->myDOMNode,$newnode->myDOMNode),$this->myOwnerDocument);}
|
||||
function set_content($text)
|
||||
{
|
||||
if (($this->myDOMNode->hasChildNodes())&&($this->myDOMNode->firstChild->nodeType==XML_TEXT_NODE))
|
||||
$this->myDOMNode->removeChild($this->myDOMNode->firstChild);
|
||||
return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode($text));
|
||||
}
|
||||
}
|
||||
|
||||
class php4DOMNodelist
|
||||
{
|
||||
var $myDOMNodelist;
|
||||
var $nodeset;
|
||||
function php4DOMNodelist($aDOMNodelist,$aOwnerDocument)
|
||||
{
|
||||
$this->myDOMNodelist=$aDOMNodelist;
|
||||
$this->nodeset=array();
|
||||
$i=0;
|
||||
if (isset($this->myDOMNodelist))
|
||||
while ($node=$this->myDOMNodelist->item($i))
|
||||
{
|
||||
$this->nodeset[]=new php4DOMElement($node,$aOwnerDocument);
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class php4DOMXPath
|
||||
{
|
||||
var $myDOMXPath;
|
||||
var $myOwnerDocument;
|
||||
function php4DOMXPath($dom_document)
|
||||
{
|
||||
$this->myOwnerDocument=$dom_document;
|
||||
$this->myDOMXPath=new DOMXPath($dom_document->myDOMNode);
|
||||
}
|
||||
function query($eval_str,$contextnode)
|
||||
{
|
||||
if (isset($contextnode)) return new php4DOMNodelist($this->myDOMXPath->query($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument);
|
||||
else return new php4DOMNodelist($this->myDOMXPath->query($eval_str),$this->myOwnerDocument);
|
||||
}
|
||||
function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
|
||||
}
|
||||
|
||||
if (extension_loaded('xsl'))
|
||||
{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
|
||||
function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));}
|
||||
function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);}
|
||||
function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));}
|
||||
class php4DomXsltStylesheet
|
||||
{
|
||||
var $myxsltProcessor;
|
||||
function php4DomXsltStylesheet($dom_document)
|
||||
{
|
||||
$this->myxsltProcessor=new xsltProcessor();
|
||||
$this->myxsltProcessor->importStyleSheet($dom_document);
|
||||
}
|
||||
function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false)
|
||||
{
|
||||
foreach ($xslt_parameters as $param=>$value)
|
||||
$this->myxsltProcessor->setParameter('',$param,$value);
|
||||
$myphp4DOMDocument=new php4DOMDocument();
|
||||
$myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode);
|
||||
return $myphp4DOMDocument;
|
||||
}
|
||||
function result_dump_file($dom_document,$filename)
|
||||
{
|
||||
$html=$dom_document->myDOMNode->saveHTML();
|
||||
file_put_contents($filename,$html);
|
||||
return $html;
|
||||
}
|
||||
function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();}
|
||||
}
|
||||
}
|
||||
?>
|
499
plugins/CasAuthentication/extlib/CAS/domxml-php4-to-php5.php
Normal file
499
plugins/CasAuthentication/extlib/CAS/domxml-php4-to-php5.php
Normal file
@ -0,0 +1,499 @@
|
||||
<?php
|
||||
/*
|
||||
Requires PHP5, uses built-in DOM extension.
|
||||
To be used in PHP4 scripts using DOMXML extension: allows PHP4/DOMXML scripts to run on PHP5/DOM.
|
||||
(Optional: requires PHP5/XSL extension for domxml_xslt functions, PHP>=5.1 for XPath evaluation functions, and PHP>=5.1/libxml for DOMXML error reports)
|
||||
|
||||
Typical use:
|
||||
{
|
||||
if (PHP_VERSION>='5')
|
||||
require_once('domxml-php4-to-php5.php');
|
||||
}
|
||||
|
||||
Version 1.21, 2008-12-05, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
|
||||
|
||||
------------------------------------------------------------------
|
||||
Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/
|
||||
|
||||
Copyright 2004-2008, GNU Lesser General Public License,
|
||||
http://www.gnu.org/licenses/lgpl.html
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/lgpl.html>
|
||||
|
||||
== Rights and obligations ==
|
||||
- Attribution: You must give the original author credit.
|
||||
- Share Alike: If you alter or transform this library,
|
||||
you may distribute the resulting library only under the same license GNU/LGPL.
|
||||
- In case of jurisdiction dispute, the French law is authoritative.
|
||||
- Any of these conditions can be waived if you get permission from Alexandre Alapetite.
|
||||
- Not required, but please send to Alexandre Alapetite the modifications you make,
|
||||
in order to improve this file for the benefit of everybody.
|
||||
|
||||
If you want to distribute this code, please do it as a link to:
|
||||
http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
|
||||
*/
|
||||
|
||||
define('DOMXML_LOAD_PARSING',0);
|
||||
define('DOMXML_LOAD_VALIDATING',1);
|
||||
define('DOMXML_LOAD_RECOVERING',2);
|
||||
define('DOMXML_LOAD_SUBSTITUTE_ENTITIES',4);
|
||||
//define('DOMXML_LOAD_COMPLETE_ATTRS',8);
|
||||
define('DOMXML_LOAD_DONT_KEEP_BLANKS',16);
|
||||
|
||||
function domxml_new_doc($version) {return new php4DOMDocument();}
|
||||
function domxml_new_xmldoc($version) {return new php4DOMDocument();}
|
||||
function domxml_open_file($filename,$mode=DOMXML_LOAD_PARSING,&$error=null)
|
||||
{
|
||||
$dom=new php4DOMDocument($mode);
|
||||
$errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION');
|
||||
if ($errorMode) libxml_use_internal_errors(true);
|
||||
if (!$dom->myDOMNode->load($filename)) $dom=null;
|
||||
if ($errorMode)
|
||||
{
|
||||
$error=array_map('_error_report',libxml_get_errors());
|
||||
libxml_clear_errors();
|
||||
}
|
||||
return $dom;
|
||||
}
|
||||
function domxml_open_mem($str,$mode=DOMXML_LOAD_PARSING,&$error=null)
|
||||
{
|
||||
$dom=new php4DOMDocument($mode);
|
||||
$errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION');
|
||||
if ($errorMode) libxml_use_internal_errors(true);
|
||||
if (!$dom->myDOMNode->loadXML($str)) $dom=null;
|
||||
if ($errorMode)
|
||||
{
|
||||
$error=array_map('_error_report',libxml_get_errors());
|
||||
libxml_clear_errors();
|
||||
}
|
||||
return $dom;
|
||||
}
|
||||
function html_doc($html_doc,$from_file=false)
|
||||
{
|
||||
$dom=new php4DOMDocument();
|
||||
if ($from_file) $result=$dom->myDOMNode->loadHTMLFile($html_doc);
|
||||
else $result=$dom->myDOMNode->loadHTML($html_doc);
|
||||
return $result ? $dom : null;
|
||||
}
|
||||
function html_doc_file($filename) {return html_doc($filename,true);}
|
||||
function xmldoc($str) {return domxml_open_mem($str);}
|
||||
function xmldocfile($filename) {return domxml_open_file($filename);}
|
||||
function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->xpath_eval($eval_str,$contextnode);}
|
||||
function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);}
|
||||
function xpath_register_ns($xpath_context,$prefix,$namespaceURI) {return $xpath_context->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
|
||||
function _entityDecode($text) {return html_entity_decode(strtr($text,array('''=>'\'')),ENT_QUOTES,'UTF-8');}
|
||||
function _error_report($error) {return array('errormessage'=>$error->message,'nodename'=>'','line'=>$error->line,'col'=>$error->column)+($error->file==''?array():array('directory'=>dirname($error->file),'file'=>basename($error->file)));}
|
||||
|
||||
class php4DOMAttr extends php4DOMNode
|
||||
{
|
||||
function __get($name)
|
||||
{
|
||||
if ($name==='name') return $this->myDOMNode->name;
|
||||
else return parent::__get($name);
|
||||
}
|
||||
function name() {return $this->myDOMNode->name;}
|
||||
function set_content($text) {}
|
||||
//function set_value($content) {return $this->myDOMNode->value=htmlspecialchars($content,ENT_QUOTES);}
|
||||
function specified() {return $this->myDOMNode->specified;}
|
||||
function value() {return $this->myDOMNode->value;}
|
||||
}
|
||||
|
||||
class php4DOMDocument extends php4DOMNode
|
||||
{
|
||||
function php4DOMDocument($mode=DOMXML_LOAD_PARSING)
|
||||
{
|
||||
$this->myDOMNode=new DOMDocument();
|
||||
$this->myOwnerDocument=$this;
|
||||
if ($mode & DOMXML_LOAD_VALIDATING) $this->myDOMNode->validateOnParse=true;
|
||||
if ($mode & DOMXML_LOAD_RECOVERING) $this->myDOMNode->recover=true;
|
||||
if ($mode & DOMXML_LOAD_SUBSTITUTE_ENTITIES) $this->myDOMNode->substituteEntities=true;
|
||||
if ($mode & DOMXML_LOAD_DONT_KEEP_BLANKS) $this->myDOMNode->preserveWhiteSpace=false;
|
||||
}
|
||||
function add_root($name)
|
||||
{
|
||||
if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
|
||||
return new php4DOMElement($this->myDOMNode->appendChild($this->myDOMNode->createElement($name)),$this->myOwnerDocument);
|
||||
}
|
||||
function create_attribute($name,$value)
|
||||
{
|
||||
$myAttr=$this->myDOMNode->createAttribute($name);
|
||||
$myAttr->value=htmlspecialchars($value,ENT_QUOTES);
|
||||
return new php4DOMAttr($myAttr,$this);
|
||||
}
|
||||
function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);}
|
||||
function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);}
|
||||
function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);}
|
||||
function create_element_ns($uri,$name,$prefix=null)
|
||||
{
|
||||
if ($prefix==null) $prefix=$this->myDOMNode->lookupPrefix($uri);
|
||||
if (($prefix==null)&&(($this->myDOMNode->documentElement==null)||(!$this->myDOMNode->documentElement->isDefaultNamespace($uri)))) $prefix='a'.sprintf('%u',crc32($uri));
|
||||
return new php4DOMElement($this->myDOMNode->createElementNS($uri,$prefix==null ? $name : $prefix.':'.$name),$this);
|
||||
}
|
||||
function create_entity_reference($content) {return new php4DOMNode($this->myDOMNode->createEntityReference($content),$this);} //By Walter Ebert 2007-01-22
|
||||
function create_processing_instruction($target,$data=''){return new php4DomProcessingInstruction($this->myDOMNode->createProcessingInstruction($target,$data),$this);}
|
||||
function create_text_node($content) {return new php4DOMText($this->myDOMNode->createTextNode($content),$this);}
|
||||
function document_element() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);}
|
||||
function dump_file($filename,$compressionmode=false,$format=false)
|
||||
{
|
||||
$format0=$this->myDOMNode->formatOutput;
|
||||
$this->myDOMNode->formatOutput=$format;
|
||||
$res=$this->myDOMNode->save($filename);
|
||||
$this->myDOMNode->formatOutput=$format0;
|
||||
return $res;
|
||||
}
|
||||
function dump_mem($format=false,$encoding=false)
|
||||
{
|
||||
$format0=$this->myDOMNode->formatOutput;
|
||||
$this->myDOMNode->formatOutput=$format;
|
||||
$encoding0=$this->myDOMNode->encoding;
|
||||
if ($encoding) $this->myDOMNode->encoding=$encoding;
|
||||
$dump=$this->myDOMNode->saveXML();
|
||||
$this->myDOMNode->formatOutput=$format0;
|
||||
if ($encoding) $this->myDOMNode->encoding= $encoding0=='' ? 'UTF-8' : $encoding0; //UTF-8 is XML default encoding
|
||||
return $dump;
|
||||
}
|
||||
function free()
|
||||
{
|
||||
if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
|
||||
$this->myDOMNode=null;
|
||||
$this->myOwnerDocument=null;
|
||||
}
|
||||
function get_element_by_id($id) {return parent::_newDOMElement($this->myDOMNode->getElementById($id),$this);}
|
||||
function get_elements_by_tagname($name)
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this);
|
||||
return $nodeSet;
|
||||
}
|
||||
function html_dump_mem() {return $this->myDOMNode->saveHTML();}
|
||||
function root() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);}
|
||||
function xinclude() {return $this->myDOMNode->xinclude();}
|
||||
function xpath_new_context() {return new php4DOMXPath($this);}
|
||||
}
|
||||
|
||||
class php4DOMElement extends php4DOMNode
|
||||
{
|
||||
function add_namespace($uri,$prefix)
|
||||
{
|
||||
if ($this->myDOMNode->hasAttributeNS('http://www.w3.org/2000/xmlns/',$prefix)) return false;
|
||||
else
|
||||
{
|
||||
$this->myDOMNode->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$prefix,$uri); //By Daniel Walker 2006-09-08
|
||||
return true;
|
||||
}
|
||||
}
|
||||
function get_attribute($name) {return $this->myDOMNode->getAttribute($name);}
|
||||
function get_attribute_node($name) {return parent::_newDOMElement($this->myDOMNode->getAttributeNode($name),$this->myOwnerDocument);}
|
||||
function get_elements_by_tagname($name)
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
|
||||
return $nodeSet;
|
||||
}
|
||||
function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);}
|
||||
function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);}
|
||||
function set_attribute($name,$value)
|
||||
{
|
||||
//return $this->myDOMNode->setAttribute($name,$value); //Does not return a DomAttr
|
||||
$myAttr=$this->myDOMNode->ownerDocument->createAttribute($name);
|
||||
$myAttr->value=htmlspecialchars($value,ENT_QUOTES); //Entity problem reported by AL-DesignWorks 2007-09-07
|
||||
$this->myDOMNode->setAttributeNode($myAttr);
|
||||
return new php4DOMAttr($myAttr,$this->myOwnerDocument);
|
||||
}
|
||||
/*function set_attribute_node($attr)
|
||||
{
|
||||
$this->myDOMNode->setAttributeNode($this->_importNode($attr));
|
||||
return $attr;
|
||||
}*/
|
||||
function set_name($name)
|
||||
{
|
||||
if ($this->myDOMNode->prefix=='') $newNode=$this->myDOMNode->ownerDocument->createElement($name);
|
||||
else $newNode=$this->myDOMNode->ownerDocument->createElementNS($this->myDOMNode->namespaceURI,$this->myDOMNode->prefix.':'.$name);
|
||||
$myDOMNodeList=$this->myDOMNode->attributes;
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i++))
|
||||
if ($node->namespaceURI=='') $newNode->setAttribute($node->name,$node->value);
|
||||
else $newNode->setAttributeNS($node->namespaceURI,$node->nodeName,$node->value);
|
||||
$myDOMNodeList=$this->myDOMNode->childNodes;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item(0)) $newNode->appendChild($node);
|
||||
$this->myDOMNode->parentNode->replaceChild($newNode,$this->myDOMNode);
|
||||
$this->myDOMNode=$newNode;
|
||||
return true;
|
||||
}
|
||||
function tagname() {return $this->tagname;}
|
||||
}
|
||||
|
||||
class php4DOMNode
|
||||
{
|
||||
public $myDOMNode;
|
||||
public $myOwnerDocument;
|
||||
function php4DOMNode($aDomNode,$aOwnerDocument)
|
||||
{
|
||||
$this->myDOMNode=$aDomNode;
|
||||
$this->myOwnerDocument=$aOwnerDocument;
|
||||
}
|
||||
function __get($name)
|
||||
{
|
||||
switch ($name)
|
||||
{
|
||||
case 'type': return $this->myDOMNode->nodeType;
|
||||
case 'tagname': return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->tagName; //Avoid namespace prefix for DOMElement
|
||||
case 'content': return $this->myDOMNode->textContent;
|
||||
case 'value': return $this->myDOMNode->value;
|
||||
default:
|
||||
$myErrors=debug_backtrace();
|
||||
trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function add_child($newnode) {return append_child($newnode);}
|
||||
function add_namespace($uri,$prefix) {return false;}
|
||||
function append_child($newnode) {return self::_newDOMElement($this->myDOMNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);}
|
||||
function append_sibling($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);}
|
||||
function attributes()
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->attributes;
|
||||
if (!(isset($myDOMNodeList)&&$this->myDOMNode->hasAttributes())) return null;
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument);
|
||||
return $nodeSet;
|
||||
}
|
||||
function child_nodes()
|
||||
{
|
||||
$myDOMNodeList=$this->myDOMNode->childNodes;
|
||||
$nodeSet=array();
|
||||
$i=0;
|
||||
if (isset($myDOMNodeList))
|
||||
while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=self::_newDOMElement($node,$this->myOwnerDocument);
|
||||
return $nodeSet;
|
||||
}
|
||||
function children() {return $this->child_nodes();}
|
||||
function clone_node($deep=false) {return self::_newDOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);}
|
||||
//dump_node($node) should only be called on php4DOMDocument
|
||||
function dump_node($node=null) {return $node==null ? $this->myOwnerDocument->myDOMNode->saveXML($this->myDOMNode) : $this->myOwnerDocument->myDOMNode->saveXML($node->myDOMNode);}
|
||||
function first_child() {return self::_newDOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);}
|
||||
function get_content() {return $this->myDOMNode->textContent;}
|
||||
function has_attributes() {return $this->myDOMNode->hasAttributes();}
|
||||
function has_child_nodes() {return $this->myDOMNode->hasChildNodes();}
|
||||
function insert_before($newnode,$refnode) {return self::_newDOMElement($this->myDOMNode->insertBefore($this->_importNode($newnode),$refnode==null?null:$refnode->myDOMNode),$this->myOwnerDocument);}
|
||||
function is_blank_node() {return ($this->myDOMNode->nodeType===XML_TEXT_NODE)&&preg_match('%^\s*$%',$this->myDOMNode->nodeValue);}
|
||||
function last_child() {return self::_newDOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);}
|
||||
function new_child($name,$content)
|
||||
{
|
||||
$mySubNode=$this->myDOMNode->ownerDocument->createElement($name);
|
||||
$mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($content)));
|
||||
$this->myDOMNode->appendChild($mySubNode);
|
||||
return new php4DOMElement($mySubNode,$this->myOwnerDocument);
|
||||
}
|
||||
function next_sibling() {return self::_newDOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);}
|
||||
function node_name() {return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->nodeName;} //Avoid namespace prefix for DOMElement
|
||||
function node_type() {return $this->myDOMNode->nodeType;}
|
||||
function node_value() {return $this->myDOMNode->nodeValue;}
|
||||
function owner_document() {return $this->myOwnerDocument;}
|
||||
function parent_node() {return self::_newDOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);}
|
||||
function prefix() {return $this->myDOMNode->prefix;}
|
||||
function previous_sibling() {return self::_newDOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);}
|
||||
function remove_child($oldchild) {return self::_newDOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);}
|
||||
function replace_child($newnode,$oldnode) {return self::_newDOMElement($this->myDOMNode->replaceChild($this->_importNode($newnode),$oldnode->myDOMNode),$this->myOwnerDocument);}
|
||||
function replace_node($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->replaceChild($this->_importNode($newnode),$this->myDOMNode),$this->myOwnerDocument);}
|
||||
function set_content($text) {return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($text)));} //Entity problem reported by AL-DesignWorks 2007-09-07
|
||||
//function set_name($name) {return $this->myOwnerDocument->renameNode($this->myDOMNode,$this->myDOMNode->namespaceURI,$name);}
|
||||
function set_namespace($uri,$prefix=null)
|
||||
{//Contributions by Daniel Walker 2006-09-08
|
||||
$nsprefix=$this->myDOMNode->lookupPrefix($uri);
|
||||
if ($nsprefix==null)
|
||||
{
|
||||
$nsprefix= $prefix==null ? $nsprefix='a'.sprintf('%u',crc32($uri)) : $prefix;
|
||||
if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE)
|
||||
{
|
||||
if (($prefix!=null)&&$this->myDOMNode->ownerElement->hasAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)&&
|
||||
($this->myDOMNode->ownerElement->getAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)!=$uri))
|
||||
{//Remove namespace
|
||||
$parent=$this->myDOMNode->ownerElement;
|
||||
$parent->removeAttributeNode($this->myDOMNode);
|
||||
$parent->setAttribute($this->myDOMNode->localName,$this->myDOMNode->nodeValue);
|
||||
$this->myDOMNode=$parent->getAttributeNode($this->myDOMNode->localName);
|
||||
return;
|
||||
}
|
||||
$this->myDOMNode->ownerElement->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$nsprefix,$uri);
|
||||
}
|
||||
}
|
||||
if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE)
|
||||
{
|
||||
$parent=$this->myDOMNode->ownerElement;
|
||||
$parent->removeAttributeNode($this->myDOMNode);
|
||||
$parent->setAttributeNS($uri,$nsprefix.':'.$this->myDOMNode->localName,$this->myDOMNode->nodeValue);
|
||||
$this->myDOMNode=$parent->getAttributeNodeNS($uri,$this->myDOMNode->localName);
|
||||
}
|
||||
elseif ($this->myDOMNode->nodeType===XML_ELEMENT_NODE)
|
||||
{
|
||||
$NewNode=$this->myDOMNode->ownerDocument->createElementNS($uri,$nsprefix.':'.$this->myDOMNode->localName);
|
||||
foreach ($this->myDOMNode->attributes as $n) $NewNode->appendChild($n->cloneNode(true));
|
||||
foreach ($this->myDOMNode->childNodes as $n) $NewNode->appendChild($n->cloneNode(true));
|
||||
$xpath=new DOMXPath($this->myDOMNode->ownerDocument);
|
||||
$myDOMNodeList=$xpath->query('namespace::*[name()!="xml"]',$this->myDOMNode); //Add old namespaces
|
||||
foreach ($myDOMNodeList as $n) $NewNode->setAttributeNS('http://www.w3.org/2000/xmlns/',$n->nodeName,$n->nodeValue);
|
||||
$this->myDOMNode->parentNode->replaceChild($NewNode,$this->myDOMNode);
|
||||
$this->myDOMNode=$NewNode;
|
||||
}
|
||||
}
|
||||
function unlink_node()
|
||||
{
|
||||
if ($this->myDOMNode->parentNode!=null)
|
||||
{
|
||||
if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) $this->myDOMNode->parentNode->removeAttributeNode($this->myDOMNode);
|
||||
else $this->myDOMNode->parentNode->removeChild($this->myDOMNode);
|
||||
}
|
||||
}
|
||||
protected function _importNode($newnode) {return $this->myOwnerDocument===$newnode->myOwnerDocument ? $newnode->myDOMNode : $this->myOwnerDocument->myDOMNode->importNode($newnode->myDOMNode,true);} //To import DOMNode from another DOMDocument
|
||||
static function _newDOMElement($aDOMNode,$aOwnerDocument)
|
||||
{//Check the PHP5 DOMNode before creating a new associated PHP4 DOMNode wrapper
|
||||
if ($aDOMNode==null) return null;
|
||||
switch ($aDOMNode->nodeType)
|
||||
{
|
||||
case XML_ELEMENT_NODE: return new php4DOMElement($aDOMNode,$aOwnerDocument);
|
||||
case XML_TEXT_NODE: return new php4DOMText($aDOMNode,$aOwnerDocument);
|
||||
case XML_ATTRIBUTE_NODE: return new php4DOMAttr($aDOMNode,$aOwnerDocument);
|
||||
case XML_PI_NODE: return new php4DomProcessingInstruction($aDOMNode,$aOwnerDocument);
|
||||
default: return new php4DOMNode($aDOMNode,$aOwnerDocument);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class php4DomProcessingInstruction extends php4DOMNode
|
||||
{
|
||||
function data() {return $this->myDOMNode->data;}
|
||||
function target() {return $this->myDOMNode->target;}
|
||||
}
|
||||
|
||||
class php4DOMText extends php4DOMNode
|
||||
{
|
||||
function __get($name)
|
||||
{
|
||||
if ($name==='tagname') return '#text';
|
||||
else return parent::__get($name);
|
||||
}
|
||||
function tagname() {return '#text';}
|
||||
function set_content($text) {$this->myDOMNode->nodeValue=$text; return true;}
|
||||
}
|
||||
|
||||
if (!defined('XPATH_NODESET'))
|
||||
{
|
||||
define('XPATH_UNDEFINED',0);
|
||||
define('XPATH_NODESET',1);
|
||||
define('XPATH_BOOLEAN',2);
|
||||
define('XPATH_NUMBER',3);
|
||||
define('XPATH_STRING',4);
|
||||
/*define('XPATH_POINT',5);
|
||||
define('XPATH_RANGE',6);
|
||||
define('XPATH_LOCATIONSET',7);
|
||||
define('XPATH_USERS',8);
|
||||
define('XPATH_XSLT_TREE',9);*/
|
||||
}
|
||||
|
||||
class php4DOMNodelist
|
||||
{
|
||||
private $myDOMNodelist;
|
||||
public $nodeset;
|
||||
public $type=XPATH_UNDEFINED;
|
||||
public $value;
|
||||
function php4DOMNodelist($aDOMNodelist,$aOwnerDocument)
|
||||
{
|
||||
if (!isset($aDOMNodelist)) return;
|
||||
elseif (is_object($aDOMNodelist)||is_array($aDOMNodelist))
|
||||
{
|
||||
if ($aDOMNodelist->length>0)
|
||||
{
|
||||
$this->myDOMNodelist=$aDOMNodelist;
|
||||
$this->nodeset=array();
|
||||
$this->type=XPATH_NODESET;
|
||||
$i=0;
|
||||
while ($node=$this->myDOMNodelist->item($i++)) $this->nodeset[]=php4DOMNode::_newDOMElement($node,$aOwnerDocument);
|
||||
}
|
||||
}
|
||||
elseif (is_int($aDOMNodelist)||is_float($aDOMNodelist))
|
||||
{
|
||||
$this->type=XPATH_NUMBER;
|
||||
$this->value=$aDOMNodelist;
|
||||
}
|
||||
elseif (is_bool($aDOMNodelist))
|
||||
{
|
||||
$this->type=XPATH_BOOLEAN;
|
||||
$this->value=$aDOMNodelist;
|
||||
}
|
||||
elseif (is_string($aDOMNodelist))
|
||||
{
|
||||
$this->type=XPATH_STRING;
|
||||
$this->value=$aDOMNodelist;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class php4DOMXPath
|
||||
{
|
||||
public $myDOMXPath;
|
||||
private $myOwnerDocument;
|
||||
function php4DOMXPath($dom_document)
|
||||
{
|
||||
//TODO: If $dom_document is a DomElement, make that default $contextnode and modify XPath. Ex: '/test'
|
||||
$this->myOwnerDocument=$dom_document->myOwnerDocument;
|
||||
$this->myDOMXPath=new DOMXPath($this->myOwnerDocument->myDOMNode);
|
||||
}
|
||||
function xpath_eval($eval_str,$contextnode=null)
|
||||
{
|
||||
if (method_exists($this->myDOMXPath,'evaluate')) $xp=isset($contextnode) ? $this->myDOMXPath->evaluate($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->evaluate($eval_str);
|
||||
else $xp=isset($contextnode) ? $this->myDOMXPath->query($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->query($eval_str);
|
||||
$xp=new php4DOMNodelist($xp,$this->myOwnerDocument);
|
||||
return ($xp->type===XPATH_UNDEFINED) ? false : $xp;
|
||||
}
|
||||
function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
|
||||
}
|
||||
|
||||
if (extension_loaded('xsl'))
|
||||
{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
|
||||
function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));}
|
||||
function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);}
|
||||
function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));}
|
||||
class php4DomXsltStylesheet
|
||||
{
|
||||
private $myxsltProcessor;
|
||||
function php4DomXsltStylesheet($dom_document)
|
||||
{
|
||||
$this->myxsltProcessor=new xsltProcessor();
|
||||
$this->myxsltProcessor->importStyleSheet($dom_document);
|
||||
}
|
||||
function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false)
|
||||
{
|
||||
foreach ($xslt_parameters as $param=>$value) $this->myxsltProcessor->setParameter('',$param,$value);
|
||||
$myphp4DOMDocument=new php4DOMDocument();
|
||||
$myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode);
|
||||
return $myphp4DOMDocument;
|
||||
}
|
||||
function result_dump_file($dom_document,$filename)
|
||||
{
|
||||
$html=$dom_document->myDOMNode->saveHTML();
|
||||
file_put_contents($filename,$html);
|
||||
return $html;
|
||||
}
|
||||
function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();}
|
||||
}
|
||||
}
|
||||
?>
|
@ -11,15 +11,15 @@ $this->_strings = array(
|
||||
CAS_STR_USING_SERVER
|
||||
=> 'utilisant le serveur',
|
||||
CAS_STR_AUTHENTICATION_WANTED
|
||||
=> 'Authentication CAS nécessaire !',
|
||||
=> 'Authentication CAS n<EFBFBD>cessaire !',
|
||||
CAS_STR_LOGOUT
|
||||
=> 'Déconnexion demandée !',
|
||||
=> 'D<EFBFBD>connexion demand<6E>e !',
|
||||
CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
|
||||
=> 'Vous auriez du etre redirigé(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.',
|
||||
=> 'Vous auriez du etre redirig<EFBFBD>(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.',
|
||||
CAS_STR_AUTHENTICATION_FAILED
|
||||
=> 'Authentification CAS infructueuse !',
|
||||
CAS_STR_YOU_WERE_NOT_AUTHENTICATED
|
||||
=> '<p>Vous n\'avez pas été authentifié(e).</p><p>Vous pouvez soumettre votre requete à nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le problème persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>',
|
||||
=> '<p>Vous n\'avez pas <EFBFBD>t<EFBFBD> authentifi<66>(e).</p><p>Vous pouvez soumettre votre requete <20> nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le probl<62>me persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>',
|
||||
CAS_STR_SERVICE_UNAVAILABLE
|
||||
=> 'Le service `<b>%s</b>\' est indisponible (<b>%s</b>)'
|
||||
|
||||
|
@ -9,19 +9,19 @@
|
||||
|
||||
$this->_strings = array(
|
||||
CAS_STR_USING_SERVER
|
||||
=> 'χρησιμοποιείται ο εξυπηρετητής',
|
||||
=> '<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
CAS_STR_AUTHENTICATION_WANTED
|
||||
=> 'Απαιτείται η ταυτοποίηση CAS!',
|
||||
=> '<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CAS!',
|
||||
CAS_STR_LOGOUT
|
||||
=> 'Απαιτείται η αποσύνδεση από CAS!',
|
||||
=> '<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> CAS!',
|
||||
CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
|
||||
=> 'Θα έπρεπε να είχατε ανακατευθυνθεί στον εξυπηρετητή CAS. Κάντε κλίκ <a href="%s">εδώ</a> για να συνεχίσετε.',
|
||||
=> '<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CAS. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <a href="%s"><3E><><EFBFBD></a> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.',
|
||||
CAS_STR_AUTHENTICATION_FAILED
|
||||
=> 'Η ταυτοποίηση CAS απέτυχε!',
|
||||
=> '<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CAS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!',
|
||||
CAS_STR_YOU_WERE_NOT_AUTHENTICATED
|
||||
=> '<p>Δεν ταυτοποιηθήκατε.</p><p>Μπορείτε να ξαναπροσπαθήσετε, κάνοντας κλίκ <a href="%s">εδώ</a>.</p><p>Εαν το πρόβλημα επιμείνει, ελάτε σε επαφή με τον <a href="mailto:%s">διαχειριστή</a>.</p>',
|
||||
=> '<p><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.</p><p><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <a href="%s"><3E><><EFBFBD></a>.</p><p><3E><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <a href="mailto:%s"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></a>.</p>',
|
||||
CAS_STR_SERVICE_UNAVAILABLE
|
||||
=> 'Η υπηρεσία `<b>%s</b>\' δεν είναι διαθέσιμη (<b>%s</b>).'
|
||||
=> '<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> `<b>%s</b>\' <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<b>%s</b>).'
|
||||
);
|
||||
|
||||
?>
|
@ -11,17 +11,17 @@ $this->_strings = array(
|
||||
CAS_STR_USING_SERVER
|
||||
=> 'using server',
|
||||
CAS_STR_AUTHENTICATION_WANTED
|
||||
=> 'CASによる認証を行います',
|
||||
=> 'CAS<EFBFBD>ˤ<EFBFBD><EFBFBD>ǧ<EFBFBD>ڤ<EFBFBD>Ԥ<EFBFBD><EFBFBD>ޤ<EFBFBD>',
|
||||
CAS_STR_LOGOUT
|
||||
=> 'CASからログアウトします!',
|
||||
=> 'CAS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD><EFBFBD>Ȥ<EFBFBD><C8A4>ޤ<EFBFBD>!',
|
||||
CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
|
||||
=> 'CASサーバに行く必要があります。自動的に転送されない場合は <a href="%s">こちら</a> をクリックして続行します。',
|
||||
=> 'CAS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ф˹Ԥ<EFBFBD>ɬ<EFBFBD>פ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ưŪ<EFBFBD><EFBFBD>ž<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <a href="%s"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></a> <20><EFBFBD>å<EFBFBD><C3A5><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD>Ԥ<EFBFBD><D4A4>ޤ<EFBFBD><DEA4><EFBFBD>',
|
||||
CAS_STR_AUTHENTICATION_FAILED
|
||||
=> 'CASによる認証に失敗しました',
|
||||
=> 'CAS<EFBFBD>ˤ<EFBFBD><EFBFBD>ǧ<EFBFBD>ڤ˼<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD>',
|
||||
CAS_STR_YOU_WERE_NOT_AUTHENTICATED
|
||||
=> '<p>認証できませんでした.</p><p>もう一度リクエストを送信する場合は<a href="%s">こちら</a>をクリック.</p><p>問題が解決しない場合は <a href="mailto:%s">このサイトの管理者</a>に問い合わせてください.</p>',
|
||||
=> '<p>ǧ<EFBFBD>ڤǤ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD>Ǥ<EFBFBD><EFBFBD><EFBFBD>.</p><p><3E>⤦<EFBFBD><E2A4A6><EFBFBD>٥ꥯ<D9A5><EAA5AF><EFBFBD><EFBFBD><EFBFBD>Ȥ<EFBFBD><C8A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><a href="%s"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></a><3E><EFBFBD>å<EFBFBD>.</p><p><3E><><EFBFBD>꤬<EFBFBD><EAA4AC>褷<EFBFBD>ʤ<EFBFBD><CAA4><EFBFBD><EFBFBD><EFBFBD> <a href="mailto:%s"><3E><><EFBFBD>Υ<EFBFBD><CEA5><EFBFBD><EFBFBD>Ȥδ<C8A4><CEB4><EFBFBD><EFBFBD></a><3E><><EFBFBD>䤤<EFBFBD><E4A4A4>碌<EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.</p>',
|
||||
CAS_STR_SERVICE_UNAVAILABLE
|
||||
=> 'サービス `<b>%s</b>\' は利用できません (<b>%s</b>).'
|
||||
=> '<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӥ<EFBFBD> `<b>%s</b>\' <20><><EFBFBD><EFBFBD><EFBFBD>ѤǤ<D1A4><C7A4>ޤ<EFBFBD><DEA4><EFBFBD> (<b>%s</b>).'
|
||||
);
|
||||
|
||||
?>
|
Loading…
Reference in New Issue
Block a user