Merge branch 'wip_MDL-46552_m28_memcached' of https://github.com/skodak/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 19 Aug 2014 00:28:56 +0000 (02:28 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 19 Aug 2014 00:28:56 +0000 (02:28 +0200)
275 files changed:
admin/environment.php
admin/renderer.php
admin/settings/users.php
admin/tool/uploaduser/index.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
auth/upgrade.txt
availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-debug.js
availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-min.js
availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form.js
availability/condition/completion/yui/src/form/js/form.js
availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-debug.js
availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-min.js
availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form.js
availability/condition/date/yui/src/form/js/form.js
availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-debug.js
availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-min.js
availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form.js
availability/condition/grade/yui/src/form/js/form.js
availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-debug.js
availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-min.js
availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form.js
availability/condition/group/yui/src/form/js/form.js
availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-debug.js
availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-min.js
availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form.js
availability/condition/grouping/yui/src/form/js/form.js
blocks/badges/db/upgrade.php [new file with mode: 0644]
blocks/badges/version.php
blocks/calendar_month/db/upgrade.php [new file with mode: 0644]
blocks/calendar_month/version.php
blocks/calendar_upcoming/db/upgrade.php [new file with mode: 0644]
blocks/calendar_upcoming/version.php
blocks/moodleblock.class.php
blocks/myprofile/block_myprofile.php
blocks/upgrade.txt
calendar/renderer.php
course/tests/behat/behat_course.php
course/tests/behat/course_category_management_listing.feature
course/tests/behat/course_controls.feature
course/tests/behat/course_resort.feature
enrol/imsenterprise/classes/task/cron_task.php [new file with mode: 0644]
enrol/imsenterprise/db/tasks.php [new file with mode: 0644]
enrol/imsenterprise/lang/en/enrol_imsenterprise.php
enrol/imsenterprise/lib.php
enrol/imsenterprise/tests/imsenterprise_test.php
enrol/imsenterprise/version.php
filter/mathjaxloader/db/upgrade.php [new file with mode: 0644]
filter/mathjaxloader/settings.php
filter/mathjaxloader/upgrade.txt [new file with mode: 0644]
filter/mathjaxloader/version.php
filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-debug.js
filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-min.js
filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader.js
filter/mathjaxloader/yui/src/loader/js/loader.js
grade/edit/tree/item_form.php
grade/export/grade_export_form.php
grade/export/lib.php
grade/export/ods/export.php
grade/export/ods/index.php
grade/export/txt/export.php
grade/export/txt/grade_export_txt.php
grade/export/txt/index.php
grade/export/txt/tests/behat/export.feature [new file with mode: 0644]
grade/export/upgrade.txt [new file with mode: 0644]
grade/export/xls/export.php
grade/export/xls/index.php
grade/export/xml/export.php
grade/export/xml/grade_export_xml.php
grade/export/xml/index.php
grade/export/xml/lang/en/gradeexport_xml.php
grade/export/xml/tests/behat/export.feature [new file with mode: 0644]
grade/import/csv/index.php
grade/report/grader/classes/event/grade_report_viewed.php [moved from grade/report/grader/classes/event/report_viewed.php with 90% similarity]
grade/report/grader/index.php
grade/report/grader/lang/en/gradereport_grader.php
grade/report/grader/lib.php
grade/report/grader/styles.css
grade/report/lib.php
grade/report/outcomes/classes/event/grade_report_viewed.php [moved from grade/report/outcomes/classes/event/report_viewed.php with 90% similarity]
grade/report/outcomes/index.php
grade/report/outcomes/lang/en/gradereport_outcomes.php
grade/report/overview/classes/event/grade_report_viewed.php [moved from grade/report/overview/classes/event/report_viewed.php with 92% similarity]
grade/report/overview/index.php
grade/report/overview/lang/en/gradereport_overview.php
grade/report/overview/lib.php
grade/report/user/classes/event/grade_report_viewed.php [moved from grade/report/user/classes/event/report_viewed.php with 92% similarity]
grade/report/user/index.php
grade/report/user/lang/en/gradereport_user.php
grade/report/user/lib.php
grade/tests/behat/grade_aggregation.feature [new file with mode: 0644]
grade/tests/behat/grade_view.feature
grade/tests/report_graderlib_test.php
grade/tests/reportlib_test.php
group/autogroup.php
group/autogroup_form.php
group/lib.php
group/tests/behat/auto_creation.feature
group/tests/lib_test.php
install/lang/kn/moodle.php [new file with mode: 0644]
install/lang/uk/install.php
lang/en/grades.php
lang/en/group.php
lib/blocklib.php
lib/classes/session/database.php
lib/classes/session/file.php
lib/classes/session/handler.php
lib/classes/session/manager.php
lib/classes/session/memcache.php
lib/classes/session/memcached.php
lib/classes/task/send_new_user_passwords_task.php
lib/csvlib.class.php
lib/db/install.xml
lib/db/upgrade.php
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor.js
lib/editor/atto/yui/src/editor/js/editor.js
lib/editor/atto/yui/src/editor/js/textarea.js
lib/environmentlib.php
lib/form/yui/build/moodle-form-dateselector/moodle-form-dateselector-debug.js [new file with mode: 0644]
lib/form/yui/build/moodle-form-dateselector/moodle-form-dateselector-min.js [new file with mode: 0644]
lib/form/yui/build/moodle-form-dateselector/moodle-form-dateselector.js [new file with mode: 0644]
lib/form/yui/dateselector/assets/skins/sam/dateselector.css [deleted file]
lib/form/yui/dateselector/dateselector.js [deleted file]
lib/form/yui/src/dateselector/build.json [new file with mode: 0644]
lib/form/yui/src/dateselector/js/calendar.js [new file with mode: 0644]
lib/form/yui/src/dateselector/js/dateselector.js [new file with mode: 0644]
lib/form/yui/src/dateselector/js/moodlecalendar.js [new file with mode: 0644]
lib/form/yui/src/dateselector/meta/dateselector.json [new file with mode: 0644]
lib/grade/grade_category.php
lib/grade/grade_grade.php
lib/javascript-static.js
lib/moodlelib.php
lib/navigationlib.php
lib/outputcomponents.php
lib/statslib.php
lib/tests/coursecatlib_test.php
lib/tests/grouplib_test.php
lib/tests/modinfolib_test.php
lib/tests/moodlelib_test.php
lib/tests/other/jquerypage.php
lib/tests/outputcomponents_test.php
lib/tests/session_manager_test.php
lib/tests/weblib_test.php
lib/upgrade.txt
lib/weblib.php
lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-debug.js
lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm-min.js
lib/yui/build/moodle-core-notification-confirm/moodle-core-notification-confirm.js
lib/yui/build/moodle-core-notification-dialogue/moodle-core-notification-dialogue-debug.js
lib/yui/build/moodle-core-notification-dialogue/moodle-core-notification-dialogue-min.js
lib/yui/build/moodle-core-notification-dialogue/moodle-core-notification-dialogue.js
lib/yui/src/notification/js/confirm.js
lib/yui/src/notification/js/dialogue.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor-debug.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor-min.js
mod/assign/feedback/editpdf/yui/build/moodle-assignfeedback_editpdf-editor/moodle-assignfeedback_editpdf-editor.js
mod/assign/feedback/editpdf/yui/src/editor/js/editor.js
mod/assign/locallib.php
mod/assign/quickgradingform.php
mod/assign/renderable.php
mod/assign/renderer.php
mod/forum/db/install.xml
mod/forum/db/upgrade.php
mod/forum/lib.php
mod/forum/version.php
mod/glossary/formats/TEMPLATE/TEMPLATE_format.php
mod/glossary/formats/continuous/continuous_format.php
mod/glossary/formats/dictionary/dictionary_format.php
mod/glossary/formats/encyclopedia/encyclopedia_format.php
mod/glossary/formats/faq/faq_format.php
mod/glossary/formats/fullwithauthor/fullwithauthor_format.php
mod/glossary/formats/fullwithoutauthor/fullwithoutauthor_format.php
mod/glossary/lib.php
mod/glossary/upgrade.txt [new file with mode: 0644]
mod/lti/view.php
mod/quiz/tests/behat/add_quiz.feature
mod/quiz/yui/build/moodle-mod_quiz-autosave/moodle-mod_quiz-autosave-debug.js
mod/quiz/yui/build/moodle-mod_quiz-autosave/moodle-mod_quiz-autosave-min.js
mod/quiz/yui/build/moodle-mod_quiz-autosave/moodle-mod_quiz-autosave.js
mod/quiz/yui/src/autosave/js/autosave.js
mod/scorm/aicc.php
mod/scorm/datamodel.php
mod/scorm/datamodels/aicc.js
mod/scorm/datamodels/aicc.php
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/install.xml
mod/scorm/db/log.php
mod/scorm/db/subplugins.php
mod/scorm/db/upgrade.php
mod/scorm/grade.php
mod/scorm/index.php
mod/scorm/lang/en/scorm.php
mod/scorm/lib.php
mod/scorm/loadSCO.php
mod/scorm/locallib.php
mod/scorm/mod_form.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/version.php
mod/scorm/view.js
mod/scorm/view.php
my/tests/behat/reset_page.feature
question/format/xml/format.php
question/type/multichoice/edit_multichoice_form.php
rating/rate.php
rating/rate_ajax.php
report/security/locallib.php
theme/base/config.php
theme/base/style/calendar.css
theme/base/style/core.css
theme/base/style/tabs.css [new file with mode: 0644]
theme/bootstrapbase/less/bootstrap/navs.less
theme/bootstrapbase/less/moodle/calendar.less
theme/bootstrapbase/less/moodle/core.less
theme/bootstrapbase/less/moodle/grade.less
theme/bootstrapbase/less/moodle/yui_fixes.less
theme/bootstrapbase/renderers/core_renderer.php
theme/bootstrapbase/style/moodle.css
theme/upgrade.txt
user/profile/field/datetime/field.class.php
version.php

index 5c74f7f..0cfd9ee 100644 (file)
@@ -102,7 +102,7 @@ if ($contents = load_environment_xml()) {
 }
 
 // Get the results of the environment check.
-list($envstatus, $environment_results) = check_moodle_environment($version);
+list($envstatus, $environment_results) = check_moodle_environment($version, ENV_SELECT_NEWER);
 
 // Display the page.
 $output = $PAGE->get_renderer('core', 'admin');
index 99109a2..eb3925c 100644 (file)
@@ -1385,7 +1385,7 @@ class core_admin_renderer extends plugin_renderer_base {
      * configuration and how it suits Moodle needs.
      *
      * @param boolean $result final result of the check (true/false)
-     * @param array $environment_results array of results gathered
+     * @param environment_results[] $environment_results array of results gathered
      * @return string HTML to output.
      */
     public function environment_check_table($result, $environment_results) {
@@ -1397,9 +1397,10 @@ class core_admin_renderer extends plugin_renderer_base {
             get_string('name'),
             get_string('info'),
             get_string('report'),
+            get_string('plugin'),
             get_string('status'),
         );
-        $servertable->colclasses = array('centeralign name', 'centeralign info', 'leftalign report', 'centeralign status');
+        $servertable->colclasses = array('centeralign name', 'centeralign info', 'leftalign report', 'leftalign plugin', 'centeralign status');
         $servertable->attributes['class'] = 'admintable environmenttable generaltable';
         $servertable->id = 'serverstatus';
 
@@ -1409,9 +1410,10 @@ class core_admin_renderer extends plugin_renderer_base {
         $othertable->head  = array(
             get_string('info'),
             get_string('report'),
+            get_string('plugin'),
             get_string('status'),
         );
-        $othertable->colclasses = array('aligncenter info', 'alignleft report', 'aligncenter status');
+        $othertable->colclasses = array('aligncenter info', 'alignleft report', 'alignleft plugin', 'aligncenter status');
         $othertable->attributes['class'] = 'admintable environmenttable generaltable';
         $othertable->id = 'otherserverstatus';
 
@@ -1427,6 +1429,7 @@ class core_admin_renderer extends plugin_renderer_base {
                 $type = $environment_result->getPart();
                 $info = $environment_result->getInfo();
                 $status = $environment_result->getStatus();
+                $plugin = $environment_result->getPluginName();
                 $error_code = $environment_result->getErrorCode();
                 // Process Report field
                 $rec = new stdClass();
@@ -1503,7 +1506,8 @@ class core_admin_renderer extends plugin_renderer_base {
                 if (!empty($info)){
                    $linkparts[] = $info;
                 }
-                if (empty($CFG->docroot)) {
+                // Plugin environments do not have docs pages yet.
+                if (empty($CFG->docroot) or $environment_result->plugin) {
                     $report = get_string($stringtouse, 'admin', $rec);
                 } else {
                     $report = $this->doc_link(join($linkparts, '/'), get_string($stringtouse, 'admin', $rec));
@@ -1529,9 +1533,9 @@ class core_admin_renderer extends plugin_renderer_base {
 
                 // Add the row to the table
                 if ($environment_result->getPart() == 'custom_check'){
-                    $otherdata[$messagetype][] = array ($info, $report, $status);
+                    $otherdata[$messagetype][] = array ($info, $report, $plugin, $status);
                 } else {
-                    $serverdata[$messagetype][] = array ($type, $info, $report, $status);
+                    $serverdata[$messagetype][] = array ($type, $info, $report, $plugin, $status);
                 }
             }
         }
index 5a7e75a..2e613e7 100644 (file)
@@ -54,13 +54,11 @@ if ($hassiteconfig
         $temp->add(new admin_setting_configselect('defaultpreference_autosubscribe', new lang_string('autosubscribe'),
             '', 1, $choices));
 
-        if (!empty($CFG->forum_trackreadposts)) {
-            $choices = array();
-            $choices['0'] = new lang_string('trackforumsno');
-            $choices['1'] = new lang_string('trackforumsyes');
-            $temp->add(new admin_setting_configselect('defaultpreference_trackforums', new lang_string('trackforums'),
-                '', 0, $choices));
-        }
+        $choices = array();
+        $choices['0'] = new lang_string('trackforumsno');
+        $choices['1'] = new lang_string('trackforumsyes');
+        $temp->add(new admin_setting_configselect('defaultpreference_trackforums', new lang_string('trackforums'),
+            '', 0, $choices));
     }
     $ADMIN->add('accounts', $temp);
 
index b50156f..e0bddc3 100644 (file)
@@ -850,6 +850,15 @@ if ($formdata = $mform2->is_cancelled()) {
                         $cohort = $DB->get_record('cohort', array('id'=>$addcohort));
                     } else {
                         $cohort = $DB->get_record('cohort', array('idnumber'=>$addcohort));
+                        if (empty($cohort) && has_capability('moodle/cohort:manage', context_system::instance())) {
+                            // Cohort was not found. Create a new one.
+                            $cohortid = cohort_add_cohort((object)array(
+                                'idnumber' => $addcohort,
+                                'name' => $addcohort,
+                                'contextid' => context_system::instance()->id
+                            ));
+                            $cohort = $DB->get_record('cohort', array('id'=>$cohortid));
+                        }
                     }
 
                     if (empty($cohort)) {
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 8334fed..5b51134 100644 (file)
@@ -1,6 +1,11 @@
 This files describes API changes in /auth/* - plugins,
 information provided here is intended especially for developers.
 
+=== 2.8 ===
+
+* \core\session\manager::session_exists() now verifies the session is active
+  instead of only checking the session data is present in low level session handler
+
 === 2.7 ===
 
 * If you are returning a url in method change_password_url() from config, please make sure it is set before trying to use it.
index 4a070ab..27350c4 100644 (file)
Binary files a/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-debug.js and b/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-debug.js differ
index 6b0de32..eb98c96 100644 (file)
Binary files a/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-min.js and b/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-min.js differ
index 4a070ab..27350c4 100644 (file)
Binary files a/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form.js and b/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form.js differ
index b37ec5e..926a9e4 100644 (file)
@@ -45,10 +45,10 @@ M.availability_completion.form.getNode = function(json) {
     // Set initial values.
     if (json.cm !== undefined &&
             node.one('select[name=cm] > option[value=' + json.cm + ']')) {
-        node.one('select[name=cm]').set('value', json.cm);
+        node.one('select[name=cm]').set('value', '' + json.cm);
     }
     if (json.e !== undefined) {
-        node.one('select[name=e]').set('value', json.e);
+        node.one('select[name=e]').set('value', '' + json.e);
     }
 
     // Add event handlers (first time only).
index f0d42e1..d84da8c 100644 (file)
Binary files a/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-debug.js and b/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-debug.js differ
index 9b0f7c0..7447c99 100644 (file)
Binary files a/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-min.js and b/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-min.js differ
index f0d42e1..d84da8c 100644 (file)
Binary files a/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form.js and b/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form.js differ
index 9eff4e7..580c6eb 100644 (file)
@@ -51,7 +51,7 @@ M.availability_date.form.getNode = function(json) {
                 var fields = Y.JSON.parse(response.responseText);
                 for (var field in fields) {
                     var select = node.one('select[name=x\\[' + field + '\\]]');
-                    select.set('value', fields[field]);
+                    select.set('value', '' + fields[field]);
                     select.set('disabled', false);
                 }
             },
index 8db6d61..28f5f81 100644 (file)
Binary files a/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-debug.js and b/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-debug.js differ
index cb727ca..83c5e5a 100644 (file)
Binary files a/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-min.js and b/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-min.js differ
index 8db6d61..28f5f81 100644 (file)
Binary files a/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form.js and b/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form.js differ
index 669e296..e0b0fe9 100644 (file)
@@ -58,7 +58,7 @@ M.availability_grade.form.getNode = function(json) {
     // Set initial values.
     if (json.id !== undefined &&
             node.one('select[name=id] > option[value=' + json.id + ']')) {
-        node.one('select[name=id]').set('value', json.id);
+        node.one('select[name=id]').set('value', '' + json.id);
     }
     if (json.min !== undefined) {
         node.one('input[name=min]').set('checked', true);
index 3bfb261..a968d4e 100644 (file)
Binary files a/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-debug.js and b/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-debug.js differ
index d26f447..a5fe42f 100644 (file)
Binary files a/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-min.js and b/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-min.js differ
index 3bfb261..a968d4e 100644 (file)
Binary files a/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form.js and b/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form.js differ
index 9d06aed..e68a703 100644 (file)
@@ -48,7 +48,7 @@ M.availability_group.form.getNode = function(json) {
     if (json.creating === undefined) {
         if (json.id !== undefined &&
                 node.one('select[name=id] > option[value=' + json.id + ']')) {
-            node.one('select[name=id]').set('value', json.id);
+            node.one('select[name=id]').set('value', '' + json.id);
         } else if (json.id === undefined) {
             node.one('select[name=id]').set('value', 'any');
         }
index fa4f9ec..4c0a4ab 100644 (file)
Binary files a/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-debug.js and b/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-debug.js differ
index 068646f..305d8d5 100644 (file)
Binary files a/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-min.js and b/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-min.js differ
index fa4f9ec..4c0a4ab 100644 (file)
Binary files a/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form.js and b/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form.js differ
index 397000e..dc09e83 100644 (file)
@@ -46,7 +46,7 @@ M.availability_grouping.form.getNode = function(json) {
     // Set initial value if specified.
     if (json.id !== undefined &&
             node.one('select[name=id] > option[value=' + json.id + ']')) {
-        node.one('select[name=id]').set('value', json.id);
+        node.one('select[name=id]').set('value', '' + json.id);
     }
 
     // Add event handlers (first time only).
diff --git a/blocks/badges/db/upgrade.php b/blocks/badges/db/upgrade.php
new file mode 100644 (file)
index 0000000..3be12fd
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file keeps track of upgrades to the badges block
+ *
+ * Sometimes, changes between versions involve alterations to database structures
+ * and other major things that may break installations.
+ *
+ * The upgrade function in this file will attempt to perform all the necessary
+ * actions to upgrade your older installation to the current version.
+ *
+ * If there's something it cannot do itself, it will tell you what you need to do.
+ *
+ * The commands in here will all be database-neutral, using the methods of
+ * database_manager class
+ *
+ * Please do not forget to use upgrade_set_timeout()
+ * before any action that may take longer time to finish.
+ *
+ * @since Moodle 2.8
+ * @package block_badges
+ * @copyright 2014 Andrew Davis
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * Upgrade the badges block
+ * @param int $oldversion
+ * @param object $block
+ */
+function xmldb_block_badges_upgrade($oldversion, $block) {
+    global $DB;
+
+    if ($oldversion < 2014062600) {
+        // Add this block the default blocks on /my.
+        $blockname = 'badges';
+
+        $page = new moodle_page();
+        $page->set_context(context_system::instance());
+
+        // Check to see if this block is already on the default /my page.
+        $criteria = array(
+            'blockname' => $blockname,
+            'parentcontextid' => $page->context->id,
+            'pagetypepattern' => 'my-index'
+        );
+
+        if (!$DB->record_exists('block_instances', $criteria)) {
+            // Add the block to the default /my.
+            $page->blocks->add_region(BLOCK_POS_RIGHT);
+            $page->blocks->add_block($blockname, BLOCK_POS_RIGHT, 0, false, 'my-index');
+        }
+
+        upgrade_block_savepoint(true, 2014062600, $blockname);
+    }
+
+    return true;
+}
index a259daa..dd5ffab 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX).
+$plugin->version   = 2014062600;        // The current plugin version (Date: YYYYMMDDXX).
 $plugin->requires  = 2014050800;        // Requires this Moodle version.
-$plugin->component = 'block_badges';
\ No newline at end of file
+$plugin->component = 'block_badges';
diff --git a/blocks/calendar_month/db/upgrade.php b/blocks/calendar_month/db/upgrade.php
new file mode 100644 (file)
index 0000000..d4ae9b1
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file keeps track of upgrades to the calendar_month block
+ *
+ * Sometimes, changes between versions involve alterations to database structures
+ * and other major things that may break installations.
+ *
+ * The upgrade function in this file will attempt to perform all the necessary
+ * actions to upgrade your older installation to the current version.
+ *
+ * If there's something it cannot do itself, it will tell you what you need to do.
+ *
+ * The commands in here will all be database-neutral, using the methods of
+ * database_manager class
+ *
+ * Please do not forget to use upgrade_set_timeout()
+ * before any action that may take longer time to finish.
+ *
+ * @since Moodle 2.8
+ * @package block_calendar_month
+ * @copyright 2014 Andrew Davis
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * Upgrade the calendar_month block
+ * @param int $oldversion
+ * @param object $block
+ */
+function xmldb_block_calendar_month_upgrade($oldversion, $block) {
+    global $DB;
+
+    if ($oldversion < 2014062600) {
+        // Add this block the default blocks on /my.
+        $blockname = 'calendar_month';
+
+        $page = new moodle_page();
+        $page->set_context(context_system::instance());
+
+        // Check to see if this block is already on the default /my page.
+        $criteria = array(
+            'blockname' => $blockname,
+            'parentcontextid' => $page->context->id,
+            'pagetypepattern' => 'my-index'
+        );
+
+        if (!$DB->record_exists('block_instances', $criteria)) {
+            // Add the block to the default /my.
+            $page->blocks->add_region(BLOCK_POS_RIGHT);
+            $page->blocks->add_block($blockname, BLOCK_POS_RIGHT, 0, false, 'my-index');
+        }
+
+        upgrade_block_savepoint(true, 2014062600, $blockname);
+    }
+
+    return true;
+}
index a0fd698..2b169f1 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->version   = 2014062600;        // The current plugin version (Date: YYYYMMDDXX)
 $plugin->requires  = 2014050800;        // Requires this Moodle version
 $plugin->component = 'block_calendar_month'; // Full name of the plugin (used for diagnostics)
diff --git a/blocks/calendar_upcoming/db/upgrade.php b/blocks/calendar_upcoming/db/upgrade.php
new file mode 100644 (file)
index 0000000..947d37c
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file keeps track of upgrades to the calendar_upcoming block
+ *
+ * Sometimes, changes between versions involve alterations to database structures
+ * and other major things that may break installations.
+ *
+ * The upgrade function in this file will attempt to perform all the necessary
+ * actions to upgrade your older installation to the current version.
+ *
+ * If there's something it cannot do itself, it will tell you what you need to do.
+ *
+ * The commands in here will all be database-neutral, using the methods of
+ * database_manager class
+ *
+ * Please do not forget to use upgrade_set_timeout()
+ * before any action that may take longer time to finish.
+ *
+ * @since Moodle 2.8
+ * @package block_calendar_upcoming
+ * @copyright 2014 Andrew Davis
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * Upgrade the calendar_upcoming block
+ * @param int $oldversion
+ * @param object $block
+ */
+function xmldb_block_calendar_upcoming_upgrade($oldversion, $block) {
+    global $DB;
+
+    if ($oldversion < 2014062600) {
+        // Add this block the default blocks on /my.
+        $blockname = 'calendar_upcoming';
+
+        $page = new moodle_page();
+        $page->set_context(context_system::instance());
+
+        // Check to see if this block is already on the default /my page.
+        $criteria = array(
+            'blockname' => $blockname,
+            'parentcontextid' => $page->context->id,
+            'pagetypepattern' => 'my-index'
+        );
+
+        if (!$DB->record_exists('block_instances', $criteria)) {
+            // Add the block to the default /my.
+            $page->blocks->add_region(BLOCK_POS_RIGHT);
+            $page->blocks->add_block($blockname, BLOCK_POS_RIGHT, 0, false, 'my-index');
+        }
+
+        upgrade_block_savepoint(true, 2014062600, $blockname);
+    }
+
+    return true;
+}
index 2b655fa..2113bc9 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->version   = 2014062600;        // The current plugin version (Date: YYYYMMDDXX)
 $plugin->requires  = 2014050800;        // Requires this Moodle version
 $plugin->component = 'block_calendar_upcoming'; // Full name of the plugin (used for diagnostics)
index 87f4707..bbbd72b 100644 (file)
@@ -75,12 +75,6 @@ class block_base {
      */
     var $content       = NULL;
 
-    /**
-     * A string generated by {@link _add_edit_controls()} to display block manipulation links when the user is in editing mode.
-     * @var string $edit_controls
-     */
-    var $edit_controls = NULL;
-
     /**
      * The initialized instance of this block object.
      * @var block $instance
@@ -484,32 +478,6 @@ class block_base {
         return false;
     }
 
-    /**
-     * Default behavior: print the config_instance.html file
-     * You don't need to override this if you're satisfied with the above
-     *
-     * @deprecated since Moodle 2.0.
-     * @return boolean whether anything was done. Blocks should use edit_form.php.
-     */
-    function instance_config_print() {
-        global $CFG, $DB, $OUTPUT;
-        // Default behavior: print the config_instance.html file
-        // You don't need to override this if you're satisfied with the above
-        if (!$this->instance_allow_multiple() && !$this->instance_allow_config()) {
-            return false;
-        }
-
-        if (is_file($CFG->dirroot .'/blocks/'. $this->name() .'/config_instance.html')) {
-            echo $OUTPUT->box_start('generalbox boxaligncenter blockconfiginstance');
-            include($CFG->dirroot .'/blocks/'. $this->name() .'/config_instance.html');
-            echo $OUTPUT->box_end();
-        } else {
-            notice(get_string('blockconfigbad'), str_replace('blockaction=', 'dummy=', qualified_me()));
-        }
-
-        return true;
-    }
-
     /**
      * Serialize and store config data
      */
@@ -637,39 +605,6 @@ class block_base {
         return 180;
     }
 
-    /** @deprecated since Moodle 2.0. */
-    function _print_block() {
-        throw new coding_exception('_print_block is no longer used. It was a private ' .
-                'method of the block class, only for use by the blocks system. You ' .
-                'should not have been calling it anyway.');
-    }
-
-    /** @deprecated since Moodle 2.0. */
-    function _print_shadow() {
-        throw new coding_exception('_print_shadow is no longer used. It was a private ' .
-                'method of the block class, only for use by the blocks system. You ' .
-                'should not have been calling it anyway.');
-    }
-
-    /** @deprecated since Moodle 2.0. */
-    function _title_html() {
-        throw new coding_exception('_title_html is no longer used. It was a private ' .
-                'method of the block class, only for use by the blocks system. You ' .
-                'should not have been calling it anyway.');
-    }
-
-    /** @deprecated since Moodle 2.0. */
-    function _add_edit_controls() {
-        throw new coding_exception('_add_edit_controls is no longer used. It was a private ' .
-                'method of the block class, only for use by the blocks system. You ' .
-                'should not have been calling it anyway.');
-    }
-
-    /** @deprecated since Moodle 2.0. */
-    function config_print() {
-        throw new coding_exception('config_print() can no longer be used. Blocks should use a settings.php file.');
-    }
-
     /**
      * Can be overridden by the block to prevent the block from being dockable.
      *
index 48909b1..cd82a6e 100644 (file)
@@ -212,24 +212,6 @@ class block_myprofile extends block_base {
     public function specialization() {
     }
 
-    /**
-     * displays instance configuration form
-     *
-     * @return boolean
-     */
-    function instance_config_print() {
-        return false;
-
-        /*
-        global $CFG;
-
-        $form = new block_myprofile.phpConfigForm(null, array($this->config));
-        $form->display();
-
-        return true;
-        */
-    }
-
     /**
      * locations where block can be displayed
      *
index 1a9ad48..abd99d2 100644 (file)
@@ -1,6 +1,18 @@
 This files describes API changes in /blocks/* - activity modules,
 information provided here is intended especially for developers.
 
+=== 2.8 ===
+
+* The instance_config_print() function was removed. It was deprecated in
+  Moodle 2.0, but without debugging notices. Since it was no longer a part
+  of the code path, debugging notices would not have been displayed.
+* Deprecated functions were removed from the block_base class:
+** _print_block()
+** _print_shadow()
+** _title_html()
+** _add_edit_controls()
+** config_print()
+
 === 2.6 ===
 
 * Deprecated /admin/block.php was removed, make sure blocks are using settings.php instead.
index 4a0e6cb..445f0ff 100644 (file)
@@ -256,10 +256,10 @@ class core_calendar_renderer extends plugin_renderer_base {
         $events = calendar_get_upcoming($calendar->courses, $calendar->groups, $calendar->users, 1, 100, $calendar->timestamp_today());
 
         $output  = html_writer::start_tag('div', array('class'=>'header'));
+        $output .= $this->course_filter_selector($returnurl, get_string('dayviewfor', 'calendar'));
         if (calendar_user_can_add_event($calendar->course)) {
             $output .= $this->add_event_button($calendar->course->id, 0, 0, 0, $calendar->time);
         }
-        $output .= $this->course_filter_selector($returnurl, get_string('dayviewfor', 'calendar'));
         $output .= html_writer::end_tag('div');
         // Controls
         $output .= html_writer::tag('div', calendar_top_controls('day', array('id' => $calendar->courseid, 'time' => $calendar->time)), array('class'=>'controls'));
@@ -464,10 +464,10 @@ class core_calendar_renderer extends plugin_renderer_base {
         calendar_events_by_day($events, $date['mon'], $date['year'], $eventsbyday, $durationbyday, $typesbyday, $calendar->courses);
 
         $output  = html_writer::start_tag('div', array('class'=>'header'));
+        $output .= $this->course_filter_selector($returnurl, get_string('detailedmonthviewfor', 'calendar'));
         if (calendar_user_can_add_event($calendar->course)) {
             $output .= $this->add_event_button($calendar->course->id, 0, 0, 0, $calendar->time);
         }
-        $output .= $this->course_filter_selector($returnurl, get_string('detailedmonthviewfor', 'calendar'));
         $output .= html_writer::end_tag('div', array('class'=>'header'));
         // Controls
         $output .= html_writer::tag('div', calendar_top_controls('month', array('id' => $calendar->courseid, 'time' => $calendar->time)), array('class' => 'controls'));
@@ -614,10 +614,10 @@ class core_calendar_renderer extends plugin_renderer_base {
         $events = calendar_get_upcoming($calendar->courses, $calendar->groups, $calendar->users, $futuredays, $maxevents);
 
         $output  = html_writer::start_tag('div', array('class'=>'header'));
+        $output .= $this->course_filter_selector($returnurl, get_string('upcomingeventsfor', 'calendar'));
         if (calendar_user_can_add_event($calendar->course)) {
             $output .= $this->add_event_button($calendar->course->id);
         }
-        $output .= $this->course_filter_selector($returnurl, get_string('upcomingeventsfor', 'calendar'));
         $output .= html_writer::end_tag('div');
 
         if ($events) {
index 7698fe7..580003b 100644 (file)
@@ -697,12 +697,12 @@ class behat_course extends behat_base {
      * @return Given[]
      */
     public function i_delete_activity($activityname) {
-
-        $deletestring = get_string('delete');
-
-        $steps = array(
-            new Given('I click on "' . $this->escape($deletestring) . '" "link" in the "' . $this->escape($activityname) . '" activity')
-        );
+        $steps = array();
+        $activity = $this->escape($activityname);
+        if ($this->running_javascript()) {
+            $steps[] = new Given('I open "' . $activity . '" actions menu');
+        }
+        $steps[] = new Given('I click on "' . get_string('delete') . '" "link" in the "' . $activity . '" activity');
 
         // JS enabled.
         // Not using chain steps here because the exceptions catcher have problems detecting
index a07af93..6871aae 100644 (file)
@@ -295,9 +295,9 @@ Feature: Course category management interface performs as expected
       | Cat 1 | 0 | CAT1 |
     And the following "courses" exist:
       | category | fullname | shortname | idnumber | sortorder | timecreated |
-      | CAT1 | Social studies | Senior school | Ext003 | 1 | 10000000001 |
-      | CAT1 | Applied sciences  | Middle school | Sci001 | 2 | 10000000002 |
-      | CAT1 | Extended social studies  | Junior school | Ext002 | 3 | 10000000003 |
+      | CAT1 | Social studies | Senior school | Ext003 | 1 | 1000000001 |
+      | CAT1 | Applied sciences  | Middle school | Sci001 | 2 | 1000000002 |
+      | CAT1 | Extended social studies  | Junior school | Ext002 | 3 | 1000000003 |
 
     And I log in as "admin"
     And I go to the courses management page
index 7b60198..c3a965e 100644 (file)
@@ -67,7 +67,6 @@ Feature: Course activity controls works as expected
     And I open "Test forum name 1" actions menu
     And I click on "Hide" "link" in the "Test forum name 1" activity
     And "#section-2" "css_element" <should_see_other_sections> exist
-    And I open "Test forum name 1" actions menu
     And I delete "Test forum name 1" activity
     And I should not see "Test forum name 1" in the "#region-main" "css_element"
     And I duplicate "Test forum name 2" activity editing the new copy with:
index 9cb31a9..4558c89 100644 (file)
@@ -11,9 +11,9 @@ Feature: Test we can resort course in the management interface.
       | Cat 1 | 0 | CAT1 |
     And the following "courses" exist:
       | category | fullname | shortname | idnumber | sortorder | timecreated |
-      | CAT1 | Social studies | Senior school | Ext003 | 1 | 10000000001 |
-      | CAT1 | Applied sciences  | Middle school | Sci001 | 2 | 10000000002 |
-      | CAT1 | Extended social studies  | Junior school | Ext002 | 3 | 10000000003 |
+      | CAT1 | Social studies | Senior school | Ext003 | 1 | 1000000001 |
+      | CAT1 | Applied sciences  | Middle school | Sci001 | 2 | 1000000002 |
+      | CAT1 | Extended social studies  | Junior school | Ext002 | 3 | 1000000003 |
 
     And I log in as "admin"
     And I go to the courses management page
@@ -54,9 +54,9 @@ Feature: Test we can resort course in the management interface.
       | Cat 1 | 0 | CAT1 |
     And the following "courses" exist:
       | category | fullname | shortname | idnumber | sortorder | timecreated |
-      | CAT1 | Social studies | Senior school | Ext003 | 1 | 10000000001 |
-      | CAT1 | Applied sciences  | Middle school | Sci001 | 2 | 10000000002 |
-      | CAT1 | Extended social studies  | Junior school | Ext002 | 3 | 10000000003 |
+      | CAT1 | Social studies | Senior school | Ext003 | 1 | 1000000001 |
+      | CAT1 | Applied sciences  | Middle school | Sci001 | 2 | 1000000002 |
+      | CAT1 | Extended social studies  | Junior school | Ext002 | 3 | 1000000003 |
 
     And I log in as "admin"
     And I go to the courses management page
diff --git a/enrol/imsenterprise/classes/task/cron_task.php b/enrol/imsenterprise/classes/task/cron_task.php
new file mode 100644 (file)
index 0000000..524a7a8
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy