Merge branch 'MDL-43197-master-2nd' of git://github.com/FMCorz/moodle
authorMarina Glancy <marina@moodle.com>
Tue, 19 Aug 2014 05:25:32 +0000 (13:25 +0800)
committerMarina Glancy <marina@moodle.com>
Tue, 19 Aug 2014 05:25:32 +0000 (13:25 +0800)
90 files changed:
admin/auth_config.php
auth/cas/CAS/CAS.php
auth/cas/CAS/CAS/AuthenticationException.php
auth/cas/CAS/CAS/Autoload.php
auth/cas/CAS/CAS/Client.php
auth/cas/CAS/CAS/CookieJar.php
auth/cas/CAS/CAS/Languages/German.php
auth/cas/CAS/CAS/OutOfSequenceBeforeAuthenticationCallException.php [new file with mode: 0644]
auth/cas/CAS/CAS/OutOfSequenceBeforeClientException.php [new file with mode: 0644]
auth/cas/CAS/CAS/OutOfSequenceBeforeProxyException.php [new file with mode: 0644]
auth/cas/CAS/CAS/PGTStorage/AbstractStorage.php
auth/cas/CAS/CAS/PGTStorage/Db.php
auth/cas/CAS/CAS/ProxiedService/Abstract.php
auth/cas/CAS/CAS/ProxiedService/Http/Abstract.php
auth/cas/CAS/CAS/ProxiedService/Http/Get.php
auth/cas/CAS/CAS/ProxiedService/Http/Post.php
auth/cas/CAS/CAS/ProxiedService/Imap.php
auth/cas/CAS/CAS/ProxiedService/Testable.php
auth/cas/CAS/CAS/ProxyChain.php
auth/cas/CAS/CAS/ProxyTicketException.php
auth/cas/CAS/CAS/Request/AbstractRequest.php
auth/cas/CAS/CAS/Request/CurlMultiRequest.php
auth/cas/CAS/CAS/Request/CurlRequest.php
auth/cas/CAS/CAS/TypeMismatchException.php [new file with mode: 0644]
auth/cas/CAS/moodle_readme.txt
auth/cas/thirdpartylibs.xml
cache/stores/memcache/lib.php
cache/stores/memcached/lib.php
config-dist.php
course/classes/management_renderer.php
lib/classes/session/memcached.php
lib/classes/task/send_new_user_passwords_task.php
lib/ddl/tests/ddl_test.php
lib/javascript.php
lib/moodlelib.php
lib/navigationlib.php
lib/statslib.php
lib/tests/moodlelib_test.php
mod/choice/lib.php
mod/choice/view.php
mod/forum/db/install.xml
mod/forum/db/upgrade.php
mod/forum/version.php
mod/scorm/aicc.php
mod/scorm/datamodel.php
mod/scorm/datamodels/aicc.js
mod/scorm/datamodels/aicclib.php
mod/scorm/datamodels/debug.js.php
mod/scorm/datamodels/scorm_12.js
mod/scorm/datamodels/scorm_12.php
mod/scorm/datamodels/scorm_12lib.php
mod/scorm/datamodels/scorm_13.js
mod/scorm/datamodels/scorm_13.php
mod/scorm/datamodels/scorm_13lib.php
mod/scorm/datamodels/scormlib.php
mod/scorm/datamodels/sequencinghandler.php
mod/scorm/datamodels/sequencinglib.php
mod/scorm/db/log.php
mod/scorm/db/subplugins.php
mod/scorm/grade.php
mod/scorm/index.php
mod/scorm/lib.php
mod/scorm/loadSCO.php
mod/scorm/locallib.php
mod/scorm/module.js
mod/scorm/player.js
mod/scorm/player.php
mod/scorm/prereqs.php
mod/scorm/report.php
mod/scorm/report/basic/report.php
mod/scorm/report/default.php
mod/scorm/report/graphs/report.php
mod/scorm/report/graphs/version.php
mod/scorm/report/interactions/report.php
mod/scorm/report/interactions/responsessettings_form.php
mod/scorm/report/interactions/version.php
mod/scorm/report/objectives/report.php
mod/scorm/report/reportlib.php
mod/scorm/report/userreport.php
mod/scorm/report/userreportinteractions.php
mod/scorm/settings.php
mod/scorm/tabs.php
mod/scorm/tests/formatduration_test.php
mod/scorm/tests/generator_test.php
mod/scorm/upgrade.txt [new file with mode: 0644]
mod/scorm/view.js
mod/scorm/view.php
question/format.php
question/type/edit_question_form.php
theme/javascript.php

index ed5fb41..e1a0fb0 100644 (file)
@@ -142,14 +142,14 @@ function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts,
         $fieldname = $field;
         if ($fieldname === 'lang') {
             $fieldname = get_string('language');
-        } elseif (preg_match('/^(.+?)(\d+)$/', $fieldname, $matches)) {
-            $fieldname =  get_string($matches[1]) . ' ' . $matches[2];
-        } elseif ($fieldname == 'url') {
-            $fieldname = get_string('webpage');
         } elseif (!empty($customfields) && in_array($field, $customfields)) {
             // If custom field then pick name from database.
             $fieldshortname = str_replace('profile_field_', '', $fieldname);
             $fieldname = $customfieldname[$fieldshortname]->name;
+        } elseif (preg_match('/^(.+?)(\d+)$/', $fieldname, $matches)) {
+            $fieldname =  get_string($matches[1]) . ' ' . $matches[2];
+        } elseif ($fieldname == 'url') {
+            $fieldname = get_string('webpage');
         } else {
             $fieldname = get_string($fieldname);
         }
index 6efafce..63b6ce4 100644 (file)
@@ -63,7 +63,7 @@ if (!defined('E_USER_DEPRECATED')) {
 /**
  * phpCAS version. accessible for the user by phpCAS::getVersion().
  */
-define('PHPCAS_VERSION', '1.3.2');
+define('PHPCAS_VERSION', '1.3.3');
 
 /**
  * @addtogroup public
@@ -78,6 +78,10 @@ define("CAS_VERSION_1_0", '1.0');
  * CAS version 2.0
 */
 define("CAS_VERSION_2_0", '2.0');
+/**
+ * CAS version 3.0
+ */
+define("CAS_VERSION_3_0", '3.0');
 
 // ------------------------------------------------------------------------
 //  SAML defines
@@ -318,18 +322,6 @@ class phpCAS
         if (is_object(self::$_PHPCAS_CLIENT)) {
             phpCAS :: error(self::$_PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . self::$_PHPCAS_INIT_CALL['file'] . ':' . self::$_PHPCAS_INIT_CALL['line'] . ')');
         }
-        if (gettype($server_version) != 'string') {
-            phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
-        }
-        if (gettype($server_hostname) != 'string') {
-            phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
-        }
-        if (gettype($server_port) != 'integer') {
-            phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
-        }
-        if (gettype($server_uri) != 'string') {
-            phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
-        }
 
         // store where the initializer is called from
         $dbg = debug_backtrace();
@@ -341,10 +333,14 @@ class phpCAS
         );
 
         // initialize the object $_PHPCAS_CLIENT
-        self::$_PHPCAS_CLIENT = new CAS_Client(
-            $server_version, false, $server_hostname, $server_port, $server_uri,
-            $changeSessionID
-        );
+        try {
+            self::$_PHPCAS_CLIENT = new CAS_Client(
+                $server_version, false, $server_hostname, $server_port, $server_uri,
+                $changeSessionID
+            );
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
+        }
         phpCAS :: traceEnd();
     }
 
@@ -370,18 +366,6 @@ class phpCAS
         if (is_object(self::$_PHPCAS_CLIENT)) {
             phpCAS :: error(self::$_PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . self::$_PHPCAS_INIT_CALL['file'] . ':' . self::$_PHPCAS_INIT_CALL['line'] . ')');
         }
-        if (gettype($server_version) != 'string') {
-            phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
-        }
-        if (gettype($server_hostname) != 'string') {
-            phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
-        }
-        if (gettype($server_port) != 'integer') {
-            phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
-        }
-        if (gettype($server_uri) != 'string') {
-            phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
-        }
 
         // store where the initialzer is called from
         $dbg = debug_backtrace();
@@ -393,10 +377,14 @@ class phpCAS
         );
 
         // initialize the object $_PHPCAS_CLIENT
-        self::$_PHPCAS_CLIENT = new CAS_Client(
-            $server_version, true, $server_hostname, $server_port, $server_uri,
-            $changeSessionID
-        );
+        try {
+            self::$_PHPCAS_CLIENT = new CAS_Client(
+                $server_version, true, $server_hostname, $server_port, $server_uri,
+                $changeSessionID
+            );
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
+        }
         phpCAS :: traceEnd();
     }
 
@@ -636,13 +624,13 @@ class phpCAS
      */
     public static function setLang($lang)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($lang) != 'string') {
-            phpCAS :: error('type mismatched for parameter $lang (should be `string\')');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setLang($lang);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setLang($lang);
     }
 
     /** @} */
@@ -682,13 +670,13 @@ class phpCAS
      */
     public static function setHTMLHeader($header)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($header) != 'string') {
-            phpCAS :: error('type mismatched for parameter $header (should be `string\')');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setHTMLHeader($header);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setHTMLHeader($header);
     }
 
     /**
@@ -700,13 +688,13 @@ class phpCAS
      */
     public static function setHTMLFooter($footer)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($footer) != 'string') {
-            phpCAS :: error('type mismatched for parameter $footer (should be `string\')');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setHTMLFooter($footer);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setHTMLFooter($footer);
     }
 
     /** @} */
@@ -729,19 +717,13 @@ class phpCAS
     public static function setPGTStorage($storage)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called before ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() (called at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ')');
-        }
-        if ( !($storage instanceof CAS_PGTStorage) ) {
-            phpCAS :: error('type mismatched for parameter $storage (should be a CAS_PGTStorage `object\')');
+        phpCAS::_validateProxyExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setPGTStorage($storage);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setPGTStorage($storage);
         phpCAS :: traceEnd();
     }
 
@@ -766,25 +748,13 @@ class phpCAS
         $password='', $table='', $driver_options=null
     ) {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called before ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() (called at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ')');
-        }
-        if (gettype($username) != 'string') {
-            phpCAS :: error('type mismatched for parameter $username (should be `string\')');
-        }
-        if (gettype($password) != 'string') {
-            phpCAS :: error('type mismatched for parameter $password (should be `string\')');
-        }
-        if (gettype($table) != 'string') {
-            phpCAS :: error('type mismatched for parameter $table (should be `string\')');
+        phpCAS::_validateProxyExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setPGTStorageDb($dsn_or_pdo, $username, $password, $table, $driver_options);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setPGTStorageDb($dsn_or_pdo, $username, $password, $table, $driver_options);
         phpCAS :: traceEnd();
     }
 
@@ -799,19 +769,13 @@ class phpCAS
     public static function setPGTStorageFile($path = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called before ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() (called at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ')');
-        }
-        if (gettype($path) != 'string') {
-            phpCAS :: error('type mismatched for parameter $path (should be `string\')');
+        phpCAS::_validateProxyExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setPGTStorageFile($path);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setPGTStorageFile($path);
         phpCAS :: traceEnd();
     }
     /** @} */
@@ -836,23 +800,13 @@ class phpCAS
     public static function getProxiedService ($type)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
-        }
-        if (gettype($type) != 'string') {
-            phpCAS :: error('type mismatched for parameter $type (should be `string\')');
-        }
+        phpCAS::_validateProxyExists();
 
-        $res = self::$_PHPCAS_CLIENT->getProxiedService($type);
+        try {
+            $res = self::$_PHPCAS_CLIENT->getProxiedService($type);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
+        }
 
         phpCAS :: traceEnd();
         return $res;
@@ -872,20 +826,13 @@ class phpCAS
      */
     public static function initializeProxiedService (CAS_ProxiedService $proxiedService)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
-        }
+        phpCAS::_validateProxyExists();
 
-        self::$_PHPCAS_CLIENT->initializeProxiedService($proxiedService);
+        try {
+            self::$_PHPCAS_CLIENT->initializeProxiedService($proxiedService);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
+        }
     }
 
     /**
@@ -906,23 +853,13 @@ class phpCAS
     public static function serviceWeb($url, & $err_code, & $output)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-        }
+        phpCAS::_validateProxyExists();
 
-        $res = self::$_PHPCAS_CLIENT->serviceWeb($url, $err_code, $output);
+        try {
+            $res = self::$_PHPCAS_CLIENT->serviceWeb($url, $err_code, $output);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
+        }
 
         phpCAS :: traceEnd($res);
         return $res;
@@ -950,28 +887,14 @@ class phpCAS
     public static function serviceMail($url, $service, $flags, & $err_code, & $err_msg, & $pt)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string\')');
-        }
+        phpCAS::_validateProxyExists();
 
-        if (gettype($flags) != 'integer') {
-            phpCAS :: error('type mismatched for parameter $flags (should be `integer\')');
+        try {
+            $res = self::$_PHPCAS_CLIENT->serviceMail($url, $service, $flags, $err_code, $err_msg, $pt);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
 
-        $res = self::$_PHPCAS_CLIENT->serviceMail($url, $service, $flags, $err_code, $err_msg, $pt);
-
         phpCAS :: traceEnd($res);
         return $res;
     }
@@ -998,13 +921,13 @@ class phpCAS
      */
     public static function setCacheTimesForAuthRecheck($n)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($n) != 'integer') {
-            phpCAS :: error('type mismatched for parameter $n (should be `integer\')');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);
     }
 
     /**
@@ -1028,9 +951,7 @@ class phpCAS
      */
     public static function setPostAuthenticateCallback ($function, array $additionalArgs = array())
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
 
         self::$_PHPCAS_CLIENT->setPostAuthenticateCallback($function, $additionalArgs);
     }
@@ -1051,9 +972,7 @@ class phpCAS
      */
     public static function setSingleSignoutCallback ($function, array $additionalArgs = array())
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
 
         self::$_PHPCAS_CLIENT->setSingleSignoutCallback($function, $additionalArgs);
     }
@@ -1071,9 +990,7 @@ class phpCAS
     public static function checkAuthentication()
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
 
         $auth = self::$_PHPCAS_CLIENT->checkAuthentication();
 
@@ -1094,16 +1011,13 @@ class phpCAS
     public static function forceAuthentication()
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-
+        phpCAS::_validateClientExists();
         $auth = self::$_PHPCAS_CLIENT->forceAuthentication();
 
         // store where the authentication has been checked and the result
         self::$_PHPCAS_CLIENT->markAuthenticationCall($auth);
 
-        /*             if (!$auth) {
+        /*      if (!$auth) {
          phpCAS :: trace('user is not authenticated, redirecting to the CAS server');
         self::$_PHPCAS_CLIENT->forceAuthentication();
         } else {
@@ -1122,9 +1036,8 @@ class phpCAS
     public static function renewAuthentication()
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         $auth = self::$_PHPCAS_CLIENT->renewAuthentication();
 
         // store where the authentication has been checked and the result
@@ -1143,9 +1056,7 @@ class phpCAS
     public static function isAuthenticated()
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
 
         // call the isAuthenticated method of the $_PHPCAS_CLIENT object
         $auth = self::$_PHPCAS_CLIENT->isAuthenticated();
@@ -1166,9 +1077,8 @@ class phpCAS
      */
     public static function isSessionAuthenticated()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         return (self::$_PHPCAS_CLIENT->isSessionAuthenticated());
     }
 
@@ -1176,65 +1086,56 @@ class phpCAS
      * This method returns the CAS user's login name.
      *
      * @return string the login name of the authenticated user
-     * @warning should not be called only after phpCAS::forceAuthentication()
+     * @warning should only be called after phpCAS::forceAuthentication()
      * or phpCAS::checkAuthentication().
      * */
     public static function getUser()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
+        phpCAS::_validateClientExists();
+
+        try {
+            return self::$_PHPCAS_CLIENT->getUser();
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        return self::$_PHPCAS_CLIENT->getUser();
     }
 
     /**
      * Answer attributes about the authenticated user.
      *
-     * @warning should not be called only after phpCAS::forceAuthentication()
+     * @warning should only be called after phpCAS::forceAuthentication()
      * or phpCAS::checkAuthentication().
      *
      * @return array
      */
     public static function getAttributes()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
+        phpCAS::_validateClientExists();
+
+        try {
+            return self::$_PHPCAS_CLIENT->getAttributes();
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        return self::$_PHPCAS_CLIENT->getAttributes();
     }
 
     /**
      * Answer true if there are attributes for the authenticated user.
      *
-     * @warning should not be called only after phpCAS::forceAuthentication()
+     * @warning should only be called after phpCAS::forceAuthentication()
      * or phpCAS::checkAuthentication().
      *
      * @return bool
      */
     public static function hasAttributes()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
+        phpCAS::_validateClientExists();
+
+        try {
+            return self::$_PHPCAS_CLIENT->hasAttributes();
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        return self::$_PHPCAS_CLIENT->hasAttributes();
     }
 
     /**
@@ -1243,21 +1144,18 @@ class phpCAS
      * @param string $key attribute name
      *
      * @return bool
-     * @warning should not be called only after phpCAS::forceAuthentication()
+     * @warning should only be called after phpCAS::forceAuthentication()
      * or phpCAS::checkAuthentication().
      */
     public static function hasAttribute($key)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
+        phpCAS::_validateClientExists();
+
+        try {
+            return self::$_PHPCAS_CLIENT->hasAttribute($key);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        return self::$_PHPCAS_CLIENT->hasAttribute($key);
     }
 
     /**
@@ -1266,21 +1164,18 @@ class phpCAS
      * @param string $key attribute name
      *
      * @return mixed string for a single value or an array if multiple values exist.
-     * @warning should not be called only after phpCAS::forceAuthentication()
+     * @warning should only be called after phpCAS::forceAuthentication()
      * or phpCAS::checkAuthentication().
      */
     public static function getAttribute($key)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCalled()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
-        }
-        if (!self::$_PHPCAS_CLIENT->wasAuthenticationCallSuccessful()) {
-            phpCAS :: error('authentication was checked (by ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod() . '() at ' . self::$_PHPCAS_CLIENT->getAuthenticationCallerFile() . ':' . self::$_PHPCAS_CLIENT->getAuthenticationCallerLine() . ') but the method returned false');
+        phpCAS::_validateClientExists();
+
+        try {
+            return self::$_PHPCAS_CLIENT->getAttribute($key);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        return self::$_PHPCAS_CLIENT->getAttribute($key);
     }
 
     /**
@@ -1293,9 +1188,8 @@ class phpCAS
      */
     public static function handleLogoutRequests($check_client = true, $allowed_clients = false)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         return (self::$_PHPCAS_CLIENT->handleLogoutRequests($check_client, $allowed_clients));
     }
 
@@ -1307,9 +1201,8 @@ class phpCAS
      */
     public static function getServerLoginURL()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         return self::$_PHPCAS_CLIENT->getServerLoginURL();
     }
 
@@ -1324,13 +1217,14 @@ class phpCAS
     public static function setServerLoginURL($url = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after' . __CLASS__ . '::client()');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string`)');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setServerLoginURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setServerLoginURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1345,13 +1239,14 @@ class phpCAS
     public static function setServerServiceValidateURL($url = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after' . __CLASS__ . '::client()');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string`)');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setServerServiceValidateURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setServerServiceValidateURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1366,13 +1261,14 @@ class phpCAS
     public static function setServerProxyValidateURL($url = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after' . __CLASS__ . '::client()');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string`)');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setServerProxyValidateURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setServerProxyValidateURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1386,13 +1282,14 @@ class phpCAS
     public static function setServerSamlValidateURL($url = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after' . __CLASS__ . '::client()');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be`string\')');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setServerSamlValidateURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setServerSamlValidateURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1404,9 +1301,8 @@ class phpCAS
      */
     public static function getServerLogoutURL()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         return self::$_PHPCAS_CLIENT->getServerLogoutURL();
     }
 
@@ -1421,17 +1317,14 @@ class phpCAS
     public static function setServerLogoutURL($url = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error(
-                'this method should only be called after' . __CLASS__ . '::client()'
-            );
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error(
-                'type mismatched for parameter $url (should be `string`)'
-            );
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setServerLogoutURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setServerLogoutURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1446,9 +1339,8 @@ class phpCAS
     public static function logout($params = "")
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         $parsedParams = array ();
         if ($params != "") {
             if (is_string($params)) {
@@ -1480,9 +1372,8 @@ class phpCAS
     public static function logoutWithRedirectService($service)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         if (!is_string($service)) {
             phpCAS :: error('type mismatched for parameter $service (should be `string\')');
         }
@@ -1532,9 +1423,8 @@ class phpCAS
     {
         trigger_error('Function deprecated for cas servers >= 3.3.5.1', E_USER_DEPRECATED);
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         if (!is_string($service)) {
             phpCAS :: error('type mismatched for parameter $service (should be `string\')');
         }
@@ -1563,16 +1453,14 @@ class phpCAS
     public static function setFixedCallbackURL($url = '')
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (!self::$_PHPCAS_CLIENT->isProxy()) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+        phpCAS::_validateProxyExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setCallbackURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setCallbackURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1587,13 +1475,14 @@ class phpCAS
     public static function setFixedServiceURL($url)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($url) != 'string') {
-            phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+        phpCAS::_validateProxyExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setURL($url);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setURL($url);
+
         phpCAS :: traceEnd();
     }
 
@@ -1604,9 +1493,7 @@ class phpCAS
      */
     public static function getServiceURL()
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateProxyExists();
         return (self::$_PHPCAS_CLIENT->getURL());
     }
 
@@ -1621,13 +1508,13 @@ class phpCAS
      */
     public static function retrievePT($target_service, & $err_code, & $err_msg)
     {
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($target_service) != 'string') {
-            phpCAS :: error('type mismatched for parameter $target_service(should be `string\')');
+        phpCAS::_validateProxyExists();
+
+        try {
+            return (self::$_PHPCAS_CLIENT->retrievePT($target_service, $err_code, $err_msg));
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        return (self::$_PHPCAS_CLIENT->retrievePT($target_service, $err_code, $err_msg));
     }
 
     /**
@@ -1642,16 +1529,14 @@ class phpCAS
     public static function setCasServerCACert($cert, $validate_cn = true)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
-        if (gettype($cert) != 'string') {
-            phpCAS :: error('type mismatched for parameter $cert (should be `string\')');
-        }
-        if (gettype($validate_cn) != 'boolean') {\r
-            phpCAS :: error('type mismatched for parameter $validate_cn (should be `boolean\')');\r
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->setCasServerCACert($cert, $validate_cn);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->setCasServerCACert($cert, $validate_cn);
+
         phpCAS :: traceEnd();
     }
 
@@ -1663,9 +1548,8 @@ class phpCAS
     public static function setNoCasServerValidation()
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         phpCAS :: trace('You have configured no validation of the legitimacy of the cas server. This is not recommended for production use.');
         self::$_PHPCAS_CLIENT->setNoCasServerValidation();
         phpCAS :: traceEnd();
@@ -1684,9 +1568,8 @@ class phpCAS
     public static function setNoClearTicketsFromUrl()
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         self::$_PHPCAS_CLIENT->setNoClearTicketsFromUrl();
         phpCAS :: traceEnd();
     }
@@ -1705,9 +1588,8 @@ class phpCAS
     public static function setExtraCurlOption($key, $value)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
+        phpCAS::_validateClientExists();
+
         self::$_PHPCAS_CLIENT->setExtraCurlOption($key, $value);
         phpCAS :: traceEnd();
     }
@@ -1751,11 +1633,11 @@ class phpCAS
     public static function allowProxyChain(CAS_ProxyChain_Interface $proxy_chain)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
-        if (self::$_PHPCAS_CLIENT->getServerVersion() !== CAS_VERSION_2_0) {
-            phpCAS :: error('this method can only be used with the cas 2.0 protool');
+        phpCAS::_validateClientExists();
+
+        if (self::$_PHPCAS_CLIENT->getServerVersion() !== CAS_VERSION_2_0
+            && self::$_PHPCAS_CLIENT->getServerVersion() !== CAS_VERSION_3_0) {
+            phpCAS :: error('this method can only be used with the cas 2.0/3.0 protocols');
         }
         self::$_PHPCAS_CLIENT->getAllowedProxyChains()->allowProxyChain($proxy_chain);
         phpCAS :: traceEnd();
@@ -1772,9 +1654,7 @@ class phpCAS
      */
     public static function getProxies ()
     {
-        if ( !is_object(self::$_PHPCAS_CLIENT) ) {
-            phpCAS::error('this method should only be called after '.__CLASS__.'::client()');
-        }
+        phpCAS::_validateProxyExists();
 
         return(self::$_PHPCAS_CLIENT->getProxies());
     }
@@ -1795,13 +1675,14 @@ class phpCAS
     {
         phpCAS::traceBegin();
         phpCAS::log('rebroadcastNodeUrl:'.$rebroadcastNodeUrl);
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
-        }
-        if ( !(bool)preg_match("/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i", $rebroadcastNodeUrl)) {
-            phpCAS::error('type mismatched for parameter $rebroadcastNodeUrl (should be `url\')');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->addRebroadcastNode($rebroadcastNodeUrl);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->addRebroadcastNode($rebroadcastNodeUrl);
+
         phpCAS::traceEnd();
     }
 
@@ -1816,14 +1697,45 @@ class phpCAS
     public static function addRebroadcastHeader($header)
     {
         phpCAS :: traceBegin();
-        if (!is_object(self::$_PHPCAS_CLIENT)) {
-            phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+        phpCAS::_validateClientExists();
+
+        try {
+            self::$_PHPCAS_CLIENT->addRebroadcastHeader($header);
+        } catch (Exception $e) {
+            phpCAS :: error(get_class($e) . ': ' . $e->getMessage());
         }
-        self::$_PHPCAS_CLIENT->addRebroadcastHeader($header);
+
         phpCAS :: traceEnd();
     }
-}
 
+    /**
+     * Checks if a client already exists
+     *
+     * @throws CAS_OutOfSequenceBeforeClientException
+     *
+     * @return void
+     */
+    private static function _validateClientExists()
+    {
+        if (!is_object(self::$_PHPCAS_CLIENT)) {
+            throw new CAS_OutOfSequenceBeforeClientException();
+        }
+    }
+
+    /**
+     * Checks of a proxy client aready exists
+     *
+     * @throws CAS_OutOfSequenceBeforeProxyException
+     *
+     * @return void
+     */
+    private static function _validateProxyExists()
+    {
+        if (!is_object(self::$_PHPCAS_CLIENT)) {
+            throw new CAS_OutOfSequenceBeforeProxyException();
+        }
+    }
+}
 // ########################################################################
 // DOCUMENTATION
 // ########################################################################
index 801156e..a14154d 100644 (file)
@@ -74,7 +74,7 @@ implements CAS_Exception
         printf(
             $lang->getYouWereNotAuthenticated(),
             htmlentities($client->getURL()),
-            $_SERVER['SERVER_ADMIN']
+            isset($_SERVER['SERVER_ADMIN']) ? $_SERVER['SERVER_ADMIN']:''
         );
         phpCAS::trace('CAS URL: '.$cas_url);
         phpCAS::trace('Authentication failure: '.$failure);
@@ -89,6 +89,7 @@ implements CAS_Exception
                     phpCAS::trace('Reason: CAS error');
                     break;
                 case CAS_VERSION_2_0:
+                case CAS_VERSION_3_0:
                     if ( empty($err_code) ) {
                         phpCAS::trace('Reason: no CAS error');
                     } else {
index c7d436e..e56dbdf 100644 (file)
@@ -25,35 +25,39 @@ function CAS_autoload($class)
 {
     // Static to hold the Include Path to CAS
     static $include_path;
-    // Setup the include path if it's not already set from a previous call
-    if (!$include_path) {
-        $include_path = dirname(dirname(__FILE__));
-    }
+    // Check only for CAS classes
     if (substr($class, 0, 4) !== 'CAS_') {
         return false;
     }
+    // Setup the include path if it's not already set from a previous call
+    if (empty($include_path)) {
+        $include_path = array(dirname(dirname(__FILE__)), dirname(dirname(__FILE__)) . '/../test/' );
+    }
+
     // Declare local variable to store the expected full path to the file
-    $file_path = $include_path . '/' . str_replace('_', '/', $class) . '.php';
 
-    $fp = @fopen($file_path, 'r', true);
-    if ($fp) {
-        fclose($fp);
-        include $file_path;
-        if (!class_exists($class, false) && !interface_exists($class, false)) {
-            die(
-                new Exception(
-                    'Class ' . $class . ' was not present in ' .
-                    $file_path .
-                    ' [CAS_autoload]'
-                )
-            );
+    foreach ($include_path as $path) {
+        $file_path = $path . '/' . str_replace('_', '/', $class) . '.php';
+        $fp = @fopen($file_path, 'r', true);
+        if ($fp) {
+            fclose($fp);
+            include $file_path;
+            if (!class_exists($class, false) && !interface_exists($class, false)) {
+                die(
+                    new Exception(
+                        'Class ' . $class . ' was not present in ' .
+                        $file_path .
+                        ' [CAS_autoload]'
+                    )
+                );
+            }
+            return true;
         }
-        return true;
     }
     $e = new Exception(
         'Class ' . $class . ' could not be loaded from ' .
         $file_path . ', file does not exist (Path="'
-        . $include_path .'") [CAS_autoload]'
+        . implode(':', $include_path) .'") [CAS_autoload]'
     );
     $trace = $e->getTrace();
     if (isset($trace[2]) && isset($trace[2]['function'])
@@ -71,9 +75,13 @@ function CAS_autoload($class)
 
 // set up __autoload
 if (function_exists('spl_autoload_register')) {
-    if (!(spl_autoload_functions()) || !in_array('CAS_autoload', spl_autoload_functions())) {
+    if (!(spl_autoload_functions())
+        || !in_array('CAS_autoload', spl_autoload_functions())
+    ) {
         spl_autoload_register('CAS_autoload');
-        if (function_exists('__autoload') && !in_array('__autoload', spl_autoload_functions())) {
+        if (function_exists('__autoload')
+            && !in_array('__autoload', spl_autoload_functions())
+        ) {
             // __autoload() was being used, but now would be ignored, add
             // it to the autoload stack
             spl_autoload_register('__autoload');
index f5d0d4e..40e77cd 100644 (file)
@@ -147,6 +147,10 @@ class CAS_Client
      */
     public function setHTMLHeader($header)
     {
+       // Argument Validation
+       if (gettype($header) != 'string')
+               throw new CAS_TypeMismatchException($header, '$header', 'string');
+
         $this->_output_header = $header;
     }
 
@@ -159,6 +163,10 @@ class CAS_Client
      */
     public function setHTMLFooter($footer)
     {
+       // Argument Validation
+       if (gettype($footer) != 'string')
+               throw new CAS_TypeMismatchException($footer, '$footer', 'string');
+
         $this->_output_footer = $footer;
     }
 
@@ -190,10 +198,16 @@ class CAS_Client
      */
     public function setLang($lang)
     {
+       // Argument Validation
+       if (gettype($lang) != 'string')
+               throw new CAS_TypeMismatchException($lang, '$lang', 'string');
+
         phpCAS::traceBegin();
         $obj = new $lang();
         if (!($obj instanceof CAS_Languages_LanguageInterface)) {
-            throw new CAS_InvalidArgumentException('$className must implement the CAS_Languages_LanguageInterface');
+            throw new CAS_InvalidArgumentException(
+                '$className must implement the CAS_Languages_LanguageInterface'
+            );
         }
         $this->_lang = $lang;
         phpCAS::traceEnd();
@@ -350,6 +364,10 @@ class CAS_Client
      */
     public function setServerLoginURL($url)
     {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         return $this->_server['login_url'] = $url;
     }
 
@@ -363,6 +381,10 @@ class CAS_Client
      */
     public function setServerServiceValidateURL($url)
     {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         return $this->_server['service_validate_url'] = $url;
     }
 
@@ -376,6 +398,10 @@ class CAS_Client
      */
     public function setServerProxyValidateURL($url)
     {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         return $this->_server['proxy_validate_url'] = $url;
     }
 
@@ -389,6 +415,10 @@ class CAS_Client
      */
     public function setServerSamlValidateURL($url)
     {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         return $this->_server['saml_validate_url'] = $url;
     }
 
@@ -412,9 +442,16 @@ class CAS_Client
                 $this->_server['service_validate_url'] = $this->_getServerBaseURL()
                 .'serviceValidate';
                 break;
+            case CAS_VERSION_3_0:
+                $this->_server['service_validate_url'] = $this->_getServerBaseURL()
+                .'p3/serviceValidate';
+                break;
             }
         }
-        $url = $this->_buildQueryUrl($this->_server['service_validate_url'], 'service='.urlencode($this->getURL()));
+        $url = $this->_buildQueryUrl(
+            $this->_server['service_validate_url'],
+            'service='.urlencode($this->getURL())
+        );
         phpCAS::traceEnd($url);
         return $url;
     }
@@ -435,7 +472,10 @@ class CAS_Client
             }
         }
 
-        $url = $this->_buildQueryUrl($this->_server['saml_validate_url'], 'TARGET='.urlencode($this->getURL()));
+        $url = $this->_buildQueryUrl(
+            $this->_server['saml_validate_url'],
+            'TARGET='.urlencode($this->getURL())
+        );
         phpCAS::traceEnd($url);
         return $url;
     }
@@ -457,9 +497,15 @@ class CAS_Client
             case CAS_VERSION_2_0:
                 $this->_server['proxy_validate_url'] = $this->_getServerBaseURL().'proxyValidate';
                 break;
+            case CAS_VERSION_3_0:
+                $this->_server['proxy_validate_url'] = $this->_getServerBaseURL().'p3/proxyValidate';
+                break;
             }
         }
-        $url = $this->_buildQueryUrl($this->_server['proxy_validate_url'], 'service='.urlencode($this->getURL()));
+        $url = $this->_buildQueryUrl(
+            $this->_server['proxy_validate_url'],
+            'service='.urlencode($this->getURL())
+        );
         phpCAS::traceEnd($url);
         return $url;
     }
@@ -479,6 +525,7 @@ class CAS_Client
                 $this->_server['proxy_url'] = '';
                 break;
             case CAS_VERSION_2_0:
+            case CAS_VERSION_3_0:
                 $this->_server['proxy_url'] = $this->_getServerBaseURL().'proxy';
                 break;
             }
@@ -509,6 +556,10 @@ class CAS_Client
      */
     public function setServerLogoutURL($url)
     {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         return $this->_server['logout_url'] = $url;
     }
 
@@ -561,7 +612,9 @@ class CAS_Client
     {
         $obj = new $className;
         if (!($obj instanceof CAS_Request_RequestInterface)) {
-            throw new CAS_InvalidArgumentException('$className must implement the CAS_Request_RequestInterface');
+            throw new CAS_InvalidArgumentException(
+                '$className must implement the CAS_Request_RequestInterface'
+            );
         }
         $this->_requestImplementation = $className;
     }
@@ -656,6 +709,20 @@ class CAS_Client
     //  Methods for supplying code-flow feedback to integrators.
     // ########################################################################
 
+    /**
+     * Ensure that this is actually a proxy object or fail with an exception
+     *
+     * @throws CAS_OutOfSequenceProxyException
+     *
+     * @return void
+     */
+    public function ensureIsProxy()
+    {
+        if (!$this->isProxy()) {
+            throw new CAS_OutOfSequenceProxyException();
+        }
+    }
+
     /**
      * Mark the caller of authentication. This will help client integraters determine
      * problems with their code flow if they call a function such as getUser() before
@@ -688,6 +755,21 @@ class CAS_Client
         return !empty($this->_authentication_caller);
     }
 
+    /**
+     * Ensure that authentication was checked. Terminate with exception if no
+     * authentication was performed
+     *
+     * @throws CAS_OutOfSequenceBeforeAuthenticationCallException
+     *
+     * @return void
+     */
+    private function _ensureAuthenticationCalled()
+    {
+        if (!$this->wasAuthenticationCalled()) {
+            throw new CAS_OutOfSequenceBeforeAuthenticationCallException();
+        }
+    }
+
     /**
      * Answer the result of the authentication call.
      *
@@ -698,12 +780,33 @@ class CAS_Client
      */
     public function wasAuthenticationCallSuccessful ()
     {
-        if (empty($this->_authentication_caller)) {
-            throw new CAS_OutOfSequenceException('markAuthenticationCall() hasn\'t happened.');
-        }
+        $this->_ensureAuthenticationCalled();
         return $this->_authentication_caller['result'];
     }
 
+
+    /**
+     * Ensure that authentication was checked. Terminate with exception if no
+     * authentication was performed
+     *
+     * @throws CAS_OutOfSequenceBeforeAuthenticationCallException
+     *
+     * @return void
+     */
+    public function ensureAuthenticationCallSuccessful()
+    {
+        $this->_ensureAuthenticationCalled();
+        if (!$this->_authentication_caller['result']) {
+            throw new CAS_OutOfSequenceException(
+                'authentication was checked (by '
+                . $this->getAuthenticationCallerMethod()
+                . '() at ' . $this->getAuthenticationCallerFile()
+                . ':' . $this->getAuthenticationCallerLine()
+                . ') but the method returned false'
+            );
+        }
+    }
+
     /**
      * Answer information about the authentication caller.
      *
@@ -714,9 +817,7 @@ class CAS_Client
      */
     public function getAuthenticationCallerFile ()
     {
-        if (empty($this->_authentication_caller)) {
-            throw new CAS_OutOfSequenceException('markAuthenticationCall() hasn\'t happened.');
-        }
+        $this->_ensureAuthenticationCalled();
         return $this->_authentication_caller['file'];
     }
 
@@ -730,9 +831,7 @@ class CAS_Client
      */
     public function getAuthenticationCallerLine ()
     {
-        if (empty($this->_authentication_caller)) {
-            throw new CAS_OutOfSequenceException('markAuthenticationCall() hasn\'t happened.');
-        }
+        $this->_ensureAuthenticationCalled();
         return $this->_authentication_caller['line'];
     }
 
@@ -746,9 +845,7 @@ class CAS_Client
      */
     public function getAuthenticationCallerMethod ()
     {
-        if (empty($this->_authentication_caller)) {
-            throw new CAS_OutOfSequenceException('markAuthenticationCall() hasn\'t happened.');
-        }
+        $this->_ensureAuthenticationCalled();
         return $this->_authentication_caller['method'];
     }
 
@@ -770,7 +867,9 @@ class CAS_Client
      * @param string $server_hostname the hostname of the CAS server
      * @param int    $server_port     the port the CAS server is running on
      * @param string $server_uri      the URI the CAS server is responding on
-     * @param bool   $changeSessionID Allow phpCAS to change the session_id (Single Sign Out/handleLogoutRequests is based on that change)
+     * @param bool   $changeSessionID Allow phpCAS to change the session_id
+     *                                (Single Sign Out/handleLogoutRequests
+     *                                is based on that change)
      *
      * @return a newly created CAS_Client object
      */
@@ -782,15 +881,29 @@ class CAS_Client
         $server_uri,
         $changeSessionID = true
     ) {
+               // Argument validation
+        if (gettype($server_version) != 'string')
+               throw new CAS_TypeMismatchException($server_version, '$server_version', 'string');
+        if (gettype($proxy) != 'boolean')
+               throw new CAS_TypeMismatchException($proxy, '$proxy', 'boolean');
+        if (gettype($server_hostname) != 'string')
+               throw new CAS_TypeMismatchException($server_hostname, '$server_hostname', 'string');
+        if (gettype($server_port) != 'integer')
+               throw new CAS_raTypeMismatchException($server_port, '$server_port', 'integer');
+        if (gettype($server_uri) != 'string')
+               throw new CAS_TypeMismatchException($server_uri, '$server_uri', 'string');
+        if (gettype($changeSessionID) != 'boolean')
+               throw new CAS_TypeMismatchException($changeSessionID, '$changeSessionID', 'boolean');
 
         phpCAS::traceBegin();
-
-        $this->_setChangeSessionID($changeSessionID); // true : allow to change the session_id(), false session_id won't be change and logout won't be handle because of that
+        // true : allow to change the session_id(), false session_id won't be
+        // change and logout won't be handle because of that
+        $this->_setChangeSessionID($changeSessionID);
 
         // skip Session Handling for logout requests and if don't want it'
         if (session_id()=="" && !$this->_isLogoutRequest()) {
-            phpCAS :: trace("Starting a new session");
             session_start();
+            phpCAS :: trace("Starting a new session " . session_id());
         }
 
         // are we in proxy mode ?
@@ -804,7 +917,9 @@ class CAS_Client
             if (!isset($_SESSION['phpCAS']['service_cookies'])) {
                 $_SESSION['phpCAS']['service_cookies'] = array();
             }
-            $this->_serviceCookieJar = new CAS_CookieJar($_SESSION['phpCAS']['service_cookies']);
+            $this->_serviceCookieJar = new CAS_CookieJar(
+                $_SESSION['phpCAS']['service_cookies']
+            );
         }
 
         //check version
@@ -817,6 +932,7 @@ class CAS_Client
             }
             break;
         case CAS_VERSION_2_0:
+        case CAS_VERSION_3_0:
             break;
         case SAML_VERSION_1_1:
             break;
@@ -860,7 +976,9 @@ class CAS_Client
         if ( $this->_isCallbackMode() ) {
             //callback mode: check that phpCAS is secured
             if ( !$this->_isHttps() ) {
-                phpCAS::error('CAS proxies must be secured to use phpCAS; PGT\'s will not be received from the CAS server');
+                phpCAS::error(
+                    'CAS proxies must be secured to use phpCAS; PGT\'s will not be received from the CAS server'
+                );
             }
         } else {
             //normal mode: get ticket and remove it from CGI parameters for
@@ -872,7 +990,10 @@ class CAS_Client
                 unset($_GET['ticket']);
             } else if ( !empty($ticket) ) {
                 //ill-formed ticket, halt
-                phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
+                phpCAS::error(
+                    'ill-formed ticket found in the URL (ticket=`'
+                    .htmlentities($ticket).'\')'
+                );
             }
 
         }
@@ -964,6 +1085,23 @@ class CAS_Client
      */
     public function getUser()
     {
+       // Sequence validation
+       $this->ensureAuthenticationCallSuccessful();
+
+       return $this->_getUser();
+    }
+
+    /**
+     * This method returns the CAS user's login name.
+     *
+     * @return string the login name of the authenticated user
+     *
+     * @warning should be called only after CAS_Client::forceAuthentication() or
+     * CAS_Client::isAuthenticated(), otherwise halt with an error.
+     */
+    private function _getUser()
+    {
+       // This is likely a duplicate check that could be removed....
         if ( empty($this->_user) ) {
             phpCAS::error(
                 'this method should be used only after '.__CLASS__
@@ -1001,6 +1139,9 @@ class CAS_Client
      */
     public function getAttributes()
     {
+       // Sequence validation
+       $this->ensureAuthenticationCallSuccessful();
+       // This is likely a duplicate check that could be removed....
         if ( empty($this->_user) ) {
             // if no user is set, there shouldn't be any attributes also...
             phpCAS::error(
@@ -1018,6 +1159,9 @@ class CAS_Client
      */
     public function hasAttributes()
     {
+       // Sequence validation
+       $this->ensureAuthenticationCallSuccessful();
+
         return !empty($this->_attributes);
     }
     /**
@@ -1028,6 +1172,21 @@ class CAS_Client
      * @return bool is attribute available
      */
     public function hasAttribute($key)
+    {
+       // Sequence validation
+       $this->ensureAuthenticationCallSuccessful();
+
+        return $this->_hasAttribute($key);
+    }
+
+    /**
+     * Check whether a specific attribute with a name is available
+     *
+     * @param string $key name of attribute
+     *
+     * @return bool is attribute available
+     */
+    private function _hasAttribute($key)
     {
         return (is_array($this->_attributes)
             && array_key_exists($key, $this->_attributes));
@@ -1042,7 +1201,10 @@ class CAS_Client
      */
     public function getAttribute($key)
     {
-        if ($this->hasAttribute($key)) {
+       // Sequence validation
+       $this->ensureAuthenticationCallSuccessful();
+
+        if ($this->_hasAttribute($key)) {
             return $this->_attributes[$key];
         }
     }
@@ -1114,6 +1276,9 @@ class CAS_Client
      */
     public function setCacheTimesForAuthRecheck($n)
     {
+       if (gettype($n) != 'integer')
+               throw new CAS_TypeMismatchException($n, '$n', 'string');
+
         $this->_cache_times_for_auth_recheck = $n;
     }
 
@@ -1159,7 +1324,9 @@ class CAS_Client
                         .$this->_cache_times_for_auth_recheck.')'
                     );
                 } else {
-                    phpCAS::trace('user is not authenticated (cached for until login pressed)');
+                    phpCAS::trace(
+                        'user is not authenticated (cached for until login pressed)'
+                    );
                 }
             } else {
                 $_SESSION['phpCAS']['unauth_count'] = 0;
@@ -1189,21 +1356,28 @@ class CAS_Client
         if ( $this->_wasPreviouslyAuthenticated() ) {
             if ($this->hasTicket()) {
                 // User has a additional ticket but was already authenticated
-                phpCAS::trace('ticket was present and will be discarded, use renewAuthenticate()');
+                phpCAS::trace(
+                    'ticket was present and will be discarded, use renewAuthenticate()'
+                );
                 if ($this->_clearTicketsFromUrl) {
                     phpCAS::trace("Prepare redirect to : ".$this->getURL());
+                    session_write_close();
                     header('Location: '.$this->getURL());
                     flush();
                     phpCAS::traceExit();
                     throw new CAS_GracefullTerminationException();
                 } else {
-                    phpCAS::trace('Already authenticated, but skipping ticket clearing since setNoClearTicketsFromUrl() was used.');
+                    phpCAS::trace(
+                        'Already authenticated, but skipping ticket clearing since setNoClearTicketsFromUrl() was used.'
+                    );
                     $res = true;
                 }
             } else {
                 // the user has already (previously during the session) been
                 // authenticated, nothing to be done.
-                phpCAS::trace('user was already authenticated, no need to look for tickets');
+                phpCAS::trace(
+                    'user was already authenticated, no need to look for tickets'
+                );
                 $res = true;
             }
         } else {
@@ -1211,26 +1385,41 @@ class CAS_Client
                 switch ($this->getServerVersion()) {
                 case CAS_VERSION_1_0:
                     // if a Service Ticket was given, validate it
-                    phpCAS::trace('CAS 1.0 ticket `'.$this->getTicket().'\' is present');
-                    $this->validateCAS10($validate_url, $text_response, $tree_response); // if it fails, it halts
-                    phpCAS::trace('CAS 1.0 ticket `'.$this->getTicket().'\' was validated');
-                    $_SESSION['phpCAS']['user'] = $this->getUser();
+                    phpCAS::trace(
+                        'CAS 1.0 ticket `'.$this->getTicket().'\' is present'
+                    );
+                    $this->validateCAS10(
+                        $validate_url, $text_response, $tree_response
+                    ); // if it fails, it halts
+                    phpCAS::trace(
+                        'CAS 1.0 ticket `'.$this->getTicket().'\' was validated'
+                    );
+                    $_SESSION['phpCAS']['user'] = $this->_getUser();
                     $res = true;
                     $logoutTicket = $this->getTicket();
                     break;
                 case CAS_VERSION_2_0:
+                case CAS_VERSION_3_0:
                     // if a Proxy Ticket was given, validate it
-                    phpCAS::trace('CAS 2.0 ticket `'.$this->getTicket().'\' is present');
-                    $this->validateCAS20($validate_url, $text_response, $tree_response); // note: if it fails, it halts
-                    phpCAS::trace('CAS 2.0 ticket `'.$this->getTicket().'\' was validated');
+                    phpCAS::trace(
+                        'CAS '.$this->getServerVersion().' ticket `'.$this->getTicket().'\' is present'
+                    );
+                    $this->validateCAS20(
+                        $validate_url, $text_response, $tree_response
+                    ); // note: if it fails, it halts
+                    phpCAS::trace(
+                        'CAS '.$this->getServerVersion().' ticket `'.$this->getTicket().'\' was validated'
+                    );
                     if ( $this->isProxy() ) {
-                        $this->_validatePGT($validate_url, $text_response, $tree_response); // idem
+                        $this->_validatePGT(
+                            $validate_url, $text_response, $tree_response
+                        ); // idem
                         phpCAS::trace('PGT `'.$this->_getPGT().'\' was validated');
                         $_SESSION['phpCAS']['pgt'] = $this->_getPGT();
                     }
-                    $_SESSION['phpCAS']['user'] = $this->getUser();
-                    if ($this->hasAttributes()) {
-                        $_SESSION['phpCAS']['attributes'] = $this->getAttributes();
+                    $_SESSION['phpCAS']['user'] = $this->_getUser();
+                    if (!empty($this->_attributes)) {
+                        $_SESSION['phpCAS']['attributes'] = $this->_attributes;
                     }
                     $proxies = $this->getProxies();
                     if (!empty($proxies)) {
@@ -1241,11 +1430,17 @@ class CAS_Client
                     break;
                 case SAML_VERSION_1_1:
                     // if we have a SAML ticket, validate it.
-                    phpCAS::trace('SAML 1.1 ticket `'.$this->getTicket().'\' is present');
-                    $this->validateSA($validate_url, $text_response, $tree_response); // if it fails, it halts
-                    phpCAS::trace('SAML 1.1 ticket `'.$this->getTicket().'\' was validated');
-                    $_SESSION['phpCAS']['user'] = $this->getUser();
-                    $_SESSION['phpCAS']['attributes'] = $this->getAttributes();
+                    phpCAS::trace(
+                        'SAML 1.1 ticket `'.$this->getTicket().'\' is present'
+                    );
+                    $this->validateSA(
+                        $validate_url, $text_response, $tree_response
+                    ); // if it fails, it halts
+                    phpCAS::trace(
+                        'SAML 1.1 ticket `'.$this->getTicket().'\' was validated'
+                    );
+                    $_SESSION['phpCAS']['user'] = $this->_getUser();
+                    $_SESSION['phpCAS']['attributes'] = $this->_attributes;
                     $res = true;
                     $logoutTicket = $this->getTicket();
                     break;
@@ -1258,15 +1453,13 @@ class CAS_Client
                 phpCAS::trace('no ticket found');
             }
             if ($res) {
-                // Mark the auth-check as complete to allow post-authentication
-                // callbacks to make use of phpCAS::getUser() and similar methods
-                $this->markAuthenticationCall($res);
-
                 // call the post-authenticate callback if registered.
                 if ($this->_postAuthenticateCallbackFunction) {
                     $args = $this->_postAuthenticateCallbackArgs;
                     array_unshift($args, $logoutTicket);
-                    call_user_func_array($this->_postAuthenticateCallbackFunction, $args);
+                    call_user_func_array(
+                        $this->_postAuthenticateCallbackFunction, $args
+                    );
                 }
 
                 // if called with a ticket parameter, we need to redirect to the
@@ -1277,6 +1470,7 @@ class CAS_Client
                 // security precaution to prevent a ticket in the HTTP_REFERRER
                 if ($this->_clearTicketsFromUrl) {
                     phpCAS::trace("Prepare redirect to : ".$this->getURL());
+                    session_write_close();
                     header('Location: '.$this->getURL());
                     flush();
                     phpCAS::traceExit();
@@ -1284,7 +1478,9 @@ class CAS_Client
                 }
             }
         }
-
+        // Mark the auth-check as complete to allow post-authentication
+        // callbacks to make use of phpCAS::getUser() and similar methods
+        $this->markAuthenticationCall($res);
         phpCAS::traceEnd($res);
         return $res;
     }
@@ -1323,31 +1519,49 @@ class CAS_Client
 
         if ( $this->isProxy() ) {
             // CAS proxy: username and PGT must be present
-            if ( $this->isSessionAuthenticated() && !empty($_SESSION['phpCAS']['pgt']) ) {
+            if ( $this->isSessionAuthenticated()
+                && !empty($_SESSION['phpCAS']['pgt'])
+            ) {
                 // authentication already done
                 $this->_setUser($_SESSION['phpCAS']['user']);
                 if (isset($_SESSION['phpCAS']['attributes'])) {
                     $this->setAttributes($_SESSION['phpCAS']['attributes']);
                 }
                 $this->_setPGT($_SESSION['phpCAS']['pgt']);
-                phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\', PGT = `'.$_SESSION['phpCAS']['pgt'].'\'');
+                phpCAS::trace(
+                    'user = `'.$_SESSION['phpCAS']['user'].'\', PGT = `'
+                    .$_SESSION['phpCAS']['pgt'].'\''
+                );
 
                 // Include the list of proxies
                 if (isset($_SESSION['phpCAS']['proxies'])) {
                     $this->_setProxies($_SESSION['phpCAS']['proxies']);
-                    phpCAS::trace('proxies = "'.implode('", "', $_SESSION['phpCAS']['proxies']).'"');
+                    phpCAS::trace(
+                        'proxies = "'
+                        .implode('", "', $_SESSION['phpCAS']['proxies']).'"'
+                    );
                 }
 
                 $auth = true;
-            } elseif ( $this->isSessionAuthenticated() && empty($_SESSION['phpCAS']['pgt']) ) {
+            } elseif ( $this->isSessionAuthenticated()
+                && empty($_SESSION['phpCAS']['pgt'])
+            ) {
                 // these two variables should be empty or not empty at the same time
-                phpCAS::trace('username found (`'.$_SESSION['phpCAS']['user'].'\') but PGT is empty');
+                phpCAS::trace(
+                    'username found (`'.$_SESSION['phpCAS']['user']
+                    .'\') but PGT is empty'
+                );
                 // unset all tickets to enforce authentication
                 unset($_SESSION['phpCAS']);
                 $this->setTicket('');
-            } elseif ( !$this->isSessionAuthenticated() && !empty($_SESSION['phpCAS']['pgt']) ) {
+            } elseif ( !$this->isSessionAuthenticated()
+                && !empty($_SESSION['phpCAS']['pgt'])
+            ) {
                 // these two variables should be empty or not empty at the same time
-                phpCAS::trace('PGT found (`'.$_SESSION['phpCAS']['pgt'].'\') but username is empty');
+                phpCAS::trace(
+                    'PGT found (`'.$_SESSION['phpCAS']['pgt']
+                    .'\') but username is empty'
+                );
                 // unset all tickets to enforce authentication
                 unset($_SESSION['phpCAS']);
                 $this->setTicket('');
@@ -1367,7 +1581,10 @@ class CAS_Client
                 // Include the list of proxies
                 if (isset($_SESSION['phpCAS']['proxies'])) {
                     $this->_setProxies($_SESSION['phpCAS']['proxies']);
-                    phpCAS::trace('proxies = "'.implode('", "', $_SESSION['phpCAS']['proxies']).'"');
+                    phpCAS::trace(
+                        'proxies = "'
+                        .implode('", "', $_SESSION['phpCAS']['proxies']).'"'
+                    );
                 }
 
                 $auth = true;
@@ -1394,6 +1611,7 @@ class CAS_Client
     {
         phpCAS::traceBegin();
         $cas_url = $this->getServerLoginURL($gateway, $renew);
+        session_write_close();
         if (php_sapi_name() === 'cli') {
             @header('Location: '.$cas_url);
         } else {
@@ -1423,11 +1641,13 @@ class CAS_Client
         $cas_url = $this->getServerLogoutURL();
         $paramSeparator = '?';
         if (isset($params['url'])) {
-            $cas_url = $cas_url . $paramSeparator . "url=" . urlencode($params['url']);
+            $cas_url = $cas_url . $paramSeparator . "url="
+                . urlencode($params['url']);
             $paramSeparator = '&';
         }
         if (isset($params['service'])) {
-            $cas_url = $cas_url . $paramSeparator . "service=" . urlencode($params['service']);
+            $cas_url = $cas_url . $paramSeparator . "service="
+                . urlencode($params['service']);
         }
         header('Location: '.$cas_url);
         phpCAS::trace("Prepare redirect to : ".$cas_url);
@@ -1470,8 +1690,12 @@ class CAS_Client
             phpCAS::traceEnd();
             return;
         }
-        if (!$this->getChangeSessionID() && is_null($this->_signoutCallbackFunction)) {
-            phpCAS::trace("phpCAS can't handle logout requests if it is not allowed to change session_id.");
+        if (!$this->getChangeSessionID()
+            && is_null($this->_signoutCallbackFunction)
+        ) {
+            phpCAS::trace(
+                "phpCAS can't handle logout requests if it is not allowed to change session_id."
+            );
         }
         phpCAS::trace("Logout requested");
         $decoded_logout_rq = urldecode($_POST['logoutRequest']);
@@ -1485,12 +1709,19 @@ class CAS_Client
             $client = gethostbyaddr($client_ip);
             phpCAS::trace("Client: ".$client."/".$client_ip);
             foreach ($allowed_clients as $allowed_client) {
-                if (($client == $allowed_client) or ($client_ip == $allowed_client)) {
-                    phpCAS::trace("Allowed client '".$allowed_client."' matches, logout request is allowed");
+                if (($client == $allowed_client)
+                    || ($client_ip == $allowed_client)
+                ) {
+                    phpCAS::trace(
+                        "Allowed client '".$allowed_client
+                        ."' matches, logout request is allowed"
+                    );
                     $allowed = true;
                     break;
                 } else {
-                    phpCAS::trace("Allowed client '".$allowed_client."' does not match");
+                    phpCAS::trace(
+                        "Allowed client '".$allowed_client."' does not match"
+                    );
                 }
             }
         } else {
@@ -1505,9 +1736,16 @@ class CAS_Client
                 $this->_rebroadcast(self::LOGOUT);
             }
             // Extract the ticket from the SAML Request
-            preg_match("|<samlp:SessionIndex>(.*)</samlp:SessionIndex>|", $decoded_logout_rq, $tick, PREG_OFFSET_CAPTURE, 3);
-            $wrappedSamlSessionIndex = preg_replace('|<samlp:SessionIndex>|', '', $tick[0][0]);
-            $ticket2logout = preg_replace('|</samlp:SessionIndex>|', '', $wrappedSamlSessionIndex);
+            preg_match(
+                "|<samlp:SessionIndex>(.*)</samlp:SessionIndex>|",
+                $decoded_logout_rq, $tick, PREG_OFFSET_CAPTURE, 3
+            );
+            $wrappedSamlSessionIndex = preg_replace(
+                '|<samlp:SessionIndex>|', '', $tick[0][0]
+            );
+            $ticket2logout = preg_replace(
+                '|</samlp:SessionIndex>|', '', $wrappedSamlSessionIndex
+            );
             phpCAS::trace("Ticket to logout: ".$ticket2logout);
 
             // call the post-authenticate callback if registered.
@@ -1517,7 +1755,8 @@ class CAS_Client
                 call_user_func_array($this->_signoutCallbackFunction, $args);
             }
 
-            // If phpCAS is managing the session_id, destroy session thanks to session_id.
+            // If phpCAS is managing the session_id, destroy session thanks to
+            // session_id.
             if ($this->getChangeSessionID()) {
                 $session_id = preg_replace('/[^a-zA-Z0-9\-]/', '', $ticket2logout);
                 phpCAS::trace("Session id: ".$session_id);
@@ -1623,11 +1862,16 @@ class CAS_Client
     private $_cas_server_ca_cert = null;
 
 
-    /**\r
-     * validate CN of the CAS server certificate\r
-     *\r
-     * @hideinitializer\r
-     */\r
+    /**
+
+     * validate CN of the CAS server certificate
+
+     *
+
+     * @hideinitializer
+
+     */
+
     private $_cas_server_cn_validate = true;
 
     /**
@@ -1649,6 +1893,12 @@ class CAS_Client
      */
     public function setCasServerCACert($cert, $validate_cn)
     {
+       // Argument validation
+       if (gettype($cert) != 'string')
+               throw new CAS_TypeMismatchException($cert, '$cert', 'string');
+        if (gettype($validate_cn) != 'boolean')
+               throw new CAS_TypeMismatchException($validate_cn, '$validate_cn', 'boolean');
+
         $this->_cas_server_ca_cert = $cert;
         $this->_cas_server_cn_validate = $validate_cn;
     }
@@ -1682,11 +1932,14 @@ class CAS_Client
         phpCAS::traceBegin();
         $result = false;
         // build the URL to validate the ticket
-        $validate_url = $this->getServerServiceValidateURL().'&ticket='.$this->getTicket();
+        $validate_url = $this->getServerServiceValidateURL()
+            .'&ticket='.urlencode($this->getTicket());
 
         // open and read the URL
         if ( !$this->_readURL($validate_url, $headers, $text_response, $err_msg) ) {
-            phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
+            phpCAS::trace(
+                'could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')'
+            );
             throw new CAS_AuthenticationException(
                 $this, 'CAS 1.0 ticket not validated', $validate_url,
                 true/*$no_response*/
@@ -1757,8 +2010,12 @@ class CAS_Client
 
         // open and read the URL
         if ( !$this->_readURL($validate_url, $headers, $text_response, $err_msg) ) {
-            phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
-            throw new CAS_AuthenticationException($this, 'SA not validated', $validate_url, true/*$no_response*/);
+            phpCAS::trace(
+                'could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')'
+            );
+            throw new CAS_AuthenticationException(
+                $this, 'SA not validated', $validate_url, true/*$no_response*/
+            );
         }
 
         phpCAS::trace('server version: '.$this->getServerVersion());
@@ -1791,7 +2048,10 @@ class CAS_Client
                 $result = false;
             } else if ( $tree_response->localName != 'Envelope' ) {
                 // insure that tag name is 'Envelope'
-                phpCAS::trace('bad XML root node (should be `Envelope\' instead of `'.$tree_response->localName.'\'');
+                phpCAS::trace(
+                    'bad XML root node (should be `Envelope\' instead of `'
+                    .$tree_response->localName.'\''
+                );
                 throw new CAS_AuthenticationException(
                     $this, 'SA not validated', $validate_url,
                     false/*$no_response*/, true/*$bad_response*/,
@@ -1865,7 +2125,7 @@ class CAS_Client
                 foreach ($attr_array as $attr_key => $attr_value) {
                     if (count($attr_value) > 1) {
                         $this->_attributes[$attr_key] = $attr_value;
-                        phpCAS::trace("* " . $attr_key . "=" . $attr_value);
+                        phpCAS::trace("* " . $attr_key . "=" . print_r($attr_value, true));
                     } else {
                         $this->_attributes[$attr_key] = $attr_value[0];
                         phpCAS::trace("* " . $attr_key . "=" . $attr_value[0]);
@@ -2037,11 +2297,11 @@ class CAS_Client
             $final_uri = '';
             // remove the ticket if present in the URL
             $final_uri = 'https://';
-            $final_uri .= $this->_getServerUrl();
+            $final_uri .= $this->_getClientUrl();
             $request_uri = $_SERVER['REQUEST_URI'];
             $request_uri = preg_replace('/\?.*$/', '', $request_uri);
             $final_uri .= $request_uri;
-            $this->setCallbackURL($final_uri);
+            $this->_callback_url = $final_uri;
         }
         return $this->_callback_url;
     }
@@ -2055,6 +2315,12 @@ class CAS_Client
      */
     public function setCallbackURL($url)
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         return $this->_callback_url = $url;
     }
 
@@ -2172,15 +2438,17 @@ class CAS_Client
      */
     public function setPGTStorage($storage)
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+
         // check that the storage has not already been set
         if ( is_object($this->_pgt_storage) ) {
             phpCAS::error('PGT storage already defined');
         }
 
         // check to make sure a valid storage object was specified
-        if ( !($storage instanceof CAS_PGTStorage_AbstractStorage) ) {
-            phpCAS::error('Invalid PGT storage object');
-        }
+        if ( !($storage instanceof CAS_PGTStorage_AbstractStorage) )
+            throw new CAS_TypeMismatchException($storage, '$storage', 'CAS_PGTStorage_AbstractStorage object');
 
         // store the PGTStorage object
         $this->_pgt_storage = $storage;
@@ -2203,10 +2471,28 @@ class CAS_Client
      *
      * @return void
      */
-    public function setPGTStorageDb($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)
-    {
+    public function setPGTStorageDb(
+        $dsn_or_pdo, $username='', $password='', $table='', $driver_options=null
+    ) {
+       // Sequence validation
+        $this->ensureIsProxy();
+
+       // Argument validation
+       if ((is_object($dsn_or_pdo) && !($dsn_or_pdo instanceof PDO)) || gettype($dsn_or_pdo) != 'string')
+                       throw new CAS_TypeMismatchException($dsn_or_pdo, '$dsn_or_pdo', 'string or PDO object');
+       if (gettype($username) != 'string')
+               throw new CAS_TypeMismatchException($username, '$username', 'string');
+        if (gettype($password) != 'string')
+               throw new CAS_TypeMismatchException($password, '$password', 'string');
+        if (gettype($table) != 'string')
+               throw new CAS_TypeMismatchException($table, '$password', 'string');
+
         // create the storage object
-        $this->setPGTStorage(new CAS_PGTStorage_Db($this, $dsn_or_pdo, $username, $password, $table, $driver_options));
+        $this->setPGTStorage(
+            new CAS_PGTStorage_Db(
+                $this, $dsn_or_pdo, $username, $password, $table, $driver_options
+            )
+        );
     }
 
     /**
@@ -2219,6 +2505,13 @@ class CAS_Client
      */
     public function setPGTStorageFile($path='')
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+
+       // Argument validation
+       if (gettype($path) != 'string')
+               throw new CAS_TypeMismatchException($path, '$path', 'string');
+
         // create the storage object
         $this->setPGTStorage(new CAS_PGTStorage_File($this, $path));
     }
@@ -2232,7 +2525,9 @@ class CAS_Client
     *
     * @param string &$validate_url the URL of the request to the CAS server.
     * @param string $text_response the response of the CAS server, as is
-    * (XML text); result of CAS_Client::validateCAS10() or CAS_Client::validateCAS20().
+    *                              (XML text); result of
+    *                              CAS_Client::validateCAS10() or
+    *                              CAS_Client::validateCAS20().
     * @param string $tree_response the response of the CAS server, as a DOM XML
     * tree; result of CAS_Client::validateCAS10() or CAS_Client::validateCAS20().
     *
@@ -2252,13 +2547,16 @@ class CAS_Client
             );
         } else {
             // PGT Iou transmitted, extract it
-            $pgt_iou = trim($tree_response->getElementsByTagName("proxyGrantingTicket")->item(0)->nodeValue);
+            $pgt_iou = trim(
+                $tree_response->getElementsByTagName("proxyGrantingTicket")->item(0)->nodeValue
+            );
             if (preg_match('/PGTIOU-[\.\-\w]/', $pgt_iou)) {
                 $pgt = $this->_loadPGT($pgt_iou);
                 if ( $pgt == false ) {
                     phpCAS::trace('could not load PGT');
                     throw new CAS_AuthenticationException(
-                        $this, 'PGT Iou was transmitted but PGT could not be retrieved',
+                        $this,
+                        'PGT Iou was transmitted but PGT could not be retrieved',
                         $validate_url, false/*$no_response*/,
                         false/*$bad_response*/, $text_response
                     );
@@ -2292,6 +2590,10 @@ class CAS_Client
      */
     public function retrievePT($target_service,&$err_code,&$err_msg)
     {
+       // Argument validation
+       if (gettype($target_service) != 'string')
+               throw new CAS_TypeMismatchException($target_service, '$target_service', 'string');
+
         phpCAS::traceBegin();
 
         // by default, $err_msg is set empty and $pt to true. On error, $pt is
@@ -2301,11 +2603,14 @@ class CAS_Client
         $err_msg = '';
 
         // build the URL to retrieve the PT
-        $cas_url = $this->getServerProxyURL().'?targetService='.urlencode($target_service).'&pgt='.$this->_getPGT();
+        $cas_url = $this->getServerProxyURL().'?targetService='
+            .urlencode($target_service).'&pgt='.$this->_getPGT();
 
         // open and read the URL
         if ( !$this->_readURL($cas_url, $headers, $cas_response, $err_msg) ) {
-            phpCAS::trace('could not open URL \''.$cas_url.'\' to validate ('.$err_msg.')');
+            phpCAS::trace(
+                'could not open URL \''.$cas_url.'\' to validate ('.$err_msg.')'
+            );
             $err_code = PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE;
             $err_msg = 'could not retrieve PT (no response from the CAS server)';
             phpCAS::traceEnd(false);
@@ -2354,7 +2659,9 @@ class CAS_Client
                 if ( $proxy_success_list->item(0)->getElementsByTagName("proxyTicket")->length != 0) {
                     $err_code = PHPCAS_SERVICE_OK;
                     $err_msg = '';
-                    $pt = trim($proxy_success_list->item(0)->getElementsByTagName("proxyTicket")->item(0)->nodeValue);
+                    $pt = trim(
+                        $proxy_success_list->item(0)->getElementsByTagName("proxyTicket")->item(0)->nodeValue
+                    );
                     phpCAS::trace('original PT: '.trim($pt));
                     phpCAS::traceEnd($pt);
                     return $pt;
@@ -2382,7 +2689,8 @@ class CAS_Client
         // at this step, we are sure that the response of the CAS server was
         // illformed
         $err_code = PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE;
-        $err_msg = 'Invalid response from the CAS server (response=`'.$cas_response.'\')';
+        $err_msg = 'Invalid response from the CAS server (response=`'
+            .$cas_response.'\')';
 
         phpCAS::traceEnd(false);
         return false;
@@ -2425,10 +2733,14 @@ class CAS_Client
         $request->setUrl($url);
 
         if (empty($this->_cas_server_ca_cert) && !$this->_no_cas_server_validation) {
-            phpCAS::error('one of the methods phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.');
+            phpCAS::error(
+                'one of the methods phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.'
+            );
         }
         if ($this->_cas_server_ca_cert != '') {
-            $request->setSslCaCert($this->_cas_server_ca_cert, $this->_cas_server_cn_validate);
+            $request->setSslCaCert(
+                $this->_cas_server_ca_cert, $this->_cas_server_cn_validate
+            );
         }
 
         // add extra stuff if SAML
@@ -2468,9 +2780,11 @@ class CAS_Client
         phpCAS::traceBegin();
 
         //get the ticket
-        $sa = $this->getTicket();
+        $sa = urlencode($this->getTicket());
 
-        $body=SAML_SOAP_ENV.SAML_SOAP_BODY.SAMLP_REQUEST.SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE.SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
+        $body = SAML_SOAP_ENV.SAML_SOAP_BODY.SAMLP_REQUEST
+            .SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE
+            .SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
 
         phpCAS::traceEnd($body);
         return ($body);
@@ -2500,6 +2814,14 @@ class CAS_Client
      */
     public function getProxiedService ($type)
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+       $this->ensureAuthenticationCallSuccessful();
+
+       // Argument validation
+       if (gettype($type) != 'string')
+               throw new CAS_TypeMismatchException($type, '$type', 'string');
+
         switch ($type) {
         case PHPCAS_PROXIED_SERVICE_HTTP_GET:
         case PHPCAS_PROXIED_SERVICE_HTTP_POST:
@@ -2514,13 +2836,15 @@ class CAS_Client
             }
             return $proxiedService;
         case PHPCAS_PROXIED_SERVICE_IMAP;
-            $proxiedService = new CAS_ProxiedService_Imap($this->getUser());
+            $proxiedService = new CAS_ProxiedService_Imap($this->_getUser());
             if ($proxiedService instanceof CAS_ProxiedService_Testable) {
                 $proxiedService->setCasClient($this);
             }
             return $proxiedService;
         default:
-            throw new CAS_InvalidArgumentException("Unknown proxied-service type, $type.");
+            throw new CAS_InvalidArgumentException(
+                "Unknown proxied-service type, $type."
+            );
         }
     }
 
@@ -2541,9 +2865,17 @@ class CAS_Client
      */
     public function initializeProxiedService (CAS_ProxiedService $proxiedService)
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+       $this->ensureAuthenticationCallSuccessful();
+
         $url = $proxiedService->getServiceUrl();
         if (!is_string($url)) {
-            throw new CAS_ProxiedService_Exception("Proxied Service ".get_class($proxiedService)."->getServiceUrl() should have returned a string, returned a ".gettype($url)." instead.");
+            throw new CAS_ProxiedService_Exception(
+                "Proxied Service ".get_class($proxiedService)
+                ."->getServiceUrl() should have returned a string, returned a "
+                .gettype($url)." instead."
+            );
         }
         $pt = $this->retrievePT($url, $err_code, $err_msg);
         if (!$pt) {
@@ -2568,6 +2900,14 @@ class CAS_Client
      */
     public function serviceWeb($url,&$err_code,&$output)
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+       $this->ensureAuthenticationCallSuccessful();
+
+       // Argument validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         try {
             $service = $this->getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);
             $service->setUrl($url);
@@ -2581,7 +2921,9 @@ class CAS_Client
             return false;
         } catch (CAS_ProxiedService_Exception $e) {
             $lang = $this->getLangObj();
-            $output = sprintf($lang->getServiceUnavailable(), $url, $e->getMessage());
+            $output = sprintf(
+                $lang->getServiceUnavailable(), $url, $e->getMessage()
+            );
             $err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
             return false;
         }
@@ -2608,6 +2950,18 @@ class CAS_Client
      */
     public function serviceMail($url,$serviceUrl,$flags,&$err_code,&$err_msg,&$pt)
     {
+       // Sequence validation
+        $this->ensureIsProxy();
+       $this->ensureAuthenticationCallSuccessful();
+
+       // Argument validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+        if (gettype($serviceUrl) != 'string')
+               throw new CAS_TypeMismatchException($serviceUrl, '$serviceUrl', 'string');
+        if (gettype($flags) != 'integer')
+               throw new CAS_TypeMismatchException($flags, '$flags', 'string');
+
         try {
             $service = $this->getProxiedService(PHPCAS_PROXIED_SERVICE_IMAP);
             $service->setServiceUrl($serviceUrl);
@@ -2748,9 +3102,11 @@ class CAS_Client
         $result = false;
         // build the URL to validate the ticket
         if ($this->getAllowedProxyChains()->isProxyingAllowed()) {
-            $validate_url = $this->getServerProxyValidateURL().'&ticket='.$this->getTicket();
+            $validate_url = $this->getServerProxyValidateURL().'&ticket='
+                .urlencode($this->getTicket());
         } else {
-            $validate_url = $this->getServerServiceValidateURL().'&ticket='.$this->getTicket();
+            $validate_url = $this->getServerServiceValidateURL().'&ticket='
+                .urlencode($this->getTicket());
         }
 
         if ( $this->isProxy() ) {
@@ -2760,7 +3116,9 @@ class CAS_Client
 
         // open and read the URL
         if ( !$this->_readURL($validate_url, $headers, $text_response, $err_msg) ) {
-            phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
+            phpCAS::trace(
+                'could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')'
+            );
             throw new CAS_AuthenticationException(
                 $this, 'Ticket not validated', $validate_url,
                 true/*$no_response*/
@@ -2800,7 +3158,8 @@ class CAS_Client
             $result = false;
         } else if ($tree_response->getElementsByTagName("authenticationSuccess")->length != 0) {
             // authentication succeded, extract the user name
-            $success_elements = $tree_response->getElementsByTagName("authenticationSuccess");
+            $success_elements = $tree_response
+                ->getElementsByTagName("authenticationSuccess");
             if ( $success_elements->item(0)->getElementsByTagName("user")->length == 0) {
                 // no user specified => error
                 throw new CAS_AuthenticationException(
@@ -2809,7 +3168,11 @@ class CAS_Client
                 );
                 $result = false;
             } else {
-                $this->_setUser(trim($success_elements->item(0)->getElementsByTagName("user")->item(0)->nodeValue));
+                $this->_setUser(
+                    trim(
+                        $success_elements->item(0)->getElementsByTagName("user")->item(0)->nodeValue
+                    )
+                );
                 $this->_readExtraAttributesCas20($success_elements);
                 // Store the proxies we are sitting behind for authorization checking
                 $proxyList = array();
@@ -2835,7 +3198,8 @@ class CAS_Client
             }
         } else if ( $tree_response->getElementsByTagName("authenticationFailure")->length != 0) {
             // authentication succeded, extract the error code and message
-            $auth_fail_list = $tree_response->getElementsByTagName("authenticationFailure");
+            $auth_fail_list = $tree_response
+                ->getElementsByTagName("authenticationFailure");
             throw new CAS_AuthenticationException(
                 $this, 'Ticket not validated', $validate_url,
                 false/*$no_response*/, false/*$bad_response*/,
@@ -2894,13 +3258,20 @@ class CAS_Client
         //     </cas:serviceResponse>
         //
         if ( $success_elements->item(0)->getElementsByTagName("attributes")->length != 0) {
-            $attr_nodes = $success_elements->item(0)->getElementsByTagName("attributes");
+            $attr_nodes = $success_elements->item(0)
+                ->getElementsByTagName("attributes");
             phpCas :: trace("Found nested jasig style attributes");
             if ($attr_nodes->item(0)->hasChildNodes()) {
                 // Nested Attributes
                 foreach ($attr_nodes->item(0)->childNodes as $attr_child) {
-                    phpCas :: trace("Attribute [".$attr_child->localName."] = ".$attr_child->nodeValue);
-                    $this->_addAttributeToArray($extra_attributes, $attr_child->localName, $attr_child->nodeValue);
+                    phpCas :: trace(
+                        "Attribute [".$attr_child->localName."] = "
+                        .$attr_child->nodeValue
+                    );
+                    $this->_addAttributeToArray(
+                        $extra_attributes, $attr_child->localName,
+                        $attr_child->nodeValue
+                    );
                 }
             }
         } else {
@@ -2930,8 +3301,13 @@ class CAS_Client
                     continue;
                 default:
                     if (strlen(trim($attr_node->nodeValue))) {
-                        phpCas :: trace("Attribute [".$attr_node->localName."] = ".$attr_node->nodeValue);
-                        $this->_addAttributeToArray($extra_attributes, $attr_node->localName, $attr_node->nodeValue);
+                        phpCas :: trace(
+                            "Attribute [".$attr_node->localName."] = ".$attr_node->nodeValue
+                        );
+                        $this->_addAttributeToArray(
+                            $extra_attributes, $attr_node->localName,
+                            $attr_node->nodeValue
+                        );
                     }
                 }
             }
@@ -2957,16 +3333,30 @@ class CAS_Client
         //             </cas:authenticationSuccess>
         //     </cas:serviceResponse>
         //
-        if (!count($extra_attributes) && $success_elements->item(0)->getElementsByTagName("attribute")->length != 0) {
-            $attr_nodes = $success_elements->item(0)->getElementsByTagName("attribute");
+        if (!count($extra_attributes)
+            && $success_elements->item(0)->getElementsByTagName("attribute")->length != 0
+        ) {
+            $attr_nodes = $success_elements->item(0)
+                ->getElementsByTagName("attribute");
             $firstAttr = $attr_nodes->item(0);
-            if (!$firstAttr->hasChildNodes() && $firstAttr->hasAttribute('name') && $firstAttr->hasAttribute('value')) {
+            if (!$firstAttr->hasChildNodes()
+                && $firstAttr->hasAttribute('name')
+                && $firstAttr->hasAttribute('value')
+            ) {
                 phpCas :: trace("Found Name-Value style attributes");
                 // Nested Attributes
                 foreach ($attr_nodes as $attr_node) {
-                    if ($attr_node->hasAttribute('name') && $attr_node->hasAttribute('value')) {
-                        phpCas :: trace("Attribute [".$attr_node->getAttribute('name')."] = ".$attr_node->getAttribute('value'));
-                        $this->_addAttributeToArray($extra_attributes, $attr_node->getAttribute('name'), $attr_node->getAttribute('value'));
+                    if ($attr_node->hasAttribute('name')
+                        && $attr_node->hasAttribute('value')
+                    ) {
+                        phpCas :: trace(
+                            "Attribute [".$attr_node->getAttribute('name')
+                            ."] = ".$attr_node->getAttribute('value')
+                        );
+                        $this->_addAttributeToArray(
+                            $extra_attributes, $attr_node->getAttribute('name'),
+                            $attr_node->getAttribute('value')
+                        );
                     }
                 }
             }
@@ -3036,6 +3426,10 @@ class CAS_Client
      */
     public function setURL($url)
     {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
         $this->_url = $url;
     }
 
@@ -3055,14 +3449,15 @@ class CAS_Client
             $final_uri = ($this->_isHttps()) ? 'https' : 'http';
             $final_uri .= '://';
 
-            $final_uri .= $this->_getServerUrl();
+            $final_uri .= $this->_getClientUrl();
             $request_uri       = explode('?', $_SERVER['REQUEST_URI'], 2);
             $final_uri         .= $request_uri[0];
 
             if (isset($request_uri[1]) && $request_uri[1]) {
                 $query_string= $this->_removeParameterFromQueryString('ticket', $request_uri[1]);
 
-                // If the query string still has anything left, append it to the final URI
+                // If the query string still has anything left,
+                // append it to the final URI
                 if ($query_string !== '') {
                     $final_uri .= "?$query_string";
                 }
@@ -3077,11 +3472,11 @@ class CAS_Client
 
 
     /**
-     * Try to figure out the server URL with possible Proxys / Ports etc.
+     * Try to figure out the phpCas client URL with possible Proxys / Ports etc.
      *
      * @return string Server URL with domain:port
      */
-    private function _getServerUrl()
+    private function _getClientUrl()
     {
         $server_url = '';
         if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
@@ -3101,7 +3496,8 @@ class CAS_Client
             if (empty($_SERVER['HTTP_X_FORWARDED_PORT'])) {
                 $server_port = $_SERVER['SERVER_PORT'];
             } else {
-                $server_port = $_SERVER['HTTP_X_FORWARDED_PORT'];
+                $ports = explode(',', $_SERVER['HTTP_X_FORWARDED_PORT']);
+                $server_port = $ports[0];
             }
 
             if ( ($this->_isHttps() && $server_port!=443)
@@ -3121,7 +3517,13 @@ class CAS_Client
      */
     private function _isHttps()
     {
-        if ( isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
+        if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+            return ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
+        }
+        if ( isset($_SERVER['HTTPS'])
+            && !empty($_SERVER['HTTPS'])
+            && $_SERVER['HTTPS'] != 'off'
+        ) {
             return true;
         } else {
             return false;
@@ -3141,7 +3543,10 @@ class CAS_Client
     private function _removeParameterFromQueryString($parameterName, $queryString)
     {
         $parameterName = preg_quote($parameterName);
-        return preg_replace("/&$parameterName(=[^&]*)?|^$parameterName(=[^&]*)?&?/", '', $queryString);
+        return preg_replace(
+            "/&$parameterName(=[^&]*)?|^$parameterName(=[^&]*)?&?/",
+            '', $queryString
+        );
     }
 
     /**
@@ -3174,19 +3579,24 @@ class CAS_Client
         if ($this->getChangeSessionID()) {
             if (!empty($this->_user)) {
                 $old_session = $_SESSION;
+                phpCAS :: trace("Killing session: ". session_id());
                 session_destroy();
                 // set up a new session, of name based on the ticket
                 $session_id = preg_replace('/[^a-zA-Z0-9\-]/', '', $ticket);
-                phpCAS :: trace("Session ID: ".$session_id);
+                phpCAS :: trace("Starting session: ". $session_id);
                 session_id($session_id);
                 session_start();
                 phpCAS :: trace("Restoring old session vars");
                 $_SESSION = $old_session;
             } else {
-                phpCAS :: error('Session should only be renamed after successfull authentication');
+                phpCAS :: error(
+                    'Session should only be renamed after successfull authentication'
+                );
             }
         } else {
-            phpCAS :: trace("Skipping session rename since phpCAS is not handling the session.");
+            phpCAS :: trace(
+                "Skipping session rename since phpCAS is not handling the session."
+            );
         }
         phpCAS::traceEnd();
     }
@@ -3223,7 +3633,10 @@ class CAS_Client
         phpCAS::traceBegin();
         $lang = $this->getLangObj();
         $this->printHTMLHeader($lang->getAuthenticationFailed());
-        printf($lang->getYouWereNotAuthenticated(), htmlentities($this->getURL()), $_SERVER['SERVER_ADMIN']);
+        printf(
+            $lang->getYouWereNotAuthenticated(), htmlentities($this->getURL()),
+            $_SERVER['SERVER_ADMIN']
+        );
         phpCAS::trace('CAS URL: '.$cas_url);
         phpCAS::trace('Authentication failure: '.$failure);
         if ( $no_response ) {
@@ -3237,10 +3650,13 @@ class CAS_Client
                     phpCAS::trace('Reason: CAS error');
                     break;
                 case CAS_VERSION_2_0:
+                case CAS_VERSION_3_0:
                     if ( empty($err_code) ) {
                         phpCAS::trace('Reason: no CAS error');
                     } else {
-                        phpCAS::trace('Reason: ['.$err_code.'] CAS error: '.$err_msg);
+                        phpCAS::trace(
+                            'Reason: ['.$err_code.'] CAS error: '.$err_msg
+                        );
                     }
                     break;
                 }
@@ -3298,6 +3714,10 @@ class CAS_Client
      */
     public function addRebroadcastNode($rebroadcastNodeUrl)
     {
+       // Argument validation
+       if ( !(bool)preg_match("/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i", $rebroadcastNodeUrl))
+               throw new CAS_TypeMismatchException($rebroadcastNodeUrl, '$rebroadcastNodeUrl', 'url');
+
         // Store the rebroadcast node and set flag
         $this->_rebroadcast = true;
         $this->_rebroadcast_nodes[] = $rebroadcastNodeUrl;
@@ -3318,6 +3738,9 @@ class CAS_Client
      */
     public function addRebroadcastHeader($header)
     {
+       if (gettype($header) != 'string')
+               throw new CAS_TypeMismatchException($header, '$header', 'string');
+
         $this->_rebroadcast_headers[] = $header;
     }
 
@@ -3360,8 +3783,13 @@ class CAS_Client
         $multiRequest = new $multiClassName();
 
         for ($i = 0; $i < sizeof($this->_rebroadcast_nodes); $i++) {
-            if ((($this->_getNodeType($this->_rebroadcast_nodes[$i]) == self::HOSTNAME) && !empty($dns) && (stripos($this->_rebroadcast_nodes[$i], $dns) === false)) || (($this->_getNodeType($this->_rebroadcast_nodes[$i]) == self::IP) && !empty($ip) && (stripos($this->_rebroadcast_nodes[$i], $ip) === false))) {
-                phpCAS::trace('Rebroadcast target URL: '.$this->_rebroadcast_nodes[$i].$_SERVER['REQUEST_URI']);
+            if ((($this->_getNodeType($this->_rebroadcast_nodes[$i]) == self::HOSTNAME) && !empty($dns) && (stripos($this->_rebroadcast_nodes[$i], $dns) === false))
+                || (($this->_getNodeType($this->_rebroadcast_nodes[$i]) == self::IP) && !empty($ip) && (stripos($this->_rebroadcast_nodes[$i], $ip) === false))
+            ) {
+                phpCAS::trace(
+                    'Rebroadcast target URL: '.$this->_rebroadcast_nodes[$i]
+                    .$_SERVER['REQUEST_URI']
+                );
                 $className = $this->_requestImplementation;
                 $request = new $className();
 
@@ -3375,7 +3803,9 @@ class CAS_Client
                 $request->makePost();
                 if ($type == self::LOGOUT) {
                     // Logout request
-                    $request->setPostBody('rebroadcast=false&logoutRequest='.$_POST['logoutRequest']);
+                    $request->setPostBody(
+                        'rebroadcast=false&logoutRequest='.$_POST['logoutRequest']
+                    );
                 } else if ($type == self::PGTIOU) {
                     // pgtIou/pgtId rebroadcast
                     $request->setPostBody('rebroadcast=false');
@@ -3385,7 +3815,11 @@ class CAS_Client
 
                 $multiRequest->addRequest($request);
             } else {
-                phpCAS::trace('Rebroadcast not sent to self: '.$this->_rebroadcast_nodes[$i].' == '.(!empty($ip)?$ip:'').'/'.(!empty($dns)?$dns:''));
+                phpCAS::trace(
+                    'Rebroadcast not sent to self: '
+                    .$this->_rebroadcast_nodes[$i].' == '.(!empty($ip)?$ip:'')
+                    .'/'.(!empty($dns)?$dns:'')
+                );
             }
         }
         // We need at least 1 request
index 7f1f62f..549b892 100644 (file)
@@ -161,7 +161,9 @@ class CAS_CookieJar
     protected function parseCookieHeader ($line, $defaultDomain)
     {
         if (!$defaultDomain) {
-            throw new CAS_InvalidArgumentException('$defaultDomain was not provided.');
+            throw new CAS_InvalidArgumentException(
+                '$defaultDomain was not provided.'
+            );
         }
 
         // Set our default values
@@ -315,10 +317,14 @@ class CAS_CookieJar
     protected function cookieMatchesTarget ($cookie, $target)
     {
         if (!is_array($target)) {
-            throw new CAS_InvalidArgumentException('$target must be an array of URL attributes as generated by parse_url().');
+            throw new CAS_InvalidArgumentException(
+                '$target must be an array of URL attributes as generated by parse_url().'
+            );
         }
         if (!isset($target['host'])) {
-            throw new CAS_InvalidArgumentException('$target must be an array of URL attributes as generated by parse_url().');
+            throw new CAS_InvalidArgumentException(
+                '$target must be an array of URL attributes as generated by parse_url().'
+            );
         }
 
         // Verify that the scheme matches
@@ -352,15 +358,17 @@ class CAS_CookieJar
                 }
             }
         } else {
-            // If the cookie host doesn't begin with '.', the host must case-insensitive
-            // match exactly
+            // If the cookie host doesn't begin with '.',
+            // the host must case-insensitive match exactly
             if (strcasecmp($target['host'], $cookie['domain']) !== 0) {
                 return false;
             }
         }
 
         // Verify that the port matches
-        if (isset($cookie['ports']) && !in_array($target['port'], $cookie['ports'])) {
+        if (isset($cookie['ports'])
+            && !in_array($target['port'], $cookie['ports'])
+        ) {
             return false;
         }
 
index 84199d1..ed3150a 100644 (file)
@@ -99,7 +99,7 @@ class CAS_Languages_German implements CAS_Languages_LanguageInterface
      */
     public function getYouWereNotAuthenticated()
     {
-        return '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontkatieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>';
+        return '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontaktieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>';
     }
 
     /**
@@ -113,4 +113,4 @@ class CAS_Languages_German implements CAS_Languages_LanguageInterface
     }
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/auth/cas/CAS/CAS/OutOfSequenceBeforeAuthenticationCallException.php b/auth/cas/CAS/CAS/OutOfSequenceBeforeAuthenticationCallException.php
new file mode 100644 (file)
index 0000000..ef83097
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Licensed to Jasig under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * Jasig licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * PHP Version 5
+ *
+ * @file     CAS/OutOfSequenceBeforeAuthenticationCallException.php
+ * @category Authentication
+ * @package  PhpCAS
+ * @author   Joachim Fritschi <jfritschi@freenet.de>
+ * @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 <jfritschi@freenet.de>
+ * @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.');
+    }
+}
diff --git a/auth/cas/CAS/CAS/OutOfSequenceBeforeClientException.php b/auth/cas/CAS/CAS/OutOfSequenceBeforeClientException.php
new file mode 100644 (file)
index 0000000..f1ea7e2
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Licensed to Jasig under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * Jasig licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * PHP Version 5
+ *
+ * @file     CAS/OutOfSequenceBeforeClientException.php
+ * @category Authentication
+ * @package  PhpCAS
+ * @author   Joachim Fritschi <jfritschi@freenet.de>
+ * @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 <jfritschi@freenet.de>
+ * @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()'
+        );
+    }
+}
diff --git a/auth/cas/CAS/CAS/OutOfSequenceBeforeProxyException.php b/auth/cas/CAS/CAS/OutOfSequenceBeforeProxyException.php
new file mode 100644 (file)
index 0000000..8038542
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * Licensed to Jasig under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * Jasig licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * PHP Version 5
+ *
+ * @file     CAS/OutOfSequenceBeforeProxyException.php
+ * @category Authentication
+ * @package  PhpCAS
+ * @author   Joachim Fritschi <jfritschi@freenet.de>
+ * @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 <jfritschi@freenet.de>
+ * @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()'
+        );
+    }
+}
index 6c964f5..c164898 100644 (file)
@@ -68,7 +68,9 @@ abstract class CAS_PGTStorage_AbstractStorage
     {
         phpCAS::traceBegin();
         if ( !$cas_parent->isProxy() ) {
-            phpCAS::error('defining PGT storage makes no sense when not using a CAS proxy');
+            phpCAS::error(
+                'defining PGT storage makes no sense when not using a CAS proxy'
+            );
         }
         phpCAS::traceEnd();
     }
index 1f635f8..c331ca0 100644 (file)
@@ -135,8 +135,10 @@ class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage
      * @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)
-    {
+    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);
@@ -188,7 +190,10 @@ class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage
         // 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);
+                $this->_pdo = new PDO(
+                    $this->_dsn, $this->_username, $this->_password,
+                    $this->_driver_options
+                );
             }
             catch(PDOException $e) {
                 phpCAS::error('Database connection error: ' . $e->getMessage());
@@ -247,23 +252,28 @@ class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage
      */
     protected function createTableSql()
     {
-        return 'CREATE TABLE ' . $this->_getTable() . ' (pgt_iou VARCHAR(255) NOT NULL PRIMARY KEY, pgt VARCHAR(255) NOT NULL)';
+        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 the store PGT SQL, :pgt and :pgt_iou are the bind params contained in the query
+     * @return 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)';
+        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
+     * This method returns the query used to retrieve a pgt. the first column
+     * of the first row should contain the pgt
      *
-     * @return the retrieve PGT SQL, :pgt_iou is the only bind param contained in the query
+     * @return the retrieve PGT SQL, :pgt_iou is the only bind param contained
+     *         in the query
      */
     protected function retrievePgtSql()
     {
@@ -273,7 +283,8 @@ class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage
     /**
      * This method returns the query used to delete a pgt.
      *
-     * @return the delete PGT SQL, :pgt_iou is the only bind param contained in the query
+     * @return the delete PGT SQL, :pgt_iou is the only bind param contained in
+     *         the query
      */
     protected function deletePgtSql()
     {
index d8d5338..fade9e7 100644 (file)
@@ -55,15 +55,20 @@ implements CAS_ProxiedService, CAS_ProxiedService_Testable
      *
      * @return void
      * @throws InvalidArgumentException If the $proxyTicket is invalid.
-     * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized/set.
+     * @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.");
+            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.');
+            throw new CAS_OutOfSequenceException(
+                'Already initialized, cannot change the proxy ticket.'
+            );
         }
         $this->_proxyTicket = $proxyTicket;
     }
@@ -78,7 +83,9 @@ implements CAS_ProxiedService, CAS_ProxiedService_Testable
     protected function getProxyTicket ()
     {
         if (empty($this->_proxyTicket)) {
-            throw new CAS_OutOfSequenceException('No proxy ticket yet. Call $this->initializeProxyTicket() to aquire the proxy ticket.');
+            throw new CAS_OutOfSequenceException(
+                'No proxy ticket yet. Call $this->initializeProxyTicket() to aquire the proxy ticket.'
+            );
         }
 
         return $this->_proxyTicket;
@@ -105,7 +112,9 @@ implements CAS_ProxiedService, CAS_ProxiedService_Testable
     public function setCasClient (CAS_Client $casClient)
     {
         if (!empty($this->_proxyTicket)) {
-            throw new CAS_OutOfSequenceException('Already initialized, cannot change the CAS_Client.');
+            throw new CAS_OutOfSequenceException(
+                'Already initialized, cannot change the CAS_Client.'
+            );
         }
 
         $this->_casClient = $casClient;
@@ -124,7 +133,9 @@ implements CAS_ProxiedService, CAS_ProxiedService_Testable
     protected function initializeProxyTicket()
     {
         if (!empty($this->_proxyTicket)) {
-            throw new CAS_OutOfSequenceException('Already initialized, cannot initialize again.');
+            throw new CAS_OutOfSequenceException(
+                'Already initialized, cannot initialize again.'
+            );
         }
         // Allow usage of a particular CAS_Client for unit testing.
         if (empty($this->_casClient)) {
index f17304c..abeddf8 100644 (file)
@@ -38,9 +38,8 @@
  * @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
+abstract class CAS_ProxiedService_Http_Abstract extends
+CAS_ProxiedService_Abstract implements CAS_ProxiedService_Http
 {
     /**
      * The HTTP request mechanism talking to the target service.
@@ -64,8 +63,9 @@ implements CAS_ProxiedService_Http
      *
      * @return void
      */
-    public function __construct (CAS_Request_RequestInterface $requestHandler, CAS_CookieJar $cookieJar)
-    {
+    public function __construct(CAS_Request_RequestInterface $requestHandler,
+        CAS_CookieJar $cookieJar
+    ) {
         $this->requestHandler = $requestHandler;
         $this->_cookieJar = $cookieJar;
     }
@@ -82,10 +82,12 @@ implements CAS_ProxiedService_Http
      * @return string
      * @throws Exception If no service url is available.
      */
-    public function getServiceUrl ()
+    public function getServiceUrl()
     {
         if (empty($this->_url)) {
-            throw new CAS_ProxiedService_Exception('No URL set via '.get_class($this).'->setUrl($url).');
+            throw new CAS_ProxiedService_Exception(
+                'No URL set via ' . get_class($this) . '->setUrl($url).'
+            );
         }
 
         return $this->_url;
@@ -93,7 +95,7 @@ implements CAS_ProxiedService_Http
 
     /*********************************************************
      * Configure the Request
-    *********************************************************/
+     *********************************************************/
 
     /**
      * Set the URL of the Request
@@ -103,10 +105,12 @@ implements CAS_ProxiedService_Http
      * @return void
      * @throws CAS_OutOfSequenceException If called after the Request has been sent.
      */
-    public function setUrl ($url)
+    public function setUrl($url)
     {
         if ($this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot set the URL, request already sent.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot set the URL, request already sent.'
+            );
         }
         if (!is_string($url)) {
             throw new CAS_InvalidArgumentException('$url must be a string.');
@@ -117,7 +121,7 @@ implements CAS_ProxiedService_Http
 
     /*********************************************************
      * 2. Send the Request
-    *********************************************************/
+     *********************************************************/
 
     /**
      * Perform the request.
@@ -132,10 +136,12 @@ implements CAS_ProxiedService_Http
      * @throws CAS_ProxiedService_Exception If there is a failure sending the
      * request to the target service.
      */
-    public function send ()
+    public function send()
     {
         if ($this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot send, request already sent.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot send, request already sent.'
+            );
         }
 
         phpCAS::traceBegin();
@@ -144,9 +150,9 @@ implements CAS_ProxiedService_Http
         $this->initializeProxyTicket();
         $url = $this->getServiceUrl();
         if (strstr($url, '?') === false) {
-            $url = $url.'?ticket='.$this->getProxyTicket();
+            $url = $url . '?ticket=' . $this->getProxyTicket();
         } else {
-            $url = $url.'&ticket='.$this->getProxyTicket();
+            $url = $url . '&ticket=' . $this->getProxyTicket();
         }
 
         try {
@@ -199,7 +205,7 @@ implements CAS_ProxiedService_Http
      * @throws CAS_ProxiedService_Exception If there is a failure sending the
      * request to the target service.
      */
-    protected function makeRequest ($url)
+    protected function makeRequest($url)
     {
         // Verify that we are not in a redirect loop
         $this->_numRequests++;
@@ -220,9 +226,10 @@ implements CAS_ProxiedService_Http
         $this->populateRequest($request);
 
         // Perform the request.
-        phpCAS::trace('Performing proxied service request to \''.$url.'\'');
+        phpCAS::trace('Performing proxied service request to \'' . $url . '\'');
         if (!$request->send()) {
-            $message = 'Could not perform proxied service request to URL`'.$url.'\'. '.$request->getErrorMessage();
+            $message = 'Could not perform proxied service request to URL`'
+            . $url . '\'. ' . $request->getErrorMessage();
             phpCAS::trace($message);
             throw new CAS_ProxiedService_Exception($message);
         }
@@ -231,8 +238,9 @@ implements CAS_ProxiedService_Http
         $this->_cookieJar->storeCookies($url, $request->getResponseHeaders());
 
         // Follow any redirects
-        if ($redirectUrl = $this->getRedirectUrl($request->getResponseHeaders())) {
-            phpCAS :: trace('Found redirect:'.$redirectUrl);
+        if ($redirectUrl = $this->getRedirectUrl($request->getResponseHeaders())
+        ) {
+            phpCAS::trace('Found redirect:' . $redirectUrl);
             $this->makeRequest($redirectUrl);
         } else {
 
@@ -249,7 +257,9 @@ implements CAS_ProxiedService_Http
      *
      * @return void
      */
-    abstract protected function populateRequest (CAS_Request_RequestInterface $request);
+    abstract protected function populateRequest(
+        CAS_Request_RequestInterface $request
+    );
 
     /**
      * Answer a redirect URL if a redirect header is found, otherwise null.
@@ -258,11 +268,12 @@ implements CAS_ProxiedService_Http
      *
      * @return string or null
      */
-    protected function getRedirectUrl (array $responseHeaders)
+    protected function getRedirectUrl(array $responseHeaders)
     {
         // Check for the redirect after authentication
         foreach ($responseHeaders as $header) {
-            if (preg_match('/^(Location:|URI:)\s*([^\s]+.*)$/', $header, $matches)) {
+            if ( preg_match('/^(Location:|URI:)\s*([^\s]+.*)$/', $header, $matches)
+            ) {
                 return trim(array_pop($matches));
             }
         }
@@ -271,14 +282,14 @@ implements CAS_ProxiedService_Http
 
     /*********************************************************
      * 3. Access the response
-    *********************************************************/
+     *********************************************************/
 
     /**
      * Answer true if our request has been sent yet.
      *
      * @return bool
      */
-    protected function hasBeenSent ()
+    protected function hasBeenSent()
     {
         return ($this->_numRequests > 0);
     }
@@ -289,10 +300,12 @@ implements CAS_ProxiedService_Http
      * @return array An array of header strings.
      * @throws CAS_OutOfSequenceException If called before the Request has been sent.
      */
-    public function getResponseHeaders ()
+    public function getResponseHeaders()
     {
         if (!$this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot access response, request not sent yet.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot access response, request not sent yet.'
+            );
         }
 
         return $this->_responseHeaders;
@@ -304,10 +317,12 @@ implements CAS_ProxiedService_Http
      * @return int
      * @throws CAS_OutOfSequenceException If called before the Request has been sent.
      */
-    public function getResponseStatusCode ()
+    public function getResponseStatusCode()
     {
         if (!$this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot access response, request not sent yet.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot access response, request not sent yet.'
+            );
         }
 
         return $this->_responseStatusCode;
@@ -319,10 +334,12 @@ implements CAS_ProxiedService_Http
      * @return string
      * @throws CAS_OutOfSequenceException If called before the Request has been sent.
      */
-    public function getResponseBody ()
+    public function getResponseBody()
     {
         if (!$this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot access response, request not sent yet.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot access response, request not sent yet.'
+            );
         }
 
         return $this->_responseBody;
@@ -334,7 +351,7 @@ implements CAS_ProxiedService_Http
      *
      * @return array An array containing cookies. E.g. array('name' => 'val');
      */
-    public function getCookies ()
+    public function getCookies()
     {
         return $this->_cookieJar->getCookies($this->getServiceUrl());
     }
index 01f509f..78e35de 100644 (file)
  *
  * 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.');
+ *     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;
- *                     }
+ *     } 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
index 643eb98..7d4ecd3 100644 (file)
  *
  * Usage Example:
  *
- *                     try {
- *                             $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);
- *                             $service->setUrl('http://www.example.com/path/');
- *                             $service->setContentType('text/xml');
- *                             $service->setBody(''<?xml version="1.0"?'.'><methodCall><methodName>example.search</methodName></methodCall>');
- *                             $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.');
+ *     try {
+ *             $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);
+ *             $service->setUrl('http://www.example.com/path/');
+ *             $service->setContentType('text/xml');
+ *             $service->setBody('<?xml version="1.0"?'.'><methodCall><methodName>example.search</methodName></methodCall>');
+ *             $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;
- *                     }
+ *     } 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
@@ -95,7 +96,9 @@ extends CAS_ProxiedService_Http_Abstract
     public function setContentType ($contentType)
     {
         if ($this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot set the content type, request already sent.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot set the content type, request already sent.'
+            );
         }
 
         $this->_contentType = $contentType;
@@ -112,7 +115,9 @@ extends CAS_ProxiedService_Http_Abstract
     public function setBody ($body)
     {
         if ($this->hasBeenSent()) {
-            throw new CAS_OutOfSequenceException('Cannot set the body, request already sent.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot set the body, request already sent.'
+            );
         }
 
         $this->_body = $body;
@@ -128,7 +133,10 @@ extends CAS_ProxiedService_Http_Abstract
     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).');
+            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();
index d240d94..847da28 100644 (file)
@@ -79,7 +79,9 @@ extends CAS_ProxiedService_Abstract
     public function getServiceUrl ()
     {
         if (empty($this->_url)) {
-            throw new CAS_ProxiedService_Exception('No URL set via '.get_class($this).'->getServiceUrl($url).');
+            throw new CAS_ProxiedService_Exception(
+                'No URL set via '.get_class($this).'->getServiceUrl($url).'
+            );
         }
 
         return $this->_url;
@@ -100,7 +102,9 @@ extends CAS_ProxiedService_Abstract
     public function setServiceUrl ($url)
     {
         if ($this->hasBeenOpened()) {
-            throw new CAS_OutOfSequenceException('Cannot set the URL, stream already opened.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot set the URL, stream already opened.'
+            );
         }
         if (!is_string($url) || !strlen($url)) {
             throw new CAS_InvalidArgumentException('Invalid url.');
@@ -127,7 +131,9 @@ extends CAS_ProxiedService_Abstract
     public function setMailbox ($mailbox)
     {
         if ($this->hasBeenOpened()) {
-            throw new CAS_OutOfSequenceException('Cannot set the mailbox, stream already opened.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot set the mailbox, stream already opened.'
+            );
         }
         if (!is_string($mailbox) || !strlen($mailbox)) {
             throw new CAS_InvalidArgumentException('Invalid mailbox.');
@@ -155,7 +161,9 @@ extends CAS_ProxiedService_Abstract
     public function setOptions ($options)
     {
         if ($this->hasBeenOpened()) {
-            throw new CAS_OutOfSequenceException('Cannot set options, stream already opened.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot set options, stream already opened.'
+            );
         }
         if (!is_int($options)) {
             throw new CAS_InvalidArgumentException('Invalid options.');
@@ -178,14 +186,19 @@ extends CAS_ProxiedService_Abstract
      *                 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.    */
+     * @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)');
+            throw new CAS_ProxiedService_Exception(
+                'You must specify a mailbox via '.get_class($this)
+                .'->setMailbox($mailbox)'
+            );
         }
 
         phpCAS::traceBegin();
@@ -193,13 +206,16 @@ extends CAS_ProxiedService_Abstract
         // 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);
+        $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: '.$url.' '. var_export(imap_errors(), true);
+            $message = 'IMAP Error: '.$this->_url.' '. var_export(imap_errors(), true);
             phpCAS::trace($message);
             throw new CAS_ProxiedService_Exception($message);
         }
@@ -236,7 +252,9 @@ extends CAS_ProxiedService_Abstract
     public function getStream ()
     {
         if (!$this->hasBeenOpened()) {
-            throw new CAS_OutOfSequenceException('Cannot access stream, not opened yet.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot access stream, not opened yet.'
+            );
         }
         return $this->_stream;
     }
@@ -252,7 +270,9 @@ extends CAS_ProxiedService_Abstract
     public function getImapProxyTicket ()
     {
         if (!$this->hasBeenOpened()) {
-            throw new CAS_OutOfSequenceException('Cannot access errors, stream not opened yet.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot access errors, stream not opened yet.'
+            );
         }
         return $this->getProxyTicket();
     }
index a2f6fca..51f0767 100644 (file)
@@ -31,8 +31,9 @@
  * 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:
+ * 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.
@@ -65,7 +66,8 @@ interface CAS_ProxiedService_Testable
      * @param CAS_Client $casClient Cas client object
      *
      * @return void
-     * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized/set.
+     * @throws CAS_OutOfSequenceException If called after a proxy ticket has
+     *         already been initialized/set.
      */
     public function setCasClient (CAS_Client $casClient);
 
index 01ce73d..2594d14 100644 (file)
@@ -59,7 +59,8 @@ implements CAS_ProxyChain_Interface
      */
     public function __construct(array $chain)
     {
-        $this->chain = array_values($chain);   // Ensure that we have an indexed array
+        // Ensure that we have an indexed array
+        $this->chain = array_values($chain);
     }
 
     /**
@@ -78,17 +79,25 @@ implements CAS_ProxyChain_Interface
                 $proxy_url = $list[$i];
                 if (preg_match('/^\/.*\/[ixASUXu]*$/s', $search)) {
                     if (preg_match($search, $proxy_url)) {
-                        phpCAS::trace("Found regexp " .  $search . " matching " . $proxy_url);
+                        phpCAS::trace(
+                            "Found regexp " .  $search . " matching " . $proxy_url
+                        );
                     } else {
-                        phpCAS::trace("No regexp match " .  $search . " != " . $proxy_url);
+                        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);
+                        phpCAS::trace(
+                            "Found string " .  $search . " matching " . $proxy_url
+                        );
                     } else {
-                        phpCAS::trace("No match " .  $search . " != " . $proxy_url);
+                        phpCAS::trace(
+                            "No match " .  $search . " != " . $proxy_url
+                        );
                         $mismatch = true;
                         break;
                     }
index 57df81f..7233046 100644 (file)
@@ -60,7 +60,10 @@ implements CAS_Exception
         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.');
+            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);
index 0f2e467..f3dd28b 100644 (file)
@@ -68,7 +68,9 @@ implements CAS_Request_RequestInterface
     public function setUrl ($url)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
 
         $this->url = $url;
@@ -86,7 +88,9 @@ implements CAS_Request_RequestInterface
     public function addCookie ($name, $value)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
 
         $this->cookies[$name] = $value;
@@ -105,7 +109,9 @@ implements CAS_Request_RequestInterface
     public function addCookies (array $cookies)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
 
         $this->cookies = array_merge($this->cookies, $cookies);
@@ -122,7 +128,9 @@ implements CAS_Request_RequestInterface
     public function addHeader ($header)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
 
         $this->headers[] = $header;
@@ -139,7 +147,9 @@ implements CAS_Request_RequestInterface
     public function addHeaders (array $headers)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
 
         $this->headers = array_merge($this->headers, $headers);
@@ -154,7 +164,9 @@ implements CAS_Request_RequestInterface
     public function makePost ()
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
 
         $this->isPost = true;
@@ -171,10 +183,14 @@ implements CAS_Request_RequestInterface
     public function setPostBody ($body)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            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.');
+            throw new CAS_OutOfSequenceException(
+                'Cannot add a POST body to a GET request, use makePost() first.'
+            );
         }
 
         $this->postBody = $body;
@@ -192,7 +208,9 @@ implements CAS_Request_RequestInterface
     public function setSslCaCert ($caCertPath,$validate_cn=true)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
         $this->caCertPath = $caCertPath;
         $this->validateCN = $validate_cn;
@@ -211,10 +229,14 @@ implements CAS_Request_RequestInterface
     public function send ()
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot send again.');
+            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.');
+            throw new CAS_OutOfSequenceException(
+                'A url must be specified via setUrl() before the request can be sent.'
+            );
         }
         $this->_sent = true;
         return $this->sendRequest();
@@ -288,7 +310,9 @@ implements CAS_Request_RequestInterface
     public function getResponseHeaders ()
     {
         if (!$this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has not been sent yet. Cannot '.__METHOD__
+            );
         }
         return $this->_responseHeaders;
     }
@@ -302,11 +326,19 @@ implements CAS_Request_RequestInterface
     public function getResponseStatusCode ()
     {
         if (!$this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+            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.");
+        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]);
@@ -321,7 +353,9 @@ implements CAS_Request_RequestInterface
     public function getResponseBody ()
     {
         if (!$this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has not been sent yet. Cannot '.__METHOD__
+            );
         }
 
         return $this->_responseBody;
@@ -336,7 +370,9 @@ implements CAS_Request_RequestInterface
     public function getErrorMessage ()
     {
         if (!$this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has not been sent yet. Cannot '.__METHOD__
+            );
         }
         return $this->_errorMessage;
     }
index a046989..410aba0 100644 (file)
@@ -64,10 +64,14 @@ implements CAS_Request_MultiRequestInterface
     public function addRequest (CAS_Request_RequestInterface $request)
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            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.');
+            throw new CAS_InvalidArgumentException(
+                'As a CAS_Request_CurlMultiRequest, I can only work with CAS_Request_CurlRequest objects.'
+            );
         }
 
         $this->_requests[] = $request;
@@ -81,7 +85,9 @@ implements CAS_Request_MultiRequestInterface
     public function getNumRequests()
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+            throw new CAS_OutOfSequenceException(
+                'Request has already been sent cannot '.__METHOD__
+            );
         }
         return count($this->_requests);
     }
@@ -100,10 +106,14 @@ implements CAS_Request_MultiRequestInterface
     public function send ()
     {
         if ($this->_sent) {
-            throw new CAS_OutOfSequenceException('Request has already been sent cannot send again.');
+            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.');
+            throw new CAS_OutOfSequenceException(
+                'At least one request must be added via addRequest() before the multi-request can be sent.'
+            );
         }
 
         $this->_sent = true;
index e20914f..ea3201e 100644 (file)
@@ -75,7 +75,9 @@ implements CAS_Request_RequestInterface
         $buf = curl_exec($ch);
         if ( $buf === false ) {
             phpCAS::trace('curl_exec() failed');
-            $this->storeErrorMessage('CURL error #'.curl_errno($ch).': '.curl_error($ch));
+            $this->storeErrorMessage(
+                'CURL error #'.curl_errno($ch).': '.curl_error($ch)
+            );
             $res = false;
         } else {
             $this->storeResponseBody($buf);
@@ -120,7 +122,7 @@ implements CAS_Request_RequestInterface
             if ($this->validateCN) {
                 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
             } else {
-                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
+                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
             }
             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
             curl_setopt($ch, CURLOPT_CAINFO, $this->caCertPath);
diff --git a/auth/cas/CAS/CAS/TypeMismatchException.php b/auth/cas/CAS/CAS/TypeMismatchException.php
new file mode 100644 (file)
index 0000000..4a13c2d
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Licensed to Jasig under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ *
+ * Jasig licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * PHP Version 5
+ *
+ * @file     CAS/InvalidArgumentException.php
+ * @category Authentication
+ * @package  PhpCAS
+ * @author   Adam Franco <afranco@middlebury.edu>
+ * @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 <afranco@middlebury.edu>
+ * @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
+        );
+    }
+}
+?>
index f81b870..7d24ed3 100644 (file)
@@ -1,5 +1,5 @@
-Description of phpCAS 1.3.2 library import
+Description of phpCAS 1.3.3 library import
 
 * downloaded from http://downloads.jasig.org/cas-clients/php/current/
 
-iarenaza
+merrill
index 36aabce..33f0284 100644 (file)
@@ -4,7 +4,7 @@
     <location>CAS</location>
     <name>CAS</name>
     <license>BSD</license>
-    <version>1.3.2</version>
+    <version>1.3.3</version>
     <licenseversion></licenseversion>
   </library>
 </libraries>
index aa5c15d..4cedf01 100644 (file)
@@ -435,24 +435,24 @@ class cachestore_memcache extends cache_store implements cache_is_configurable {
         }
 
         $clustered = false;
+        $setservers = array();
         if (isset($data->clustered)) {
             $clustered = true;
-        }
 
-        $lines = explode("\n", $data->setservers);
-        $setservers = array();
-        foreach ($lines as $line) {
-            // Trim surrounding colons and default whitespace.
-            $line = trim(trim($line), ":");
-            if ($line === '') {
-                continue;
-            }
-            $setserver = explode(':', $line, 3);
-            // We don't use weights, so display a debug message.
-            if (count($setserver) > 2) {
-                debugging('Memcache Set Server '.$setserver[0].' has too many parameters.');
+            $lines = explode("\n", $data->setservers);
+            foreach ($lines as $line) {
+                // Trim surrounding colons and default whitespace.
+                $line = trim(trim($line), ":");
+                if ($line === '') {
+                    continue;
+                }
+                $setserver = explode(':', $line, 3);
+                // We don't use weights, so display a debug message.
+                if (count($setserver) > 2) {
+                    debugging('Memcache Set Server '.$setserver[0].' has too many parameters.');
+                }
+                $setservers[] = $setserver;
             }
-            $setservers[] = $setserver;
         }
 
         return array(
index b379b26..f75d8c5 100644 (file)
@@ -491,24 +491,24 @@ class cachestore_memcached extends cache_store implements cache_is_configurable
         }
 
         $clustered = false;
+        $setservers = array();
         if (isset($data->clustered)) {
             $clustered = true;
-        }
 
-        $lines = explode("\n", $data->setservers);
-        $setservers = array();
-        foreach ($lines as $line) {
-            // Trim surrounding colons and default whitespace.
-            $line = trim(trim($line), ":");
-            if ($line === '') {
-                continue;
-            }
-            $setserver = explode(':', $line, 3);
-            // We don't use weights, so display a debug message.
-            if (count($setserver) > 2) {
-                debugging('Memcached Set Server '.$setserver[0].' has too many parameters.');
+            $lines = explode("\n", $data->setservers);
+            foreach ($lines as $line) {
+                // Trim surrounding colons and default whitespace.
+                $line = trim(trim($line), ":");
+                if ($line === '') {
+                    continue;
+                }
+                $setserver = explode(':', $line, 3);
+                // We don't use weights, so display a debug message.
+                if (count($setserver) > 2) {
+                    debugging('Memcached Set Server '.$setserver[0].' has too many parameters.');
+                }
+                $setservers[] = $setserver;
             }
-            $setservers[] = $setserver;
         }
 
         return array(
index 51de3b8..baf1dde 100644 (file)
@@ -279,7 +279,7 @@ $CFG->admin = 'admin';
 //      $CFG->reverseproxy = true;
 //
 // Enable when using external SSL appliance for performance reasons.
-// Please note that site may be accessible via https: or https:, but not both!
+// Please note that site may be accessible via http: or https:, but not both!
 //      $CFG->sslproxy = true;
 //
 // This setting will cause the userdate() function not to fix %d in
index 6ed18dd..40c79d5 100644 (file)
@@ -1213,21 +1213,18 @@ class core_course_management_renderer extends plugin_renderer_base {
             }
             // Show/Hide.
             if ($course->can_change_visibility()) {
-                if ($course->visible) {
                     $actions[] = $this->output->action_icon(
                         new moodle_url($baseurl, array('action' => 'hidecourse')),
                         new pix_icon('t/show', get_string('hide')),
                         null,
                         array('data-action' => 'hide', 'class' => 'action-hide')
                     );
-                } else {
                     $actions[] = $this->output->action_icon(
                         new moodle_url($baseurl, array('action' => 'showcourse')),
                         new pix_icon('t/hide', get_string('show')),
                         null,
                         array('data-action' => 'show', 'class' => 'action-show')
                     );
-                }
             }
         }
         if (empty($actions)) {
index 73392cb..f5722db 100644 (file)
@@ -137,12 +137,22 @@ class memcached extends handler {
             return false;
         }
 
-        $memcached = new \Memcached();
-        $memcached->addServers($this->servers);
-        $value = $memcached->get($this->prefix.$sid);
-        $memcached->quit();
+        // Go through the list of all servers because
+        // we do not know where the session handler put the
+        // data.
+
+        foreach ($this->servers as $server) {
+            list($host, $port) = $server;
+            $memcached = new \Memcached();
+            $memcached->addServer($host, $port);
+            $value = $memcached->get($this->prefix . $sid);
+            $memcached->quit();
+            if ($value !== false) {
+                return true;
+            }
+        }
 
-        return ($value !== false);
+        return false;
     }
 
     /**
@@ -155,19 +165,32 @@ class memcached extends handler {
             return;
         }
 
-        $memcached = new \Memcached();
-        $memcached->addServers($this->servers);
+        // Go through the list of all servers because
+        // we do not know where the session handler put the
+        // data.
+
+        $memcacheds = array();
+        foreach ($this->servers as $server) {
+            list($host, $port) = $server;
+            $memcached = new \Memcached();
+            $memcached->addServer($host, $port);
+            $memcacheds[] = $memcached;
+        }
 
         // Note: this can be significantly improved by fetching keys from memcached,
         //       but we need to make sure we are not deleting somebody else's sessions.
 
         $rs = $DB->get_recordset('sessions', array(), 'id DESC', 'id, sid');
         foreach ($rs as $record) {
-            $memcached->delete($this->prefix.$record->sid);
+            foreach ($memcacheds as $memcached) {
+                $memcached->delete($this->prefix . $record->sid);
+            }
         }
         $rs->close();
 
-        $memcached->quit();
+        foreach ($memcacheds as $memcached) {
+            $memcached->quit();
+        }
     }
 
     /**
@@ -179,11 +202,17 @@ class memcached extends handler {
             return;
         }
 
-        $memcached = new \Memcached();
-        $memcached->addServers($this->servers);
-        $memcached->delete($this->prefix.$sid);
+        // Go through the list of all servers because
+        // we do not know where the session handler put the
+        // data.
 
-        $memcached->quit();
+        foreach ($this->servers as $server) {
+            list($host, $port) = $server;
+            $memcached = new \Memcached();
+            $memcached->addServer($host, $port);
+            $memcached->delete($this->prefix . $sid);
+            $memcached->quit();
+        }
     }
 
 }
index f0926fc..bdf55be 100644 (file)
@@ -48,7 +48,8 @@ class send_new_user_passwords_task extends scheduled_task {
         if ($DB->count_records('user_preferences', array('name' => 'create_password', 'value' => '1'))) {
             mtrace('Creating passwords for new users...');
             $usernamefields = get_all_user_name_fields(true, 'u');
-            $newusers = $DB->get_recordset_sql("SELECT u.id as id, u.email,
+            $newusers = $DB->get_recordset_sql("SELECT u.id as id, u.email, u.auth, u.deleted,
+                                                     u.suspended, u.emailstop, u.mnethostid, u.mailformat,
                                                      $usernamefields, u.username, u.lang,
                                                      p.id as prefid
                                                 FROM {user} u
index 9dac524..c9a89e5 100644 (file)
@@ -1608,6 +1608,11 @@ class core_ddl_testcase extends database_driver_testcase {
                   JOIN {test_temp} t ON t.name = n.name";
         $records = $DB->get_records_sql($sql);
         $this->assertCount(1, $records);
+
+        // Drop temp table.
+        $dbman->drop_temp_table($table2);
+        $this->assertFalse($dbman->table_exists('test_temp'));
+        $this->assertDebuggingCalled();
     }
 
     public function test_concurrent_temp_tables() {
index efc172e..0cb4067 100644 (file)
@@ -35,7 +35,8 @@ require_once("$CFG->dirroot/lib/classes/minify.php");
 if ($slashargument = min_get_slash_argument()) {
     $slashargument = ltrim($slashargument, '/');
     if (substr_count($slashargument, '/') < 1) {
-        image_not_found();
+        header('HTTP/1.0 404 not found');
+        die('Slash argument must contain both a revision and a file path');
     }
     // image must be last because it may contain "/"
     list($rev, $file) = explode('/', $slashargument, 2);
@@ -73,7 +74,8 @@ foreach ($files as $fsfile) {
 
 if (!$jsfiles) {
     // bad luck - no valid files
-    die();
+    header('HTTP/1.0 404 not found');
+    die('No valid javascript files found');
 }
 
 $etag = sha1($rev.implode(',', $jsfiles));
index 258e28d..1506890 100644 (file)
@@ -4742,6 +4742,11 @@ function update_internal_user_password($user, $password, $fasthash = false) {
     require_once($CFG->libdir.'/password_compat/lib/password.php');
 
     // Figure out what the hashed password should be.
+    if (!isset($user->auth)) {
+        debugging('User record in update_internal_user_password() must include field auth',
+                DEBUG_DEVELOPER);
+        $user->auth = $DB->get_field('user', 'auth', array('id' => $user->id));
+    }
     $authplugin = get_auth_plugin($user->auth);
     if ($authplugin->prevent_local_passwords()) {
         $hashedpassword = AUTH_PASSWORD_NOT_CACHED;
index 0ea480b..5359b56 100644 (file)
@@ -4132,8 +4132,16 @@ class settings_navigation extends navigation_node {
                 }
                 $canaccessallgroups = has_capability('moodle/site:accessallgroups', $coursecontext);
                 if (!$canaccessallgroups && groups_get_course_groupmode($course) == SEPARATEGROUPS) {
-                    // If groups are in use, make sure we can see that group
-                    return false;
+                    // If groups are in use, make sure we can see that group (MDL-45874).
+                    if ($courseid == $this->page->course->id) {
+                        $mygroups = get_fast_modinfo($this->page->course)->groups;
+                    } else {
+                        $mygroups = groups_get_user_groups($courseid);
+                    }
+                    $usergroups = groups_get_user_groups($courseid, $userid);
+                    if (!array_intersect_key($mygroups[0], $usergroups[0])) {
+                        return false;
+                    }
                 }
             }
         }
index e88f9e9..61bbdb3 100644 (file)
@@ -701,7 +701,7 @@ function stats_cron_weekly() {
 
                 SELECT 'logins', timeend, courseid, userid, SUM(statsreads)
                   FROM (
-                           SELECT $nextstartweek AS timeend, courseid, statsreads
+                           SELECT $nextstartweek AS timeend, courseid, userid, statsreads
                              FROM {stats_user_daily} sd
                             WHERE stattype = 'logins' AND $stattimesql
                        ) inline_view
@@ -843,7 +843,7 @@ function stats_cron_monthly() {
 
                 SELECT 'logins', timeend, courseid, userid, SUM(statsreads)
                   FROM (
-                           SELECT $nextstartmonth AS timeend, courseid, statsreads
+                           SELECT $nextstartmonth AS timeend, courseid, userid, statsreads
                              FROM {stats_user_daily} sd
                             WHERE stattype = 'logins' AND $stattimesql
                        ) inline_view
index 50cd1a3..016d656 100644 (file)
@@ -2262,6 +2262,13 @@ class core_moodlelib_testcase extends advanced_testcase {
         $this->assertSame($user->id, $event->relateduserid);
         $this->assertEquals(context_user::instance($user->id), $event->get_context());
         $this->assertEventContextNotUsed($event);
+
+        // Verify recovery of property 'auth'.
+        unset($user->auth);
+        update_internal_user_password($user, 'newpassword');
+        $this->assertDebuggingCalled('User record in update_internal_user_password() must include field auth',
+                DEBUG_DEVELOPER);
+        $this->assertEquals('manual', $user->auth);
     }
 
     public function test_fullname() {
index 29935ee..c51c807 100644 (file)
@@ -207,7 +207,7 @@ function choice_prepare_options($choice, $user, $coursemodule, $allresponses) {
             $option = new stdClass;
             $option->attributes = new stdClass;
             $option->attributes->value = $optionid;
-            $option->text = $text;
+            $option->text = format_string($text);
             $option->maxanswers = $choice->maxanswers[$optionid];
             $option->displaylayout = $choice->display;
 
index 55e1086..406fd7f 100644 (file)
             choice_user_submit_response($answer, $choice, $USER->id, $course, $cm);
         }
         echo $OUTPUT->header();
-        echo $OUTPUT->heading($choice->name, 2, null);
+        echo $OUTPUT->heading(format_string($choice->name), 2, null);
         echo $OUTPUT->notification(get_string('choicesaved', 'choice'),'notifysuccess');
     } else {
         echo $OUTPUT->header();
-        echo $OUTPUT->heading($choice->name, 2, null);
+        echo $OUTPUT->heading(format_string($choice->name), 2, null);
     }
 
 
index 3f6b111..10867e8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="mod/forum/db" VERSION="20140605" COMMENT="XMLDB file for Moodle mod/forum"
+<XMLDB PATH="mod/forum/db" VERSION="20140815" COMMENT="XMLDB file for Moodle mod/forum"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
 >
@@ -59,6 +59,7 @@
       </KEYS>
       <INDEXES>
         <INDEX NAME="userid" UNIQUE="false" FIELDS="userid"/>
+        <INDEX NAME="course" UNIQUE="false" FIELDS="course"/>
       </INDEXES>
     </TABLE>
     <TABLE NAME="forum_posts" COMMENT="All posts are stored in this table">
       </KEYS>
     </TABLE>
   </TABLES>
-</XMLDB>
+</XMLDB>
\ No newline at end of file
index aaa3353..0aeee7f 100644 (file)
@@ -185,5 +185,20 @@ function xmldb_forum_upgrade($oldversion) {
         upgrade_mod_savepoint(true, 2014051202, 'forum');
     }
 
+    if ($oldversion < 2014081500) {
+
+        // Define index course (not unique) to be added to forum_discussions.
+        $table = new xmldb_table('forum_discussions');
+        $index = new xmldb_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
+
+        // Conditionally launch add index course.
+        if (!$dbman->index_exists($table, $index)) {
+            $dbman->add_index($table, $index);
+        }
+
+        // Forum savepoint reached.
+        upgrade_mod_savepoint(true, 2014081500, 'forum');
+    }
+
     return true;
 }
index 0c36a5a..f6d07e0 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051202;       // The current module version (Date: YYYYMMDDXX)
+$plugin->version   = 2014081500;       // The current module version (Date: YYYYMMDDXX)
 $plugin->requires  = 2014050800;       // Requires this Moodle version
 $plugin->component = 'mod_forum';      // Full name of the plugin (used for diagnostics)
 $plugin->cron      = 60;
index a73a717..1e0fbd9 100644 (file)
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-//Prevent Caching Headers
+// Prevent Caching Headers.
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 header("Cache-Control: no-cache");
 header("Pragma: no-cache");
@@ -33,15 +33,15 @@ $command = required_param('command', PARAM_ALPHA);
 $sessionid = required_param('session_id', PARAM_ALPHANUM);
 $aiccdata = optional_param('aicc_data', '', PARAM_RAW);
 
-$cfg_scorm = get_config('scorm');
+$cfgscorm = get_config('scorm');
 
-$url = new moodle_url('/mod/scorm/aicc.php', array('command'=>$command, 'session_id'=>$sessionid));
+$url = new moodle_url('/mod/scorm/aicc.php', array('command' => $command, 'session_id' => $sessionid));
 if ($aiccdata !== 0) {
     $url->param('aicc_data', $aiccdata);
 }
 $PAGE->set_url($url);
 
-if (empty($cfg_scorm->allowaicchacp)) {
+if (empty($cfgscorm->allowaicchacp)) {
     require_login();
     if (!confirm_sesskey($sessionid)) {
         print_error('invalidsesskey');
@@ -53,7 +53,7 @@ if (empty($cfg_scorm->allowaicchacp)) {
     if (empty($scormsession)) {
         print_error('invalidhacpsession', 'scorm');
     }
-    $aiccuser = $DB->get_record('user', array('id'=>$scormsession->userid), 'id,username,lastname,firstname', MUST_EXIST);
+    $aiccuser = $DB->get_record('user', array('id' => $scormsession->userid), 'id,username,lastname,firstname', MUST_EXIST);
 }
 
 if (!empty($command)) {
@@ -79,7 +79,7 @@ if (!empty($command)) {
     }
 
     if ($sco = scorm_get_sco($scoid, SCO_ONLY)) {
-        if (!$scorm = $DB->get_record('scorm', array('id'=>$sco->scorm))) {
+        if (!$scorm = $DB->get_record('scorm', array('id' => $sco->scorm))) {
             print_error('cannotcallscript');
         }
     } else {
@@ -95,7 +95,7 @@ if (!empty($command)) {
     scorm_debug_log_write("aicc", "HACP Request:\r\n$aiccrequest", $scoid);
     ob_start();
 
-    if ($scorm = $DB->get_record('scorm', array('id'=>$sco->scorm))) {
+    if ($scorm = $DB->get_record('scorm', array('id' => $sco->scorm))) {
         switch ($command) {
             case 'getparam':
                 if ($status == 'Not Initialized') {
@@ -105,7 +105,7 @@ if (!empty($command)) {
                 if ($status != 'Running') {
                     echo "error=101\r\nerror_text=Terminated\r\n";
                 } else {
-                    if ($usertrack=scorm_get_tracks($scoid, $aiccuser->id, $attempt)) {
+                    if ($usertrack = scorm_get_tracks($scoid, $aiccuser->id, $attempt)) {
                         $userdata = $usertrack;
                     } else {
                         $userdata->status = '';
@@ -122,10 +122,11 @@ if (!empty($command)) {
 
                     if ($sco = scorm_get_sco($scoid)) {
                         $userdata->course_id = $sco->identifier;
-                        $userdata->datafromlms = isset($sco->datafromlms)?$sco->datafromlms:'';
-                        $userdata->mastery_score = isset($sco->mastery_score) && is_numeric($sco->mastery_score)?trim($sco->mastery_score):'';
-                        $userdata->max_time_allowed = isset($sco->max_time_allowed)?$sco->max_time_allowed:'';
-                        $userdata->time_limit_action = isset($sco->time_limit_action)?$sco->time_limit_action:'';
+                        $userdata->datafromlms = isset($sco->datafromlms) ? $sco->datafromlms : '';
+                        $userdata->mastery_score = isset($sco->mastery_score) && is_numeric($sco->mastery_score) ?
+                                                        trim($sco->mastery_score) : '';
+                        $userdata->max_time_allowed = isset($sco->max_time_allowed) ? $sco->max_time_allowed : '';
+                        $userdata->time_limit_action = isset($sco->time_limit_action) ? $sco->time_limit_action : '';
 
                         echo "error=0\r\nerror_text=Successful\r\naicc_data=";
                         echo "[Core]\r\n";
@@ -193,9 +194,10 @@ if (!empty($command)) {
             case 'putparam':
                 if ($status == 'Running') {
                     if (! $cm = get_coursemodule_from_instance("scorm", $scorm->id, $scorm->course)) {
-                        echo "error=1\r\nerror_text=Unknown\r\n"; // No one must see this error message if not hacked
+                        echo "error=1\r\nerror_text=Unknown\r\n"; // No one must see this error message if not hacked.
                     }
-                    if (!empty($aiccdata) && has_capability('mod/scorm:savetrack', context_module::instance($cm->id), $aiccuser->id)) {
+                    $savetrack = has_capability('mod/scorm:savetrack', context_module::instance($cm->id), $aiccuser->id);
+                    if (!empty($aiccdata) && $savetrack) {
                         $initlessonstatus = 'not attempted';
                         $lessonstatus = 'not attempted';
                         if (isset($scormsession->scorm_lessonstatus)) {
@@ -213,12 +215,13 @@ if (!empty($command)) {
                         while ((list(, $datarow) = each($datarows)) !== false) {
                             if (($equal = strpos($datarow, '=')) !== false) {
                                 $element = strtolower(trim(substr($datarow, 0, $equal)));
-                                $value = trim(substr($datarow, $equal+1));
+                                $value = trim(substr($datarow, $equal + 1));
                                 if (isset($datamodel[$element])) {
                                     $element = $datamodel[$element];
                                     switch ($element) {
                                         case 'cmi.core.lesson_location':
-                                            $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, $element, $value);
+                                            $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                                        $attempt, $element, $value);
                                         break;
                                         case 'cmi.core.lesson_status':
                                             $statuses = array(
@@ -254,13 +257,15 @@ if (!empty($command)) {
                                             }
                                             if (empty($value) || isset($exites[$value])) {
                                                 $subelement = 'cmi.core.exit';
-                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, $subelement, $value);
+                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                                            $attempt, $subelement, $value);
                                             }
                                             $value = trim(strtolower($values[0]));
                                             $value = $value[0];
                                             if (isset($statuses[$value]) && ($mode == 'normal')) {
                                                 $value = $statuses[$value];
-                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, $element, $value);
+                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                                            $attempt, $element, $value);
                                             }
                                             $lessonstatus = $value;
                                         break;
@@ -269,18 +274,21 @@ if (!empty($command)) {
                                             if ((count($values) > 1) && ($values[1] >= $values[0]) && is_numeric($values[1])) {
                                                 $subelement = 'cmi.core.score.max';
                                                 $value = trim($values[1]);
-                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, $subelement, $value);
+                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                                            $attempt, $subelement, $value);
                                                 if ((count($values) == 3) && ($values[2] <= $values[0]) && is_numeric($values[2])) {
                                                     $subelement = 'cmi.core.score.min';
                                                     $value = trim($values[2]);
-                                                    $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, $subelement, $value);
+                                                    $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                                                $attempt, $subelement, $value);
                                                 }
                                             }
 
                                             $value = '';
                                             if (is_numeric($values[0])) {
                                                 $value = trim($values[0]);
-                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, $element, $value);
+                                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                                            $attempt, $element, $value);
                                             }
                                             $score = $value;
                                         break;
@@ -304,12 +312,13 @@ if (!empty($command)) {
                         }
                         if (($mode == 'browse') && ($initlessonstatus == 'not attempted')) {
                             $lessonstatus = 'browsed';
-                            $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', 'browsed');
+                            $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                        $attempt, 'cmi.core.lesson_status', 'browsed');
                         }
                         if ($mode == 'normal') {
                             if ($sco = scorm_get_sco($scoid)) {
                                 if (isset($sco->mastery_score) && is_numeric($sco->mastery_score)) {
-                                    if ($score != '') { // $score is correctly initialized w/ an empty string, see above
+                                    if ($score != '') { // Score is correctly initialized w/ an empty string, see above.
                                         if ($score >= trim($sco->mastery_score)) {
                                             $lessonstatus = 'passed';
                                         } else {
@@ -317,7 +326,8 @@ if (!empty($command)) {
                                         }
                                     }
                                 }
-                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', $lessonstatus);
+                                $id = scorm_insert_track($aiccuser->id, $scorm->id, $sco->id,
+                                                            $attempt, 'cmi.core.lesson_status', $lessonstatus);
                             }
                         }
                     }
@@ -376,12 +386,12 @@ if (!empty($command)) {
             case 'exitau':
                 if ($status == 'Running') {
                     if (isset($scormsession->sessiontime) && ($scormsession->sessiontime != '')) {
-                        if ($track = $DB->get_record('scorm_scoes_track', array("userid"=>$aiccuser->id,
-                                                                                "scormid"=>$scorm->id,
-                                                                                "scoid"=>$sco->id,
-                                                                                "attempt"=>$attempt,
-                                                                                "element"=>'cmi.core.total_time'))) {
-                            // Add session_time to total_time
+                        if ($track = $DB->get_record('scorm_scoes_track', array("userid" => $aiccuser->id,
+                                                                                "scormid" => $scorm->id,
+                                                                                "scoid" => $sco->id,
+                                                                                "attempt" => $attempt,
+                                                                                "element" => 'cmi.core.total_time'))) {
+                            // Add session_time to total_time.
                             $value = scorm_add_time($track->value, $scormsession->sessiontime);
                             $track->value = $value;
                             $track->timemodified = time();
@@ -420,7 +430,7 @@ if (!empty($command)) {
         echo "error=3\r\nerror_text=Invalid Session ID\r\n";
     }
 }
-if (empty($cfg_scorm->allowaicchacp)) {
+if (empty($cfgscorm->allowaicchacp)) {
     $SESSION->scorm = $scormsession;
 } else {
     $scormsession->timemodified = time();
index 6107422..612efd0 100644 (file)
@@ -20,7 +20,7 @@ require_once($CFG->dirroot.'/mod/scorm/locallib.php');
 $id = optional_param('id', '', PARAM_INT);       // Course Module ID, or
 $a = optional_param('a', '', PARAM_INT);         // scorm ID
 $scoid = required_param('scoid', PARAM_INT);  // sco ID
-$attempt = required_param('attempt', PARAM_INT);  // attempt number
+$attempt = required_param('attempt', PARAM_INT);  // attempt number.
 
 if (!empty($id)) {
     if (! $cm = get_coursemodule_from_id('scorm', $id)) {
@@ -65,19 +65,20 @@ if (confirm_sesskey() && (!empty($scoid))) {
                                              $trackdata) && $result;
             }
             if (substr($element, 0, 15) == 'adl.nav.request') {
-                // SCORM 2004 Sequencing Request
+                // SCORM 2004 Sequencing Request.
                 require_once($CFG->dirroot.'/mod/scorm/datamodels/scorm_13lib.php');
 
-                $search = array('@continue@', '@previous@', '@\{target=(\S+)\}choice@', '@exit@', '@exitAll@', '@abandon@', '@abandonAll@');
+                $search = array('@continue@', '@previous@', '@\{target=(\S+)\}choice@', '@exit@',
+                                    '@exitAll@', '@abandon@', '@abandonAll@');
                 $replace = array('continue_', 'previous_', '\1', 'exit_', 'exitall_', 'abandon_', 'abandonall');
                 $action = preg_replace($search, $replace, $value);
 
                 if ($action != $value) {
-                    // Evaluating navigation request
+                    // Evaluating navigation request.
                     $valid = scorm_seq_overall ($scoid, $USER->id, $action, $attempt);
                     $valid = 'true';
 
-                    // Set valid request
+                    // Set valid request.
                     $search = array('@continue@', '@previous@', '@\{target=(\S+)\}choice@');
                     $replace = array('true', 'true', 'true');
                     $matched = preg_replace($search, $replace, $value);
index b2b4970..2dfa72b 100644 (file)
@@ -18,9 +18,9 @@
 //
 function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid, autocommit) {
 
-    var prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a="+scormid+"&scoid="+scoid+"&attempt="+attempt+"&mode="+viewmode+"&currentorg="+currentorg+"&sesskey="+sesskey;
+    var prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a=" + scormid + "&scoid=" + scoid + "&attempt=" + attempt + "&mode=" + viewmode + "&currentorg=" + currentorg + "&sesskey=" + sesskey;
     var datamodelurl = cfgwwwroot + "/mod/scorm/datamodel.php";
-    var datamodelurlparams = "id="+cmid+"&a="+scormid+"&sesskey="+sesskey+"&attempt="+attempt+"&scoid="+scoid;
+    var datamodelurlparams = "id=" + cmid + "&a=" + scormid + "&sesskey=" + sesskey + "&attempt=" + attempt + "&scoid=" + scoid;
 
     // Standard Data Type Definition
     CMIString256 = '^.{0,255}$';
@@ -133,8 +133,8 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
 
     var cmi, nav;
     function initdatamodel(scoid){
-        prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a="+scormid+"&scoid="+scoid+"&attempt="+attempt+"&mode="+viewmode+"&currentorg="+currentorg+"&sesskey="+sesskey;
-        datamodelurlparams = "id="+cmid+"&a="+scormid+"&sesskey="+sesskey+"&attempt="+attempt+"&scoid="+scoid;
+        prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a=" + scormid + "&scoid=" + scoid + "&attempt=" + attempt + "&mode=" + viewmode + "&currentorg=" + currentorg + "&sesskey=" + sesskey;
+        datamodelurlparams = "id=" + cmid + "&a=" + scormid + "&sesskey=" + sesskey + "&attempt=" + attempt + "&scoid=" + scoid;
 
         //
         // Datamodel inizialization
@@ -155,10 +155,10 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
 
         for (element in datamodel[scoid]) {
             if (element.match(/\.n\./) == null) {
-                if ((typeof eval('datamodel["'+scoid+'"]["'+element+'"].defaultvalue')) != 'undefined') {
-                    eval(element+' = datamodel["'+scoid+'"]["'+element+'"].defaultvalue;');
+                if ((typeof eval('datamodel["' + scoid + '"]["' + element + '"].defaultvalue')) != 'undefined') {
+                    eval(element + ' = datamodel["' + scoid + '"]["' + element + '"].defaultvalue;');
                 } else {
-                    eval(element+' = "";');
+                    eval(element + ' = "";');
                 }
             }
         }
@@ -176,7 +176,7 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
     var Initialized = false;
 
     function LMSInitialize (param) {
-        scoid = scorm_current_node ? scorm_current_node.scoid : scoid ;
+        scoid = scorm_current_node ? scorm_current_node.scoid : scoid;
         initdatamodel(scoid);
 
         errorCode = "0";
@@ -230,17 +230,17 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
     function LMSGetValue (element) {
         errorCode = "0";
         if (Initialized) {
-            if (element !="") {
+            if (element != "") {
                 expression = new RegExp(CMIIndex,'g');
                 elementmodel = String(element).replace(expression,'.n.');
-                if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"]')) != "undefined") {
-                    if (eval('datamodel["'+scoid+'"]["'+elementmodel+'"].mod') != 'w') {
+                if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"]')) != "undefined") {
+                    if (eval('datamodel["' + scoid + '"]["' + elementmodel + '"].mod') != 'w') {
                             element = String(element).replace(expression, "_$1.");
                             elementIndexes = element.split('.');
                         subelement = 'cmi';
                         i = 1;
                         while ((i < elementIndexes.length) && (typeof eval(subelement) != "undefined")) {
-                            subelement += '.'+elementIndexes[i++];
+                            subelement += '.' + elementIndexes[i++];
                         }
                         if (subelement == element) {
                             errorCode = "0";
@@ -249,21 +249,21 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
                             errorCode = "0"; // Need to check if it is the right errorCode
                         }
                     } else {
-                        errorCode = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].readerror');
+                        errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].readerror');
                     }
                 } else {
                     childrenstr = '._children';
                     countstr = '._count';
-                    if (elementmodel.substr(elementmodel.length-childrenstr.length,elementmodel.length) == childrenstr) {
-                        parentmodel = elementmodel.substr(0,elementmodel.length-childrenstr.length);
-                        if ((typeof eval('datamodel["'+scoid+'"]["'+parentmodel+'"]')) != "undefined") {
+                    if (elementmodel.substr(elementmodel.length - childrenstr.length,elementmodel.length) == childrenstr) {
+                        parentmodel = elementmodel.substr(0,elementmodel.length - childrenstr.length);
+                        if ((typeof eval('datamodel["' + scoid + '"]["' + parentmodel + '"]')) != "undefined") {
                             errorCode = "202";
                         } else {
                             errorCode = "201";
                         }
-                    } else if (elementmodel.substr(elementmodel.length-countstr.length,elementmodel.length) == countstr) {
-                        parentmodel = elementmodel.substr(0,elementmodel.length-countstr.length);
-                        if ((typeof eval('datamodel["'+scoid+'"]["'+parentmodel+'"]')) != "undefined") {
+                    } else if (elementmodel.substr(elementmodel.length - countstr.length,elementmodel.length) == countstr) {
+                        parentmodel = elementmodel.substr(0,elementmodel.length - countstr.length);
+                        if ((typeof eval('datamodel["' + scoid + '"]["' + parentmodel + '"]')) != "undefined") {
                             errorCode = "203";
                         } else {
                             errorCode = "201";
@@ -287,84 +287,84 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
             if (element != "") {
                 expression = new RegExp(CMIIndex,'g');
                 elementmodel = String(element).replace(expression,'.n.');
-                if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"]')) != "undefined") {
-                    if (eval('datamodel["'+scoid+'"]["'+elementmodel+'"].mod') != 'r') {
-                        expression = new RegExp(eval('datamodel["'+scoid+'"]["'+elementmodel+'"].format'));
-                        value = value+'';
+                if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"]')) != "undefined") {
+                    if (eval('datamodel["' + scoid + '"]["' + elementmodel + '"].mod') != 'r') {
+                        expression = new RegExp(eval('datamodel["' + scoid + '"]["' + elementmodel + '"].format'));
+                        value = value + '';
                         matches = value.match(expression);
                         if (matches != null) {
                             //Create dynamic data model element
                             if (element != elementmodel) {
                                 elementIndexes = element.split('.');
                                 subelement = 'cmi';
-                                for (i=1;i < elementIndexes.length-1;i++) {
+                                for (i = 1; i < elementIndexes.length - 1; i++) {
                                     elementIndex = elementIndexes[i];
-                                    if (elementIndexes[i+1].match(/^\d+$/)) {
-                                        if ((typeof eval(subelement+'.'+elementIndex)) == "undefined") {
-                                            eval(subelement+'.'+elementIndex+' = new Object();');
-                                            eval(subelement+'.'+elementIndex+'._count = 0;');
+                                    if (elementIndexes[i + 1].match(/^\d+$/)) {
+                                        if ((typeof eval(subelement + '.' + elementIndex)) == "undefined") {
+                                            eval(subelement + '.' + elementIndex + ' = new Object();');
+                                            eval(subelement + '.' + elementIndex + '._count = 0;');
                                         }
-                                        if (elementIndexes[i+1] == eval(subelement+'.'+elementIndex+'._count')) {
-                                            eval(subelement+'.'+elementIndex+'._count++;');
+                                        if (elementIndexes[i + 1] == eval(subelement + '.' + elementIndex + '._count')) {
+                                            eval(subelement + '.' + elementIndex + '._count++;');
                                         }
-                                        if (elementIndexes[i+1] > eval(subelement+'.'+elementIndex+'._count')) {
+                                        if (elementIndexes[i + 1] > eval(subelement + '.' + elementIndex + '._count')) {
                                             errorCode = "201";
                                         }
-                                        subelement = subelement.concat('.'+elementIndex+'_'+elementIndexes[i+1]);
+                                        subelement = subelement.concat('.' + elementIndex + '_' + elementIndexes[i + 1]);
                                         i++;
                                     } else {
-                                        subelement = subelement.concat('.'+elementIndex);
+                                        subelement = subelement.concat('.' + elementIndex);
                                     }
                                     if ((typeof eval(subelement)) == "undefined") {
-                                        eval(subelement+' = new Object();');
+                                        eval(subelement + ' = new Object();');
                                         if (subelement.substr(0,14) == 'cmi.objectives') {
-                                            eval(subelement+'.score = new Object();');
-                                            eval(subelement+'.score._children = score_children;');
-                                            eval(subelement+'.score.raw = "";');
-                                            eval(subelement+'.score.min = "";');
-                                            eval(subelement+'.score.max = "";');
+                                            eval(subelement + '.score = new Object();');
+                                            eval(subelement + '.score._children = score_children;');
+                                            eval(subelement + '.score.raw = "";');
+                                            eval(subelement + '.score.min = "";');
+                                            eval(subelement + '.score.max = "";');
                                         }
                                         if (subelement.substr(0,16) == 'cmi.interactions') {
-                                            eval(subelement+'.objectives = new Object();');
-                                            eval(subelement+'.objectives._count = 0;');
-                                            eval(subelement+'.correct_responses = new Object();');
-                                            eval(subelement+'.correct_responses._count = 0;');
+                                            eval(subelement + '.objectives = new Object();');
+                                            eval(subelement + '.objectives._count = 0;');
+                                            eval(subelement + '.correct_responses = new Object();');
+                                            eval(subelement + '.correct_responses._count = 0;');
                                         }
                                     }
                                 }
-                                element = subelement.concat('.'+elementIndexes[elementIndexes.length-1]);
+                                element = subelement.concat('.' + elementIndexes[elementIndexes.length - 1]);
                             }
-                            //Store data
+                            // Store data.
                             if (errorCode == "0") {
                                 if (autocommit && !(AICCapi.timeout)) {
                                     AICCapi.timeout = Y.later(60000, API, 'LMSCommit', [""], false);
                                 }
-                                if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range')) != "undefined") {
-                                    range = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range');
+                                if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"].range')) != "undefined") {
+                                    range = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].range');
                                     ranges = range.split('#');
-                                    value = value*1.0;
+                                    value = value * 1.0;
                                     if ((value >= ranges[0]) && (value <= ranges[1])) {
-                                        eval(element+'="'+value+'";');
+                                        eval(element + '="' + value + '";');
                                         errorCode = "0";
                                         return "true";
                                     } else {
-                                        errorCode = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].writeerror');
+                                        errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].writeerror');
                                     }
                                 } else {
                                     if (element == 'cmi.comments') {
-                                        eval(element+'+="'+value+'";');
+                                        eval(element + '+="' + value + '";');
                                     } else {
-                                        eval(element+'="'+value+'";');
+                                        eval(element + '="' + value + '";');
                                     }
                                     errorCode = "0";
                                     return "true";
                                 }
                             }
                         } else {
-                            errorCode = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].writeerror');
+                            errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].writeerror');
                         }
                     } else {
-                        errorCode = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].writeerror');
+                        errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].writeerror');
                     }
                 } else {
                     errorCode = "201"
@@ -450,21 +450,21 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
             cents = "0" + cents.toString();
         }
 
-        var secs = parseInt(cFirst[0],10)+parseInt(cSecond[0],10)+change;  //Seconds
+        var secs = parseInt(cFirst[0],10) + parseInt(cSecond[0],10) + change;  //Seconds
         change = Math.floor(secs / 60);
         secs = secs - (change * 60);
         if (Math.floor(secs) < 10) {
             secs = "0" + secs.toString();
         }
 
-        mins = parseInt(sFirst[1],10)+parseInt(sSecond[1],10)+change;   //Minutes
+        mins = parseInt(sFirst[1],10) + parseInt(sSecond[1],10) + change;   //Minutes
         change = Math.floor(mins / 60);
         mins = mins - (change * 60);
         if (mins < 10) {
             mins = "0" + mins.toString();
         }
 
-        hours = parseInt(sFirst[0],10)+parseInt(sSecond[0],10)+change;  //Hours
+        hours = parseInt(sFirst[0],10) + parseInt(sSecond[0],10) + change;  //Hours
         if (hours < 10) {
             hours = "0" + hours.toString();
         }
@@ -478,23 +478,23 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
 
     function TotalTime() {
         total_time = AddTime(cmi.core.total_time, cmi.core.session_time);
-        return '&'+underscore('cmi.core.total_time')+'='+escape(total_time);
+        return '&' + underscore('cmi.core.total_time') + '=' + escape(total_time);
     }
 
     function CollectData(data,parent) {
         var datastring = '';
         for (property in data) {
             if (typeof data[property] == 'object') {
-                datastring += CollectData(data[property],parent+'.'+property);
+                datastring += CollectData(data[property],parent + '.' + property);
             } else {
-                element = parent+'.'+property;
+                element = parent + '.' + property;
                 expression = new RegExp(CMIIndex,'g');
                 elementmodel = String(element).replace(expression,'.n.');
-                if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"]')) != "undefined") {
-                    if (eval('datamodel["'+scoid+'"]["'+elementmodel+'"].mod') != 'r') {
-                        elementstring = '&'+underscore(element)+'='+escape(data[property]);
-                        if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"].defaultvalue')) != "undefined") {
-                            if (eval('datamodel["'+scoid+'"]["'+elementmodel+'"].defaultvalue') != data[property]) {
+                if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"]')) != "undefined") {
+                    if (eval('datamodel["' + scoid + '"]["' + elementmodel + '"].mod') != 'r') {
+                        elementstring = '&' + underscore(element) + '=' + escape(data[property]);
+                        if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"].defaultvalue')) != "undefined") {
+                            if (eval('datamodel["' + scoid + '"]["' + elementmodel + '"].defaultvalue') != data[property]) {
                                 datastring += elementstring;
                             }
                         } else {
@@ -533,7 +533,7 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi
 
         //popupwin(datastring);
         var myRequest = NewHttpReq();
-        result = DoRequest(myRequest,datamodelurl,datamodelurlparams+datastring);
+        result = DoRequest(myRequest,datamodelurl,datamodelurlparams + datastring);
         results = String(result).split('\n');
         errorCode = results[1];
         return results[0];
index 5015a25..b3c5a37 100644 (file)
@@ -29,7 +29,7 @@ function scorm_add_time($a, $b) {
     $bseconds = explode('.', $bes[2]);
     $change = 0;
 
-    $acents = 0;  //Cents
+    $acents = 0;  // Cents.
     if (count($aseconds) > 1) {
         $acents = $aseconds[1];
     }
@@ -44,21 +44,21 @@ function scorm_add_time($a, $b) {
         $cents = '0'. $cents;
     }
 
-    $secs = $aseconds[0] + $bseconds[0] + $change;  //Seconds
+    $secs = $aseconds[0] + $bseconds[0] + $change;  // Seconds.
     $change = floor($secs / 60);
     $secs = $secs - ($change * 60);
     if (floor($secs) < 10) {
         $secs = '0'. $secs;
     }
 
-    $mins = $aes[1] + $bes[1] + $change;   //Minutes
+    $mins = $aes[1] + $bes[1] + $change;   // Minutes.
     $change = floor($mins / 60);
     $mins = $mins - ($change * 60);
     if ($mins < 10) {
         $mins = '0' .  $mins;
     }
 
-    $hours = $aes[0] + $bes[0] + $change;  //Hours
+    $hours = $aes[0] + $bes[0] + $change;  // Hours.
     if ($hours < 10) {
         $hours = '0' . $hours;
     }
@@ -83,9 +83,9 @@ function scorm_get_aicc_columns($row, $mastername='system_id') {
     $tok = strtok(strtolower($row), "\",\n\r");
     $result = new stdClass();
     $result->columns = array();
-    $i=0;
+    $i = 0;
     while ($tok) {
-        if ($tok !='') {
+        if ($tok != '') {
             $result->columns[] = $tok;
             if ($tok == $mastername) {
                 $result->mastercol = $i;
@@ -184,14 +184,14 @@ function scorm_parse_aicc(&$scorm) {
             $rows = explode("\r\n", $contents);
             $columns = scorm_get_aicc_columns($rows[0]);
             $regexp = scorm_forge_cols_regexp($columns->columns);
-            for ($i=1; $i<count($rows); $i++) {
+            for ($i = 1; $i < count($rows); $i++) {
                 if (preg_match($regexp, $rows[$i], $matches)) {
-                    for ($j=0; $j<count($columns->columns); $j++) {
+                    for ($j = 0; $j < count($columns->columns); $j++) {
                         $column = $columns->columns[$j];
-                        if (!isset($courses[$courseid]->elements[substr(trim($matches[$columns->mastercol+1]), 1 , -1)])) {
-                            $courses[$courseid]->elements[substr(trim($matches[$columns->mastercol+1]), 1 , -1)] = new stdClass();
+                        if (!isset($courses[$courseid]->elements[substr(trim($matches[$columns->mastercol + 1]), 1 , -1)])) {
+                            $courses[$courseid]->elements[substr(trim($matches[$columns->mastercol + 1]), 1 , -1)] = new stdClass();
                         }
-                        $courses[$courseid]->elements[substr(trim($matches[$columns->mastercol+1]), 1 , -1)]->$column = substr(trim($matches[$j+1]), 1, -1);
+                        $courses[$courseid]->elements[substr(trim($matches[$columns->mastercol + 1]), 1 , -1)]->$column = substr(trim($matches[$j + 1]), 1, -1);
                     }
                 }
             }
@@ -201,11 +201,11 @@ function scorm_parse_aicc(&$scorm) {
             $rows = explode("\r\n", $contents);
             $columns = scorm_get_aicc_columns($rows[0]);
             $regexp = scorm_forge_cols_regexp($columns->columns);
-            for ($i=1; $i<count($rows); $i++) {
+            for ($i = 1; $i < count($rows); $i++) {
                 if (preg_match($regexp, $rows[$i], $matches)) {
-                    for ($j=0; $j<count($columns->columns); $j++) {
+                    for ($j = 0; $j < count($columns->columns); $j++) {
                         $column = $columns->columns[$j];
-                        $courses[$courseid]->elements[substr(trim($matches[$columns->mastercol+1]), 1, -1)]->$column = substr(trim($matches[$j+1]), 1, -1);
+                        $courses[$courseid]->elements[substr(trim($matches[$columns->mastercol + 1]), 1, -1)]->$column = substr(trim($matches[$j + 1]), 1, -1);
                     }
                 }
             }
@@ -215,13 +215,13 @@ function scorm_parse_aicc(&$scorm) {
             $rows = explode("\r\n", $contents);
             $columns = scorm_get_aicc_columns($rows[0], 'block');
             $regexp = scorm_forge_cols_regexp($columns->columns, '(.+)?,');
-            for ($i=1; $i<count($rows); $i++) {
+            for ($i = 1; $i < count($rows); $i++) {
                 if (preg_match($regexp, $rows[$i], $matches)) {
-                    for ($j=0; $j<count($columns->columns); $j++) {
+                    for ($j = 0; $j < count($columns->columns); $j++) {
                         if ($j != $columns->mastercol) {
-                            $element = substr(trim($matches[$j+1]), 1 , -1);
+                            $element = substr(trim($matches[$j + 1]), 1 , -1);
                             if (!empty($element)) {
-                                $courses[$courseid]->elements[$element]->parent = substr(trim($matches[$columns->mastercol+1]), 1, -1);
+                                $courses[$courseid]->elements[$element]->parent = substr(trim($matches[$columns->mastercol + 1]), 1, -1);
                             }
                         }
                     }
@@ -233,11 +233,11 @@ function scorm_parse_aicc(&$scorm) {
             $rows = explode("\r\n", $contents);
             $columns = scorm_get_aicc_columns($rows[0], 'course_element');
             $regexp = scorm_forge_cols_regexp($columns->columns, '(.+)?,');
-            for ($i=1; $i<count($rows); $i++) {
+            for ($i = 1; $i < count($rows); $i++) {
                 if (preg_match($regexp, $rows[$i], $matches)) {
-                    for ($j=0; $j<count($matches)-1; $j++) {
+                    for ($j = 0; $j < count($matches) - 1; $j++) {
                         if ($j != $columns->mastercol) {
-                            $courses[$courseid]->elements[substr(trim($matches[$j+1]), 1, -1)]->parent = substr(trim($matches[$columns->mastercol+1]), 1, -1);
+                            $courses[$courseid]->elements[substr(trim($matches[$j + 1]), 1, -1)]->parent = substr(trim($matches[$columns->mastercol + 1]), 1, -1);
                         }
                     }
                 }
@@ -248,9 +248,9 @@ function scorm_parse_aicc(&$scorm) {
             $rows = explode("\r\n", $contents);
             $columns = scorm_get_aicc_columns($rows[0], 'structure_element');
             $regexp = scorm_forge_cols_regexp($columns->columns, '(.+),');
-            for ($i=1; $i<count($rows); $i++) {
+            for ($i = 1; $i < count($rows); $i++) {
                 if (preg_match($regexp, $rows[$i], $matches)) {
-                    $courses[$courseid]->elements[$columns->mastercol+1]->prerequisites = substr(trim($matches[1-$columns->mastercol+1]), 1, -1);
+                    $courses[$courseid]->elements[$columns->mastercol + 1]->prerequisites = substr(trim($matches[2 - $columns->mastercol]), 1, -1);
                 }
             }
         }
@@ -260,7 +260,7 @@ function scorm_parse_aicc(&$scorm) {
         }
     }
 
-    $oldscoes = $DB->get_records('scorm_scoes', array('scorm'=>$scorm->id));
+    $oldscoes = $DB->get_records('scorm_scoes', array('scorm' => $scorm->id));
     $sortorder = 0;
     $launch = 0;
     if (isset($courses)) {
@@ -276,8 +276,8 @@ function scorm_parse_aicc(&$scorm) {
             $sco->scormtype = '';
             $sco->sortorder = $sortorder;
 
-            if ($ss = $DB->get_record('scorm_scoes', array('scorm'=>$scorm->id,
-                                                           'identifier'=>$sco->identifier))) {
+            if ($ss = $DB->get_record('scorm_scoes', array('scorm' => $scorm->id,
+                                                           'identifier' => $sco->identifier))) {
                 $id = $ss->id;
                 $sco->id = $id;
                 $DB->update_record('scorm_scoes', $sco);
@@ -319,7 +319,7 @@ function scorm_parse_aicc(&$scorm) {
                         $sco->id = $oldscoid;
                         $DB->update_record('scorm_scoes', $sco);
                         $id = $oldscoid;
-                        $DB->delete_records('scorm_scoes_data', array('scoid'=>$oldscoid));
+                        $DB->delete_records('scorm_scoes_data', array('scoid' => $oldscoid));
                         unset($oldscoes[$oldscoid]);
                     } else {
                         $id = $DB->insert_record('scorm_scoes', $sco);
@@ -358,7 +358,7 @@ function scorm_parse_aicc(&$scorm) {
                             $dataid = $DB->insert_record('scorm_scoes_data', $scodata);
                         }
                     }
-                    if ($launch==0) {
+                    if ($launch == 0) {
                         $launch = $id;
                     }
                 }
@@ -367,8 +367,8 @@ function scorm_parse_aicc(&$scorm) {
     }
     if (!empty($oldscoes)) {
         foreach ($oldscoes as $oldsco) {
-            $DB->delete_records('scorm_scoes', array('id'=>$oldsco->id));
-            $DB->delete_records('scorm_scoes_track', array('scoid'=>$oldsco->id));
+            $DB->delete_records('scorm_scoes', array('id' => $oldsco->id));
+            $DB->delete_records('scorm_scoes_track', array('scoid' => $oldsco->id));
         }
     }
 
@@ -396,8 +396,8 @@ function scorm_parse_aicc(&$scorm) {
  */
 function scorm_aicc_get_hacp_session($scormid) {
     global $USER, $DB, $SESSION;
-    $cfg_scorm = get_config('scorm');
-    if (empty($cfg_scorm->allowaicchacp)) {
+    $cfgscorm = get_config('scorm');
+    if (empty($cfgscorm->allowaicchacp)) {
         return false;
     }
     $now = time();
@@ -422,14 +422,14 @@ function scorm_aicc_get_hacp_session($scormid) {
  */
 function scorm_aicc_confirm_hacp_session($hacpsession) {
     global $DB;
-    $cfg_scorm = get_config('scorm');
-    if (empty($cfg_scorm->allowaicchacp)) {
+    $cfgscorm = get_config('scorm');
+    if (empty($cfgscorm->allowaicchacp)) {
         return false;
     }
-    $time = time()-($cfg_scorm->aicchacptimeout * 60);
+    $time = time() - ($cfgscorm->aicchacptimeout * 60);
     $sql = "hacpsession = ? AND timemodified > ?";
     $hacpsession = $DB->get_record_select('scorm_aicc_session', $sql, array($hacpsession, $time));
-    if (!empty($hacpsession)) { //update timemodified as this is still an active session - resets the timeout.
+    if (!empty($hacpsession)) { // Update timemodified as this is still an active session - resets the timeout.
         $hacpsession->timemodified = time();
         $DB->update_record('scorm_aicc_session', $hacpsession);
     }
index 28b6fbb..9ee6618 100644 (file)
@@ -86,135 +86,135 @@ var logRow = 0;
 var logPopUpWindow = "N";
 var debugSCORMVersion = '<?php echo $scorm->version; ?>';
 <?php
-   $LMS_prefix = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'LMS' : '';
-   $LMS_api = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'API' : 'API_1484_11';
+$lmsprefix = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'LMS' : '';
+$lmsapi = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'API' : 'API_1484_11';
 
-   $LMS_elements = array();
-   if (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) {
-       $LMS_elements = array(   'cmi.core._children',
-                                'cmi.core.student_id',
-                                'cmi.core.student_name',
-                                'cmi.core.lesson_location',
-                                'cmi.core.credit',
-                                'cmi.core.lesson_status',
-                                'cmi.core.entry',
-                                'cmi.core._children',
-                                'cmi.core.score.raw',
-                                'cmi.core.score.max',
-                                'cmi.core.score.min',
-                                'cmi.core.total_time',
-                                'cmi.core.lesson_mode',
-                                'cmi.core.exit',
-                                'cmi.core.session_time',
-                                'cmi.suspend_data',
-                                'cmi.launch_data',
-                                'cmi.comments',
-                                'cmi.comments_from_lms',
-                                'cmi.objectives._count',
-                                'cmi.objectives._children',
-                                'cmi.objectives.n.id',
-                                'cmi.objectives.n.score._children',
-                                'cmi.objectives.n.score.raw',
-                                'cmi.objectives.n.score.min',
-                                'cmi.objectives.n.score.max',
-                                'cmi.objectives.n.status',
-                                'cmi.student_data._children',
-                                'cmi.student_data.mastery_score',
-                                'cmi.student_data.max_time_allowed',
-                                'cmi.student_data.time_limit_action',
-                                'cmi.student_preference._children',
-                                'cmi.student_preference.audio',
-                                'cmi.student_preference.language',
-                                'cmi.student_preference.speed',
-                                'cmi.student_preference.text',
-                                'cmi.interactions._children',
-                                'cmi.interactions._count',
-                                'cmi.interactions.n.id',
-                                'cmi.interactions.n.objectives._count',
-                                'cmi.interactions.n.objectives.m.id',
-                                'cmi.interactions.n.time',
-                                'cmi.interactions.n.type',
-                                'cmi.interactions.n.correct_responses._count',
-                                'cmi.interactions.n.correct_responses.m.pattern',
-                                'cmi.interactions.n.weighting',
-                                'cmi.interactions.n.student_response',
-                                'cmi.interactions.n.result',
-                                'cmi.interactions.n.latency');
-   } else {
-       $LMS_elements = array(   'cmi._children',
-                                'cmi._version',
-                                'cmi.learner_id',
-                                'cmi.learner_name',
-                                'cmi.location',
-                                'cmi.completion_status',
-                                'cmi.completion_threshold',
-                                'cmi.scaled_passing_score',
-                                'cmi.progressive_measure',
-                                'cmi.score._children',
-                                'cmi.score.raw',
-                                'cmi.score.max',
-                                'cmi.score.min',
-                                'cmi.score.scaled',
-                                'cmi.total_time',
-                                'cmi.time_limit_action',
-                                'cmi.max_time_allowed',
-                                'cmi.session_time',
-                                'cmi.success_status',
-                                'cmi.lesson_mode',
-                                'cmi.entry',
-                                'cmi.exit',
-                                'cmi.credit',
-                                'cmi.mode',
-                                'cmi.suspend_data',
-                                'cmi.launch_data',
-                                'cmi.comments',
-                                'cmi.comments_from_lms._children',
-                                'cmi.comments_from_lms._count',
-                                'cmi.comments_from_lms.n.comment',
-                                'cmi.comments_from_lms.n.location',
-                                'cmi.comments_from_lms.n.timestamp',
-                                'cmi.comments_from_learner._children',
-                                'cmi.comments_from_learner._count',
-                                'cmi.comments_from_learner.n.comment',
-                                'cmi.comments_from_learner.n.location',
-                                'cmi.comments_from_learner.n.timestamp',
-                                'cmi.objectives._count',
-                                'cmi.objectives._children',
-                                'cmi.objectives.n.id',
-                                'cmi.objectives.n.score._children',
-                                'cmi.objectives.n.score.raw',
-                                'cmi.objectives.n.score.min',
-                                'cmi.objectives.n.score.max',
-                                'cmi.objectives.n.score.scaled',
-                                'cmi.objectives.n.success_status',
-                                'cmi.objectives.n.completion_status',
-                                'cmi.objectives.n.progress_measure',
-                                'cmi.objectives.n.description',
-                                'cmi.student_data._children',
-                                'cmi.student_data.mastery_score',
-                                'cmi.student_data.max_time_allowed',
-                                'cmi.student_data.time_limit_action',
-                                'cmi.student_preference._children',
-                                'cmi.student_preference.audio',
-                                'cmi.student_preference.language',
-                                'cmi.student_preference.speed',
-                                'cmi.student_preference.text',
-                                'cmi.interactions._children',
-                                'cmi.interactions._count',
-                                'cmi.interactions.n.id',
-                                'cmi.interactions.n.objectives._count',
-                                'cmi.interactions.n.objectives.m.id',
-                                'cmi.interactions.n.time',
-                                'cmi.interactions.n.type',
-                                'cmi.interactions.n.correct_responses._count',
-                                'cmi.interactions.n.correct_responses.m.pattern',
-                                'cmi.interactions.n.weighting',
-                                'cmi.interactions.n.learner_response',
-                                'cmi.interactions.n.result',
-                                'cmi.interactions.n.latency',
-                                'cmi.interactions.n.description',
-                                'adl.nav.request');
-   }
+$lmselements = array();
+if (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) {
+    $lmselements = array(   'cmi.core._children',
+                            'cmi.core.student_id',
+                            'cmi.core.student_name',
+                            'cmi.core.lesson_location',
+                            'cmi.core.credit',
+                            'cmi.core.lesson_status',
+                            'cmi.core.entry',
+                            'cmi.core._children',
+                            'cmi.core.score.raw',
+                            'cmi.core.score.max',
+                            'cmi.core.score.min',
+                            'cmi.core.total_time',
+                            'cmi.core.lesson_mode',
+                            'cmi.core.exit',
+                            'cmi.core.session_time',
+                            'cmi.suspend_data',
+                            'cmi.launch_data',
+                            'cmi.comments',
+                            'cmi.comments_from_lms',
+                            'cmi.objectives._count',
+                            'cmi.objectives._children',
+                            'cmi.objectives.n.id',
+                            'cmi.objectives.n.score._children',
+                            'cmi.objectives.n.score.raw',
+                            'cmi.objectives.n.score.min',
+                            'cmi.objectives.n.score.max',
+                            'cmi.objectives.n.status',
+                            'cmi.student_data._children',
+                            'cmi.student_data.mastery_score',
+                            'cmi.student_data.max_time_allowed',
+                            'cmi.student_data.time_limit_action',
+                            'cmi.student_preference._children',
+                            'cmi.student_preference.audio',
+                            'cmi.student_preference.language',