You were not authenticated.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @sa @link internalLang Internationalization @endlink
* @ingroup internalLang
*/
class CAS_Languages_French implements CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer()
{
return 'utilisant le serveur';
}
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted()
{
return 'Authentication CAS nécessaire !';
}
/**
* Get logout string
*
* @return string logout
*/
public function getLogout()
{
return 'Déconnexion demandée !';
}
/**
* Get the should have been redirected string
*
* @return string should habe been redirected
*/
public function getShouldHaveBeenRedirected()
{
return 'Vous auriez du etre redirigé(e) vers le serveur CAS. Cliquez ici pour continuer.';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return 'Authentification CAS infructueuse !';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return 'Vous n\'avez pas été authentifié(e).
Vous pouvez soumettre votre requete à nouveau en cliquant ici.
Si le problème persiste, vous pouvez contacter l\'administrateur de ce site.
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'Le service `%s\' est indisponible (%s)';
}
}
?>
phpCAS-1.6.0/source/CAS/Languages/Galego.php 0000664 0000000 0000000 00000006303 14330031177 0020360 0 ustar 00root root 0000000 0000000 aquí para continuar';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return 'Autenticación CAS errada!';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return '
Non estás autenticado
Podes volver tentalo facendo click aquí.
Se o problema persiste debería contactar con el administrador deste sitio.
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'O servizo `%s\' non está dispoñible (%s).';
}
}
?>
phpCAS-1.6.0/source/CAS/Languages/German.php 0000664 0000000 0000000 00000006306 14330031177 0020376 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* German language class
*
* @class CAS_Languages_German
* @category Authentication
* @package PhpCAS
* @author Henrik Genssen
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @sa @link internalLang Internationalization @endlink
* @ingroup internalLang
*/
class CAS_Languages_German implements CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer()
{
return 'via Server';
}
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted()
{
return 'CAS Authentifizierung erforderlich!';
}
/**
* Get logout string
*
* @return string logout
*/
public function getLogout()
{
return 'CAS Abmeldung!';
}
/**
* Get the should have been redirected string
*
* @return string should habe been redirected
*/
public function getShouldHaveBeenRedirected()
{
return 'eigentlich häten Sie zum CAS Server weitergeleitet werden sollen. Drücken Sie hier um fortzufahren.';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return 'CAS Anmeldung fehlgeschlagen!';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return 'Sie wurden nicht angemeldet.
Um es erneut zu versuchen klicken Sie hier.
Wenn das Problem bestehen bleibt, kontaktieren Sie den Administrator dieser Seite.
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'Der Dienst `%s\' ist nicht verfügbar (%s).';
}
}
?>
phpCAS-1.6.0/source/CAS/Languages/Greek.php 0000664 0000000 0000000 00000006752 14330031177 0020227 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Greek language class
*
* @class CAS_Languages_Greek
* @category Authentication
* @package PhpCAS
* @author Vangelis Haniotakis
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @sa @link internalLang Internationalization @endlink
* @ingroup internalLang
*/
class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer()
{
return 'χρησιμοποιείται ο εξυπηρετητής';
}
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted()
{
return 'Απαιτείται η ταυτοποίηση CAS!';
}
/**
* Get logout string
*
* @return string logout
*/
public function getLogout()
{
return 'Απαιτείται η αποσύνδεση από CAS!';
}
/**
* Get the should have been redirected string
*
* @return string should habe been redirected
*/
public function getShouldHaveBeenRedirected()
{
return 'Θα έπρεπε να είχατε ανακατευθυνθεί στον εξυπηρετητή CAS. Κάντε κλίκ εδώ για να συνεχίσετε.';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return 'Η ταυτοποίηση CAS απέτυχε!';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return 'Δεν ταυτοποιηθήκατε.
Μπορείτε να ξαναπροσπαθήσετε, κάνοντας κλίκ εδώ.
Εαν το πρόβλημα επιμείνει, ελάτε σε επαφή με τον διαχειριστή.
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'Η υπηρεσία `%s\' δεν είναι διαθέσιμη (%s).';
}
}
?>
phpCAS-1.6.0/source/CAS/Languages/Japanese.php 0000664 0000000 0000000 00000006425 14330031177 0020715 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Japanese language class. Now Encoding is UTF-8.
*
* @class CAS_Languages_Japanese
* @category Authentication
* @package PhpCAS
* @author fnorif
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
**/
class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer()
{
return 'サーバーを使っています。';
}
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted()
{
return 'CASによる認証を行います。';
}
/**
* Get logout string
*
* @return string logout
*/
public function getLogout()
{
return 'CASからログアウトします!';
}
/**
* Get the should have been redirected string
*
* @return string should habe been redirected
*/
public function getShouldHaveBeenRedirected()
{
return 'CASサーバに行く必要があります。自動的に転送されない場合は こちら をクリックして続行します。';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return 'CASによる認証に失敗しました。';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return '認証できませんでした。
もう一度リクエストを送信する場合はこちらをクリック。
問題が解決しない場合は このサイトの管理者に問い合わせてください。
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'サービス `%s\' は利用できません (%s)。';
}
}
?>
phpCAS-1.6.0/source/CAS/Languages/LanguageInterface.php 0000664 0000000 0000000 00000005063 14330031177 0022530 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Language Interface class for all internationalization files
*
* @class CAS_Languages_LanguageInterface
* @category Authentication
* @package PhpCAS
* @author Joachim Fritschi
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @sa @link internalLang Internationalization @endlink
* @ingroup internalLang
*/
interface CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer();
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted();
/**
* Get logout string
*
* @return string logout
*/
public function getLogout();
/**
* Get the should have been redirected string
*
* @return string should habe been redirected
*/
public function getShouldHaveBeenRedirected();
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed();
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated();
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable();
}
?>
phpCAS-1.6.0/source/CAS/Languages/Portuguese.php 0000664 0000000 0000000 00000006452 14330031177 0021331 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://apereo.atlassian.net/wiki/spaces/CASC/pages/103252517/phpCAS
*/
/**
* Portuguese language class
*
* @class CAS_Languages_Portuguese
* @category Authentication
* @package PhpCAS
* @author Sherwin Harris
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://apereo.atlassian.net/wiki/spaces/CASC/pages/103252517/phpCAS
*
* @sa @link internalLang Internationalization @endlink
* @ingroup internalLang
*/
class CAS_Languages_Portuguese implements CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer()
{
return 'Usando o servidor';
}
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted()
{
return 'A autenticação do servidor CAS desejado!';
}
/**
* Get logout string
*
* @return string logout
*/
public function getLogout()
{
return 'Saida do servidor CAS desejado!';
}
/**
* Get the should have been redirected string
*
* @return string should have been redirected
*/
public function getShouldHaveBeenRedirected()
{
return 'Você já deve ter sido redirecionado para o servidor CAS. Clique aqui para continuar';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return 'A autenticação do servidor CAS falheu!';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return 'Você não foi autenticado.
Você pode enviar sua solicitação novamente clicando aqui.
Se o problema persistir, você pode entrar em contato com o administrador deste site.
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'O serviço `%s\' não está disponível (%s).';
}
}
phpCAS-1.6.0/source/CAS/Languages/Spanish.php 0000664 0000000 0000000 00000006336 14330031177 0020575 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Spanish language class
*
* @class CAS_Languages_Spanish
* @category Authentication
* @package PhpCAS
* @author Iván-Benjamín García Torà
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @sa @link internalLang Internationalization @endlink
* @ingroup internalLang
*/
class CAS_Languages_Spanish implements CAS_Languages_LanguageInterface
{
/**
* Get the using server string
*
* @return string using server
*/
public function getUsingServer()
{
return 'usando servidor';
}
/**
* Get authentication wanted string
*
* @return string authentication wanted
*/
public function getAuthenticationWanted()
{
return '¡Autentificación CAS necesaria!';
}
/**
* Get logout string
*
* @return string logout
*/
public function getLogout()
{
return '¡Salida CAS necesaria!';
}
/**
* Get the should have been redirected string
*
* @return string should habe been redirected
*/
public function getShouldHaveBeenRedirected()
{
return 'Ya debería haber sido redireccionado al servidor CAS. Haga click aquí para continuar.';
}
/**
* Get authentication failed string
*
* @return string authentication failed
*/
public function getAuthenticationFailed()
{
return '¡Autentificación CAS fallida!';
}
/**
* Get the your were not authenticated string
*
* @return string not authenticated
*/
public function getYouWereNotAuthenticated()
{
return 'No estás autentificado.
Puedes volver a intentarlo haciendo click aquí.
Si el problema persiste debería contactar con el administrador de este sitio.
';
}
/**
* Get the service unavailable string
*
* @return string service unavailable
*/
public function getServiceUnavailable()
{
return 'El servicio `%s\' no está disponible (%s).';
}
}
?>
phpCAS-1.6.0/source/CAS/OutOfSequenceBeforeAuthenticationCallException.php 0000664 0000000 0000000 00000003605 14330031177 0026501 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class defines Exceptions that should be thrown when the sequence of
* operations is invalid. In this case it should be thrown when an
* authentication call has not yet happened.
*
* @class CAS_OutOfSequenceBeforeAuthenticationCallException
* @category Authentication
* @package PhpCAS
* @author Joachim Fritschi
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_OutOfSequenceBeforeAuthenticationCallException
extends CAS_OutOfSequenceException
implements CAS_Exception
{
/**
* Return standard error meessage
*
* @return void
*/
public function __construct ()
{
parent::__construct('An authentication call hasn\'t happened yet.');
}
}
phpCAS-1.6.0/source/CAS/OutOfSequenceBeforeClientException.php 0000664 0000000 0000000 00000003675 14330031177 0024153 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class defines Exceptions that should be thrown when the sequence of
* operations is invalid. In this case it should be thrown when the client() or
* proxy() call has not yet happened and no client or proxy object exists.
*
* @class CAS_OutOfSequenceBeforeClientException
* @category Authentication
* @package PhpCAS
* @author Joachim Fritschi
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_OutOfSequenceBeforeClientException
extends CAS_OutOfSequenceException
implements CAS_Exception
{
/**
* Return standard error message
*
* @return void
*/
public function __construct ()
{
parent::__construct(
'this method cannot be called before phpCAS::client() or phpCAS::proxy()'
);
}
}
phpCAS-1.6.0/source/CAS/OutOfSequenceBeforeProxyException.php 0000664 0000000 0000000 00000003620 14330031177 0024044 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class defines Exceptions that should be thrown when the sequence of
* operations is invalid. In this case it should be thrown when the proxy() call
* has not yet happened and no proxy object exists.
*
* @class CAS_OutOfSequenceBeforeProxyException
* @category Authentication
* @package PhpCAS
* @author Joachim Fritschi
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_OutOfSequenceBeforeProxyException
extends CAS_OutOfSequenceException
implements CAS_Exception
{
/**
* Return standard error message
*
* @return void
*/
public function __construct ()
{
parent::__construct(
'this method cannot be called before phpCAS::proxy()'
);
}
}
phpCAS-1.6.0/source/CAS/OutOfSequenceException.php 0000664 0000000 0000000 00000003232 14330031177 0021656 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class defines Exceptions that should be thrown when the sequence of
* operations is invalid. Examples are:
* - Requesting the response before executing a request.
* - Changing the URL of a request after executing the request.
*
* @class CAS_OutOfSequenceException
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_OutOfSequenceException
extends BadMethodCallException
implements CAS_Exception
{
}
phpCAS-1.6.0/source/CAS/PGTStorage/ 0000775 0000000 0000000 00000000000 14330031177 0016520 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/PGTStorage/AbstractStorage.php 0000664 0000000 0000000 00000014007 14330031177 0022323 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Basic class for PGT storage
* The CAS_PGTStorage_AbstractStorage class is a generic class for PGT storage.
* This class should not be instanciated itself but inherited by specific PGT
* storage classes.
*
* @class CAS_PGTStorage_AbstractStorage
* @category Authentication
* @package PhpCAS
* @author Pascal Aubry
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @ingroup internalPGTStorage
*/
abstract class CAS_PGTStorage_AbstractStorage
{
/**
* @addtogroup internalPGTStorage
* @{
*/
// ########################################################################
// CONSTRUCTOR
// ########################################################################
/**
* The constructor of the class, should be called only by inherited classes.
*
* @param CAS_Client $cas_parent the CAS _client instance that creates the
* current object.
*
* @return void
*
* @protected
*/
function __construct($cas_parent)
{
phpCAS::traceBegin();
if ( !$cas_parent->isProxy() ) {
phpCAS::error(
'defining PGT storage makes no sense when not using a CAS proxy'
);
}
phpCAS::traceEnd();
}
// ########################################################################
// DEBUGGING
// ########################################################################
/**
* This virtual method returns an informational string giving the type of storage
* used by the object (used for debugging purposes).
*
* @return string
*
* @public
*/
function getStorageType()
{
phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
}
/**
* This virtual method returns an informational string giving informations on the
* parameters of the storage.(used for debugging purposes).
*
* @return string
*
* @public
*/
function getStorageInfo()
{
phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
}
// ########################################################################
// ERROR HANDLING
// ########################################################################
/**
* string used to store an error message. Written by
* PGTStorage::setErrorMessage(), read by PGTStorage::getErrorMessage().
*
* @hideinitializer
* @deprecated not used.
*/
var $_error_message=false;
/**
* This method sets en error message, which can be read later by
* PGTStorage::getErrorMessage().
*
* @param string $error_message an error message
*
* @return void
*
* @deprecated not used.
*/
function setErrorMessage($error_message)
{
$this->_error_message = $error_message;
}
/**
* This method returns an error message set by PGTStorage::setErrorMessage().
*
* @return string an error message when set by PGTStorage::setErrorMessage(), FALSE
* otherwise.
*
* @deprecated not used.
*/
function getErrorMessage()
{
return $this->_error_message;
}
// ########################################################################
// INITIALIZATION
// ########################################################################
/**
* a boolean telling if the storage has already been initialized. Written by
* PGTStorage::init(), read by PGTStorage::isInitialized().
*
* @hideinitializer
*/
var $_initialized = false;
/**
* This method tells if the storage has already been intialized.
*
* @return bool
*
* @protected
*/
function isInitialized()
{
return $this->_initialized;
}
/**
* This virtual method initializes the object.
*
* @return void
*/
function init()
{
$this->_initialized = true;
}
// ########################################################################
// PGT I/O
// ########################################################################
/**
* This virtual method stores a PGT and its corresponding PGT Iuo.
*
* @param string $pgt the PGT
* @param string $pgt_iou the PGT iou
*
* @return void
*
* @note Should never be called.
*
*/
function write($pgt,$pgt_iou)
{
phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
}
/**
* This virtual method reads a PGT corresponding to a PGT Iou and deletes
* the corresponding storage entry.
*
* @param string $pgt_iou the PGT iou
*
* @return string
*
* @note Should never be called.
*/
function read($pgt_iou)
{
phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
}
/** @} */
}
?>
phpCAS-1.6.0/source/CAS/PGTStorage/Db.php 0000664 0000000 0000000 00000031366 14330031177 0017567 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
define('CAS_PGT_STORAGE_DB_DEFAULT_TABLE', 'cas_pgts');
/**
* Basic class for PGT database storage
* The CAS_PGTStorage_Db class is a class for PGT database storage.
*
* @class CAS_PGTStorage_Db
* @category Authentication
* @package PhpCAS
* @author Daniel Frett
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
* @ingroup internalPGTStorageDb
*/
class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage
{
/**
* @addtogroup internalCAS_PGTStorageDb
* @{
*/
/**
* the PDO object to use for database interactions
*/
private $_pdo;
/**
* This method returns the PDO object to use for database interactions.
*
* @return PDO object
*/
private function _getPdo()
{
return $this->_pdo;
}
/**
* database connection options to use when creating a new PDO object
*/
private $_dsn;
private $_username;
private $_password;
private $_driver_options;
/**
* @var string the table to use for storing/retrieving pgt's
*/
private $_table;
/**
* This method returns the table to use when storing/retrieving PGT's
*
* @return string the name of the pgt storage table.
*/
private function _getTable()
{
return $this->_table;
}
// ########################################################################
// DEBUGGING
// ########################################################################
/**
* This method returns an informational string giving the type of storage
* used by the object (used for debugging purposes).
*
* @return string an informational string.
*/
public function getStorageType()
{
return "db";
}
/**
* This method returns an informational string giving informations on the
* parameters of the storage.(used for debugging purposes).
*
* @return string an informational string.
* @public
*/
public function getStorageInfo()
{
return 'table=`'.$this->_getTable().'\'';
}
// ########################################################################
// CONSTRUCTOR
// ########################################################################
/**
* The class constructor.
*
* @param CAS_Client $cas_parent the CAS_Client instance that creates
* the object.
* @param string $dsn_or_pdo a dsn string to use for creating a PDO
* object or a PDO object
* @param string $username the username to use when connecting to
* the database
* @param string $password the password to use when connecting to
* the database
* @param string $table the table to use for storing and
* retrieving PGT's
* @param string $driver_options any driver options to use when
* connecting to the database
*/
public function __construct(
$cas_parent, $dsn_or_pdo, $username='', $password='', $table='',
$driver_options=null
) {
phpCAS::traceBegin();
// call the ancestor's constructor
parent::__construct($cas_parent);
// set default values
if ( empty($table) ) {
$table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE;
}
if ( !is_array($driver_options) ) {
$driver_options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
}
// store the specified parameters
if ($dsn_or_pdo instanceof PDO) {
$this->_pdo = $dsn_or_pdo;
} else {
$this->_dsn = $dsn_or_pdo;
$this->_username = $username;
$this->_password = $password;
$this->_driver_options = $driver_options;
}
// store the table name
$this->_table = $table;
phpCAS::traceEnd();
}
// ########################################################################
// INITIALIZATION
// ########################################################################
/**
* This method is used to initialize the storage. Halts on error.
*
* @return void
*/
public function init()
{
phpCAS::traceBegin();
// if the storage has already been initialized, return immediatly
if ($this->isInitialized()) {
return;
}
// initialize the base object
parent::init();
// create the PDO object if it doesn't exist already
if (!($this->_pdo instanceof PDO)) {
try {
$this->_pdo = new PDO(
$this->_dsn, $this->_username, $this->_password,
$this->_driver_options
);
}
catch(PDOException $e) {
phpCAS::error('Database connection error: ' . $e->getMessage());
}
}
phpCAS::traceEnd();
}
// ########################################################################
// PDO database interaction
// ########################################################################
/**
* attribute that stores the previous error mode for the PDO handle while
* processing a transaction
*/
private $_errMode;
/**
* This method will enable the Exception error mode on the PDO object
*
* @return void
*/
private function _setErrorMode()
{
// get PDO object and enable exception error mode
$pdo = $this->_getPdo();
$this->_errMode = $pdo->getAttribute(PDO::ATTR_ERRMODE);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
/**
* this method will reset the error mode on the PDO object
*
* @return void
*/
private function _resetErrorMode()
{
// get PDO object and reset the error mode to what it was originally
$pdo = $this->_getPdo();
$pdo->setAttribute(PDO::ATTR_ERRMODE, $this->_errMode);
}
// ########################################################################
// database queries
// ########################################################################
// these queries are potentially unsafe because the person using this library
// can set the table to use, but there is no reliable way to escape SQL
// fieldnames in PDO yet
/**
* This method returns the query used to create a pgt storage table
*
* @return string the create table SQL, no bind params in query
*/
protected function createTableSql()
{
return 'CREATE TABLE ' . $this->_getTable()
. ' (pgt_iou VARCHAR(255) NOT NULL PRIMARY KEY, pgt VARCHAR(255) NOT NULL)';
}
/**
* This method returns the query used to store a pgt
*
* @return string the store PGT SQL, :pgt and :pgt_iou are the bind params contained
* in the query
*/
protected function storePgtSql()
{
return 'INSERT INTO ' . $this->_getTable()
. ' (pgt_iou, pgt) VALUES (:pgt_iou, :pgt)';
}
/**
* This method returns the query used to retrieve a pgt. the first column
* of the first row should contain the pgt
*
* @return string the retrieve PGT SQL, :pgt_iou is the only bind param contained
* in the query
*/
protected function retrievePgtSql()
{
return 'SELECT pgt FROM ' . $this->_getTable() . ' WHERE pgt_iou = :pgt_iou';
}
/**
* This method returns the query used to delete a pgt.
*
* @return string the delete PGT SQL, :pgt_iou is the only bind param contained in
* the query
*/
protected function deletePgtSql()
{
return 'DELETE FROM ' . $this->_getTable() . ' WHERE pgt_iou = :pgt_iou';
}
// ########################################################################
// PGT I/O
// ########################################################################
/**
* This method creates the database table used to store pgt's and pgtiou's
*
* @return void
*/
public function createTable()
{
phpCAS::traceBegin();
// initialize this PGTStorage object if it hasn't been initialized yet
if ( !$this->isInitialized() ) {
$this->init();
}
// initialize the PDO object for this method
$pdo = $this->_getPdo();
$this->_setErrorMode();
try {
$pdo->beginTransaction();
$query = $pdo->query($this->createTableSQL());
$query->closeCursor();
$pdo->commit();
}
catch(PDOException $e) {
// attempt rolling back the transaction before throwing a phpCAS error
try {
$pdo->rollBack();
}
catch(PDOException $e) {
}
phpCAS::error('error creating PGT storage table: ' . $e->getMessage());
}
// reset the PDO object
$this->_resetErrorMode();
phpCAS::traceEnd();
}
/**
* This method stores a PGT and its corresponding PGT Iou in the database.
* Echoes a warning on error.
*
* @param string $pgt the PGT
* @param string $pgt_iou the PGT iou
*
* @return void
*/
public function write($pgt, $pgt_iou)
{
phpCAS::traceBegin();
// initialize the PDO object for this method
$pdo = $this->_getPdo();
$this->_setErrorMode();
try {
$pdo->beginTransaction();
$query = $pdo->prepare($this->storePgtSql());
$query->bindValue(':pgt', $pgt, PDO::PARAM_STR);
$query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR);
$query->execute();
$query->closeCursor();
$pdo->commit();
}
catch(PDOException $e) {
// attempt rolling back the transaction before throwing a phpCAS error
try {
$pdo->rollBack();
}
catch(PDOException $e) {
}
phpCAS::error('error writing PGT to database: ' . $e->getMessage());
}
// reset the PDO object
$this->_resetErrorMode();
phpCAS::traceEnd();
}
/**
* This method reads a PGT corresponding to a PGT Iou and deletes the
* corresponding db entry.
*
* @param string $pgt_iou the PGT iou
*
* @return string|false the corresponding PGT, or FALSE on error
*/
public function read($pgt_iou)
{
phpCAS::traceBegin();
$pgt = false;
// initialize the PDO object for this method
$pdo = $this->_getPdo();
$this->_setErrorMode();
try {
$pdo->beginTransaction();
// fetch the pgt for the specified pgt_iou
$query = $pdo->prepare($this->retrievePgtSql());
$query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR);
$query->execute();
$pgt = $query->fetchColumn(0);
$query->closeCursor();
// delete the specified pgt_iou from the database
$query = $pdo->prepare($this->deletePgtSql());
$query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR);
$query->execute();
$query->closeCursor();
$pdo->commit();
}
catch(PDOException $e) {
// attempt rolling back the transaction before throwing a phpCAS error
try {
$pdo->rollBack();
}
catch(PDOException $e) {
}
phpCAS::trace('error reading PGT from database: ' . $e->getMessage());
}
// reset the PDO object
$this->_resetErrorMode();
phpCAS::traceEnd();
return $pgt;
}
/** @} */
}
?>
phpCAS-1.6.0/source/CAS/PGTStorage/File.php 0000664 0000000 0000000 00000017206 14330031177 0020116 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* The CAS_PGTStorage_File class is a class for PGT file storage. An instance of
* this class is returned by CAS_Client::SetPGTStorageFile().
*
* @class CAS_PGTStorage_File
* @category Authentication
* @package PhpCAS
* @author Pascal Aubry
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
*
* @ingroup internalPGTStorageFile
*/
class CAS_PGTStorage_File extends CAS_PGTStorage_AbstractStorage
{
/**
* @addtogroup internalPGTStorageFile
* @{
*/
/**
* a string telling where PGT's should be stored on the filesystem. Written by
* PGTStorageFile::PGTStorageFile(), read by getPath().
*
* @private
*/
var $_path;
/**
* This method returns the name of the directory where PGT's should be stored
* on the filesystem.
*
* @return string the name of a directory (with leading and trailing '/')
*
* @private
*/
function getPath()
{
return $this->_path;
}
// ########################################################################
// DEBUGGING
// ########################################################################
/**
* This method returns an informational string giving the type of storage
* used by the object (used for debugging purposes).
*
* @return string an informational string.
* @public
*/
function getStorageType()
{
return "file";
}
/**
* This method returns an informational string giving informations on the
* parameters of the storage.(used for debugging purposes).
*
* @return string an informational string.
* @public
*/
function getStorageInfo()
{
return 'path=`'.$this->getPath().'\'';
}
// ########################################################################
// CONSTRUCTOR
// ########################################################################
/**
* The class constructor, called by CAS_Client::SetPGTStorageFile().
*
* @param CAS_Client $cas_parent the CAS_Client instance that creates the object.
* @param string $path the path where the PGT's should be stored
*
* @return void
*
* @public
*/
function __construct($cas_parent,$path)
{
phpCAS::traceBegin();
// call the ancestor's constructor
parent::__construct($cas_parent);
if (empty($path)) {
$path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH;
}
// check that the path is an absolute path
if (getenv("OS")=="Windows_NT" || strtoupper(substr(PHP_OS,0,3)) == 'WIN') {
if (!preg_match('`^[a-zA-Z]:`', $path)) {
phpCAS::error('an absolute path is needed for PGT storage to file');
}
} else {
if ( $path[0] != '/' ) {
phpCAS::error('an absolute path is needed for PGT storage to file');
}
// store the path (with a leading and trailing '/')
$path = preg_replace('|[/]*$|', '/', $path);
$path = preg_replace('|^[/]*|', '/', $path);
}
$this->_path = $path;
phpCAS::traceEnd();
}
// ########################################################################
// INITIALIZATION
// ########################################################################
/**
* This method is used to initialize the storage. Halts on error.
*
* @return void
* @public
*/
function init()
{
phpCAS::traceBegin();
// if the storage has already been initialized, return immediatly
if ($this->isInitialized()) {
return;
}
// call the ancestor's method (mark as initialized)
parent::init();
phpCAS::traceEnd();
}
// ########################################################################
// PGT I/O
// ########################################################################
/**
* This method returns the filename corresponding to a PGT Iou.
*
* @param string $pgt_iou the PGT iou.
*
* @return string a filename
* @private
*/
function getPGTIouFilename($pgt_iou)
{
phpCAS::traceBegin();
$filename = $this->getPath()."phpcas-".hash("sha256", $pgt_iou);
// $filename = $this->getPath().$pgt_iou.'.plain';
phpCAS::trace("Sha256 filename:" . $filename);
phpCAS::traceEnd();
return $filename;
}
/**
* This method stores a PGT and its corresponding PGT Iou into a file. Echoes a
* warning on error.
*
* @param string $pgt the PGT
* @param string $pgt_iou the PGT iou
*
* @return void
*
* @public
*/
function write($pgt,$pgt_iou)
{
phpCAS::traceBegin();
$fname = $this->getPGTIouFilename($pgt_iou);
if (!file_exists($fname)) {
touch($fname);
// Chmod will fail on windows
@chmod($fname, 0600);
if ($f=fopen($fname, "w")) {
if (fputs($f, $pgt) === false) {
phpCAS::error('could not write PGT to `'.$fname.'\'');
}
phpCAS::trace('Successful write of PGT to `'.$fname.'\'');
fclose($f);
} else {
phpCAS::error('could not open `'.$fname.'\'');
}
} else {
phpCAS::error('File exists: `'.$fname.'\'');
}
phpCAS::traceEnd();
}
/**
* This method reads a PGT corresponding to a PGT Iou and deletes the
* corresponding file.
*
* @param string $pgt_iou the PGT iou
*
* @return string|false the corresponding PGT, or FALSE on error
*
* @public
*/
function read($pgt_iou)
{
phpCAS::traceBegin();
$pgt = false;
$fname = $this->getPGTIouFilename($pgt_iou);
if (file_exists($fname)) {
if (!($f=fopen($fname, "r"))) {
phpCAS::error('could not open `'.$fname.'\'');
} else {
if (($pgt=fgets($f)) === false) {
phpCAS::error('could not read PGT from `'.$fname.'\'');
}
phpCAS::trace('Successful read of PGT to `'.$fname.'\'');
fclose($f);
}
// delete the PGT file
@unlink($fname);
} else {
phpCAS::error('No such file `'.$fname.'\'');
}
phpCAS::traceEnd($pgt);
return $pgt;
}
/** @} */
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService.php 0000664 0000000 0000000 00000004647 14330031177 0020220 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This interface defines methods that allow proxy-authenticated service handlers
* to interact with phpCAS.
*
* Proxy service handlers must implement this interface as well as call
* phpCAS::initializeProxiedService($this) at some point in their implementation.
*
* While not required, proxy-authenticated service handlers are encouraged to
* implement the CAS_ProxiedService_Testable interface to facilitate unit testing.
*
* @class CAS_ProxiedService
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_ProxiedService
{
/**
* Answer a service identifier (URL) for whom we should fetch a proxy ticket.
*
* @return string
* @throws Exception If no service url is available.
*/
public function getServiceUrl ();
/**
* Register a proxy ticket with the ProxiedService that it can use when
* making requests.
*
* @param string $proxyTicket Proxy ticket string
*
* @return void
* @throws InvalidArgumentException If the $proxyTicket is invalid.
* @throws CAS_OutOfSequenceException If called after a proxy ticket has
* already been initialized/set.
*/
public function setProxyTicket ($proxyTicket);
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/ 0000775 0000000 0000000 00000000000 14330031177 0017474 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/ProxiedService/Abstract.php 0000664 0000000 0000000 00000011201 14330031177 0021743 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class implements common methods for ProxiedService implementations included
* with phpCAS.
*
* @class CAS_ProxiedService_Abstract
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
abstract class CAS_ProxiedService_Abstract
implements CAS_ProxiedService, CAS_ProxiedService_Testable
{
/**
* The proxy ticket that can be used when making service requests.
* @var string $_proxyTicket;
*/
private $_proxyTicket;
/**
* Register a proxy ticket with the Proxy that it can use when making requests.
*
* @param string $proxyTicket proxy ticket
*
* @return void
* @throws InvalidArgumentException If the $proxyTicket is invalid.
* @throws CAS_OutOfSequenceException If called after a proxy ticket has
* already been initialized/set.
*/
public function setProxyTicket ($proxyTicket)
{
if (empty($proxyTicket)) {
throw new CAS_InvalidArgumentException(
'Trying to initialize with an empty proxy ticket.'
);
}
if (!empty($this->_proxyTicket)) {
throw new CAS_OutOfSequenceException(
'Already initialized, cannot change the proxy ticket.'
);
}
$this->_proxyTicket = $proxyTicket;
}
/**
* Answer the proxy ticket to be used when making requests.
*
* @return string
* @throws CAS_OutOfSequenceException If called before a proxy ticket has
* already been initialized/set.
*/
protected function getProxyTicket ()
{
if (empty($this->_proxyTicket)) {
throw new CAS_OutOfSequenceException(
'No proxy ticket yet. Call $this->initializeProxyTicket() to aquire the proxy ticket.'
);
}
return $this->_proxyTicket;
}
/**
* @var CAS_Client $_casClient;
*/
private $_casClient;
/**
* Use a particular CAS_Client->initializeProxiedService() rather than the
* static phpCAS::initializeProxiedService().
*
* This method should not be called in standard operation, but is needed for unit
* testing.
*
* @param CAS_Client $casClient cas client
*
* @return void
* @throws CAS_OutOfSequenceException If called after a proxy ticket has
* already been initialized/set.
*/
public function setCasClient (CAS_Client $casClient)
{
if (!empty($this->_proxyTicket)) {
throw new CAS_OutOfSequenceException(
'Already initialized, cannot change the CAS_Client.'
);
}
$this->_casClient = $casClient;
}
/**
* Fetch our proxy ticket.
*
* Descendent classes should call this method once their service URL is available
* to initialize their proxy ticket.
*
* @return void
* @throws CAS_OutOfSequenceException If called after a proxy ticket has
* already been initialized.
*/
protected function initializeProxyTicket()
{
if (!empty($this->_proxyTicket)) {
throw new CAS_OutOfSequenceException(
'Already initialized, cannot initialize again.'
);
}
// Allow usage of a particular CAS_Client for unit testing.
if (empty($this->_casClient)) {
phpCAS::initializeProxiedService($this);
} else {
$this->_casClient->initializeProxiedService($this);
}
}
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Exception.php 0000664 0000000 0000000 00000002747 14330031177 0022155 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* An Exception for problems communicating with a proxied service.
*
* @class CAS_ProxiedService_Exception
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxiedService_Exception
extends Exception
implements CAS_Exception
{
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Http.php 0000664 0000000 0000000 00000005500 14330031177 0021124 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This interface defines methods that clients should use for configuring, sending,
* and receiving proxied HTTP requests.
*
* @class CAS_ProxiedService_Http
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_ProxiedService_Http
{
/*********************************************************
* Configure the Request
*********************************************************/
/**
* Set the URL of the Request
*
* @param string $url Url to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setUrl ($url);
/*********************************************************
* 2. Send the Request
*********************************************************/
/**
* Perform the request.
*
* @return bool TRUE on success, FALSE on failure.
* @throws CAS_OutOfSequenceException If called multiple times.
*/
public function send ();
/*********************************************************
* 3. Access the response
*********************************************************/
/**
* Answer the headers of the response.
*
* @return array An array of header strings.
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseHeaders ();
/**
* Answer the body of response.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseBody ();
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Http/ 0000775 0000000 0000000 00000000000 14330031177 0020413 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/ProxiedService/Http/Abstract.php 0000664 0000000 0000000 00000024735 14330031177 0022702 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class implements common methods for ProxiedService implementations included
* with phpCAS.
*
* @class CAS_ProxiedService_Http_Abstract
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
abstract class CAS_ProxiedService_Http_Abstract extends
CAS_ProxiedService_Abstract implements CAS_ProxiedService_Http
{
/**
* The HTTP request mechanism talking to the target service.
*
* @var CAS_Request_RequestInterface $requestHandler
*/
protected $requestHandler;
/**
* The storage mechanism for cookies set by the target service.
*
* @var CAS_CookieJar $_cookieJar
*/
private $_cookieJar;
/**
* Constructor.
*
* @param CAS_Request_RequestInterface $requestHandler request handler object
* @param CAS_CookieJar $cookieJar cookieJar object
*
* @return void
*/
public function __construct(CAS_Request_RequestInterface $requestHandler,
CAS_CookieJar $cookieJar
) {
$this->requestHandler = $requestHandler;
$this->_cookieJar = $cookieJar;
}
/**
* The target service url.
* @var string $_url;
*/
private $_url;
/**
* Answer a service identifier (URL) for whom we should fetch a proxy ticket.
*
* @return string
* @throws Exception If no service url is available.
*/
public function getServiceUrl()
{
if (empty($this->_url)) {
throw new CAS_ProxiedService_Exception(
'No URL set via ' . get_class($this) . '->setUrl($url).'
);
}
return $this->_url;
}
/*********************************************************
* Configure the Request
*********************************************************/
/**
* Set the URL of the Request
*
* @param string $url url to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setUrl($url)
{
if ($this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot set the URL, request already sent.'
);
}
if (!is_string($url)) {
throw new CAS_InvalidArgumentException('$url must be a string.');
}
$this->_url = $url;
}
/*********************************************************
* 2. Send the Request
*********************************************************/
/**
* Perform the request.
*
* @return void
* @throws CAS_OutOfSequenceException If called multiple times.
* @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
* The code of the Exception will be one of:
* PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_FAILURE
* @throws CAS_ProxiedService_Exception If there is a failure sending the
* request to the target service.
*/
public function send()
{
if ($this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot send, request already sent.'
);
}
phpCAS::traceBegin();
// Get our proxy ticket and append it to our URL.
$this->initializeProxyTicket();
$url = $this->getServiceUrl();
if (strstr($url, '?') === false) {
$url = $url . '?ticket=' . $this->getProxyTicket();
} else {
$url = $url . '&ticket=' . $this->getProxyTicket();
}
try {
$this->makeRequest($url);
} catch (Exception $e) {
phpCAS::traceEnd();
throw $e;
}
}
/**
* Indicator of the number of requests (including redirects performed.
*
* @var int $_numRequests;
*/
private $_numRequests = 0;
/**
* The response headers.
*
* @var array $_responseHeaders;
*/
private $_responseHeaders = array();
/**
* The response status code.
*
* @var int $_responseStatusCode;
*/
private $_responseStatusCode = '';
/**
* The response headers.
*
* @var string $_responseBody;
*/
private $_responseBody = '';
/**
* Build and perform a request, following redirects
*
* @param string $url url for the request
*
* @return void
* @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
* The code of the Exception will be one of:
* PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_FAILURE
* @throws CAS_ProxiedService_Exception If there is a failure sending the
* request to the target service.
*/
protected function makeRequest($url)
{
// Verify that we are not in a redirect loop
$this->_numRequests++;
if ($this->_numRequests > 4) {
$message = 'Exceeded the maximum number of redirects (3) in proxied service request.';
phpCAS::trace($message);
throw new CAS_ProxiedService_Exception($message);
}
// Create a new request.
$request = clone $this->requestHandler;
$request->setUrl($url);
// Add any cookies to the request.
$request->addCookies($this->_cookieJar->getCookies($url));
// Add any other parts of the request needed by concrete classes
$this->populateRequest($request);
// Perform the request.
phpCAS::trace('Performing proxied service request to \'' . $url . '\'');
if (!$request->send()) {
$message = 'Could not perform proxied service request to URL`'
. $url . '\'. ' . $request->getErrorMessage();
phpCAS::trace($message);
throw new CAS_ProxiedService_Exception($message);
}
// Store any cookies from the response;
$this->_cookieJar->storeCookies($url, $request->getResponseHeaders());
// Follow any redirects
if ($redirectUrl = $this->getRedirectUrl($request->getResponseHeaders())
) {
phpCAS::trace('Found redirect:' . $redirectUrl);
$this->makeRequest($redirectUrl);
} else {
$this->_responseHeaders = $request->getResponseHeaders();
$this->_responseBody = $request->getResponseBody();
$this->_responseStatusCode = $request->getResponseStatusCode();
}
}
/**
* Add any other parts of the request needed by concrete classes
*
* @param CAS_Request_RequestInterface $request request interface object
*
* @return void
*/
abstract protected function populateRequest(
CAS_Request_RequestInterface $request
);
/**
* Answer a redirect URL if a redirect header is found, otherwise null.
*
* @param array $responseHeaders response header to extract a redirect from
*
* @return string|null
*/
protected function getRedirectUrl(array $responseHeaders)
{
// Check for the redirect after authentication
foreach ($responseHeaders as $header) {
if ( preg_match('/^(Location:|URI:)\s*([^\s]+.*)$/', $header, $matches)
) {
return trim(array_pop($matches));
}
}
return null;
}
/*********************************************************
* 3. Access the response
*********************************************************/
/**
* Answer true if our request has been sent yet.
*
* @return bool
*/
protected function hasBeenSent()
{
return ($this->_numRequests > 0);
}
/**
* Answer the headers of the response.
*
* @return array An array of header strings.
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseHeaders()
{
if (!$this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot access response, request not sent yet.'
);
}
return $this->_responseHeaders;
}
/**
* Answer HTTP status code of the response
*
* @return int
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseStatusCode()
{
if (!$this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot access response, request not sent yet.'
);
}
return $this->_responseStatusCode;
}
/**
* Answer the body of response.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseBody()
{
if (!$this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot access response, request not sent yet.'
);
}
return $this->_responseBody;
}
/**
* Answer the cookies from the response. This may include cookies set during
* redirect responses.
*
* @return array An array containing cookies. E.g. array('name' => 'val');
*/
public function getCookies()
{
return $this->_cookieJar->getCookies($this->getServiceUrl());
}
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Http/Get.php 0000664 0000000 0000000 00000005737 14330031177 0021657 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class is used to make proxied service requests via the HTTP GET method.
*
* Usage Example:
*
* try {
* $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);
* $service->setUrl('http://www.example.com/path/');
* $service->send();
* if ($service->getResponseStatusCode() == 200)
* return $service->getResponseBody();
* else
* // The service responded with an error code 404, 500, etc.
* throw new Exception('The service responded with an error.');
*
* } catch (CAS_ProxyTicketException $e) {
* if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE)
* return "Your login has timed out. You need to log in again.";
* else
* // Other proxy ticket errors are from bad request format
* // (shouldn't happen) or CAS server failure (unlikely)
* // so lets just stop if we hit those.
* throw $e;
* } catch (CAS_ProxiedService_Exception $e) {
* // Something prevented the service request from being sent or received.
* // We didn't even get a valid error response (404, 500, etc), so this
* // might be caused by a network error or a DNS resolution failure.
* // We could handle it in some way, but for now we will just stop.
* throw $e;
* }
*
* @class CAS_ProxiedService_Http_Get
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxiedService_Http_Get
extends CAS_ProxiedService_Http_Abstract
{
/**
* Add any other parts of the request needed by concrete classes
*
* @param CAS_Request_RequestInterface $request request interface
*
* @return void
*/
protected function populateRequest (CAS_Request_RequestInterface $request)
{
// do nothing, since the URL has already been sent and that is our
// only data.
}
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Http/Post.php 0000664 0000000 0000000 00000011433 14330031177 0022053 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This class is used to make proxied service requests via the HTTP POST method.
*
* Usage Example:
*
* try {
* $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);
* $service->setUrl('http://www.example.com/path/');
* $service->setContentType('text/xml');
* $service->setBody('example.search');
* $service->send();
* if ($service->getResponseStatusCode() == 200)
* return $service->getResponseBody();
* else
* // The service responded with an error code 404, 500, etc.
* throw new Exception('The service responded with an error.');
*
* } catch (CAS_ProxyTicketException $e) {
* if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE)
* return "Your login has timed out. You need to log in again.";
* else
* // Other proxy ticket errors are from bad request format
* // (shouldn't happen) or CAS server failure (unlikely) so lets just
* // stop if we hit those.
* throw $e;
* } catch (CAS_ProxiedService_Exception $e) {
* // Something prevented the service request from being sent or received.
* // We didn't even get a valid error response (404, 500, etc), so this
* // might be caused by a network error or a DNS resolution failure.
* // We could handle it in some way, but for now we will just stop.
* throw $e;
* }
*
* @class CAS_ProxiedService_Http_Post
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxiedService_Http_Post
extends CAS_ProxiedService_Http_Abstract
{
/**
* The content-type of this request
*
* @var string $_contentType
*/
private $_contentType;
/**
* The body of the this request
*
* @var string $_body
*/
private $_body;
/**
* Set the content type of this POST request.
*
* @param string $contentType content type
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setContentType ($contentType)
{
if ($this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot set the content type, request already sent.'
);
}
$this->_contentType = $contentType;
}
/**
* Set the body of this POST request.
*
* @param string $body body to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setBody ($body)
{
if ($this->hasBeenSent()) {
throw new CAS_OutOfSequenceException(
'Cannot set the body, request already sent.'
);
}
$this->_body = $body;
}
/**
* Add any other parts of the request needed by concrete classes
*
* @param CAS_Request_RequestInterface $request request interface class
*
* @return void
*/
protected function populateRequest (CAS_Request_RequestInterface $request)
{
if (empty($this->_contentType) && !empty($this->_body)) {
throw new CAS_ProxiedService_Exception(
"If you pass a POST body, you must specify a content type via "
.get_class($this).'->setContentType($contentType).'
);
}
$request->makePost();
if (!empty($this->_body)) {
$request->addHeader('Content-Type: '.$this->_contentType);
$request->addHeader('Content-Length: '.strlen($this->_body));
$request->setPostBody($this->_body);
}
}
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Imap.php 0000664 0000000 0000000 00000020013 14330031177 0021067 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Provides access to a proxy-authenticated IMAP stream
*
* @class CAS_ProxiedService_Imap
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxiedService_Imap
extends CAS_ProxiedService_Abstract
{
/**
* The username to send via imap_open.
*
* @var string $_username;
*/
private $_username;
/**
* Constructor.
*
* @param string $username Username
*
* @return void
*/
public function __construct ($username)
{
if (!is_string($username) || !strlen($username)) {
throw new CAS_InvalidArgumentException('Invalid username.');
}
$this->_username = $username;
}
/**
* The target service url.
* @var string $_url;
*/
private $_url;
/**
* Answer a service identifier (URL) for whom we should fetch a proxy ticket.
*
* @return string
* @throws Exception If no service url is available.
*/
public function getServiceUrl ()
{
if (empty($this->_url)) {
throw new CAS_ProxiedService_Exception(
'No URL set via '.get_class($this).'->getServiceUrl($url).'
);
}
return $this->_url;
}
/*********************************************************
* Configure the Stream
*********************************************************/
/**
* Set the URL of the service to pass to CAS for proxy-ticket retrieval.
*
* @param string $url Url to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the stream has been opened.
*/
public function setServiceUrl ($url)
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot set the URL, stream already opened.'
);
}
if (!is_string($url) || !strlen($url)) {
throw new CAS_InvalidArgumentException('Invalid url.');
}
$this->_url = $url;
}
/**
* The mailbox to open. See the $mailbox parameter of imap_open().
*
* @var string $_mailbox
*/
private $_mailbox;
/**
* Set the mailbox to open. See the $mailbox parameter of imap_open().
*
* @param string $mailbox Mailbox to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the stream has been opened.
*/
public function setMailbox ($mailbox)
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot set the mailbox, stream already opened.'
);
}
if (!is_string($mailbox) || !strlen($mailbox)) {
throw new CAS_InvalidArgumentException('Invalid mailbox.');
}
$this->_mailbox = $mailbox;
}
/**
* A bit mask of options to pass to imap_open() as the $options parameter.
*
* @var int $_options
*/
private $_options = null;
/**
* Set the options for opening the stream. See the $options parameter of
* imap_open().
*
* @param int $options Options for the stream
*
* @return void
* @throws CAS_OutOfSequenceException If called after the stream has been opened.
*/
public function setOptions ($options)
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot set options, stream already opened.'
);
}
if (!is_int($options)) {
throw new CAS_InvalidArgumentException('Invalid options.');
}
$this->_options = $options;
}
/*********************************************************
* 2. Open the stream
*********************************************************/
/**
* Open the IMAP stream (similar to imap_open()).
*
* @return resource Returns an IMAP stream on success
* @throws CAS_OutOfSequenceException If called multiple times.
* @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
* The code of the Exception will be one of:
* PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_FAILURE
* @throws CAS_ProxiedService_Exception If there is a failure sending the
* request to the target service.
*/
public function open ()
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException('Stream already opened.');
}
if (empty($this->_mailbox)) {
throw new CAS_ProxiedService_Exception(
'You must specify a mailbox via '.get_class($this)
.'->setMailbox($mailbox)'
);
}
phpCAS::traceBegin();
// Get our proxy ticket and append it to our URL.
$this->initializeProxyTicket();
phpCAS::trace('opening IMAP mailbox `'.$this->_mailbox.'\'...');
$this->_stream = @imap_open(
$this->_mailbox, $this->_username, $this->getProxyTicket(),
$this->_options
);
if ($this->_stream) {
phpCAS::trace('ok');
} else {
phpCAS::trace('could not open mailbox');
// @todo add localization integration.
$message = 'IMAP Error: '.$this->_url.' '. var_export(imap_errors(), true);
phpCAS::trace($message);
throw new CAS_ProxiedService_Exception($message);
}
phpCAS::traceEnd();
return $this->_stream;
}
/**
* Answer true if our request has been sent yet.
*
* @return bool
*/
protected function hasBeenOpened ()
{
return !empty($this->_stream);
}
/*********************************************************
* 3. Access the result
*********************************************************/
/**
* The IMAP stream
*
* @var resource $_stream
*/
private $_stream;
/**
* Answer the IMAP stream
*
* @return resource
* @throws CAS_OutOfSequenceException if stream is not opened yet
*/
public function getStream ()
{
if (!$this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot access stream, not opened yet.'
);
}
return $this->_stream;
}
/**
* CAS_Client::serviceMail() needs to return the proxy ticket for some reason,
* so this method provides access to it.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the stream has been
* opened.
*/
public function getImapProxyTicket ()
{
if (!$this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot access errors, stream not opened yet.'
);
}
return $this->getProxyTicket();
}
}
?>
phpCAS-1.6.0/source/CAS/ProxiedService/Testable.php 0000664 0000000 0000000 00000004755 14330031177 0021763 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This interface defines methods that allow proxy-authenticated service handlers
* to be tested in unit tests.
*
* Classes implementing this interface SHOULD store the CAS_Client passed and
* initialize themselves with that client rather than via the static phpCAS
* method. For example:
*
* / **
* * Fetch our proxy ticket.
* * /
* protected function initializeProxyTicket() {
* // Allow usage of a particular CAS_Client for unit testing.
* if (is_null($this->casClient))
* phpCAS::initializeProxiedService($this);
* else
* $this->casClient->initializeProxiedService($this);
* }
*
* @class CAS_ProxiedService_Testabel
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_ProxiedService_Testable
{
/**
* Use a particular CAS_Client->initializeProxiedService() rather than the
* static phpCAS::initializeProxiedService().
*
* This method should not be called in standard operation, but is needed for unit
* testing.
*
* @param CAS_Client $casClient Cas client object
*
* @return void
* @throws CAS_OutOfSequenceException If called after a proxy ticket has
* already been initialized/set.
*/
public function setCasClient (CAS_Client $casClient);
}
?>
phpCAS-1.6.0/source/CAS/ProxyChain.php 0000664 0000000 0000000 00000010402 14330031177 0017333 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* A normal proxy-chain definition that lists each level of the chain as either
* a string or regular expression.
*
* @class CAS_ProxyChain
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxyChain
implements CAS_ProxyChain_Interface
{
protected $chain = array();
/**
* A chain is an array of strings or regexp strings that will be matched
* against. Regexp will be matched with preg_match and strings will be
* matched from the beginning. A string must fully match the beginning of
* an proxy url. So you can define a full domain as acceptable or go further
* down.
* Proxies have to be defined in reverse from the service to the user. If a
* user hits service A get proxied via B to service C the list of acceptable
* proxies on C would be array(B,A);
*
* @param array $chain A chain of proxies
*/
public function __construct(array $chain)
{
// Ensure that we have an indexed array
$this->chain = array_values($chain);
}
/**
* Match a list of proxies.
*
* @param array $list The list of proxies in front of this service.
*
* @return bool
*/
public function matches(array $list)
{
$list = array_values($list); // Ensure that we have an indexed array
if ($this->isSizeValid($list)) {
$mismatch = false;
foreach ($this->chain as $i => $search) {
$proxy_url = $list[$i];
if (preg_match('/^\/.*\/[ixASUXu]*$/s', $search)) {
if (preg_match($search, $proxy_url)) {
phpCAS::trace(
"Found regexp " . $search . " matching " . $proxy_url
);
} else {
phpCAS::trace(
"No regexp match " . $search . " != " . $proxy_url
);
$mismatch = true;
break;
}
} else {
if (strncasecmp($search, $proxy_url, strlen($search)) == 0) {
phpCAS::trace(
"Found string " . $search . " matching " . $proxy_url
);
} else {
phpCAS::trace(
"No match " . $search . " != " . $proxy_url
);
$mismatch = true;
break;
}
}
}
if (!$mismatch) {
phpCAS::trace("Proxy chain matches");
return true;
}
} else {
phpCAS::trace("Proxy chain skipped: size mismatch");
}
return false;
}
/**
* Validate the size of the the list as compared to our chain.
*
* @param array $list List of proxies
*
* @return bool
*/
protected function isSizeValid (array $list)
{
return (sizeof($this->chain) == sizeof($list));
}
}
phpCAS-1.6.0/source/CAS/ProxyChain/ 0000775 0000000 0000000 00000000000 14330031177 0016625 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/ProxyChain/AllowedList.php 0000664 0000000 0000000 00000006743 14330031177 0021573 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* ProxyChain is a container for storing chains of valid proxies that can
* be used to validate proxied requests to a service
*
* @class CAS_ProxyChain_AllowedList
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxyChain_AllowedList
{
private $_chains = array();
/**
* Check whether proxies are allowed by configuration
*
* @return bool
*/
public function isProxyingAllowed()
{
return (count($this->_chains) > 0);
}
/**
* Add a chain of proxies to the list of possible chains
*
* @param CAS_ProxyChain_Interface $chain A chain of proxies
*
* @return void
*/
public function allowProxyChain(CAS_ProxyChain_Interface $chain)
{
$this->_chains[] = $chain;
}
/**
* Check if the proxies found in the response match the allowed proxies
*
* @param array $proxies list of proxies to check
*
* @return bool whether the proxies match the allowed proxies
*/
public function isProxyListAllowed(array $proxies)
{
phpCAS::traceBegin();
if (empty($proxies)) {
phpCAS::trace("No proxies were found in the response");
phpCAS::traceEnd(true);
return true;
} elseif (!$this->isProxyingAllowed()) {
phpCAS::trace("Proxies are not allowed");
phpCAS::traceEnd(false);
return false;
} else {
$res = $this->contains($proxies);
phpCAS::traceEnd($res);
return $res;
}
}
/**
* Validate the proxies from the proxy ticket validation against the
* chains that were definded.
*
* @param array $list List of proxies from the proxy ticket validation.
*
* @return bool if any chain fully matches the supplied list
*/
public function contains(array $list)
{
phpCAS::traceBegin();
$count = 0;
foreach ($this->_chains as $chain) {
phpCAS::trace("Checking chain ". $count++);
if ($chain->matches($list)) {
phpCAS::traceEnd(true);
return true;
}
}
phpCAS::trace("No proxy chain matches.");
phpCAS::traceEnd(false);
return false;
}
}
?>
phpCAS-1.6.0/source/CAS/ProxyChain/Any.php 0000664 0000000 0000000 00000004074 14330031177 0020072 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* A proxy-chain definition that will match any list of proxies.
*
* Use this class for quick testing or in certain production screnarios you
* might want to allow allow any other valid service to proxy your service.
*
* THIS CLASS IS HOWEVER NOT RECOMMENDED FOR PRODUCTION AND HAS SECURITY
* IMPLICATIONS: YOU ARE ALLOWING ANY SERVICE TO ACT ON BEHALF OF A USER
* ON THIS SERVICE.
*
* @class CAS_ProxyChain_Any
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxyChain_Any
implements CAS_ProxyChain_Interface
{
/**
* Match a list of proxies.
*
* @param array $list The list of proxies in front of this service.
*
* @return bool
*/
public function matches(array $list)
{
phpCAS::trace("Using CAS_ProxyChain_Any. No proxy validation is performed.");
return true;
}
}
phpCAS-1.6.0/source/CAS/ProxyChain/Interface.php 0000664 0000000 0000000 00000003235 14330031177 0021241 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* An interface for classes that define a list of allowed proxies in front of
* the current application.
*
* @class CAS_ProxyChain_Interface
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_ProxyChain_Interface
{
/**
* Match a list of proxies.
*
* @param array $list The list of proxies in front of this service.
*
* @return bool
*/
public function matches(array $list);
}
phpCAS-1.6.0/source/CAS/ProxyChain/Trusted.php 0000664 0000000 0000000 00000003534 14330031177 0020775 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* A proxy-chain definition that defines a chain up to a trusted proxy and
* delegates the resposibility of validating the rest of the chain to that
* trusted proxy.
*
* @class CAS_ProxyChain_Trusted
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxyChain_Trusted
extends CAS_ProxyChain
implements CAS_ProxyChain_Interface
{
/**
* Validate the size of the the list as compared to our chain.
*
* @param array $list list of proxies
*
* @return bool
*/
protected function isSizeValid (array $list)
{
return (sizeof($this->chain) <= sizeof($list));
}
}
phpCAS-1.6.0/source/CAS/ProxyTicketException.php 0000664 0000000 0000000 00000004411 14330031177 0021416 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*
*/
/**
* An Exception for errors related to fetching or validating proxy tickets.
*
* @class CAS_ProxyTicketException
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxyTicketException
extends BadMethodCallException
implements CAS_Exception
{
/**
* Constructor
*
* @param string $message Message text
* @param int $code Error code
*
* @return void
*/
public function __construct ($message, $code = PHPCAS_SERVICE_PT_FAILURE)
{
// Warn if the code is not in our allowed list
$ptCodes = array(
PHPCAS_SERVICE_PT_FAILURE,
PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE,
PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
);
if (!in_array($code, $ptCodes)) {
trigger_error(
'Invalid code '.$code
.' passed. Must be one of PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, or PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE.'
);
}
parent::__construct($message, $code);
}
}
phpCAS-1.6.0/source/CAS/Request/ 0000775 0000000 0000000 00000000000 14330031177 0016171 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/Request/AbstractRequest.php 0000664 0000000 0000000 00000024770 14330031177 0022030 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Provides support for performing web-requests via curl
*
* @class CAS_Request_AbstractRequest
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
abstract class CAS_Request_AbstractRequest
implements CAS_Request_RequestInterface
{
protected $url = null;
protected $cookies = array();
protected $headers = array();
protected $isPost = false;
protected $postBody = null;
protected $caCertPath = null;
protected $validateCN = true;
private $_sent = false;
private $_responseHeaders = array();
private $_responseBody = null;
private $_errorMessage = '';
/*********************************************************
* Configure the Request
*********************************************************/
/**
* Set the URL of the Request
*
* @param string $url Url to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setUrl ($url)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->url = $url;
}
/**
* Add a cookie to the request.
*
* @param string $name Name of entry
* @param string $value value of entry
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addCookie ($name, $value)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->cookies[$name] = $value;
}
/**
* Add an array of cookies to the request.
* The cookie array is of the form
* array('cookie_name' => 'cookie_value', 'cookie_name2' => cookie_value2')
*
* @param array $cookies cookies to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addCookies (array $cookies)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->cookies = array_merge($this->cookies, $cookies);
}
/**
* Add a header string to the request.
*
* @param string $header Header to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addHeader ($header)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->headers[] = $header;
}
/**
* Add an array of header strings to the request.
*
* @param array $headers headers to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addHeaders (array $headers)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->headers = array_merge($this->headers, $headers);
}
/**
* Make the request a POST request rather than the default GET request.
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function makePost ()
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->isPost = true;
}
/**
* Add a POST body to the request
*
* @param string $body body to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setPostBody ($body)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
if (!$this->isPost) {
throw new CAS_OutOfSequenceException(
'Cannot add a POST body to a GET request, use makePost() first.'
);
}
$this->postBody = $body;
}
/**
* Specify the path to an SSL CA certificate to validate the server with.
*
* @param string $caCertPath path to cert
* @param bool $validate_cn valdiate CN of certificate
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setSslCaCert ($caCertPath,$validate_cn=true)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
$this->caCertPath = $caCertPath;
$this->validateCN = $validate_cn;
}
/*********************************************************
* 2. Send the Request
*********************************************************/
/**
* Perform the request.
*
* @return bool TRUE on success, FALSE on failure.
* @throws CAS_OutOfSequenceException If called multiple times.
*/
public function send ()
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot send again.'
);
}
if (is_null($this->url) || !$this->url) {
throw new CAS_OutOfSequenceException(
'A url must be specified via setUrl() before the request can be sent.'
);
}
$this->_sent = true;
return $this->sendRequest();
}
/**
* Send the request and store the results.
*
* @return bool TRUE on success, FALSE on failure.
*/
abstract protected function sendRequest ();
/**
* Store the response headers.
*
* @param array $headers headers to store
*
* @return void
*/
protected function storeResponseHeaders (array $headers)
{
$this->_responseHeaders = array_merge($this->_responseHeaders, $headers);
}
/**
* Store a single response header to our array.
*
* @param string $header header to store
*
* @return void
*/
protected function storeResponseHeader ($header)
{
$this->_responseHeaders[] = $header;
}
/**
* Store the response body.
*
* @param string $body body to store
*
* @return void
*/
protected function storeResponseBody ($body)
{
$this->_responseBody = $body;
}
/**
* Add a string to our error message.
*
* @param string $message message to add
*
* @return void
*/
protected function storeErrorMessage ($message)
{
$this->_errorMessage .= $message;
}
/*********************************************************
* 3. Access the response
*********************************************************/
/**
* Answer the headers of the response.
*
* @return array An array of header strings.
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseHeaders ()
{
if (!$this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has not been sent yet. Cannot '.__METHOD__
);
}
return $this->_responseHeaders;
}
/**
* Answer HTTP status code of the response
*
* @return int
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
* @throws CAS_Request_Exception if the response did not contain a status code
*/
public function getResponseStatusCode ()
{
if (!$this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has not been sent yet. Cannot '.__METHOD__
);
}
if (!preg_match(
'/HTTP\/[0-9.]+\s+([0-9]+)\s*(.*)/',
$this->_responseHeaders[0], $matches
)
) {
throw new CAS_Request_Exception(
'Bad response, no status code was found in the first line.'
);
}
return intval($matches[1]);
}
/**
* Answer the body of response.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseBody ()
{
if (!$this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has not been sent yet. Cannot '.__METHOD__
);
}
return $this->_responseBody;
}
/**
* Answer a message describing any errors if the request failed.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getErrorMessage ()
{
if (!$this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has not been sent yet. Cannot '.__METHOD__
);
}
return $this->_errorMessage;
}
}
phpCAS-1.6.0/source/CAS/Request/CurlMultiRequest.php 0000664 0000000 0000000 00000011742 14330031177 0022200 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This interface defines a class library for performing multiple web requests
* in batches. Implementations of this interface may perform requests serially
* or in parallel.
*
* @class CAS_Request_CurlMultiRequest
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_Request_CurlMultiRequest
implements CAS_Request_MultiRequestInterface
{
private $_requests = array();
private $_sent = false;
/*********************************************************
* Add Requests
*********************************************************/
/**
* Add a new Request to this batch.
* Note, implementations will likely restrict requests to their own concrete
* class hierarchy.
*
* @param CAS_Request_RequestInterface $request reqest to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
* @throws CAS_InvalidArgumentException If passed a Request of the wrong
* implmentation.
*/
public function addRequest (CAS_Request_RequestInterface $request)
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
if (!$request instanceof CAS_Request_CurlRequest) {
throw new CAS_InvalidArgumentException(
'As a CAS_Request_CurlMultiRequest, I can only work with CAS_Request_CurlRequest objects.'
);
}
$this->_requests[] = $request;
}
/**
* Retrieve the number of requests added to this batch.
*
* @return int number of request elements
* @throws CAS_OutOfSequenceException if the request has already been sent
*/
public function getNumRequests()
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot '.__METHOD__
);
}
return count($this->_requests);
}
/*********************************************************
* 2. Send the Request
*********************************************************/
/**
* Perform the request. After sending, all requests will have their
* responses poulated.
*
* @return bool TRUE on success, FALSE on failure.
* @throws CAS_OutOfSequenceException If called multiple times.
*/
public function send ()
{
if ($this->_sent) {
throw new CAS_OutOfSequenceException(
'Request has already been sent cannot send again.'
);
}
if (!count($this->_requests)) {
throw new CAS_OutOfSequenceException(
'At least one request must be added via addRequest() before the multi-request can be sent.'
);
}
$this->_sent = true;
// Initialize our handles and configure all requests.
$handles = array();
$multiHandle = curl_multi_init();
foreach ($this->_requests as $i => $request) {
$handle = $request->initAndConfigure();
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$handles[$i] = $handle;
curl_multi_add_handle($multiHandle, $handle);
}
// Execute the requests in parallel.
do {
curl_multi_exec($multiHandle, $running);
} while ($running > 0);
// Populate all of the responses or errors back into the request objects.
foreach ($this->_requests as $i => $request) {
$buf = curl_multi_getcontent($handles[$i]);
$request->_storeResponseBody($buf);
curl_multi_remove_handle($multiHandle, $handles[$i]);
curl_close($handles[$i]);
}
curl_multi_close($multiHandle);
}
}
phpCAS-1.6.0/source/CAS/Request/CurlRequest.php 0000664 0000000 0000000 00000014766 14330031177 0021176 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Provides support for performing web-requests via curl
*
* @class CAS_Request_CurlRequest
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_Request_CurlRequest
extends CAS_Request_AbstractRequest
implements CAS_Request_RequestInterface
{
/**
* Set additional curl options
*
* @param array $options option to set
*
* @return void
*/
public function setCurlOptions (array $options)
{
$this->_curlOptions = $options;
}
private $_curlOptions = array();
/**
* Send the request and store the results.
*
* @return bool true on success, false on failure.
*/
protected function sendRequest ()
{
phpCAS::traceBegin();
/*********************************************************
* initialize the CURL session
*********************************************************/
$ch = $this->initAndConfigure();
/*********************************************************
* Perform the query
*********************************************************/
$buf = curl_exec($ch);
if ( $buf === false ) {
phpCAS::trace('curl_exec() failed');
$this->storeErrorMessage(
'CURL error #'.curl_errno($ch).': '.curl_error($ch)
);
$res = false;
} else {
$this->storeResponseBody($buf);
phpCAS::trace("Response Body: \n".$buf."\n");
$res = true;
}
// close the CURL session
curl_close($ch);
phpCAS::traceEnd($res);
return $res;
}
/**
* Internal method to initialize our cURL handle and configure the request.
* This method should NOT be used outside of the CurlRequest or the
* CurlMultiRequest.
*
* @return resource|false The cURL handle on success, false on failure
*/
public function initAndConfigure()
{
/*********************************************************
* initialize the CURL session
*********************************************************/
$ch = curl_init($this->url);
curl_setopt_array($ch, $this->_curlOptions);
/*********************************************************
* Set SSL configuration
*********************************************************/
if ($this->caCertPath) {
if ($this->validateCN) {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
} else {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_CAINFO, $this->caCertPath);
phpCAS::trace('CURL: Set CURLOPT_CAINFO ' . $this->caCertPath);
} else {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}
/*********************************************************
* Configure curl to capture our output.
*********************************************************/
// return the CURL output into a variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// get the HTTP header with a callback
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, '_curlReadHeaders'));
/*********************************************************
* Add cookie headers to our request.
*********************************************************/
if (count($this->cookies)) {
$cookieStrings = array();
foreach ($this->cookies as $name => $val) {
$cookieStrings[] = $name.'='.$val;
}
curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookieStrings));
}
/*********************************************************
* Add any additional headers
*********************************************************/
if (count($this->headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
}
/*********************************************************
* Flag and Body for POST requests
*********************************************************/
if ($this->isPost) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postBody);
}
/*********************************************************
* Set User Agent
*********************************************************/
curl_setopt($ch, CURLOPT_USERAGENT, 'phpCAS/' . phpCAS::getVersion());
return $ch;
}
/**
* Store the response body.
* This method should NOT be used outside of the CurlRequest or the
* CurlMultiRequest.
*
* @param string $body body to stor
*
* @return void
*/
public function _storeResponseBody ($body)
{
$this->storeResponseBody($body);
}
/**
* Internal method for capturing the headers from a curl request.
*
* @param resource $ch handle of curl
* @param string $header header
*
* @return int
*/
public function _curlReadHeaders ($ch, $header)
{
$this->storeResponseHeader($header);
return strlen($header);
}
}
phpCAS-1.6.0/source/CAS/Request/Exception.php 0000664 0000000 0000000 00000002675 14330031177 0020652 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* An Exception for problems performing requests
*
* @class CAS_Request_Exception
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_Request_Exception
extends Exception
implements CAS_Exception
{
}
phpCAS-1.6.0/source/CAS/Request/MultiRequestInterface.php 0000664 0000000 0000000 00000005463 14330031177 0023176 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This interface defines a class library for performing multiple web requests
* in batches. Implementations of this interface may perform requests serially
* or in parallel.
*
* @class CAS_Request_MultiRequestInterface
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_Request_MultiRequestInterface
{
/*********************************************************
* Add Requests
*********************************************************/
/**
* Add a new Request to this batch.
* Note, implementations will likely restrict requests to their own concrete
* class hierarchy.
*
* @param CAS_Request_RequestInterface $request request interface
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been
* sent.
* @throws CAS_InvalidArgumentException If passed a Request of the wrong
* implmentation.
*/
public function addRequest (CAS_Request_RequestInterface $request);
/**
* Retrieve the number of requests added to this batch.
*
* @return int number of request elements
*/
public function getNumRequests ();
/*********************************************************
* 2. Send the Request
*********************************************************/
/**
* Perform the request. After sending, all requests will have their
* responses poulated.
*
* @return bool TRUE on success, FALSE on failure.
* @throws CAS_OutOfSequenceException If called multiple times.
*/
public function send ();
}
phpCAS-1.6.0/source/CAS/Request/RequestInterface.php 0000664 0000000 0000000 00000012511 14330031177 0022153 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* This interface defines a class library for performing web requests.
*
* @class CAS_Request_RequestInterface
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_Request_RequestInterface
{
/*********************************************************
* Configure the Request
*********************************************************/
/**
* Set the URL of the Request
*
* @param string $url url to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setUrl ($url);
/**
* Add a cookie to the request.
*
* @param string $name name of cookie
* @param string $value value of cookie
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addCookie ($name, $value);
/**
* Add an array of cookies to the request.
* The cookie array is of the form
* array('cookie_name' => 'cookie_value', 'cookie_name2' => cookie_value2')
*
* @param array $cookies cookies to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addCookies (array $cookies);
/**
* Add a header string to the request.
*
* @param string $header header to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addHeader ($header);
/**
* Add an array of header strings to the request.
*
* @param array $headers headers to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function addHeaders (array $headers);
/**
* Make the request a POST request rather than the default GET request.
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function makePost ();
/**
* Add a POST body to the request
*
* @param string $body body to add
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setPostBody ($body);
/**
* Specify the path to an SSL CA certificate to validate the server with.
*
* @param string $caCertPath path to cert file
* @param boolean $validate_cn validate CN of SSL certificate
*
* @return void
* @throws CAS_OutOfSequenceException If called after the Request has been sent.
*/
public function setSslCaCert ($caCertPath, $validate_cn = true);
/*********************************************************
* 2. Send the Request
*********************************************************/
/**
* Perform the request.
*
* @return bool TRUE on success, FALSE on failure.
* @throws CAS_OutOfSequenceException If called multiple times.
*/
public function send ();
/*********************************************************
* 3. Access the response
*********************************************************/
/**
* Answer the headers of the response.
*
* @return array An array of header strings.
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseHeaders ();
/**
* Answer HTTP status code of the response
*
* @return int
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseStatusCode ();
/**
* Answer the body of response.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getResponseBody ();
/**
* Answer a message describing any errors if the request failed.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the Request has been sent.
*/
public function getErrorMessage ();
}
phpCAS-1.6.0/source/CAS/ServiceBaseUrl/ 0000775 0000000 0000000 00000000000 14330031177 0017417 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/ServiceBaseUrl/AllowedListDiscovery.php 0000664 0000000 0000000 00000011673 14330031177 0024253 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Class that gets the service base URL of the PHP server by HTTP header
* discovery and allowlist check. This is used to generate service URL
* and PGT callback URL.
*
* @class CAS_ServiceBaseUrl_AllowedListDiscovery
* @category Authentication
* @package PhpCAS
* @author Henry Pan
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ServiceBaseUrl_AllowedListDiscovery
extends CAS_ServiceBaseUrl_Base
{
private $_list = array();
public function __construct($list) {
if (is_array($list)) {
if (count($list) === 0) {
throw new CAS_InvalidArgumentException('$list should not be empty');
}
foreach ($list as $value) {
$this->allow($value);
}
} else {
throw new CAS_TypeMismatchException($list, '$list', 'array');
}
}
/**
* Add a base URL to the allowed list.
*
* @param $url protocol, host name and port to add to the allowed list
*
* @return void
*/
public function allow($url)
{
$this->_list[] = $this->removeStandardPort($url);
}
/**
* Check if the server name is allowed by configuration.
*
* @param $name server name to check
*
* @return bool whether the allowed list contains the server name
*/
protected function isAllowed($name)
{
return in_array($name, $this->_list);
}
/**
* Discover the server name through HTTP headers.
*
* We read:
* - HTTP header X-Forwarded-Host
* - HTTP header X-Forwarded-Server and X-Forwarded-Port
* - HTTP header Host and SERVER_PORT
* - PHP SERVER_NAME (which can change based on the HTTP server used)
*
* The standard port will be omitted (80 for HTTP, 443 for HTTPS).
*
* @return string the discovered, unsanitized server protocol, hostname and port
*/
protected function discover()
{
$isHttps = $this->isHttps();
$protocol = $isHttps ? 'https' : 'http';
$protocol .= '://';
if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
// explode the host list separated by comma and use the first host
$hosts = explode(',', $_SERVER['HTTP_X_FORWARDED_HOST']);
// see rfc7239#5.3 and rfc7230#2.7.1: port is in HTTP_X_FORWARDED_HOST if non default
return $protocol . $hosts[0];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_SERVER'])) {
$server_url = $_SERVER['HTTP_X_FORWARDED_SERVER'];
} else {
if (empty($_SERVER['SERVER_NAME'])) {
$server_url = $_SERVER['HTTP_HOST'];
} else {
$server_url = $_SERVER['SERVER_NAME'];
}
}
if (!strpos($server_url, ':')) {
if (empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
$server_port = $_SERVER['SERVER_PORT'];
} else {
$ports = explode(',', $_SERVER['HTTP_X_FORWARDED_PORT']);
$server_port = $ports[0];
}
$server_url .= ':';
$server_url .= $server_port;
}
return $protocol . $server_url;
}
/**
* Get PHP server base URL.
*
* @return string the server protocol, hostname and port
*/
public function get()
{
phpCAS::traceBegin();
$result = $this->removeStandardPort($this->discover());
phpCAS::trace("Discovered server base URL: " . $result);
if ($this->isAllowed($result)) {
phpCAS::trace("Server base URL is allowed");
phpCAS::traceEnd(true);
} else {
$result = $this->_list[0];
phpCAS::trace("Server base URL is not allowed, using default: " . $result);
phpCAS::traceEnd(false);
}
return $result;
}
}
phpCAS-1.6.0/source/CAS/ServiceBaseUrl/Base.php 0000664 0000000 0000000 00000006202 14330031177 0021002 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Base class of CAS/ServiceBaseUrl that implements isHTTPS method.
*
* @class CAS_ServiceBaseUrl_Base
* @category Authentication
* @package PhpCAS
* @author Henry Pan
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
abstract class CAS_ServiceBaseUrl_Base
implements CAS_ServiceBaseUrl_Interface
{
/**
* Get PHP server name.
*
* @return string the server hostname and port of the server
*/
abstract public function get();
/**
* Check whether HTTPS is used.
*
* This is used to construct the protocol in the URL.
*
* @return bool true if HTTPS is used
*/
public function isHttps() {
if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
return ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTOCOL'])) {
return ($_SERVER['HTTP_X_FORWARDED_PROTOCOL'] === 'https');
} elseif ( isset($_SERVER['HTTPS'])
&& !empty($_SERVER['HTTPS'])
&& strcasecmp($_SERVER['HTTPS'], 'off') !== 0
) {
return true;
}
return false;
}
/**
* Remove standard HTTP and HTTPS port for discovery and allowlist input.
*
* @param $url URL as https://domain:port without trailing slash
* @return standardized URL, or the original URL
* @throws CAS_InvalidArgumentException if the URL does not include the protocol
*/
protected function removeStandardPort($url) {
if (strpos($url, "://") === false) {
throw new CAS_InvalidArgumentException(
"Configured base URL should include the protocol string: " . $url);
}
$url = rtrim($url, '/');
if (strpos($url, "https://") === 0 && substr_compare($url, ':443', -4) === 0) {
return substr($url, 0, -4);
}
if (strpos($url, "http://") === 0 && substr_compare($url, ':80', -3) === 0) {
return substr($url, 0, -3);
}
return $url;
}
}
phpCAS-1.6.0/source/CAS/ServiceBaseUrl/Interface.php 0000664 0000000 0000000 00000003636 14330031177 0022040 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* An interface for classes that gets the server name of the PHP server.
* This is used to generate service URL and PGT callback URL.
*
* @class CAS_ServiceBaseUrl_Interface
* @category Authentication
* @package PhpCAS
* @author Henry Pan
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
interface CAS_ServiceBaseUrl_Interface
{
/**
* Get PHP HTTP protocol and server name.
*
* @return string protocol, server hostname, and optionally port,
* without trailing slash (https://localhost:8443)
*/
public function get();
/**
* Check whether HTTPS is used.
*
* This is used to construct the protocol in the URL.
*
* @return bool true if HTTPS is used
*/
public function isHttps();
}
phpCAS-1.6.0/source/CAS/ServiceBaseUrl/Static.php 0000664 0000000 0000000 00000004177 14330031177 0021370 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Class that gets the server name of the PHP server by statically set
* hostname and port. This is used to generate service URL and PGT
* callback URL.
*
* @class CAS_ServiceBaseUrl_Static
* @category Authentication
* @package PhpCAS
* @author Henry Pan
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ServiceBaseUrl_Static
extends CAS_ServiceBaseUrl_Base
{
private $_name = null;
public function __construct($name) {
if (is_string($name)) {
$this->_name = $this->removeStandardPort($name);
} else {
throw new CAS_TypeMismatchException($name, '$name', 'string');
}
}
/**
* Get the server name through static config.
*
* @return string the server hostname and port of the server configured
*/
public function get()
{
phpCAS::traceBegin();
phpCAS::trace("Returning static server name: " . $this->_name);
phpCAS::traceEnd(true);
return $this->_name;
}
} phpCAS-1.6.0/source/CAS/Session/ 0000775 0000000 0000000 00000000000 14330031177 0016164 5 ustar 00root root 0000000 0000000 phpCAS-1.6.0/source/CAS/Session/PhpSession.php 0000664 0000000 0000000 00000003046 14330031177 0020773 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Empty class used as a default implementation for phpCAS.
*
* Implements the standard PHP session handler without no alterations.
*
* @class CAS_Session_PhpSession
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_Session_PhpSession extends SessionHandler implements SessionHandlerInterface
{
}
phpCAS-1.6.0/source/CAS/TypeMismatchException.php 0000664 0000000 0000000 00000004373 14330031177 0021547 0 ustar 00root root 0000000 0000000
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Exception that denotes invalid arguments were passed.
*
* @class CAS_InvalidArgumentException
* @category Authentication
* @package PhpCAS
* @author Adam Franco
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_TypeMismatchException
extends CAS_InvalidArgumentException
{
/**
* Constructor, provides a nice message.
*
* @param mixed $argument Argument
* @param string $argumentName Argument Name
* @param string $type Type
* @param string $message Error Message
* @param integer $code Code
*
* @return void
*/
public function __construct (
$argument, $argumentName, $type, $message = '', $code = 0
) {
if (is_object($argument)) {
$foundType = get_class($argument).' object';
} else {
$foundType = gettype($argument);
}
parent::__construct(
'type mismatched for parameter '
. $argumentName . ' (should be \'' . $type .' \'), '
. $foundType . ' given. ' . $message, $code
);
}
}
?>