Merge branch 'MDL-59490' of https://github.com/spvickers/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Mon, 24 Jul 2017 04:42:34 +0000 (12:42 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Mon, 24 Jul 2017 04:42:34 +0000 (12:42 +0800)
421 files changed:
.eslintignore
.stylelintignore
.travis.yml
admin/cli/install.php
admin/cli/install_database.php
admin/cli/upgrade.php
admin/environment.xml
admin/index.php
admin/registration/forms.php
admin/searchareas.php
admin/settings/plugins.php
admin/tool/customlang/db/upgrade.php
admin/tool/log/db/upgrade.php
admin/tool/log/store/database/db/upgrade.php
admin/tool/log/store/standard/db/upgrade.php
admin/tool/lp/classes/external.php
admin/tool/lp/db/services.php
admin/tool/lp/tests/behat/behat_tool_lp.php
admin/tool/lp/tests/behat/plan_crud.feature
admin/tool/lp/tests/externallib_test.php
admin/tool/lp/version.php
admin/tool/monitor/db/upgrade.php
admin/tool/oauth2/classes/form/issuer.php
admin/tool/oauth2/lang/en/tool_oauth2.php
admin/tool/uploadcourse/classes/course.php
admin/tool/uploadcourse/classes/step2_form.php
admin/tool/uploadcourse/cli/uploadcourse.php
admin/tool/uploadcourse/tests/course_test.php
admin/tool/xmldb/actions/check_defaults/check_defaults.class.php
auth/README.txt [deleted file]
auth/cas/CAS/CAS.php
auth/cas/CAS/CAS/AuthenticationException.php
auth/cas/CAS/CAS/Client.php
auth/cas/CAS/CAS/Languages/ChineseSimplified.php [new file with mode: 0644]
auth/cas/CAS/CAS/Languages/Greek.php
auth/cas/CAS/CAS/Languages/Japanese.php
auth/cas/CAS/CAS/PGTStorage/File.php
auth/cas/CAS/CAS/Request/CurlMultiRequest.php
auth/cas/CAS/CAS/Request/CurlRequest.php
auth/cas/CAS/moodle_readme.txt
auth/cas/db/upgrade.php
auth/cas/thirdpartylibs.xml
auth/fc/Readme.txt [deleted file]
auth/fc/auth.php [deleted file]
auth/fc/db/install.php [deleted file]
auth/fc/fcFPP.php [deleted file]
auth/fc/lang/en/auth_fc.php [deleted file]
auth/fc/settings.php [deleted file]
auth/fc/thirdpartylibs.xml [deleted file]
auth/fc/upgrade.txt [deleted file]
auth/imap/auth.php [deleted file]
auth/imap/db/install.php [deleted file]
auth/imap/db/upgrade.php [deleted file]
auth/imap/lang/en/auth_imap.php [deleted file]
auth/imap/settings.php [deleted file]
auth/imap/upgrade.txt [deleted file]
auth/imap/version.php [deleted file]
auth/ldap/db/upgrade.php
auth/manual/db/upgrade.php
auth/mnet/db/upgrade.php
auth/nntp/auth.php [deleted file]
auth/nntp/db/install.php [deleted file]
auth/nntp/db/upgrade.php [deleted file]
auth/nntp/lang/en/auth_nntp.php [deleted file]
auth/nntp/settings.php [deleted file]
auth/nntp/upgrade.txt [deleted file]
auth/oauth2/classes/api.php
auth/oauth2/classes/auth.php
auth/oauth2/tests/api_test.php
auth/pam/auth.php [deleted file]
auth/pam/db/install.php [deleted file]
auth/pam/db/upgrade.php [deleted file]
auth/pam/lang/en/auth_pam.php [deleted file]
auth/pam/settings.php [deleted file]
auth/pam/upgrade.txt [deleted file]
auth/pam/version.php [deleted file]
auth/pop3/auth.php [deleted file]
auth/pop3/db/install.php [deleted file]
auth/pop3/db/upgrade.php [deleted file]
auth/pop3/lang/en/auth_pop3.php [deleted file]
auth/pop3/settings.php [deleted file]
auth/pop3/upgrade.txt [deleted file]
auth/pop3/version.php [deleted file]
backup/moodle2/backup_stepslib.php
backup/moodle2/restore_stepslib.php
backup/moodle2/tests/moodle2_test.php
blocks/badges/db/upgrade.php
blocks/calendar_month/db/upgrade.php
blocks/calendar_upcoming/db/upgrade.php
blocks/comments/tests/behat/behat_block_comments.php
blocks/community/db/upgrade.php
blocks/completionstatus/db/upgrade.php
blocks/course_summary/db/upgrade.php
blocks/html/classes/search/content.php [new file with mode: 0644]
blocks/html/db/upgrade.php
blocks/html/lang/en/block_html.php
blocks/html/lib.php
blocks/html/tests/search_content_test.php [new file with mode: 0644]
blocks/moodleblock.class.php
blocks/navigation/db/upgrade.php
blocks/quiz_results/db/upgrade.php
blocks/recent_activity/db/upgrade.php
blocks/rss_client/db/upgrade.php
blocks/section_links/db/upgrade.php
blocks/selfcompletion/db/upgrade.php
blocks/settings/db/upgrade.php
blocks/upgrade.txt
calendar/amd/build/calendar.min.js [new file with mode: 0644]
calendar/amd/build/calendar_events.min.js [new file with mode: 0644]
calendar/amd/build/calendar_repository.min.js [new file with mode: 0644]
calendar/amd/build/summary_modal.min.js [new file with mode: 0644]
calendar/amd/src/calendar.js [new file with mode: 0644]
calendar/amd/src/calendar_events.js [moved from auth/fc/version.php with 65% similarity]
calendar/amd/src/calendar_repository.js [new file with mode: 0644]
calendar/amd/src/summary_modal.js [new file with mode: 0644]
calendar/export_execute.php
calendar/externallib.php
calendar/lib.php
calendar/renderer.php
calendar/templates/event_summary_body.mustache [new file with mode: 0644]
calendar/templates/event_summary_modal.mustache [new file with mode: 0644]
calendar/tests/behat/calendar_import.feature
calendar/tests/container_test.php
calendar/view.php
cohort/externallib.php
cohort/lib.php
cohort/tests/externallib_test.php
completion/classes/api.php
completion/classes/manager.php
completion/tests/api_test.php
course/externallib.php
course/lib.php
course/renderer.php
course/templates/defaultactivitycompletion.mustache
course/tests/behat/behat_course.php
course/tests/courselib_test.php
course/tests/externallib_test.php
course/yui/build/moodle-course-management/moodle-course-management-debug.js
course/yui/build/moodle-course-management/moodle-course-management-min.js
course/yui/build/moodle-course-management/moodle-course-management.js
course/yui/src/management/js/console.js
dataformat/html/classes/writer.php
enrol/database/db/upgrade.php
enrol/externallib.php
enrol/flatfile/db/upgrade.php
enrol/guest/db/upgrade.php
enrol/imsenterprise/db/upgrade.php
enrol/manual/ajax.php
enrol/manual/amd/build/form-potential-user-selector.min.js [new file with mode: 0644]
enrol/manual/amd/build/quickenrolment.min.js [new file with mode: 0644]
enrol/manual/amd/src/form-potential-user-selector.js [new file with mode: 0644]
enrol/manual/amd/src/quickenrolment.js [new file with mode: 0644]
enrol/manual/classes/enrol_users_form.php [new file with mode: 0644]
enrol/manual/db/upgrade.php
enrol/manual/lang/en/enrol_manual.php
enrol/manual/lib.php
enrol/manual/templates/form-user-selector-suggestion.mustache [new file with mode: 0644]
enrol/manual/yui/quickenrolment/assets/skins/sam/quickenrolment.css [deleted file]
enrol/manual/yui/quickenrolment/assets/skins/sam/sprite.png [deleted file]
enrol/manual/yui/quickenrolment/quickenrolment.js [deleted file]
enrol/mnet/db/upgrade.php
enrol/paypal/db/upgrade.php
enrol/self/db/upgrade.php
enrol/tests/behat/add_to_group.feature
enrol/tests/behat/behat_enrol.php
enrol/tests/behat/manage_enrolments_from_participants.feature
enrol/yui/rolemanager/assets/skins/sam/rolemanager.css [deleted file]
enrol/yui/rolemanager/assets/skins/sam/sprite.png [deleted file]
filter/mathjaxloader/db/upgrade.php
filter/mediaplugin/db/upgrade.php
filter/mediaplugin/styles.css
filter/tex/db/upgrade.php
grade/grading/form/rubric/db/upgrade.php
grade/report/overview/db/access.php
grade/report/overview/db/upgrade.php [moved from auth/fc/db/upgrade.php with 55% similarity]
grade/report/overview/lib.php
grade/report/overview/version.php
grade/report/user/db/upgrade.php
group/classes/output/user_groups_editable.php [new file with mode: 0644]
group/lib.php
group/tests/behat/behat_groups.php
install.php
install/lang/da/install.php
install/lang/de/install.php
install/lang/fr/install.php
install/lang/ja/install.php
install/lang/pt_br/error.php
lang/en/admin.php
lang/en/calendar.php
lang/en/form.php
lang/en/group.php
lib/amd/build/form-autocomplete.min.js
lib/amd/build/form-cohort-selector.min.js [new file with mode: 0644]
lib/amd/build/inplace_editable.min.js
lib/amd/build/modal.min.js
lib/amd/build/modal_events.min.js
lib/amd/src/form-autocomplete.js
lib/amd/src/form-cohort-selector.js [new file with mode: 0644]
lib/amd/src/inplace_editable.js
lib/amd/src/modal.js
lib/amd/src/modal_events.js
lib/behat/behat_base.php
lib/behat/behat_field_manager.php
lib/behat/form_field/behat_form_autocomplete.php
lib/behat/form_field/behat_form_checkbox.php
lib/behat/form_field/behat_form_field.php
lib/behat/form_field/behat_form_select.php
lib/bennu/iCalendar_components.php
lib/bennu/readme_moodle.txt
lib/blocklib.php
lib/classes/oauth2/api.php
lib/classes/oauth2/issuer.php
lib/classes/output/icon_system_fontawesome.php
lib/classes/output/inplace_editable.php
lib/classes/plugin_manager.php
lib/classes/task/build_installed_themes_task.php [new file with mode: 0644]
lib/classes/task/manager.php
lib/classes/task/search_index_task.php
lib/classes/task/search_optimize_task.php
lib/db/install.php
lib/db/install.xml
lib/db/services.php
lib/db/upgrade.php
lib/db/upgradelib.php
lib/editor/atto/db/upgrade.php
lib/editor/atto/plugins/equation/db/upgrade.php
lib/editor/atto/plugins/equation/db/upgradelib.php [deleted file]
lib/editor/atto/plugins/equation/tests/upgradelib_testcase.php [deleted file]
lib/editor/atto/upgrade.txt
lib/editor/tinymce/db/upgrade.php
lib/editor/tinymce/plugins/spellchecker/db/upgrade.php
lib/external/externallib.php
lib/externallib.php
lib/filelib.php
lib/filestorage/file_storage.php
lib/filestorage/stored_file.php
lib/form/classes/filetypes_util.php
lib/form/cohort.php [new file with mode: 0644]
lib/form/filemanager.js
lib/form/filemanager.php
lib/form/filetypes.php
lib/form/tests/behat/filetypes.feature [new file with mode: 0644]
lib/form/tests/filetypes_util_test.php
lib/form/tests/fixtures/filetypes.php [new file with mode: 0644]
lib/formslib.php
lib/grouplib.php
lib/moodlelib.php
lib/outputlib.php
lib/phpminimumversionlib.php [new file with mode: 0644]
lib/requirejs.php
lib/templates/form_autocomplete_selection.mustache
lib/templates/inplace_editable.mustache
lib/testing/generator/block_generator.php
lib/testing/tests/generator_test.php
lib/tests/adhoc_task_test.php
lib/tests/behat/behat_forms.php
lib/tests/behat/behat_general.php
lib/tests/blocklib_test.php
lib/tests/fixtures/task_fixtures.php
lib/tests/grouplib_test.php
lib/tests/moodlelib_test.php
lib/tests/upgradelib_test.php
lib/thirdpartylibs.xml
lib/upgrade.txt
lib/upgradelib.php
lib/validateurlsyntax.php
media/classes/manager.php
media/player/videojs/settings.php
message/classes/api.php
message/output/email/db/upgrade.php
message/output/jabber/db/upgrade.php
message/output/popup/amd/build/message_popover_controller.min.js
message/output/popup/amd/build/notification_area_control_area.min.js
message/output/popup/amd/build/notification_popover_controller.min.js
message/output/popup/amd/src/message_popover_controller.js
message/output/popup/amd/src/notification_area_control_area.js
message/output/popup/amd/src/notification_popover_controller.js
message/output/popup/classes/api.php
message/output/popup/db/upgrade.php
mod/assign/backup/moodle2/restore_assign_stepslib.php
mod/assign/db/upgrade.php
mod/assign/feedback/comments/db/upgrade.php
mod/assign/feedback/editpdf/db/upgrade.php
mod/assign/feedback/file/db/upgrade.php
mod/assign/lib.php
mod/assign/locallib.php
mod/assign/submission/comments/db/upgrade.php
mod/assign/submission/comments/lang/en/assignsubmission_comments.php
mod/assign/submission/comments/lib.php
mod/assign/submission/file/db/upgrade.php
mod/assign/submission/onlinetext/db/upgrade.php
mod/assign/upgrade.txt
mod/assignment/db/upgrade.php
mod/book/db/upgrade.php
mod/book/tests/behat/edit_tags.feature
mod/chat/db/upgrade.php
mod/chat/lib.php
mod/chat/upgrade.txt
mod/choice/db/upgrade.php
mod/choice/lib.php
mod/choice/upgrade.txt
mod/data/db/upgrade.php
mod/data/field/file/field.class.php
mod/data/field/picture/field.class.php
mod/data/import.php
mod/data/lib.php
mod/data/upgrade.txt
mod/feedback/db/upgrade.php
mod/feedback/lib.php
mod/feedback/tests/behat/coursemapping.feature
mod/feedback/upgrade.txt
mod/folder/db/upgrade.php
mod/forum/db/upgrade.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/mod_form.php
mod/forum/settings.php
mod/forum/tests/behat/edit_tags.feature
mod/glossary/db/upgrade.php
mod/glossary/tests/behat/edit_tags.feature
mod/imscp/db/upgrade.php
mod/label/db/upgrade.php
mod/label/mod_form.php
mod/label/tests/generator/lib.php
mod/label/version.php
mod/lesson/continue.php
mod/lesson/db/upgrade.php
mod/lesson/lib.php
mod/lesson/locallib.php
mod/lesson/tests/behat/lesson_question_attempts.feature
mod/lesson/upgrade.txt
mod/lesson/version.php
mod/lti/db/access.php
mod/lti/db/upgrade.php
mod/lti/db/upgradelib.php [deleted file]
mod/lti/lang/en/lti.php
mod/lti/locallib.php
mod/lti/tests/upgradelib_test.php [deleted file]
mod/lti/upgrade.txt
mod/lti/version.php
mod/page/db/upgrade.php
mod/quiz/classes/structure.php
mod/quiz/db/upgrade.php
mod/quiz/lib.php
mod/quiz/report/overview/db/upgrade.php
mod/quiz/report/statistics/db/upgrade.php
mod/quiz/tests/structure_test.php
mod/quiz/upgrade.txt
mod/resource/db/upgrade.php
mod/scorm/backup/moodle2/backup_scorm_stepslib.php
mod/scorm/db/upgrade.php
mod/scorm/lib.php
mod/scorm/player.php
mod/scorm/upgrade.txt
mod/scorm/view.php
mod/survey/db/upgrade.php
mod/url/db/upgrade.php
mod/wiki/db/upgrade.php
mod/wiki/tests/behat/edit_tags.feature
mod/workshop/db/upgrade.php
mod/workshop/form/accumulative/db/upgrade.php
mod/workshop/form/assessment_form.php
mod/workshop/form/comments/db/upgrade.php
mod/workshop/form/numerrors/db/upgrade.php
mod/workshop/form/rubric/db/upgrade.php
mod/workshop/lang/en/deprecated.txt
mod/workshop/lang/en/workshop.php
mod/workshop/lib.php
mod/workshop/locallib.php
mod/workshop/mod_form.php
mod/workshop/submission_form.php
mod/workshop/tests/behat/file_type_restriction.feature [new file with mode: 0644]
mod/workshop/tests/locallib_test.php
mod/workshop/upgrade.txt
my/lib.php
pix/e/cancel.png [new file with mode: 0644]
pix/e/cancel.svg [new file with mode: 0644]
portfolio/boxnet/db/upgrade.php
portfolio/googledocs/db/upgrade.php
portfolio/picasa/db/upgrade.php
question/behaviour/manualgraded/db/upgrade.php
question/type/calculated/db/upgrade.php
question/type/ddmarker/db/upgrade.php
question/type/essay/db/upgrade.php
question/type/match/db/upgrade.php
question/type/multianswer/db/upgrade.php
question/type/multichoice/db/upgrade.php
question/type/numerical/db/upgrade.php
question/type/random/db/upgrade.php
question/type/randomsamatch/db/upgrade.php
question/type/shortanswer/db/upgrade.php
repository/boxnet/db/upgrade.php
repository/dropbox/db/upgrade.php
repository/googledocs/db/upgrade.php
repository/picasa/db/upgrade.php
search/classes/base.php
search/classes/base_block.php [new file with mode: 0644]
search/classes/engine.php
search/classes/manager.php
search/cli/indexer.php
search/tests/base_block_test.php [new file with mode: 0644]
search/tests/fixtures/mock_block_area.php [moved from auth/nntp/version.php with 55% similarity]
search/tests/fixtures/mock_search_area.php
search/tests/fixtures/mock_search_engine.php
search/tests/manager_test.php
search/upgrade.txt
tag/tests/behat/edit_tag.feature
tag/tests/behat/flag_tags.feature
theme/boost/scss/moodle/admin.scss
theme/boost/scss/moodle/blocks.scss
theme/boost/scss/moodle/forms.scss
theme/boost/scss/moodle/user.scss
theme/boost/templates/core/form_autocomplete_selection.mustache
theme/bootstrapbase/less/moodle/user.less
theme/bootstrapbase/style/moodle.css
theme/more/db/upgrade.php
user/classes/participants_table.php
user/externallib.php
user/index.php
user/tests/behat/view_participants.feature
version.php

index e62d329..f37d77f 100644 (file)
@@ -6,7 +6,6 @@ vendor/
 admin/tool/usertours/amd/src/tour.js
 admin/tool/usertours/amd/src/popper.js
 auth/cas/CAS/
-auth/fc/fcFPP.php
 enrol/lti/ims-blti/
 filter/algebra/AlgParser.pm
 filter/tex/mimetex.*
@@ -58,6 +57,7 @@ lib/maxmind/MaxMind/
 lib/ltiprovider/
 lib/amd/src/truncate.js
 lib/fonts/
+lib/validateurlsyntax.php
 media/player/videojs/amd/src/video-lazy.js
 media/player/videojs/amd/src/Youtube-lazy.js
 media/player/videojs/videojs/
index 8c3d147..392cab1 100644 (file)
@@ -7,7 +7,6 @@ vendor/
 admin/tool/usertours/amd/src/tour.js
 admin/tool/usertours/amd/src/popper.js
 auth/cas/CAS/
-auth/fc/fcFPP.php
 enrol/lti/ims-blti/
 filter/algebra/AlgParser.pm
 filter/tex/mimetex.*
@@ -59,6 +58,7 @@ lib/maxmind/MaxMind/
 lib/ltiprovider/
 lib/amd/src/truncate.js
 lib/fonts/
+lib/validateurlsyntax.php
 media/player/videojs/amd/src/video-lazy.js
 media/player/videojs/amd/src/Youtube-lazy.js
 media/player/videojs/videojs/
index d58effa..54198fd 100644 (file)
@@ -14,7 +14,7 @@ language: php
 php:
     # We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
     - 7.1
-    - 5.6
+    - 7.0
 
 addons:
   postgresql: "9.3"
@@ -65,11 +65,7 @@ matrix:
         # Exclude it on all versions except for 7.1
 
         - env: DB=mysqli   TASK=PHPUNIT
-          php: 5.6
-
-        # Moodle 2.7 is not compatible with PHP 7 for the upgrade test.
-        - env: DB=pgsql    TASK=UPGRADE
-          php: 7.1
+          php: 7.0
 
 cache:
     directories:
@@ -77,8 +73,6 @@ cache:
       - $HOME/.npm
 
 install:
-    - sudo apt-get -y install haveged
-    - sudo service haveged start
     - >
         if [ "$DB" = 'mysqli' ];
         then
@@ -233,9 +227,9 @@ before_script:
         # We need the official upstream.
         git remote add upstream https://github.com/moodle/moodle.git;
 
-        # Checkout 27 STABLE branch.
-        git fetch upstream MOODLE_27_STABLE;
-        git checkout MOODLE_27_STABLE;
+        # Checkout 30 STABLE branch (the first version compatible with PHP 7.x)
+        git fetch upstream MOODLE_30_STABLE;
+        git checkout MOODLE_30_STABLE;
 
         # Perform the upgrade
         php admin/cli/install_database.php --agree-license --adminpass=Password --adminemail=admin@example.com --fullname="Upgrade test" --shortname=Upgrade;
index 0b6c5ca..240a819 100644 (file)
@@ -146,14 +146,9 @@ define('PHPUNIT_TEST', false);
 
 define('IGNORE_COMPONENT_CACHE', true);
 
-// Check that PHP is of a sufficient version
-if (version_compare(phpversion(), "5.6.5") < 0) {
-    $phpversion = phpversion();
-    // do NOT localise - lang strings would not work here and we CAN NOT move it after installib
-    fwrite(STDERR, "Moodle 3.2 or later requires at least PHP 5.6.5 (currently using version $phpversion).\n");
-    fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
-    exit(1);
-}
+// Check that PHP is of a sufficient version as soon as possible.
+require_once(__DIR__.'/../../lib/phpminimumversionlib.php');
+moodle_require_minimum_php_version();
 
 // set up configuration
 global $CFG;
@@ -808,6 +803,12 @@ if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
 
 if (!$options['skip-database']) {
     install_cli_database($options, $interactive);
+    // This needs to happen at the end to ensure it occurs after all caches
+    // have been purged for the last time.
+    // This will build a cached version of the current theme for the user
+    // to immediately start browsing the site.
+    require_once($CFG->libdir.'/upgradelib.php');
+    upgrade_themes();
 } else {
     echo get_string('cliskipdatabase', 'install')."\n";
 }
index f41263e..0dd6122 100644 (file)
@@ -62,14 +62,9 @@ Example:
 \$sudo -u www-data /usr/bin/php admin/cli/install_database.php --lang=cs --adminpass=soMePass123 --agree-license
 ";
 
-// Check that PHP is of a sufficient version
-if (version_compare(phpversion(), "5.6.5") < 0) {
-    $phpversion = phpversion();
-    // do NOT localise - lang strings would not work here and we CAN NOT move it after installib
-    fwrite(STDERR, "Moodle 3.2 or later requires at least PHP 5.6.5 (currently using version $phpversion).\n");
-    fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
-    exit(1);
-}
+// Check that PHP is of a sufficient version as soon as possible.
+require_once(__DIR__.'/../../lib/phpminimumversionlib.php');
+moodle_require_minimum_php_version();
 
 // Nothing to do if config.php does not exist
 $configfile = __DIR__.'/../../config.php';
@@ -183,5 +178,12 @@ if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
 
 install_cli_database($options, true);
 
+// This needs to happen at the end to ensure it occurs after all caches
+// have been purged for the last time.
+// This will build a cached version of the current theme for the user
+// to immediately start browsing the site.
+require_once($CFG->libdir.'/upgradelib.php');
+upgrade_themes();
+
 echo get_string('cliinstallfinished', 'install')."\n";
 exit(0); // 0 means success
index 6de2e13..6c10b9a 100644 (file)
@@ -187,5 +187,11 @@ upgrade_noncore(true);
 admin_apply_default_settings(NULL, false);
 admin_apply_default_settings(NULL, false);
 
+// This needs to happen at the end to ensure it occurs after all caches
+// have been purged for the last time.
+// This will build a cached version of the current theme for the user
+// to immediately start browsing the site.
+upgrade_themes();
+
 echo get_string('cliupgradefinished', 'admin')."\n";
 exit(0); // 0 means success
index 916c8a7..b8c7f16 100644 (file)
       </CUSTOM_CHECK>
     </CUSTOM_CHECKS>
   </MOODLE>
+  <MOODLE version="3.4" requires="3.0">
+    <UNICODE level="required">
+      <FEEDBACK>
+        <ON_ERROR message="unicoderequired" />
+      </FEEDBACK>
+    </UNICODE>
+    <DATABASE level="required">
+      <VENDOR name="mariadb" version="5.5.31" />
+      <VENDOR name="mysql" version="5.5.31" />
+      <VENDOR name="postgres" version="9.3" />
+      <VENDOR name="mssql" version="10.0" />
+      <VENDOR name="oracle" version="10.2" />
+    </DATABASE>
+    <PHP version="7.0.0" level="required">
+    </PHP>
+    <PCREUNICODE level="optional">
+      <FEEDBACK>
+        <ON_CHECK message="pcreunicodewarning" />
+      </FEEDBACK>
+    </PCREUNICODE>
+    <PHP_EXTENSIONS>
+      <PHP_EXTENSION name="iconv" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="iconvrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="mbstring" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="mbstringrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="curl" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="curlrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="openssl" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="opensslrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="tokenizer" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="tokenizerrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="xmlrpc" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="xmlrpcrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="soap" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="soaprecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="ctype" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="ctyperequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="zip" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="ziprequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="zlib" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="gd" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="gdrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="simplexml" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="simplexmlrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="spl" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="splrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="pcre" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="dom" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="xml" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="xmlreader" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="intl" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="intlrequired" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="json" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="hash" level="required"/>
+      <PHP_EXTENSION name="fileinfo" level="required"/>
+    </PHP_EXTENSIONS>
+    <PHP_SETTINGS>
+      <PHP_SETTING name="memory_limit" value="96M" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="settingmemorylimit" />
+        </FEEDBACK>
+      </PHP_SETTING>
+      <PHP_SETTING name="file_uploads" value="1" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="settingfileuploads" />
+        </FEEDBACK>
+      </PHP_SETTING>
+      <PHP_SETTING name="opcache.enable" value="1" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="opcacherecommended" />
+        </FEEDBACK>
+      </PHP_SETTING>
+    </PHP_SETTINGS>
+    <CUSTOM_CHECKS>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="unsupporteddbstorageengine" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="quizattemptsupgradedmessage" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="slashargumentswarning" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="unsupporteddbtablerowformat" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="unoconvwarning" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="libcurlwarning" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_format" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="unsupporteddbfileformat" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_file_per_table" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="unsupporteddbfilepertable" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_large_prefix" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="unsupporteddblargeprefix" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_is_https" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="ishttpswarning" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_mysql_incomplete_unicode_support" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="incompleteunicodesupport" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+    </CUSTOM_CHECKS>
+  </MOODLE>
 </COMPATIBILITY_MATRIX>
index 6cf7f45..d0da26b 100644 (file)
@@ -29,14 +29,9 @@ if (!file_exists('../config.php')) {
     die();
 }
 
-// Check that PHP is of a sufficient version as soon as possible
-if (version_compare(phpversion(), '5.6.5') < 0) {
-    $phpversion = phpversion();
-    // do NOT localise - lang strings would not work here and we CAN NOT move it to later place
-    echo "Moodle 3.2 or later requires at least PHP 5.6.5 (currently using version $phpversion).<br />";
-    echo "Please upgrade your server software or install older Moodle version.";
-    die();
-}
+// Check that PHP is of a sufficient version as soon as possible.
+require_once(__DIR__.'/../lib/phpminimumversionlib.php');
+moodle_require_minimum_php_version();
 
 // make sure iconv is available and actually works
 if (!function_exists('iconv')) {
index 6e0b8a9..8142999 100644 (file)
@@ -225,19 +225,25 @@ class site_registration_form extends moodleform {
         $imageurl = get_config('hub', 'site_imageurl_' . $cleanhuburl);
         $privacy = get_config('hub', 'site_privacy_' . $cleanhuburl);
         $address = get_config('hub', 'site_address_' . $cleanhuburl);
+        if ($address === false) {
+            $address = '';
+        }
         $region = get_config('hub', 'site_region_' . $cleanhuburl);
         $country = get_config('hub', 'site_country_' . $cleanhuburl);
-        if ($country === false) {
-            $country = $admin->country;
+        if (empty($country)) {
+            $country = $admin->country ?: $CFG->country;
         }
         $language = get_config('hub', 'site_language_' . $cleanhuburl);
         if ($language === false) {
             $language = explode('_', current_language())[0];
         }
         $geolocation = get_config('hub', 'site_geolocation_' . $cleanhuburl);
+        if ($geolocation === false) {
+            $geolocation = '';
+        }
         $contactable = get_config('hub', 'site_contactable_' . $cleanhuburl);
         $emailalert = get_config('hub', 'site_emailalert_' . $cleanhuburl);
-        $emailalert = ($emailalert === 0) ? 0 : 1;
+        $emailalert = ($emailalert === false || $emailalert) ? 1 : 0;
         $coursesnumber = get_config('hub', 'site_coursesnumber_' . $cleanhuburl);
         $usersnumber = get_config('hub', 'site_usersnumber_' . $cleanhuburl);
         $roleassignmentsnumber = get_config('hub', 'site_roleassignmentsnumber_' . $cleanhuburl);
@@ -311,11 +317,12 @@ class site_registration_form extends moodleform {
         $mform->addElement('hidden', 'regioncode', '-');
         $mform->setType('regioncode', PARAM_ALPHANUMEXT);
 
-        $countries = get_string_manager()->get_list_of_countries();
+        $countries = ['' => ''] + get_string_manager()->get_list_of_countries();
         $mform->addElement('select', 'countrycode', get_string('sitecountry', 'hub'), $countries);
         $mform->setDefault('countrycode', $country);
         $mform->setType('countrycode', PARAM_ALPHANUMEXT);
         $mform->addHelpButton('countrycode', 'sitecountry', 'hub');
+        $mform->addRule('countrycode', $strrequired, 'required', null, 'client');
 
         $mform->addElement('text', 'geolocation', get_string('sitegeolocation', 'hub'),
                 array('class' => 'registration_textfield'));
@@ -333,6 +340,7 @@ class site_registration_form extends moodleform {
         $mform->addElement('text', 'contactphone', get_string('sitephone', 'hub'),
                 array('class' => 'registration_textfield'));
         $mform->setType('contactphone', PARAM_TEXT);
+        $mform->setDefault('contactphone', $contactphone);
         $mform->addHelpButton('contactphone', 'sitephone', 'hub');
         $mform->setForceLtr('contactphone');
 
index dcbc7cb..9ce7af6 100644 (file)
@@ -125,6 +125,9 @@ foreach ($searchareas as $area) {
                     $areasconfig[$areaid]->docsprocessed . ' , ' .
                     $areasconfig[$areaid]->recordsprocessed . ' , ' .
                     $areasconfig[$areaid]->docsignored;
+                if ($areasconfig[$areaid]->partial) {
+                    $laststatus .= ' ' . get_string('searchpartial', 'admin');
+                }
             } else {
                 $laststatus = '';
             }
index e63f190..3bb3c4a 100644 (file)
@@ -557,6 +557,13 @@ if ($hassiteconfig) {
     $temp->add(new admin_setting_heading('searchengineheading', new lang_string('searchengine', 'admin'), ''));
     $temp->add(new admin_setting_configselect('searchengine',
                                 new lang_string('selectsearchengine', 'admin'), '', 'solr', $engines));
+    $temp->add(new admin_setting_heading('searchindexingheading', new lang_string('searchoptions', 'admin'), ''));
+    $temp->add(new admin_setting_configcheckbox('searchindexwhendisabled',
+            new lang_string('searchindexwhendisabled', 'admin'), new lang_string('searchindexwhendisabled_desc', 'admin'),
+            0));
+    $temp->add(new admin_setting_configduration('searchindextime',
+            new lang_string('searchindextime', 'admin'), new lang_string('searchindextime_desc', 'admin'),
+            600));
 
     $ADMIN->add('searchplugins', $temp);
     $ADMIN->add('searchplugins', new admin_externalpage('searchareas', new lang_string('searchareas', 'admin'),
index d6fa182..afda140 100644 (file)
@@ -29,15 +29,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_tool_customlang_upgrade($oldversion) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index 3d7f4f9..13befec 100644 (file)
@@ -33,15 +33,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_tool_log_upgrade($oldversion) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index 789415e..0dbe11a 100644 (file)
@@ -27,15 +27,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_logstore_database_upgrade($oldversion) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index 2614e0a..bcd8d1d 100644 (file)
 defined('MOODLE_INTERNAL') || die();
 
 function xmldb_logstore_standard_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    $dbman = $DB->get_manager();
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2016041200) {
-        // This could take a long time. Unfortunately, no way to know how long, and no way to do progress, so setting for 1 hour.
-        upgrade_set_timeout(3600);
-
-        // Define key contextid (foreign) to be added to logstore_standard_log.
-        $table = new xmldb_table('logstore_standard_log');
-        $key = new xmldb_key('contextid', XMLDB_KEY_FOREIGN, array('contextid'), 'context', array('id'));
-
-        // Launch add key contextid.
-        $dbman->add_key($table, $key);
-
-        // Standard savepoint reached.
-        upgrade_plugin_savepoint(true, 2016041200, 'logstore', 'standard');
-    }
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index 6af0d41..77cf893 100644 (file)
@@ -920,119 +920,6 @@ class external extends external_api {
         ));
     }
 
-    /**
-     * Returns the description of external function parameters.
-     *
-     * @return external_function_parameters
-     */
-    public static function search_cohorts_parameters() {
-        $query = new external_value(
-            PARAM_RAW,
-            'Query string'
-        );
-        $includes = new external_value(
-            PARAM_ALPHA,
-            'What other contexts to fetch the frameworks from. (all, parents, self)',
-            VALUE_DEFAULT,
-            'parents'
-        );
-        $limitfrom = new external_value(
-            PARAM_INT,
-            'limitfrom we are fetching the records from',
-            VALUE_DEFAULT,
-            0
-        );
-        $limitnum = new external_value(
-            PARAM_INT,
-            'Number of records to fetch',
-            VALUE_DEFAULT,
-            25
-        );
-        return new external_function_parameters(array(
-            'query' => $query,
-            'context' => self::get_context_parameters(),
-            'includes' => $includes,
-            'limitfrom' => $limitfrom,
-            'limitnum' => $limitnum
-        ));
-    }
-
-    /**
-     * Search cohorts.
-     * TODO: MDL-52243 Move this function to cohorts/externallib.php
-     *
-     * @param string $query
-     * @param array $context
-     * @param string $includes
-     * @param int $limitfrom
-     * @param int $limitnum
-     * @return array
-     */
-    public static function search_cohorts($query, $context, $includes = 'parents', $limitfrom = 0, $limitnum = 25) {
-        global $DB, $CFG, $PAGE;
-        require_once($CFG->dirroot . '/cohort/lib.php');
-
-        $params = self::validate_parameters(self::search_cohorts_parameters(), array(
-            'query' => $query,
-            'context' => $context,
-            'includes' => $includes,
-            'limitfrom' => $limitfrom,
-            'limitnum' => $limitnum,
-        ));
-        $query = $params['query'];
-        $includes = $params['includes'];
-        $context = self::get_context_from_params($params['context']);
-        $limitfrom = $params['limitfrom'];
-        $limitnum = $params['limitnum'];
-
-        self::validate_context($context);
-        $output = $PAGE->get_renderer('tool_lp');
-
-        $manager = has_capability('moodle/cohort:manage', $context);
-        if (!$manager) {
-            require_capability('moodle/cohort:view', $context);
-        }
-
-        // TODO Make this more efficient.
-        if ($includes == 'self') {
-            $results = cohort_get_cohorts($context->id, $limitfrom, $limitnum, $query);
-            $results = $results['cohorts'];
-        } else if ($includes == 'parents') {
-            $results = cohort_get_cohorts($context->id, $limitfrom, $limitnum, $query);
-            $results = $results['cohorts'];
-            if (!$context instanceof context_system) {
-                $results = array_merge($results, cohort_get_available_cohorts($context, COHORT_ALL, $limitfrom, $limitnum, $query));
-            }
-        } else if ($includes == 'all') {
-            $results = cohort_get_all_cohorts($limitfrom, $limitnum, $query);
-            $results = $results['cohorts'];
-        } else {
-            throw new coding_exception('Invalid parameter value for \'includes\'.');
-        }
-
-        $cohorts = array();
-        foreach ($results as $key => $cohort) {
-            $cohortcontext = context::instance_by_id($cohort->contextid);
-            $exporter = new cohort_summary_exporter($cohort, array('context' => $cohortcontext));
-            $newcohort = $exporter->export($output);
-
-            $cohorts[$key] = $newcohort;
-        }
-
-        return array('cohorts' => $cohorts);
-    }
-
-    /**
-     * Returns description of external function result value.
-     *
-     * @return external_description
-     */
-    public static function search_cohorts_returns() {
-        return new external_single_structure(array(
-            'cohorts' => new external_multiple_structure(cohort_summary_exporter::get_read_structure())
-        ));
-    }
-
     /**
      * Returns description of external function.
      *
index 258f382..b7f9e9e 100644 (file)
@@ -131,10 +131,11 @@ $functions = array(
         'capabilities' => '',
         'ajax'         => true,
     ),
+    // This function was originally in this plugin but has been moved to core.
     'tool_lp_search_cohorts' => array(
-        'classname'    => 'tool_lp\external',
+        'classname'    => 'core_cohort_external',
         'methodname'   => 'search_cohorts',
-        'classpath'    => '',
+        'classpath'    => 'cohort/externallib.php',
         'description'  => 'Search for cohorts.',
         'type'         => 'read',
         'capabilities' => 'moodle/cohort:view',
index a43d857..acd0b19 100644 (file)
@@ -63,16 +63,4 @@ class behat_tool_lp extends behat_base {
         $this->execute('behat_general::i_click_on', [$xpathtarget, 'xpath_element']);
     }
 
-    /**
-     * Select item from autocomplete list.
-     *
-     * @Given /^I click on "([^"]*)" item in the autocomplete list$/
-     *
-     * @param string $item
-     */
-    public function i_click_on_item_in_the_autocomplete_list($item) {
-        $xpathtarget = "//ul[@class='form-autocomplete-suggestions']//li//span//span[contains(.,'" . $item . "')]";
-
-        $this->execute('behat_general::i_click_on', [$xpathtarget, 'xpath_element']);
-    }
 }
index 456e32b..7e9fecc 100644 (file)
@@ -28,8 +28,9 @@ Feature: Manage plearning plan
     And I follow "Home"
     And I navigate to "Competencies > Learning plan templates" in site administration
     And I click on ".template-userplans" "css_element" in the "Science template" "table_row"
-    And I click on ".form-autocomplete-downarrow" "css_element"
+    And I open the autocomplete suggestions list
     And I click on "Admin" item in the autocomplete list
+    And I press key "27" in the field "Select users to create learning plans for"
     When I click on "Create learning plans" "button"
     Then I should see "A learning plan was created"
     And I should see "Admin User" in the "Science template" "table_row"
@@ -54,6 +55,7 @@ Feature: Manage plearning plan
     And I click on ".template-cohorts" "css_element" in the "Science template cohort" "table_row"
     And I click on ".form-autocomplete-downarrow" "css_element"
     And I click on "cohort plan" item in the autocomplete list
+    And I press key "27" in the field "Select cohorts to sync"
     When I click on "Add cohorts" "button"
     Then I should see "2 learning plans were created."
     And I follow "Learning plan templates"
index d523735..138a420 100644 (file)
@@ -461,76 +461,4 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('A', $summary->evidence[1]->gradename);
     }
 
-    /**
-     * Search cohorts.
-     */
-    public function test_search_cohorts() {
-        $this->resetAfterTest(true);
-
-        $syscontext = array('contextid' => context_system::instance()->id);
-        $catcontext = array('contextid' => context_coursecat::instance($this->category->id)->id);
-        $othercatcontext = array('contextid' => context_coursecat::instance($this->othercategory->id)->id);
-
-        $cohort1 = $this->getDataGenerator()->create_cohort(array_merge($syscontext, array('name' => 'Cohortsearch 1')));
-        $cohort2 = $this->getDataGenerator()->create_cohort(array_merge($catcontext, array('name' => 'Cohortsearch 2')));
-        $cohort3 = $this->getDataGenerator()->create_cohort(array_merge($othercatcontext, array('name' => 'Cohortsearch 3')));
-
-        // Check for parameter $includes = 'parents'.
-
-        // A user without permission in the system.
-        $this->setUser($this->user);
-        try {
-            $result = external::search_cohorts("Cohortsearch", $syscontext, 'parents');
-            $this->fail('Invalid permissions in system');
-        } catch (required_capability_exception $e) {
-            // All good.
-        }
-
-        // A user without permission in a category.
-        $this->setUser($this->catuser);
-        try {
-            $result = external::search_cohorts("Cohortsearch", $catcontext, 'parents');
-            $this->fail('Invalid permissions in category');
-        } catch (required_capability_exception $e) {
-            // All good.
-        }
-
-        // A user with permissions in the system.
-        $this->setUser($this->creator);
-        $result = external::search_cohorts("Cohortsearch", $syscontext, 'parents');
-        $this->assertEquals(1, count($result['cohorts']));
-        $this->assertEquals('Cohortsearch 1', $result['cohorts'][$cohort1->id]->name);
-
-        // A user with permissions in the category.
-        $this->setUser($this->catcreator);
-        $result = external::search_cohorts("Cohortsearch", $catcontext, 'parents');
-        $this->assertEquals(2, count($result['cohorts']));
-        $cohorts = array();
-        foreach ($result['cohorts'] as $cohort) {
-            $cohorts[] = $cohort->name;
-        }
-        $this->assertTrue(in_array('Cohortsearch 1', $cohorts));
-        $this->assertTrue(in_array('Cohortsearch 2', $cohorts));
-
-        // Check for parameter $includes = 'self'.
-        $this->setUser($this->creator);
-        $result = external::search_cohorts("Cohortsearch", $othercatcontext, 'self');
-        $this->assertEquals(1, count($result['cohorts']));
-        $this->assertEquals('Cohortsearch 3', $result['cohorts'][$cohort3->id]->name);
-
-        // Check for parameter $includes = 'all'.
-        $this->setUser($this->creator);
-        $result = external::search_cohorts("Cohortsearch", $syscontext, 'all');
-        $this->assertEquals(3, count($result['cohorts']));
-
-        // Detect invalid parameter $includes.
-        $this->setUser($this->creator);
-        try {
-            $result = external::search_cohorts("Cohortsearch", $syscontext, 'invalid');
-            $this->fail('Invalid parameter includes');
-        } catch (coding_exception $e) {
-            // All good.
-        }
-    }
-
 }
index 3dadfb7..4c12650 100644 (file)
@@ -25,6 +25,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$plugin->version   = 2017051500; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->version   = 2017062700; // The current plugin version (Date: YYYYMMDDXX).
 $plugin->requires  = 2017050500; // Requires this Moodle version.
 $plugin->component = 'tool_lp'; // Full name of the plugin (used for diagnostics).
index 1a47f3a..4d7c475 100644 (file)
@@ -31,34 +31,10 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool always true
  */
 function xmldb_tool_monitor_upgrade($oldversion) {
-    global $DB;
+    global $CFG, $DB;
 
     $dbman = $DB->get_manager();
 
-    if ($oldversion < 2014102000) {
-
-        // Define field lastnotificationsent to be added to tool_monitor_subscriptions.
-        $table = new xmldb_table('tool_monitor_subscriptions');
-        $field = new xmldb_field('lastnotificationsent', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'timecreated');
-
-        // Conditionally launch add field lastnotificationsent.
-        if (!$dbman->field_exists($table, $field)) {
-            $dbman->add_field($table, $field);
-        }
-
-        // Monitor savepoint reached.
-        upgrade_plugin_savepoint(true, 2014102000, 'tool', 'monitor');
-    }
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index 3a0b64d..a57b4c2 100644 (file)
@@ -119,6 +119,10 @@ class issuer extends persistent {
         $mform->addElement('checkbox', 'showonloginpage', get_string('issuershowonloginpage', 'tool_oauth2'));
         $mform->addHelpButton('showonloginpage', 'issuershowonloginpage', 'tool_oauth2');
 
+        // Require confirmation email for new accounts.
+        $mform->addElement('advcheckbox', 'requireconfirmation', get_string('issuerrequireconfirmation', 'tool_oauth2'));
+        $mform->addHelpButton('requireconfirmation', 'issuerrequireconfirmation', 'tool_oauth2');
+
         $mform->addElement('hidden', 'sortorder');
         $mform->setType('sortorder', PARAM_INT);
 
index 5cc423c..8c20c6a 100644 (file)
@@ -81,6 +81,8 @@ $string['issuername_help'] = 'Name of the identity issuer. May be displayed on l
 $string['issuername'] = 'Name';
 $string['issuershowonloginpage_help'] = 'If the OAuth 2 authentication plugin is enabled, this login issuer will be listed on the login page to allow users to log in with accounts from this issuer.';
 $string['issuershowonloginpage'] = 'Show on login page';
+$string['issuerrequireconfirmation_help'] = 'Require that all users verify their email address before they can log in with OAuth. This applies to newly created accounts as part of the login process, or when an existing Moodle account is connected to an OAuth login via matching email addresses.';
+$string['issuerrequireconfirmation'] = 'Require email verification';
 $string['issuers'] = 'Issuers';
 $string['loginissuer'] = 'Allow login';
 $string['notconfigured'] = 'Not configured';
index 75500b2..da1592e 100644 (file)
@@ -95,7 +95,7 @@ class tool_uploadcourse_course {
     /** @var array fields allowed as course data. */
     static protected $validfields = array('fullname', 'shortname', 'idnumber', 'category', 'visible', 'startdate', 'enddate',
         'summary', 'format', 'theme', 'lang', 'newsitems', 'showgrades', 'showreports', 'legacyfiles', 'maxbytes',
-        'groupmode', 'groupmodeforce', 'groupmodeforce', 'enablecompletion');
+        'groupmode', 'groupmodeforce', 'enablecompletion');
 
     /** @var array fields required on course creation. */
     static protected $mandatoryfields = array('fullname', 'category');
@@ -676,6 +676,17 @@ class tool_uploadcourse_course {
             return false;
         }
 
+        // TODO MDL-59259 allow to set course format options for the current course format.
+
+        // Special case, 'numsections' is not a course format option any more but still should apply from defaults.
+        if (!$exists || !array_key_exists('numsections', $coursedata)) {
+            if (isset($this->rawdata['numsections']) && is_numeric($this->rawdata['numsections'])) {
+                $coursedata['numsections'] = (int)$this->rawdata['numsections'];
+            } else {
+                $coursedata['numsections'] = get_config('moodlecourse', 'numsections');
+            }
+        }
+
         // Saving data.
         $this->data = $coursedata;
         $this->enrolmentdata = tool_uploadcourse_helper::get_enrolment_data($this->rawdata);
index 4601500..d3c5024 100644 (file)
@@ -166,6 +166,13 @@ class tool_uploadcourse_step2_form extends tool_uploadcourse_base_form {
         $mform->addHelpButton('defaults[groupmodeforce]', 'groupmodeforce', 'group');
         $mform->setDefault('defaults[groupmodeforce]', $courseconfig->groupmodeforce);
 
+        // Completion tracking.
+        if (!empty($CFG->enablecompletion)) {
+            $mform->addElement('selectyesno', 'defaults[enablecompletion]', get_string('enablecompletion', 'completion'));
+            $mform->setDefault('defaults[enablecompletion]', $courseconfig->enablecompletion);
+            $mform->addHelpButton('defaults[enablecompletion]', 'enablecompletion', 'completion');
+        }
+
         // Hidden fields.
         $mform->addElement('hidden', 'importid');
         $mform->setType('importid', PARAM_INT);
index 7d9970f..75c39d8 100644 (file)
@@ -166,6 +166,7 @@ $defaults['groupmode'] = $courseconfig->groupmode;
 $defaults['groupmodeforce'] = $courseconfig->groupmodeforce;
 $defaults['visible'] = $courseconfig->visible;
 $defaults['lang'] =  $courseconfig->lang;
+$defaults['enablecompletion'] = $courseconfig->enablecompletion;
 
 // Course template.
 if (isset($options['templatecourse'])) {
index 3ac9fe0..3356163 100644 (file)
@@ -120,6 +120,36 @@ class tool_uploadcourse_course_testcase extends advanced_testcase {
         $this->assertTrue($DB->record_exists('course', array('shortname' => 'c2')));
     }
 
+    public function test_create_with_sections() {
+        global $DB;
+        $this->resetAfterTest(true);
+        $updatemode = tool_uploadcourse_processor::UPDATE_NOTHING;
+        $defaultnumsections = get_config('moodlecourse', 'numsections');
+
+        // Add new course, make sure default number of sections is created.
+        $mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
+        $data = array('shortname' => 'newcourse1', 'fullname' => 'New course1', 'format' => 'topics', 'category' => 1);
+        $co = new tool_uploadcourse_course($mode, $updatemode, $data);
+        $this->assertTrue($co->prepare());
+        $co->proceed();
+        $courseid = $DB->get_field('course', 'id', array('shortname' => 'newcourse1'));
+        $this->assertNotEmpty($courseid);
+        $this->assertEquals($defaultnumsections + 1,
+            $DB->count_records('course_sections', ['course' => $courseid]));
+
+        // Add new course specifying number of sections.
+        $mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
+        $data = array('shortname' => 'newcourse2', 'fullname' => 'New course2', 'format' => 'topics', 'category' => 1,
+            'numsections' => 15);
+        $co = new tool_uploadcourse_course($mode, $updatemode, $data);
+        $this->assertTrue($co->prepare());
+        $co->proceed();
+        $courseid = $DB->get_field('course', 'id', array('shortname' => 'newcourse2'));
+        $this->assertNotEmpty($courseid);
+        $this->assertEquals(15 + 1,
+            $DB->count_records('course_sections', ['course' => $courseid]));
+    }
+
     public function test_delete() {
         global $DB;
         $this->resetAfterTest(true);
index 73306ea..c37ab36 100644 (file)
@@ -20,6 +20,8 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+defined('MOODLE_INTERNAL') || die();
+
 /**
  * This class will check all the default values existing in the DB
  * match those specified in the xml specs
@@ -34,15 +36,15 @@ class check_defaults extends XMLDBCheckAction {
     /**
      * Init method, every subclass will have its own
      */
-    function init() {
+    public function init() {
         $this->introstr = 'confirmcheckdefaults';
         parent::init();
 
-        // Set own core attributes
+        // Set own core attributes.
 
-        // Set own custom attributes
+        // Set own custom attributes.
 
-        // Get needed strings
+        // Get needed strings.
         $this->loadStrings(array(
             'wrongdefaults' => 'tool_xmldb',
             'nowrongdefaultsfound' => 'tool_xmldb',
@@ -52,107 +54,130 @@ class check_defaults extends XMLDBCheckAction {
         ));
     }
 
-    protected function check_table(xmldb_table $xmldb_table, array $metacolumns) {
+    protected function check_table(xmldb_table $xmldbtable, array $metacolumns) {
         $o = '';
-        $wrong_fields = array();
+        $wrongfields = array();
+
+        // Get and process XMLDB fields.
+        if ($xmldbfields = $xmldbtable->getFields()) {
+            $o .= '        <ul>';
+            foreach ($xmldbfields as $xmldbfield) {
 
-        // Get and process XMLDB fields
-        if ($xmldb_fields = $xmldb_table->getFields()) {
-            $o.='        <ul>';
-            foreach ($xmldb_fields as $xmldb_field) {
+                // Get the default value for the field.
+                $xmldbdefault = $xmldbfield->getDefault();
 
-                // Get the default value for the field
-                $xmldbdefault = $xmldb_field->getDefault();
+                // Char fields with not null currently have default '' when actually installed.
+                if ($xmldbdefault === null && $xmldbfield->getType() === XMLDB_TYPE_CHAR &&
+                        $xmldbfield->getNotNull()) {
+                    $xmldbdefault = '';
+                }
+                if ($xmldbdefault !== null) {
+                    $xmldbdefault = (string)$xmldbdefault;
+                }
 
-                // If the metadata for that column doesn't exist or 'id' field found, skip
-                if (!isset($metacolumns[$xmldb_field->getName()]) or $xmldb_field->getName() == 'id') {
+                // If the metadata for that column doesn't exist or 'id' field found, skip.
+                if (!isset($metacolumns[$xmldbfield->getName()]) or $xmldbfield->getName() == 'id') {
                     continue;
                 }
 
-                // To variable for better handling
-                $metacolumn = $metacolumns[$xmldb_field->getName()];
+                // To variable for better handling.
+                $metacolumn = $metacolumns[$xmldbfield->getName()];
 
-                // Going to check this field in DB
-                $o.='            <li>' . $this->str['field'] . ': ' . $xmldb_field->getName() . ' ';
+                // Going to check this field in DB.
+                $o .= '            <li>' . $this->str['field'] . ': ' . $xmldbfield->getName() . ' ';
 
-                // get the value of the physical default (or blank if there isn't one)
-                if ($metacolumn->has_default==1) {
+                // Get the value of the physical default (or blank if there isn't one).
+                if ($metacolumn->has_default == 1) {
                     $physicaldefault = $metacolumn->default_value;
-                }
-                else {
-                    $physicaldefault = '';
+                } else {
+                    $physicaldefault = null;
                 }
 
-                // there *is* a default and it's wrong
-                if ($physicaldefault != $xmldbdefault) {
-                    $info = '('.$this->str['expected']." '$xmldbdefault', ".$this->str['actual'].
-                    " '$physicaldefault')";
-                    $o.='<font color="red">' . $this->str['wrong'] . " $info</font>";
-                    // Add the wrong field to the list
+                // There *is* a default and it's wrong.
+                if ($physicaldefault !== $xmldbdefault) {
+                    $xmldbtext = self::display_default($xmldbdefault);
+                    $physicaltext = self::display_default($physicaldefault);
+                    $info = "({$this->str['expected']} {$xmldbtext}, {$this->str['actual']} {$physicaltext})";
+                    $o .= '<font color="red">' . $this->str['wrong'] . " $info</font>";
+                    // Add the wrong field to the list.
                     $obj = new stdClass();
-                    $obj->table = $xmldb_table;
-                    $obj->field = $xmldb_field;
+                    $obj->table = $xmldbtable;
+                    $obj->field = $xmldbfield;
                     $obj->physicaldefault = $physicaldefault;
                     $obj->xmldbdefault = $xmldbdefault;
-                    $wrong_fields[] = $obj;
+                    $wrongfields[] = $obj;
                 } else {
-                    $o.='<font color="green">' . $this->str['ok'] . '</font>';
+                    $o .= '<font color="green">' . $this->str['ok'] . '</font>';
                 }
-                $o.='</li>';
+                $o .= '</li>';
             }
-            $o.='        </ul>';
+            $o .= '        </ul>';
         }
 
-        return array($o, $wrong_fields);
+        return array($o, $wrongfields);
+    }
+
+    /**
+     * Converts a default value suitable for display.
+     *
+     * @param string|null $defaultvalue Default value
+     * @return string Displayed version
+     */
+    protected static function display_default($defaultvalue) {
+        if ($defaultvalue === null) {
+            return '-';
+        } else {
+            return "'" . s($defaultvalue) . "'";
+        }
     }
 
-    protected function display_results(array $wrong_fields) {
+    protected function display_results(array $wrongfields) {
         global $DB;
         $dbman = $DB->get_manager();
 
         $s = '';
         $r = '<table class="generaltable boxaligncenter boxwidthwide" border="0" cellpadding="5" cellspacing="0" id="results">';
-        $r.= '  <tr><td class="generalboxcontent">';
-        $r.= '    <h2 class="main">' . $this->str['searchresults'] . '</h2>';
-        $r.= '    <p class="centerpara">' . $this->str['wrongdefaults'] . ': ' . count($wrong_fields) . '</p>';
-        $r.= '  </td></tr>';
-        $r.= '  <tr><td class="generalboxcontent">';
-
-        // If we have found wrong defaults inform about them
-        if (count($wrong_fields)) {
-            $r.= '    <p class="centerpara">' . $this->str['yeswrongdefaultsfound'] . '</p>';
-            $r.= '        <ul>';
-            foreach ($wrong_fields as $obj) {
-                $xmldb_table = $obj->table;
-                $xmldb_field = $obj->field;
-                $physicaldefault = $obj->physicaldefault;
-                $xmldbdefault = $obj->xmldbdefault;
-
-                // get the alter table command
-                $sqlarr = $dbman->generator->getAlterFieldSQL($xmldb_table, $xmldb_field);
-
-                $r.= '            <li>' . $this->str['table'] . ': ' . $xmldb_table->getName() . '. ' .
-                                          $this->str['field'] . ': ' . $xmldb_field->getName() . ', ' .
-                                          $this->str['expected'] . ' ' . "'$xmldbdefault'" . ' ' .
-                                          $this->str['actual'] . ' ' . "'$physicaldefault'" . '</li>';
-                // Add to output if we have sentences
+        $r .= '  <tr><td class="generalboxcontent">';
+        $r .= '    <h2 class="main">' . $this->str['searchresults'] . '</h2>';
+        $r .= '    <p class="centerpara">' . $this->str['wrongdefaults'] . ': ' . count($wrongfields) . '</p>';
+        $r .= '  </td></tr>';
+        $r .= '  <tr><td class="generalboxcontent">';
+
+        // If we have found wrong defaults inform about them.
+        if (count($wrongfields)) {
+            $r .= '    <p class="centerpara">' . $this->str['yeswrongdefaultsfound'] . '</p>';
+            $r .= '        <ul>';
+            foreach ($wrongfields as $obj) {
+                $xmldbtable = $obj->table;
+                $xmldbfield = $obj->field;
+                $physicaltext = self::display_default($obj->physicaldefault);
+                $xmldbtext = self::display_default($obj->xmldbdefault);
+
+                // Get the alter table command.
+                $sqlarr = $dbman->generator->getAlterFieldSQL($xmldbtable, $xmldbfield);
+
+                $r .= '            <li>' . $this->str['table'] . ': ' . $xmldbtable->getName() . '. ' .
+                        $this->str['field'] . ': ' . $xmldbfield->getName() . ', ' .
+                        $this->str['expected'] . ' ' . $xmldbtext . ' ' .
+                        $this->str['actual'] . ' ' . $physicaltext . '</li>';
+                // Add to output if we have sentences.
                 if ($sqlarr) {
                     $sqlarr = $dbman->generator->getEndedStatements($sqlarr);
-                    $s.= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
+                    $s .= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
                 }
             }
-            $r.= '        </ul>';
-            // Add the SQL statements (all together)
-            $r.= '<hr />' . $s;
+            $r .= '        </ul>';
+            // Add the SQL statements (all together).
+            $r .= '<hr />' . $s;
         } else {
-            $r.= '    <p class="centerpara">' . $this->str['nowrongdefaultsfound'] . '</p>';
+            $r .= '    <p class="centerpara">' . $this->str['nowrongdefaultsfound'] . '</p>';
         }
-        $r.= '  </td></tr>';
-        $r.= '  <tr><td class="generalboxcontent">';
-        // Add the complete log message
-        $r.= '    <p class="centerpara">' . $this->str['completelogbelow'] . '</p>';
-        $r.= '  </td></tr>';
-        $r.= '</table>';
+        $r .= '  </td></tr>';
+        $r .= '  <tr><td class="generalboxcontent">';
+        // Add the complete log message.
+        $r .= '    <p class="centerpara">' . $this->str['completelogbelow'] . '</p>';
+        $r .= '  </td></tr>';
+        $r .= '</table>';
 
         return $r;
     }
diff --git a/auth/README.txt b/auth/README.txt
deleted file mode 100644 (file)
index 48337b4..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-This directory contains authentication modules.
-
-Each of these modules describes a different way to
-check that a user has provided a correct
-
-   - username, and
-   - password.
-
-Even when external forms of authentication are being used, Moodle still
-maintains the internal "user" table with all the associated information about
-that user such as name, email address and so on.
-
-
-Multiauthentication in Moodle 1.8
--------------------------------------
-
-The active methods are set by the admin on the Configuration page. Multiple
-authentication plugins can now be used and ordered in a fail-through sequence.
-One plugin can be selected for interactive login as well (which will need to be
-part of the enabled plugin sequence).
-
-
-email - authentication by email  (DEFAULT METHOD)
-
-    - user fills out form with email address
-    - email sent to user with link
-    - user clicks on link in email to confirm
-    - user account is created
-    - user can log in
-
-
-none  - no authentication at all .. very insecure!!
-
-    - user logs in using ANY username and password
-    - if the username doesn't already exist then
-      a new account is created
-    - when user tries to access a course they
-      are forced to set up their account details
-
-
-nologin  - user can not log in, login as is possible
-
-    - this plugin can be used to prevent normal user login
-
-
-manual - internal authentication only
-
-    - user logs in using username and password
-    - no way for user to make their own account
-
-
-ldap  - Uses an external LDAP server
-
-    - user logs in using username and password
-    - these are checked against an LDAP server
-    - if correct, user is logged in
-    - optionally, info is copied from the LDAP
-      database to the Moodle user database
-
-    (see the ldap/README for more details on config etc...)
-
-
-imap  - Uses an external IMAP server
-
-    - user logs in using username and password
-    - these are checked against an IMAP server
-    - if correct, user is logged in
-    - if the username doesn't already exist then
-      a new account is created
-
-
-pop3  - Uses an external POP3 server
-
-    - user logs in using username and password
-    - these are checked against a POP3 server
-    - if correct, user is logged in
-    - if the username doesn't already exist then
-      a new account is created
-
-
-nntp  - Uses an external NNTP server
-
-    - user logs in using username and password
-    - these are checked against an NNTP server
-    - if correct, user is logged in
-    - if the username doesn't already exist then
-      a new account is created
-
-
-db  - Uses an external database to check username/password
-
-    - user logs in using username and password
-    - these are checked against an external database
-    - if correct, user is logged in
-    - if the username doesn't already exist then
-      a new Moodle account is created
-
-
---------------------------------------------------------------------------------
-
-Authentication API
-------------------
-
-
-AUTHENTICATION PLUGINS
-----------------------
-Each authentication plugin is now contained in a subfolder as a class definition
-in the auth.php file. For instance, the LDAP authentication plugin is the class
-called auth_plugin_ldap defined in:
-
-   /auth/ldap/auth.php
-
-To instantiate the class, there is a function in lib/moodlelib called
-get_auth_plugin() that does the work for you:
-
-   $ldapauth = get_auth_plugin('ldap');
-
-Auth plugin classes are pretty basic and should be extending auth_plugin_base class.
-They contain the same functions that were previously in each plugin's lib.php file,
-but refactored to become class methods, and tweaked to reference the plugin's instantiated
-config to get at the settings, rather than the global $CFG variable.
-
-When creating new plugins you can either extend the abstract auth_plugin_base class
-(defined in lib/authlib.php) or create a new one and implement all methods from
-auth_plugin_base.
-
-The new plugin architecture allows creating of more advanced types such as custom SSO
-without the need to patch login and logout pages (see *_hook() methods in existing plugins).
-
-Configuration
------------------
-
-All auth plugins must have a config property that contains the name value pairs
-from the config_plugins table. This is populated using the get_config() function
-in the constructor. The settings keys have also had the "auth_" prefix, as well
-as the auth plugin name, trimmed. For instance, what used to be
-
-   echo $CFG->auth_ldapversion;
-
-is now accessed as
-
-   echo $ldapauth->config->version;
-
-Authentication settings have been moved to the config_plugins database table,
-with the plugin field set to "auth/foo" (for instance, "auth/ldap").
-
-
-Method Names
------------------
-
-When the functions from lib.php were ported to methods in auth.php, the "auth_"
-prefix was dropped. For instance, calls to
-
-   auth_user_login($user, $pass);
-
-now become
-
-   $ldapauth->user_login($user, $pass);
-
-this also avoids having to worry about which auth/lib file to include since
-Moodle takes care of it for you when you create an instance with
-get_auth_plugin().
-
-The basic class defines all applicable methods that moodle uses, you can find
-more information in lib/authlib.php file.
-
-
-Upgrading from Moodle 1.7
------------------------------
-
-Moodle will upgrade the old auth settings (in $CFG->auth_foobar where foo is the
-auth plugin and bar is the setting) to the new style in the config_plugin
-database table.
-
-
-
-Upgrading from Moodle 1.8
-------------------------------
-
-user_activate() method was removed from public API because it was used only from user_confirm() in LDAP
index 3d84809..778d752 100644 (file)
 // hack by Vangelis Haniotakis to handle the absence of $_SERVER['REQUEST_URI']
 // in IIS
 //
-if (php_sapi_name() != 'cli') {
-    if (!isset($_SERVER['REQUEST_URI'])) {
-        $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
-    }
+if (!isset($_SERVER['REQUEST_URI']) && isset($_SERVER['SCRIPT_NAME']) && isset($_SERVER['QUERY_STRING'])) {
+    $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
 }
 
 // Add a E_USER_DEPRECATED for php versions <= 5.2
@@ -63,7 +61,7 @@ if (!defined('E_USER_DEPRECATED')) {
 /**
  * phpCAS version. accessible for the user by phpCAS::getVersion().
  */
-define('PHPCAS_VERSION', '1.3.4');
+define('PHPCAS_VERSION', '1.3.5+');
 
 /**
  * @addtogroup public
@@ -138,9 +136,9 @@ define("SAML_SOAP_ENV_CLOSE", '</SOAP-ENV:Envelope>');
  */
 define("SAML_ATTRIBUTES", 'SAMLATTRIBS');
 
-/**\r
- * SAML Attributes\r
- */\r
+/**
+ * SAML Attributes
+ */
 define("DEFAULT_ERROR", 'Internal script failure');
 
 /** @} */
@@ -221,6 +219,7 @@ define("PHPCAS_LANG_GERMAN", 'CAS_Languages_German');
 define("PHPCAS_LANG_JAPANESE", 'CAS_Languages_Japanese');
 define("PHPCAS_LANG_SPANISH", 'CAS_Languages_Spanish');
 define("PHPCAS_LANG_CATALAN", 'CAS_Languages_Catalan');
+define("PHPCAS_LANG_CHINESE_SIMPLIFIED", 'CAS_Languages_ChineseSimplified');
 
 /** @} */
 
@@ -302,13 +301,13 @@ class phpCAS
      */
     private static $_PHPCAS_DEBUG;
 
-    /**\r
+    /**
      * This variable is used to enable verbose mode
      * This pevents debug info to be show to the user. Since it's a security
      * feature the default is false
-     *\r
-     * @hideinitializer\r
-     */\r
+     *
+     * @hideinitializer
+     */
     private static $_PHPCAS_VERBOSE = false;
 
 
@@ -470,19 +469,19 @@ class phpCAS
         }
     }
 
-    /**\r
+    /**
      * Enable verbose errors messages in the website output
      * This is a security relevant since internal status info may leak an may
-     * help an attacker. Default is therefore false\r
-     *\r
-     * @param bool $verbose enable verbose output\r
-     *\r
-     * @return void\r
-     */\r
+     * help an attacker. Default is therefore false
+     *
+     * @param bool $verbose enable verbose output
+     *
+     * @return void
+     */
     public static function setVerbose($verbose)
     {
-        if ($verbose === true) {\r
-            self::$_PHPCAS_VERBOSE = true;\r
+        if ($verbose === true) {
+            self::$_PHPCAS_VERBOSE = true;
         } else {
             self::$_PHPCAS_VERBOSE = false;
         }
@@ -490,13 +489,13 @@ class phpCAS
 
 
     /**
-     * Show is verbose mode is on\r
-     *\r
-     * @return boot verbose\r
-     */\r
-    public static function getVerbose()\r
-    {\r
-        return self::$_PHPCAS_VERBOSE;\r
+     * Show is verbose mode is on
+     *
+     * @return boot verbose
+     */
+    public static function getVerbose()
+    {
+        return self::$_PHPCAS_VERBOSE;
     }
 
     /**
@@ -995,6 +994,25 @@ class phpCAS
         }
     }
 
+
+    /**
+     * Set a callback function to be run when receiving CAS attributes
+     *
+     * The callback function will be passed an $success_elements
+     * payload of the response (\DOMElement) as its first parameter.
+     *
+     * @param string $function       Callback function
+     * @param array  $additionalArgs optional array of arguments
+     *
+     * @return void
+     */
+    public static function setCasAttributeParserCallback($function, array $additionalArgs = array())
+    {
+        phpCAS::_validateClientExists();
+
+        self::$_PHPCAS_CLIENT->setCasAttributeParserCallback($function, $additionalArgs);
+    }
+
     /**
      * Set a callback function to be run when a user authenticates.
      *
@@ -1295,7 +1313,11 @@ class phpCAS
 
     /**
      * Set the serviceValidate URL of the CAS server.
-     * Used only in CAS 1.0 validations
+     * Used for all CAS versions of URL validations.
+     * Examples:
+     * CAS 1.0 http://www.exemple.com/validate
+     * CAS 2.0 http://www.exemple.com/validateURL
+     * CAS 3.0 http://www.exemple.com/p3/serviceValidate
      *
      * @param string $url the serviceValidate URL
      *
@@ -1317,7 +1339,11 @@ class phpCAS
 
     /**
      * Set the proxyValidate URL of the CAS server.
-     * Used for all CAS 2.0 validations
+     * Used for all CAS versions of proxy URL validations
+     * Examples:
+     * CAS 1.0 http://www.exemple.com/
+     * CAS 2.0 http://www.exemple.com/proxyValidate
+     * CAS 3.0 http://www.exemple.com/p3/proxyValidate
      *
      * @param string $url the proxyValidate URL
      *
@@ -1801,6 +1827,16 @@ class phpCAS
             throw new CAS_OutOfSequenceBeforeProxyException();
         }
     }
+
+    /**
+     * For testing purposes, use this method to set the client to a test double
+     *
+     * @return void
+     */
+    public static function setCasClient(\CAS_Client $client)
+    {
+        self::$_PHPCAS_CLIENT = $client;
+    }
 }
 // ########################################################################
 // DOCUMENTATION
index a14154d..1a98d75 100644 (file)
@@ -68,6 +68,7 @@ implements CAS_Exception
     public function __construct($client,$failure,$cas_url,$no_response,
         $bad_response='',$cas_response='',$err_code='',$err_msg=''
     ) {
+        $messages = array();
         phpCAS::traceBegin();
         $lang = $client->getLangObj();
         $client->printHTMLHeader($lang->getAuthenticationFailed());
@@ -76,32 +77,34 @@ implements CAS_Exception
             htmlentities($client->getURL()),
             isset($_SERVER['SERVER_ADMIN']) ? $_SERVER['SERVER_ADMIN']:''
         );
-        phpCAS::trace('CAS URL: '.$cas_url);
-        phpCAS::trace('Authentication failure: '.$failure);
+        phpCAS::trace($messages[] = 'CAS URL: '.$cas_url);
+        phpCAS::trace($messages[] = 'Authentication failure: '.$failure);
         if ( $no_response ) {
-            phpCAS::trace('Reason: no response from the CAS server');
+            phpCAS::trace($messages[] = 'Reason: no response from the CAS server');
         } else {
             if ( $bad_response ) {
-                phpCAS::trace('Reason: bad response from the CAS server');
+                phpCAS::trace($messages[] = 'Reason: bad response from the CAS server');
             } else {
                 switch ($client->getServerVersion()) {
                 case CAS_VERSION_1_0:
-                    phpCAS::trace('Reason: CAS error');
+                    phpCAS::trace($messages[] = 'Reason: CAS error');
                     break;
                 case CAS_VERSION_2_0:
                 case CAS_VERSION_3_0:
                     if ( empty($err_code) ) {
-                        phpCAS::trace('Reason: no CAS error');
+                        phpCAS::trace($messages[] = 'Reason: no CAS error');
                     } else {
-                        phpCAS::trace('Reason: ['.$err_code.'] CAS error: '.$err_msg);
+                        phpCAS::trace($messages[] = 'Reason: ['.$err_code.'] CAS error: '.$err_msg);
                     }
                     break;
                 }
             }
-            phpCAS::trace('CAS response: '.$cas_response);
+            phpCAS::trace($messages[] = 'CAS response: '.$cas_response);
         }
         $client->printHTMLFooter();
         phpCAS::traceExit();
+
+        parent::__construct(implode("\n", $messages));
     }
 
 }
index 522d6c6..8cce608 100644 (file)
@@ -641,7 +641,33 @@ class CAS_Client
     }
 
     /**
-     * @var callback $_postAuthenticateCallbackFunction;
+     * @var callback $_attributeParserCallbackFunction;
+     */
+    private $_casAttributeParserCallbackFunction = null;
+
+    /**
+     * @var array $_attributeParserCallbackArgs;
+     */
+    private $_casAttributeParserCallbackArgs = array();
+
+    /**
+     * Set a callback function to be run when parsing CAS attributes
+     *
+     * The callback function will be passed a XMLNode as its first parameter,
+     * followed by any $additionalArgs you pass.
+     *
+     * @param string $function       callback function to call
+     * @param array  $additionalArgs optional array of arguments
+     *
+     * @return void
+     */
+    public function setCasAttributeParserCallback($function, array $additionalArgs = array())
+    {
+        $this->_casAttributeParserCallbackFunction = $function;
+        $this->_casAttributeParserCallbackArgs = $additionalArgs;
+    }
+
+    /** @var callback $_postAuthenticateCallbackFunction;
      */
     private $_postAuthenticateCallbackFunction = null;
 
@@ -905,7 +931,12 @@ class CAS_Client
             session_start();
             phpCAS :: trace("Starting a new session " . session_id());
         }
-
+        // Only for debug purposes
+        if ($this->isSessionAuthenticated()){
+            phpCAS :: trace("Session is authenticated as: " . $_SESSION['phpCAS']['user']);
+        } else {
+            phpCAS :: trace("Session is not authenticated");
+        }
         // are we in proxy mode ?
         $this->_proxy = $proxy;
 
@@ -1229,7 +1260,7 @@ class CAS_Client
             $res = true;
         } else {
             $this->redirectToCas(false, true);
-            // never reached\r
+            // never reached
             $res = false;
         }
         phpCAS::traceEnd();
@@ -1664,8 +1695,15 @@ class CAS_Client
         header('Location: '.$cas_url);
         phpCAS::trace("Prepare redirect to : ".$cas_url);
 
+        phpCAS::trace("Destroying session : ".session_id());
         session_unset();
         session_destroy();
+        if (session_status() === PHP_SESSION_NONE) {
+            phpCAS::trace("Session terminated");
+        } else {
+            phpCAS::error("Session was not terminated");
+            phpCAS::trace("Session was not terminated");
+        }
         $lang = $this->getLangObj();
         $this->printHTMLHeader($lang->getLogout());
         printf('<p>'.$lang->getShouldHaveBeenRedirected(). '</p>', $cas_url);
@@ -1905,12 +1943,16 @@ 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');
-
+    // 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');
+        }
+        if ( !file_exists($cert) && $this->_requestImplementation !== 'CAS_TestHarness_DummyRequest'){
+            throw new CAS_InvalidArgumentException("Certificate file does not exist " . $this->_requestImplementation);
+        }
         $this->_cas_server_ca_cert = $cert;
         $this->_cas_server_cn_validate = $validate_cn;
     }
@@ -1948,9 +1990,9 @@ class CAS_Client
         $validate_url = $this->getServerServiceValidateURL()
             .'&ticket='.urlencode($this->getTicket());
 
-        if ( $renew ) {\r
-            // pass the renew\r
-            $validate_url .= '&renew=true';\r
+        if ( $renew ) {
+            // pass the renew
+            $validate_url .= '&renew=true';
         }
 
         // open and read the URL
@@ -2027,9 +2069,9 @@ class CAS_Client
         // build the URL to validate the ticket
         $validate_url = $this->getServerSamlValidateURL();
 
-        if ( $renew ) {\r
-            // pass the renew\r
-            $validate_url .= '&renew=true';\r
+        if ( $renew ) {
+            // pass the renew
+            $validate_url .= '&renew=true';
         }
 
         // open and read the URL
@@ -3140,9 +3182,9 @@ class CAS_Client
             $validate_url .= '&pgtUrl='.urlencode($this->_getCallbackURL());
         }
 
-        if ( $renew ) {\r
-            // pass the renew\r
-            $validate_url .= '&renew=true';\r
+        if ( $renew ) {
+            // pass the renew
+            $validate_url .= '&renew=true';
         }
 
         // open and read the URL
@@ -3187,7 +3229,7 @@ class CAS_Client
                 false/*$no_response*/, true/*$bad_response*/, $text_response
             );
             $result = false;
-       } else if ( $tree_response->getElementsByTagName("authenticationFailure")->length != 0) {
+        } else if ( $tree_response->getElementsByTagName("authenticationFailure")->length != 0) {
             // authentication failed, extract the error code and message and throw exception
             $auth_fail_list = $tree_response
                 ->getElementsByTagName("authenticationFailure");
@@ -3288,7 +3330,16 @@ class CAS_Client
         //             </cas:authenticationSuccess>
         //     </cas:serviceResponse>
         //
-        if ( $success_elements->item(0)->getElementsByTagName("attributes")->length != 0) {
+        if ($this->_casAttributeParserCallbackFunction !== null
+            && is_callable($this->_casAttributeParserCallbackFunction)
+        ) {
+            array_unshift($this->_casAttributeParserCallbackArgs, $success_elements->item(0));
+            phpCas :: trace("Calling attritubeParser callback");
+            $extra_attributes =  call_user_func_array(
+                $this->_casAttributeParserCallbackFunction,
+                $this->_casAttributeParserCallbackArgs
+            );
+        } elseif ( $success_elements->item(0)->getElementsByTagName("attributes")->length != 0) {
             $attr_nodes = $success_elements->item(0)
                 ->getElementsByTagName("attributes");
             phpCas :: trace("Found nested jasig style attributes");
@@ -3501,6 +3552,22 @@ class CAS_Client
         return $this->_url;
     }
 
+    /**
+     * This method sets the base URL of the CAS server.
+     *
+     * @param string $url the base URL
+     *
+     * @return string base url
+     */
+    public function setBaseURL($url)
+    {
+       // Argument Validation
+       if (gettype($url) != 'string')
+               throw new CAS_TypeMismatchException($url, '$url', 'string');
+
+        return $this->_server['base_url'] = $url;
+    }
+
 
     /**
      * Try to figure out the phpCas client URL with possible Proxys / Ports etc.
@@ -3551,15 +3618,16 @@ class CAS_Client
     {
         if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
             return ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
-        }
-        if ( isset($_SERVER['HTTPS'])
+        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTOCOL'])) {
+            return ($_SERVER['HTTP_X_FORWARDED_PROTOCOL'] === 'https');
+        } elseif ( isset($_SERVER['HTTPS'])
             && !empty($_SERVER['HTTPS'])
             && strcasecmp($_SERVER['HTTPS'], 'off') !== 0
         ) {
             return true;
-        } else {
-            return false;
         }
+        return false;
+
     }
 
     /**
diff --git a/auth/cas/CAS/CAS/Languages/ChineseSimplified.php b/auth/cas/CAS/CAS/Languages/ChineseSimplified.php
new file mode 100644 (file)
index 0000000..bb66593
--- /dev/null
@@ -0,0 +1,114 @@
+<?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/Language/ChineseSimplified.php
+ * @category Authentication
+ * @package  PhpCAS
+ * @author   Pascal Aubry <pascal.aubry@univ-rennes1.fr>, Phy25 <caslang@phy25.com>
+ * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0
+ * @link     https://wiki.jasig.org/display/CASC/phpCAS
+ */
+
+/**
+ * Chinese Simplified language class
+ *
+ * @class    CAS_Languages_ChineseSimplified
+ * @category Authentication
+ * @package  PhpCAS
+ * @author   Pascal Aubry <pascal.aubry@univ-rennes1.fr>, Phy25 <caslang@phy25.com>
+ * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0
+ * @link     https://wiki.jasig.org/display/CASC/phpCAS
+ *
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+class CAS_Languages_ChineseSimplified implements CAS_Languages_LanguageInterface
+{
+    /**
+     * Get the using server string
+     *
+     * @return string using server
+     */
+    public function getUsingServer()
+    {
+        return '连接的服务器';
+    }
+
+    /**
+     * Get authentication wanted string
+     *
+     * @return string authentication wanted
+     */
+    public function getAuthenticationWanted()
+    {
+        return '请进行 CAS 认证!';
+    }
+
+    /**
+     * Get logout string
+     *
+     * @return string logout
+     */
+    public function getLogout()
+    {
+        return '请进行 CAS 登出!';
+    }
+
+    /**
+     * Get the should have been redirected string
+     *
+     * @return string should habe been redirected
+     */
+    public function getShouldHaveBeenRedirected()
+    {
+        return '你正被重定向到 CAS 服务器。<a href="%s">点击这里</a>继续。';
+    }
+
+    /**
+    * Get authentication failed string
+    *
+    * @return string authentication failed
+    */
+    public function getAuthenticationFailed()
+    {
+        return 'CAS 认证失败!';
+    }
+
+    /**
+    * Get the your were not authenticated string
+    *
+    * @return string not authenticated
+    */
+    public function getYouWereNotAuthenticated()
+    {
+        return '<p>你没有成功登录。</p><p>你可以<a href="%s">点击这里重新登录</a>。</p><p>如果问题依然存在,请<a href="mailto:%s">联系本站管理员</a>。</p>';
+    }
+
+    /**
+    * Get the service unavailable string
+    *
+    * @return string service unavailable
+    */
+    public function getServiceUnavailable()
+    {
+        return '服务器 <b>%s</b> 不可用(<b>%s</b>)。';
+    }
+}
\ No newline at end of file
index eb0f5ef..888ce24 100644 (file)
@@ -49,7 +49,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getUsingServer()
     {
-        return '÷ñçóéìïðïéåßôáé ï åîõðçñåôçôÞò';
+        return 'χρησιμοποιείται ο εξυπηρετητής';
     }
 
     /**
@@ -59,7 +59,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getAuthenticationWanted()
     {
-        return 'Áðáéôåßôáé ç ôáõôïðïßçóç CAS!';
+        return 'Απαιτείται η ταυτοποίηση CAS!';
     }
 
     /**
@@ -69,7 +69,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getLogout()
     {
-        return 'Áðáéôåßôáé ç áðïóýíäåóç áðü CAS!';
+        return 'Απαιτείται η αποσύνδεση από CAS!';
     }
 
     /**
@@ -79,7 +79,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getShouldHaveBeenRedirected()
     {
-        return 'Èá Ýðñåðå íá åß÷áôå áíáêáôåõèõíèåß óôïí åîõðçñåôçôÞ CAS. ÊÜíôå êëßê <a href="%s">åäþ</a> ãéá íá óõíå÷ßóåôå.';
+        return 'Θα έπρεπε να είχατε ανακατευθυνθεί στον εξυπηρετητή CAS. Κάντε κλίκ <a href="%s">εδώ</a> για να συνεχίσετε.';
     }
 
     /**
@@ -89,7 +89,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getAuthenticationFailed()
     {
-        return 'Ç ôáõôïðïßçóç CAS áðÝôõ÷å!';
+        return 'Η ταυτοποίηση CAS απέτυχε!';
     }
 
     /**
@@ -99,7 +99,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getYouWereNotAuthenticated()
     {
-        return '<p>Äåí ôáõôïðïéçèÞêáôå.</p><p>Ìðïñåßôå íá îáíáðñïóðáèÞóåôå, êÜíïíôáò êëßê <a href="%s">åäþ</a>.</p><p>Åáí ôï ðñüâëçìá åðéìåßíåé, åëÜôå óå åðáöÞ ìå ôïí <a href="mailto:%s">äéá÷åéñéóôÞ</a>.</p>';
+        return '<p>Δεν ταυτοποιηθήκατε.</p><p>Μπορείτε να ξαναπροσπαθήσετε, κάνοντας κλίκ <a href="%s">εδώ</a>.</p><p>Εαν το πρόβλημα επιμείνει, ελάτε σε επαφή με τον <a href="mailto:%s">διαχειριστή</a>.</p>';
     }
 
     /**
@@ -109,7 +109,7 @@ class CAS_Languages_Greek implements CAS_Languages_LanguageInterface
      */
     public function getServiceUnavailable()
     {
-        return 'Ç õðçñåóßá `<b>%s</b>\' äåí åßíáé äéáèÝóéìç (<b>%s</b>).';
+        return 'Η υπηρεσία `<b>%s</b>\' δεν είναι διαθέσιμη (<b>%s</b>).';
     }
 }
-?>
\ No newline at end of file
+?>
index e9cd121..a15bf17 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 /**
- * Japanese language class. Now Encoding is EUC-JP and LF
+ * Japanese language class. Now Encoding is UTF-8.
  *
  * @class    CAS_Languages_Japanese
  * @category Authentication
@@ -47,7 +47,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getUsingServer()
     {
-        return 'using server';
+        return 'サーバーを使っています。';
     }
 
     /**
@@ -57,7 +57,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getAuthenticationWanted()
     {
-        return 'CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�';
+        return 'CASによる認証を行います。';
     }
 
     /**
@@ -67,7 +67,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getLogout()
     {
-        return 'CAS����?�����Ȥ��ޤ�!';
+        return 'CASからログアウトします!';
     }
 
     /**
@@ -77,7 +77,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getShouldHaveBeenRedirected()
     {
-        return 'CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� <a href="%s">������</a> �򥯥�å�����³�Ԥ��ޤ��';
+        return 'CASサーバに行く必要があります。自動的に転送されない場合は <a href="%s">こちら</a> をクリックして続行します。';
     }
 
     /**
@@ -87,7 +87,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getAuthenticationFailed()
     {
-        return 'CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���';
+        return 'CASによる認証に失敗しました。';
     }
 
     /**
@@ -97,7 +97,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getYouWereNotAuthenticated()
     {
-        return '<p>ǧ�ڤǤ��ޤ���Ǥ���.</p><p>�⤦���٥ꥯ�����Ȥ������������<a href="%s">������</a>�򥯥�å�.</p><p>���꤬��褷�ʤ����� <a href="mailto:%s">���Υ����Ȥδ����</a>���䤤��碌�Ƥ�������.</p>';
+        return '<p>認証できませんでした。</p><p>もう一度リクエストを送信する場合は<a href="%s">こちら</a>をクリック。</p><p>問題が解決しない場合は <a href="mailto:%s">このサイトの管理者</a>に問い合わせてください。</p>';
     }
 
     /**
@@ -107,7 +107,7 @@ class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface
      */
     public function getServiceUnavailable()
     {
-        return '�����ӥ� `<b>%s</b>\' �����ѤǤ��ޤ��� (<b>%s</b>).';
+        return 'サービス `<b>%s</b>\' は利用できません (<b>%s</b>)。';
     }
 }
-?>
\ No newline at end of file
+?>
index 80a1ea1..d3bcf80 100644 (file)
@@ -180,8 +180,10 @@ class CAS_PGTStorage_File extends CAS_PGTStorage_AbstractStorage
     function getPGTIouFilename($pgt_iou)
     {
         phpCAS::traceBegin();
-        $filename = $this->getPath().$pgt_iou.'.plain';
-        phpCAS::traceEnd($filename);
+        $filename = $this->getPath()."phpcas-".hash("sha256", $pgt_iou);
+//        $filename = $this->getPath().$pgt_iou.'.plain';
+        phpCAS::trace("Sha256 filename:" . $filename);
+        phpCAS::traceEnd();
         return $filename;
     }
 
index 410aba0..7099608 100644 (file)
@@ -122,7 +122,7 @@ implements CAS_Request_MultiRequestInterface
         $handles = array();
         $multiHandle = curl_multi_init();
         foreach ($this->_requests as $i => $request) {
-            $handle = $request->_initAndConfigure();
+            $handle = $request->initAndConfigure();
             curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
             $handles[$i] = $handle;
             curl_multi_add_handle($multiHandle, $handle);
index dd866dc..86d2492 100644 (file)
@@ -67,7 +67,7 @@ implements CAS_Request_RequestInterface
         /*********************************************************
          * initialize the CURL session
         *********************************************************/
-        $ch = $this->_initAndConfigure();
+        $ch = $this->initAndConfigure();
 
         /*********************************************************
          * Perform the query
@@ -99,7 +99,7 @@ implements CAS_Request_RequestInterface
      *
      * @return resource The cURL handle on success, false on failure
      */
-    private function _initAndConfigure()
+    public function initAndConfigure()
     {
         /*********************************************************
          * initialize the CURL session
index 2ef9d66..62f9f91 100644 (file)
@@ -1,5 +1,3 @@
-Description of phpCAS 1.3.4 library import
+Description of phpCAS 1.3.5 library import
 
 * downloaded from http://downloads.jasig.org/cas-clients/php/current/
-
-* MDL-59456 phpCAS library has been patched because of an authentication bypass security vulnerability.
\ No newline at end of file
index a17ef91..ce506d6 100644 (file)
@@ -30,28 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool result
  */
 function xmldb_auth_cas_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2014111001) {
-        // From now on the default LDAP objectClass setting for AD has been changed, from 'user' to '(samaccounttype=805306368)'.
-        if (is_enabled_auth('cas')
-                && ($DB->get_field('config_plugins', 'value', array('name' => 'user_type', 'plugin' => 'auth/cas')) === 'ad')
-                && ($DB->get_field('config_plugins', 'value', array('name' => 'objectclass', 'plugin' => 'auth/cas')) === '')) {
-            // Save the backwards-compatible default setting.
-            set_config('objectclass', 'user', 'auth/cas');
-        }
-
-        upgrade_plugin_savepoint(true, 2014111001, 'auth', 'cas');
-    }
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index 895150d..c811250 100644 (file)
@@ -4,7 +4,7 @@
     <location>CAS</location>
     <name>CAS</name>
     <license>Apache</license>
-    <version>1.3.4</version>
+    <version>1.3.5</version>
     <licenseversion>2.0</licenseversion>
   </library>
 </libraries>
diff --git a/auth/fc/Readme.txt b/auth/fc/Readme.txt
deleted file mode 100644 (file)
index c40e7ff..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-Moodle - FirstClass authentication module
------------------------------------------
-This module uses the FirstClass Flexible Provisining Protocol (FPP) to communicate between the FirstClass server
-and the Moodle host.
-
-Installation
-------------
-
-1. Enable FPP on the FirstClass server
-FPP is not doumented in the FirstClass documentation and is not enable by default.
-To enable the protocol you need to edit the file \FCPO\Server\Netinfo. Open the file and insert the
-following lines.
-
-// TCP port for Flexible Provisioning Protocol (FPP).
-TCPFPPPORT = 3333
-
-
-2. Create an account on the FirstClass server with privilege "Subadministrator".
-Using the FPP protocoll this module logs in to the FirstClass server and issuess batch admin commands.
-Batch admin command can only be issued in the context of a user with subadministrative privileges.
-
-Default account name is "fcMoodle".
-
-
-3. Check that the FPP protocoll is working by running a Telnet session. If everyting is working you
-should get a "+0" answer from the server.
-
-> telnet yourhost.domain.com 3333
-+0
-
-Check that the "fcMoodle" is working by entering the following sequens of commands:
-
-> telnet yourhost.domain.com 3333
-+0
-fcMoodle
-+0
-
-the_password_you_gave_fcmoodle
-+0
-
-Get user some_user_id 1201
-
-1201 0 some_user_id
-+0
-
-
-
-4. On the Moodle host go to the directory where you have installed Moodle.
-Open the folder "auth", where all other authentication modules are installed,
- and create a new directory with the name "fc".
-
-Copy the files "config.html", "fcFPP.php" and "lib.php" to the "auth" directory.
-
-Now you need to add som strings to the language file. This distribution contains
-string for the English (en) and Swedish (sv) translation.
-
-Open the file "auth.php" in the folder "lang/sv" and paste the text from the file
-"auth.php - sv.txt" at the end of the file above the line "?>"
-
-Open the file "auth.php" in the folder "lang/en" and paste the text from the file
-"auth.php - en.txt" at the end of the file above the line "?>"
-
-
-
-
-
-
-
-
-
-
diff --git a/auth/fc/auth.php b/auth/fc/auth.php
deleted file mode 100644 (file)
index 31b1b20..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-<?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/>.
-
-/**
- * Authentication Plugin: FirstClass Authentication
- * Authentication using a FirstClass server.
-
- * @package auth_fc
- * @author Martin Dougiamas
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-require_once($CFG->libdir.'/authlib.php');
-
-require_once 'fcFPP.php';
-
-/**
- * FirstClass authentication plugin.
- */
-class auth_plugin_fc extends auth_plugin_base {
-
-    /**
-     * Constructor.
-     */
-    public function __construct() {
-        $this->authtype = 'fc';
-        $this->config = get_config('auth_fc');
-    }
-
-    /**
-     * Old syntax of class constructor. Deprecated in PHP7.
-     *
-     * @deprecated since Moodle 3.1
-     */
-    public function auth_plugin_fc() {
-        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
-        self::__construct();
-    }
-
-    /**
-     * Returns true if the username and password work and false if they are
-     * wrong or don't exist.
-     *
-     * @param string $username The username
-     * @param string $password The password
-     * @return bool Authentication success or failure.
-     */
-    function user_login ($username, $password) {
-        global $CFG;
-        $retval = false;
-
-        // Don't allow blank usernames or passwords
-        if (!$username or !$password) {
-            return $retval;
-        }
-
-        $fpp = new fcFPP($this->config->host, $this->config->fppport);
-        if ($fpp->open()) {
-            if ($fpp->login($username, $password)) {
-                $retval = true;
-            }
-        }
-        $fpp->close();
-
-        return $retval;
-    }
-
-    /**
-     * Get user information from FirstCLass server and return it in an array.
-     * Localize this routine to fit your needs.
-     */
-    function get_userinfo($username) {
-        /*
-        Moodle                FirstCLass fieldID in UserInfo form
-        ------                -----------------------------------
-        firstname             1202
-        lastname              1204
-        email                 1252
-        icq                   -
-        phone1                1206
-        phone2                1207 (Fax)
-        institution           -
-        department            -
-        address               1205
-        city                  -
-        country               -
-        lang                  -
-        timezone              8030 (Not used yet. Need to figure out how FC codes timezones)
-
-        description           Get data from users resume. Pictures will be removed.
-
-        */
-
-        $userinfo = array();
-
-        $fpp = new fcFPP($this->config->host, $this->config->fppport);
-        if ($fpp->open()) {
-            if ($fpp->login($this->config->userid, $this->config->passwd)) {
-                $userinfo['firstname']   = $fpp->getUserInfo($username,"1202");
-                $userinfo['lastname']    = $fpp->getUserInfo($username,"1204");
-                $userinfo['email']       = strtok($fpp->getUserInfo($username,"1252"),',');
-                $userinfo['phone1']      = $fpp->getUserInfo($username,"1206");
-                $userinfo['phone2']      = $fpp->getUserInfo($username,"1207");
-                $userinfo['description'] = $fpp->getResume($username);
-            }
-        }
-        $fpp->close();
-
-        foreach($userinfo as $key => $value) {
-            if (!$value) {
-                unset($userinfo[$key]);
-            }
-        }
-
-        return $userinfo;
-    }
-
-    /**
-     * Get users group membership from the FirstClass server user and check if
-     * user is member of one of the groups of creators.
-     */
-    function iscreator($username) {
-        if (! $this->config->creators) {
-            return null;
-        }
-
-        $fcgroups = array();
-
-        $fpp = new fcFPP($this->config->host, $this->config->fppport);
-        if ($fpp->open()) {
-            if ($fpp->login($this->config->userid, $this->config->passwd)) {
-                $fcgroups = $fpp->getGroups($username);
-            }
-        }
-        $fpp->close();
-
-        if ((! $fcgroups)) {
-            return false;
-        }
-
-        $creators = explode(";", $this->config->creators);
-
-        foreach($creators as $creator) {
-            if (in_array($creator, $fcgroups)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    function prevent_local_passwords() {
-        return true;
-    }
-
-    /**
-     * Returns true if this authentication plugin is 'internal'.
-     *
-     * @return bool
-     */
-    function is_internal() {
-        return false;
-    }
-
-    /**
-     * Returns true if this authentication plugin can change the user's
-     * password.
-     *
-     * @return bool
-     */
-    function can_change_password() {
-        return false;
-    }
-
-    /**
-     * Sync roles for this user
-     *
-     * @param $user object user object (without system magic quotes)
-     */
-    function sync_roles($user) {
-        $iscreator = $this->iscreator($user->username);
-        if ($iscreator === null) {
-            return; //nothing to sync - creators not configured
-        }
-
-        if ($roles = get_archetype_roles('coursecreator')) {
-            $creatorrole = array_shift($roles);      // We can only use one, let's use the first one
-            $systemcontext = context_system::instance();
-
-            if ($iscreator) { // Following calls will not create duplicates
-                role_assign($creatorrole->id, $user->id, $systemcontext->id, 'auth_fc');
-            } else {
-                //unassign only if previously assigned by this plugin!
-                role_unassign($creatorrole->id, $user->id, $systemcontext->id, 'auth_fc');
-            }
-        }
-    }
-
-}
-
-
diff --git a/auth/fc/db/install.php b/auth/fc/db/install.php
deleted file mode 100644 (file)
index 543f4f0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function xmldb_auth_fc_install() {
-    global $CFG, $DB;
-
-}
diff --git a/auth/fc/fcFPP.php b/auth/fc/fcFPP.php
deleted file mode 100644 (file)
index 2adc309..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-<?php
-/************************************************************************/
-/* fcFPP: Php class for FirstClass Flexible Provisining Protocol        */
-/* =============================================================        */
-/*                                                                      */
-/* Copyright (c) 2004 SKERIA Utveckling, Teknous                        */
-/* http://skeria.skelleftea.se                                          */
-/*                                                                      */
-/* Flexible Provisioning Protocol is a real-time, IP based protocol     */
-/* which provides direct access to the scriptable remote administration */
-/* subsystem of the core FirstClass Server. Using FPP, it is possible to*/
-/* implement automated provisioning and administration systems for      */
-/* FirstClass, avoiding the need for a point and click GUI. FPP can also*/
-/* be used to integrate FirstClass components into a larger unified     */
-/* system.                                                              */
-/*                                                                      */
-/* This program 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 2 of the License or any */
-/* later version.                                                       */
-/************************************************************************/
-/* Author: Torsten Anderson, torsten.anderson@skeria.skelleftea.se
- */
-
-class fcFPP
-{
-    var $_hostname;         // hostname of FirstClass server we are connection to
-    var $_port;             // port on which fpp is running
-    var $_conn = 0;         // socket we are connecting on
-    var $_debug = FALSE;    // set to true to see some debug info
-
-    // class constructor
-    public function __construct($host="localhost", $port="3333")
-    {
-    $this->_hostname = $host;
-    $this->_port = $port;
-    $this->_user = "";
-    $this->_pwd = "";
-    }
-
-    function fcFPP($host="localhost", $port="3333")
-    {
-           debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
-           self::__construct($host, $port);
-    }
-
-    // open a connection to the FirstClass server
-    function open()
-    {
-    if ($this->_debug) echo "Connecting to host ";
-    $host = $this->_hostname;
-    $port = $this->_port;
-
-    if ($this->_debug) echo "[$host:$port]..";
-
-    // open the connection to the FirstClass server
-    $conn = fsockopen($host, $port, $errno, $errstr, 5);
-    if (!$conn)
-    {
-        print_error('auth_fcconnfail','auth_fc', '', array('no'=>$errno, 'str'=>$errstr));
-        return false;
-    }
-
-    // We are connected
-    if ($this->_debug) echo "connected!";
-
-    // Read connection message.
-    $line = fgets ($conn);        //+0
-    $line = fgets ($conn);        //new line
-
-    // store the connection in this class, so we can use it later
-    $this->_conn = & $conn;
-
-    return true;
-    }
-
-    // close any open connections
-    function close()
-    {
-    // get the current connection
-    $conn = &$this->_conn;
-
-    // close it if it's open
-        if ($conn)
-    {
-        fclose($conn);
-
-        // cleanup the variable
-        unset($this->_conn);
-        return true;
-    }
-    return;
-    }
-
-
-    // Authenticate to the FirstClass server
-    function login($userid, $passwd)
-    {
-    // we did have a connection right?!
-        if ($this->_conn)
-    {
-        # Send username
-        fputs($this->_conn,"$userid\r\n");
-
-        $line = fgets ($this->_conn);        //new line
-        $line = fgets ($this->_conn);        //+0
-        $line = fgets ($this->_conn);        //new line
-
-        # Send password
-        fputs($this->_conn,"$passwd\r\n");
-        $line = fgets ($this->_conn);        //new line
-        $line = fgets ($this->_conn);        //+0
-        $line = fgets ($this->_conn);        //+0 or message
-
-        if ($this->_debug) echo $line;
-
-        if (preg_match ("/^\+0/", $line)) {      //+0, user with subadmin privileges
-            $this->_user = $userid;
-            $this->_pwd  = $passwd;
-            return TRUE;
-        } elseif (strpos($line, 'You are not allowed')) { // Denied access but a valid user and password
-                                                         // "Sorry. You are not allowed to login with the FPP interface"
-            return TRUE;
-        } else {                    //Invalid user or password
-            return FALSE;
-        }
-
-
-    }
-    return FALSE;
-    }
-
-    // Get the list of groups the user is a member of
-    function getGroups($userid) {
-
-    $groups = array();
-
-    // we must be logged in as a user with subadmin privileges
-    if ($this->_conn AND $this->_user) {
-        # Send BA-command to get groups
-        fputs($this->_conn,"GET USER '" . $userid . "' 4 -1\r");
-        $line = "";
-        while (!$line) {
-        $line = trim(fgets ($this->_conn));
-        }
-        $n = 0;
-        while ($line AND !preg_match("/^\+0/", $line) AND $line != "-1003") {
-        list( , , $groups[$n++]) = explode(" ",$line,3);
-        $line = trim(fgets ($this->_conn));
-        }
-            if ($this->_debug) echo "getGroups:" . implode(",",$groups);
-    }
-
-    return $groups;
-    }
-
-    // Check if the user is member of any of the groups.
-    // Return the list of groups the user is member of.
-    function isMemberOf($userid, $groups) {
-
-    $usergroups = array_map("strtolower",$this->getGroups($userid));
-    $groups = array_map("strtolower",$groups);
-
-    $result = array_intersect($groups,$usergroups);
-
-        if ($this->_debug) echo "isMemberOf:" . implode(",",$result);
-
-    return $result;
-
-    }
-
-    function getUserInfo($userid, $field) {
-
-    $userinfo = "";
-
-    if ($this->_conn AND $this->_user) {
-        # Send BA-command to get data
-        fputs($this->_conn,"GET USER '" . $userid . "' " . $field . "\r");
-        $line = "";
-        while (!$line) {
-            $line = trim(fgets ($this->_conn));
-        }
-        $n = 0;
-        while ($line AND !preg_match("/^\+0/", $line)) {
-        list( , , $userinfo) = explode(" ",$line,3);
-        $line = trim(fgets ($this->_conn));
-        }
-        if ($this->_debug) echo "getUserInfo:" . $userinfo;
-    }
-
-    return str_replace('\r',' ',trim($userinfo,'"'));
-
-    }
-
-    function getResume($userid) {
-
-    $resume = "";
-
-    $pattern = "/\[.+:.+\..+\]/";         // Remove references to pictures in resumes
-
-    if ($this->_conn AND $this->_user) {
-        # Send BA-command to get data
-        fputs($this->_conn,"GET RESUME '" . $userid . "' 6\r");
-        $line = "";
-        while (!$line) {
-               $line = trim(fgets ($this->_conn));
-        }
-        $n = 0;
-        while ($line AND !preg_match("/^\+0/", $line)) {
-            $resume .= preg_replace($pattern,"",str_replace('\r',"\n",trim($line,'6 ')));
-        $line = trim(fgets ($this->_conn));
-        //print $line;
-
-        }
-        if ($this->_debug) echo "getResume:" . $resume;
-    }
-
-    return $resume;
-
-    }
-
-
-}
-
-
-?>
diff --git a/auth/fc/lang/en/auth_fc.php b/auth/fc/lang/en/auth_fc.php
deleted file mode 100644 (file)
index 46e75fc..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?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/>.
-
-/**
- * Strings for component 'auth_fc', language 'en'.
- *
- * @package   auth_fc
- * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-$string['auth_fcconnfail'] = 'Connection failed with Errno: {$a->no} and Error String: {$a->str}';
-$string['auth_fccreators'] = 'List of groups whose members are allowed to create new courses. Separate multiple groups with \';\'. Names must be spelled exactly as on FirstClass server. System is case-sensitive.';
-$string['auth_fccreators_key'] = 'Creators';
-$string['auth_fcdescription'] = 'This method uses a FirstClass server to check whether a given username and password is valid.';
-$string['auth_fcfppport'] = 'Server port (3333 is the most common)';
-$string['auth_fcfppport_key'] = 'Port';
-$string['auth_fcchangepasswordurl'] = 'Password-change URL';
-$string['auth_fcpasswd'] = 'Password for the account above.';
-$string['auth_fcpasswd_key'] = 'Password';
-$string['auth_fcuserid'] = 'Userid for FirstClass account with privilege \'Subadministrator\' set.';
-$string['auth_fcuserid_key'] = 'User ID';
-$string['auth_fchost'] = 'The FirstClass server address. Use the IP number or DNS name.';
-$string['auth_fchost_key'] = 'Host';
-$string['pluginname'] = 'FirstClass server';
diff --git a/auth/fc/settings.php b/auth/fc/settings.php
deleted file mode 100644 (file)
index ff3aa3f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?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/>.
-
-/**
- * Admin settings and defaults.
- *
- * @package    auth_fc
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die;
-
-if ($ADMIN->fulltree) {
-
-    // Introductory explanation.
-    $settings->add(new admin_setting_heading('auth_fc/pluginname', '', new lang_string('auth_fcdescription', 'auth_fc')));
-
-    // Host.
-    $settings->add(new admin_setting_configtext('auth_fc/host', get_string('auth_fchost_key', 'auth_fc'),
-            get_string('auth_fchost', 'auth_fc'), '127.0.0.1', PARAM_HOST));
-
-    // Port.
-    $settings->add(new admin_setting_configtext('auth_fc/fppport', get_string('auth_fcfppport_key', 'auth_fc'),
-            get_string('auth_fcfppport', 'auth_fc'), '3333', PARAM_INT));
-
-    // User ID.
-    $settings->add(new admin_setting_configtext('auth_fc/userid', get_string('auth_fcuserid_key', 'auth_fc'),
-            get_string('auth_fcuserid', 'auth_fc'), 'fcMoodle', PARAM_RAW));
-
-    // Password.
-    $settings->add(new admin_setting_configpasswordunmask('auth_fc/passwd', get_string('auth_fcpasswd_key', 'auth_fc'),
-            get_string('auth_fcpasswd', 'auth_fc'), ''));
-
-    // Creators.
-    $settings->add(new admin_setting_configtext('auth_fc/creators', get_string('auth_fccreators_key', 'auth_fc'),
-            get_string('auth_fccreators', 'auth_fc'), '', PARAM_RAW));
-
-    // Password change URL.
-    $settings->add(new admin_setting_configtext('auth_fc/changepasswordurl',
-            get_string('auth_fcchangepasswordurl', 'auth_fc'),
-            get_string('changepasswordhelp', 'auth'), '', PARAM_URL));
-
-    // Display locking / mapping of profile fields.
-    $authplugin = get_auth_plugin('fc');
-    display_auth_lock_options($settings, $authplugin->authtype, $authplugin->userfields,
-            get_string('auth_fieldlocks_help', 'auth'), false, false);
-}
diff --git a/auth/fc/thirdpartylibs.xml b/auth/fc/thirdpartylibs.xml
deleted file mode 100644 (file)
index 191a281..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0"?>
-<libraries>
-  <library>
-    <location>fcFPP.php</location>
-    <name>fcFPP</name>
-    <license>GPL</license>
-    <version></version>
-    <licenseversion>2.0+</licenseversion>
-  </library>
-</libraries>
diff --git a/auth/fc/upgrade.txt b/auth/fc/upgrade.txt
deleted file mode 100644 (file)
index 312f797..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-This files describes API changes in /auth/fc/*,
-information provided here is intended especially for developers.
-
-=== 3.3 ===
-
-* The config.html file was migrated to use the admin settings API.
-  The identifier for configuration data stored in config_plugins table was converted from 'auth/fc' to 'auth_fc'.
-
diff --git a/auth/imap/auth.php b/auth/imap/auth.php
deleted file mode 100644 (file)
index 6d6590c..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-<?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/>.
-
-/**
- * Authentication Plugin: IMAP Authentication
- * Authenticates against an IMAP server.
- *
- * @package auth_imap
- * @author Martin Dougiamas
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-require_once($CFG->libdir.'/authlib.php');
-
-/**
- * IMAP authentication plugin.
- */
-class auth_plugin_imap extends auth_plugin_base {
-
-    /**
-     * Constructor.
-     */
-    public function __construct() {
-        $this->authtype = 'imap';
-        $this->config = get_config('auth_imap');
-    }
-
-    /**
-     * Old syntax of class constructor. Deprecated in PHP7.
-     *
-     * @deprecated since Moodle 3.1
-     */
-    public function auth_plugin_imap() {
-        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
-        self::__construct();
-    }
-
-    /**
-     * Returns true if the username and password work and false if they are
-     * wrong or don't exist.
-     *
-     * @param string $username The username (with system magic quotes)
-     * @param string $password The password (with system magic quotes)
-     * @return bool Authentication success or failure.
-     */
-    function user_login ($username, $password) {
-        if (! function_exists('imap_open')) {
-            print_error('auth_imapnotinstalled','mnet');
-            return false;
-        }
-
-        global $CFG;
-        $hosts = explode(';', $this->config->host);   // Could be multiple hosts
-
-        foreach ($hosts as $host) {                 // Try each host in turn
-            $host = trim($host);
-
-            switch ($this->config->type) {
-                case 'imapssl':
-                    $host = '{'.$host.":{$this->config->port}/imap/ssl}";
-                break;
-
-                case 'imapcert':
-                    $host = '{'.$host.":{$this->config->port}/imap/ssl/novalidate-cert}";
-                break;
-
-                case 'imaptls':
-                    $host = '{'.$host.":{$this->config->port}/imap/tls}";
-                break;
-
-                case 'imapnosslcert':
-                    $host = '{'.$host.":{$this->config->port}/imap/novalidate-cert}";
-                break;
-
-                default:
-                    $host = '{'.$host.":{$this->config->port}/imap}";
-            }
-
-            error_reporting(0);
-            $connection = imap_open($host, $username, $password, OP_HALFOPEN);
-            error_reporting($CFG->debug);
-
-            if ($connection) {
-                imap_close($connection);
-                return true;
-            }
-        }
-
-        return false;  // No match
-    }
-
-    function prevent_local_passwords() {
-        return true;
-    }
-
-    /**
-     * Returns true if this authentication plugin is 'internal'.
-     *
-     * @return bool
-     */
-    function is_internal() {
-        return false;
-    }
-
-    /**
-     * Returns true if this authentication plugin can change the user's
-     * password.
-     *
-     * @return bool
-     */
-    function can_change_password() {
-        return !empty($this->config->changepasswordurl);
-    }
-
-    /**
-     * Returns the URL for changing the user's pw, or empty if the default can
-     * be used.
-     *
-     * @return moodle_url
-     */
-    function change_password_url() {
-        if (!empty($this->config->changepasswordurl)) {
-            return new moodle_url($this->config->changepasswordurl);
-        } else {
-            return null;
-        }
-    }
-
-}
-
-
diff --git a/auth/imap/db/install.php b/auth/imap/db/install.php
deleted file mode 100644 (file)
index 37b3c09..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function xmldb_auth_imap_install() {
-    global $CFG, $DB;
-
-}
diff --git a/auth/imap/db/upgrade.php b/auth/imap/db/upgrade.php
deleted file mode 100644 (file)
index d33e70a..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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/>.
-
-/**
- * Imap authentication plugin upgrade code
- *
- * @package    auth_imap
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-/**
- * Function to upgrade auth_imap.
- * @param int $oldversion the version we are upgrading from
- * @return bool result
- */
-function xmldb_auth_imap_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Automatically generated Moodle v3.2.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2017020700) {
-        // Convert info in config plugins from auth/imap to auth_imap.
-        upgrade_fix_config_auth_plugin_names('imap');
-        upgrade_fix_config_auth_plugin_defaults('imap');
-        upgrade_plugin_savepoint(true, 2017020700, 'auth', 'imap');
-    }
-
-    // Automatically generated Moodle v3.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    return true;
-}
diff --git a/auth/imap/lang/en/auth_imap.php b/auth/imap/lang/en/auth_imap.php
deleted file mode 100644 (file)
index ccfe27b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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/>.
-
-/**
- * Strings for component 'auth_imap', language 'en'.
- *
- * @package   auth_imap
- * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-$string['auth_imapdescription'] = 'This method uses an IMAP server to check whether a given username and password is valid.';
-$string['auth_imaphost'] = 'The IMAP server address. Use the IP number, not DNS name.';
-$string['auth_imaphost_key'] = 'Host';
-$string['auth_imapchangepasswordurl_key'] = 'Password-change URL';
-$string['auth_imapnotinstalled'] = 'Cannot use IMAP authentication. The PHP IMAP module is not installed.';
-$string['auth_imapport'] = 'IMAP server port number. Usually this is 143 or 993.';
-$string['auth_imapport_key'] = 'Port';
-$string['auth_imaptype'] = 'The IMAP server type.  IMAP servers can have different types of authentication and negotiation.';
-$string['auth_imaptype_key'] = 'Type';
-$string['pluginname'] = 'IMAP server';
diff --git a/auth/imap/settings.php b/auth/imap/settings.php
deleted file mode 100644 (file)
index fe8e7a1..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?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/>.
-
-/**
- * Admin settings and defaults.
- *
- * @package auth_imap
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die;
-
-if ($ADMIN->fulltree) {
-
-    // Introductory explanation.
-    $settings->add(new admin_setting_heading('auth_imap/pluginname', '', new lang_string('auth_imapdescription', 'auth_imap')));
-
-    // Host.
-    $settings->add(new admin_setting_configtext('auth_imap/host', get_string('auth_imaphost_key', 'auth_imap'),
-            get_string('auth_imaphost', 'auth_imap') . ' ' .get_string('auth_multiplehosts', 'auth'),
-            '127.0.0.1', PARAM_RAW));
-
-    // Type.
-    $imapoptions = array();
-    $imaptypes = array('imap', 'imapssl', 'imapcert', 'imapnosslcert', 'imaptls');
-    foreach ($imaptypes as $imaptype) {
-        $imapoptions[$imaptype] = $imaptype;
-    }
-
-    $settings->add(new admin_setting_configselect('auth_imap/type',
-        new lang_string('auth_imaptype_key', 'auth_imap'),
-        new lang_string('auth_imaptype', 'auth_imap'), 'imap', $imapoptions));
-
-    // Port.
-    $settings->add(new admin_setting_configtext('auth_imap/port', get_string('auth_imapport_key', 'auth_imap'),
-            get_string('auth_imapport', 'auth_imap'), '143', PARAM_INT));
-
-    // Password change URL.
-    $settings->add(new admin_setting_configtext('auth_imap/changepasswordurl',
-            get_string('auth_imapchangepasswordurl_key', 'auth_imap'),
-            get_string('changepasswordhelp', 'auth'), '', PARAM_URL));
-
-    // Display locking / mapping of profile fields.
-    $authplugin = get_auth_plugin('imap');
-    display_auth_lock_options($settings, $authplugin->authtype, $authplugin->userfields,
-            get_string('auth_fieldlocks_help', 'auth'), false, false);
-
-}
diff --git a/auth/imap/upgrade.txt b/auth/imap/upgrade.txt
deleted file mode 100644 (file)
index c6e6a95..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-This files describes API changes in /auth/imap/*,
-information provided here is intended especially for developers.
-
-=== 3.3 ===
-
-* The config.html file was migrated to use the admin settings API.
-  The identifier for configuration data stored in config_plugins table was converted from 'auth/imap' to 'auth_imap'.
diff --git a/auth/imap/version.php b/auth/imap/version.php
deleted file mode 100644 (file)
index b38709a..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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/>.
-
-/**
- * Version details
- *
- * @package    auth_imap
- * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-$plugin->version   = 2017051500;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2017050500;        // Requires this Moodle version
-$plugin->component = 'auth_imap';       // Full name of the plugin (used for diagnostics)
index a2fe48e..3e1c58f 100644 (file)
@@ -30,28 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool result
  */
 function xmldb_auth_ldap_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2014111001) {
-        // From now on the default LDAP objectClass setting for AD has been changed, from 'user' to '(samaccounttype=805306368)'.
-        if (is_enabled_auth('ldap')
-                && ($DB->get_field('config_plugins', 'value', array('name' => 'user_type', 'plugin' => 'auth/ldap')) === 'ad')
-                && ($DB->get_field('config_plugins', 'value', array('name' => 'objectclass', 'plugin' => 'auth/ldap')) === '')) {
-            // Save the backwards-compatible default setting.
-            set_config('objectclass', 'user', 'auth/ldap');
-        }
-
-        upgrade_plugin_savepoint(true, 2014111001, 'auth', 'ldap');
-    }
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index 6a947d8..a73861d 100644 (file)
@@ -30,16 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool result
  */
 function xmldb_auth_manual_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index c66ead0..99e326c 100644 (file)
@@ -30,16 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * @return bool result
  */
 function xmldb_auth_mnet_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
diff --git a/auth/nntp/auth.php b/auth/nntp/auth.php
deleted file mode 100644 (file)
index 2ee31dc..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?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/>.
-
-/**
- * Authentication Plugin: NNTP Authentication
- * Authenticates against an NNTP server.
- *
- * @package auth_nntp
- * @author Martin Dougiamas
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-require_once($CFG->libdir.'/authlib.php');
-
-/**
- * NNTP authentication plugin.
- */
-class auth_plugin_nntp extends auth_plugin_base {
-
-    /**
-     * Constructor.
-     */
-    public function __construct() {
-        $this->authtype = 'nntp';
-        $this->config = get_config('auth_nntp');
-    }
-
-    /**
-     * Old syntax of class constructor. Deprecated in PHP7.
-     *
-     * @deprecated since Moodle 3.1
-     */
-    public function auth_plugin_nntp() {
-        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
-        self::__construct();
-    }
-
-    /**
-     * Returns true if the username and password work and false if they are
-     * wrong or don't exist.
-     *
-     * @param string $username The username
-     * @param string $password The password
-     * @return bool Authentication success or failure.
-     */
-    function user_login ($username, $password) {
-        if (! function_exists('imap_open')) {
-            print_error('auth_nntpnotinstalled','auth_nntp');
-            exit;
-        }
-
-        global $CFG;
-
-        // try each multiple host
-        $hosts = explode(';', $this->config->host);
-        foreach ($hosts as $host) {
-            $host = '{' . trim($host) . ':' . $this->config->port . '/nntp}';
-
-            error_reporting(0);
-            $connection = imap_open($host, $username, $password, OP_HALFOPEN);
-            error_reporting($CFG->debug);
-
-            if ($connection) {
-                imap_close($connection);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    function prevent_local_passwords() {
-        return true;
-    }
-
-    /**
-     * Returns true if this authentication plugin is 'internal'.
-     *
-     * @return bool
-     */
-    function is_internal() {
-        return false;
-    }
-
-    /**
-     * Returns true if this authentication plugin can change the user's
-     * password.
-     *
-     * @return bool
-     */
-    function can_change_password() {
-        return false;
-    }
-
-}
-
-
diff --git a/auth/nntp/db/install.php b/auth/nntp/db/install.php
deleted file mode 100644 (file)
index 18d66b9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function xmldb_auth_nntp_install() {
-    global $CFG, $DB;
-
-}
diff --git a/auth/nntp/db/upgrade.php b/auth/nntp/db/upgrade.php
deleted file mode 100644 (file)
index bd869bc..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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/>.
-
-/**
- * NNTP authentication plugin upgrade code
- *
- * @package    auth_nntp
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-/**
- * Function to upgrade auth_nntp.
- * @param int $oldversion the version we are upgrading from
- * @return bool result
- */
-function xmldb_auth_nntp_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Automatically generated Moodle v3.2.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2017020700) {
-        // Convert info in config plugins from auth/nntp to auth_nntp.
-        upgrade_fix_config_auth_plugin_names('nntp');
-        upgrade_fix_config_auth_plugin_defaults('nntp');
-        upgrade_plugin_savepoint(true, 2017020700, 'auth', 'nntp');
-    }
-
-    // Automatically generated Moodle v3.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    return true;
-}
diff --git a/auth/nntp/lang/en/auth_nntp.php b/auth/nntp/lang/en/auth_nntp.php
deleted file mode 100644 (file)
index fa10cac..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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/>.
-
-/**
- * Strings for component 'auth_nntp', language 'en'.
- *
- * @package   auth_nntp
- * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-$string['auth_nntpdescription'] = 'This method uses an NNTP server to check whether a given username and password is valid.';
-$string['auth_nntphost'] = 'The NNTP server address. Use the IP number, not DNS name.';
-$string['auth_nntphost_key'] = 'Host';
-$string['auth_nntpchangepasswordurl_key'] = 'Password-change URL';
-$string['auth_nntpnotinstalled'] = 'Cannot use NNTP authentication. The PHP IMAP module is not installed.';
-$string['auth_nntpport'] = 'Server port (119 is the most common)';
-$string['auth_nntpport_key'] = 'Port';
-$string['pluginname'] = 'NNTP server';
diff --git a/auth/nntp/settings.php b/auth/nntp/settings.php
deleted file mode 100644 (file)
index bf475ee..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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/>.
-
-/**
- * Admin settings and defaults.
- *
- * @package    auth_nntp
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die;
-
-if ($ADMIN->fulltree) {
-
-    // Introductory explanation.
-    $settings->add(new admin_setting_heading('auth_nntp/pluginname', '', new lang_string('auth_nntpdescription', 'auth_nntp')));
-
-    // Host.
-    $settings->add(new admin_setting_configtext('auth_nntp/host', get_string('auth_nntphost_key', 'auth_nntp'),
-            get_string('auth_nntphost', 'auth_nntp') . ' ' .get_string('auth_multiplehosts', 'auth'),
-            '127.0.0.1', PARAM_RAW));
-
-    // Port.
-    $settings->add(new admin_setting_configtext('auth_nntp/port', get_string('auth_nntpport_key', 'auth_nntp'),
-            get_string('auth_nntpport', 'auth_nntp'), '119', PARAM_INT));
-
-    // Password change URL.
-    $settings->add(new admin_setting_configtext('auth_nntp/changepasswordurl',
-            get_string('auth_nntpchangepasswordurl_key', 'auth_nntp'),
-            get_string('changepasswordhelp', 'auth'), '', PARAM_URL));
-
-    // Display locking / mapping of profile fields.
-    $authplugin = get_auth_plugin('nntp');
-    display_auth_lock_options($settings, $authplugin->authtype, $authplugin->userfields,
-            get_string('auth_fieldlocks_help', 'auth'), false, false);
-}
diff --git a/auth/nntp/upgrade.txt b/auth/nntp/upgrade.txt
deleted file mode 100644 (file)
index 18376af..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-This files describes API changes in /auth/nntp/*,
-information provided here is intended especially for developers.
-
-=== 3.3 ===
-
-* The config.html file was migrated to use the admin settings API.
-  The identifier for configuration data stored in config_plugins table was converted from 'auth/nntp' to 'auth_nntp'.
index 9d678a8..1b152b5 100644 (file)
@@ -239,6 +239,50 @@ class api {
         return true;
     }
 
+    /**
+     * Create an account with a linked login that is already confirmed.
+     *
+     * @param array $userinfo as returned from an oauth client.
+     * @param \core\oauth2\issuer $issuer
+     * @return bool
+     */
+    public static function create_new_confirmed_account($userinfo, $issuer) {
+        global $CFG, $DB;
+        require_once($CFG->dirroot.'/user/profile/lib.php');
+        require_once($CFG->dirroot.'/user/lib.php');
+
+        $user = new stdClass();
+        $user->username = $userinfo['username'];
+        $user->email = $userinfo['email'];
+        $user->auth = 'oauth2';
+        $user->mnethostid = $CFG->mnet_localhost_id;
+        $user->lastname = isset($userinfo['lastname']) ? $userinfo['lastname'] : '';
+        $user->firstname = isset($userinfo['firstname']) ? $userinfo['firstname'] : '';
+        $user->url = isset($userinfo['url']) ? $userinfo['url'] : '';
+        $user->alternatename = isset($userinfo['alternatename']) ? $userinfo['alternatename'] : '';
+        $user->secret = random_string(15);
+
+        $user->password = '';
+        // This user is confirmed.
+        $user->confirmed = 1;
+
+        $user->id = user_create_user($user, false, true);
+
+        // The linked account is pre-confirmed.
+        $record = new stdClass();
+        $record->issuerid = $issuer->get('id');
+        $record->username = $userinfo['username'];
+        $record->userid = $user->id;
+        $record->email = $userinfo['email'];
+        $record->confirmtoken = '';
+        $record->confirmtokenexpires = 0;
+
+        $linkedlogin = new linked_login(0, $record);
+        $linkedlogin->create();
+
+        return $user;
+    }
+
     /**
      * Send an email with a link to confirm creating this account.
      *
index aa5f70c..be99012 100644 (file)
@@ -450,15 +450,21 @@ class auth extends \auth_plugin_base {
 
             $moodleuser = \core_user::get_user_by_email($userinfo['email']);
             if (!empty($moodleuser)) {
-                $PAGE->set_url('/auth/oauth2/confirm-link-login.php');
-                $PAGE->set_context(context_system::instance());
-
-                \auth_oauth2\api::send_confirm_link_login_email($userinfo, $issuer, $moodleuser->id);
-                // Request to link to existing account.
-                $emailconfirm = get_string('emailconfirmlink', 'auth_oauth2');
-                $message = get_string('emailconfirmlinksent', 'auth_oauth2', $moodleuser->email);
-                $this->print_confirm_required($emailconfirm, $message);
-                exit();
+                if ($issuer->get('requireconfirmation')) {
+                    $PAGE->set_url('/auth/oauth2/confirm-link-login.php');
+                    $PAGE->set_context(context_system::instance());
+
+                    \auth_oauth2\api::send_confirm_link_login_email($userinfo, $issuer, $moodleuser->id);
+                    // Request to link to existing account.
+                    $emailconfirm = get_string('emailconfirmlink', 'auth_oauth2');
+                    $message = get_string('emailconfirmlinksent', 'auth_oauth2', $moodleuser->email);
+                    $this->print_confirm_required($emailconfirm, $message);
+                    exit();
+                } else {
+                    \auth_oauth2\api::link_login($userinfo, $issuer, $moodleuser->id, true);
+                    $userinfo = get_complete_user_data('id', $moodleuser->id);
+                    // No redirect, we will complete this login.
+                }
 
             } else {
                 // This is a new account.
@@ -506,17 +512,25 @@ class auth extends \auth_plugin_base {
                     redirect(new moodle_url($CFG->httpswwwroot . '/login/index.php'));
                 }
 
-                $PAGE->set_url('/auth/oauth2/confirm-account.php');
-                $PAGE->set_context(context_system::instance());
+                if ($issuer->get('requireconfirmation')) {
+                    $PAGE->set_url('/auth/oauth2/confirm-account.php');
+                    $PAGE->set_context(context_system::instance());
 
-                // Create a new (unconfirmed account) and send an email to confirm it.
-                $user = \auth_oauth2\api::send_confirm_account_email($userinfo, $issuer);
+                    // Create a new (unconfirmed account) and send an email to confirm it.
+                    $user = \auth_oauth2\api::send_confirm_account_email($userinfo, $issuer);
 
-                $this->update_picture($user);
-                $emailconfirm = get_string('emailconfirm');
-                $message = get_string('emailconfirmsent', '', $userinfo['email']);
-                $this->print_confirm_required($emailconfirm, $message);
-                exit();
+                    $this->update_picture($user);
+                    $emailconfirm = get_string('emailconfirm');
+                    $message = get_string('emailconfirmsent', '', $userinfo['email']);
+                    $this->print_confirm_required($emailconfirm, $message);
+                    exit();
+                } else {
+                    // Create a new confirmed account.
+                    $newuser = \auth_oauth2\api::create_new_confirmed_account($userinfo, $issuer);
+                    $userinfo = get_complete_user_data('id', $newuser->id);
+
+                    // No redirect, we will complete this login.
+                }
             }
         }
 
index 817430a..83bf1a6 100644 (file)
@@ -98,4 +98,46 @@ class auth_oauth2_external_testcase extends advanced_testcase {
         $this->assertCount(1, $linkedlogins);
     }
 
+    /**
+     * Test auto-confirming linked logins.
+     */
+    public function test_linked_logins() {
+        $this->resetAfterTest();
+
+        $this->setAdminUser();
+        $issuer = \core\oauth2\api::create_standard_issuer('google');
+
+        $user = $this->getDataGenerator()->create_user();
+
+        $info = [];
+        $info['username'] = 'banana';
+        $info['email'] = 'banana@example.com';
+
+        \auth_oauth2\api::link_login($info, $issuer, $user->id, false);
+
+        // Try and match a user with a linked login.
+        $match = \auth_oauth2\api::match_username_to_user('banana', $issuer);
+
+        $this->assertEquals($user->id, $match->get('userid'));
+        $linkedlogins = \auth_oauth2\api::get_linked_logins($user->id, $issuer);
+        \auth_oauth2\api::delete_linked_login($linkedlogins[0]->get('id'));
+
+        $match = \auth_oauth2\api::match_username_to_user('banana', $issuer);
+        $this->assertFalse($match);
+
+        $info = [];
+        $info['username'] = 'apple';
+        $info['email'] = 'apple@example.com';
+        $info['firstname'] = 'Apple';
+        $info['lastname'] = 'Fruit';
+        $info['url'] = 'http://apple.com/';
+        $info['alternamename'] = 'Beatles';
+
+        $newuser = \auth_oauth2\api::create_new_confirmed_account($info, $issuer);
+
+        $match = \auth_oauth2\api::match_username_to_user('apple', $issuer);
+
+        $this->assertEquals($newuser->id, $match->get('userid'));
+    }
+
 }
diff --git a/auth/pam/auth.php b/auth/pam/auth.php
deleted file mode 100644 (file)
index 35e0abf..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-<?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/>.
-
-/**
- * Authentication Plugin: PAM Authentication
- *
- * PAM (Pluggable Authentication Modules) for Moodle
- *
- * Description:
- * Authentication by using the PHP4 PAM module:
- * http://www.math.ohio-state.edu/~ccunning/pam_auth/
- *
- * Version 0.3  2006/09/07 by Jonathan Harker (plugin class)
- * Version 0.2: 2004/09/01 by Martin V�geli (stable version)
- * Version 0.1: 2004/08/30 by Martin V�geli (first draft)
- *
- * Contact: martinvoegeli@gmx.ch
- * Website 1: http://elearning.zhwin.ch/
- * Website 2: http://birdy1976.com/
- *
- * @package auth_pam
- * @author Martin Dougiamas
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-require_once($CFG->libdir.'/authlib.php');
-
-/**
- * PAM authentication plugin.
- */
-class auth_plugin_pam extends auth_plugin_base {
-
-    /**
-     * Store error messages from pam authentication attempts.
-     */
-    var $lasterror;
-
-    /**
-     * Constructor.
-     */
-    public function __construct() {
-        $this->authtype = 'pam';
-        $this->config = get_config('auth_pam');
-        $this->errormessage = '';
-    }
-
-    /**
-     * Old syntax of class constructor. Deprecated in PHP7.
-     *
-     * @deprecated since Moodle 3.1
-     */
-    public function auth_plugin_pam() {
-        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
-        self::__construct();
-    }
-
-    /**
-     * Returns true if the username and password work and false if they are
-     * wrong or don't exist.
-     *
-     * @param string $username The username
-     * @param string $password The password
-     * @return bool Authentication success or failure.
-     */
-    function user_login ($username, $password) {
-        // variable to store possible errors during authentication
-        $errormessage = str_repeat(' ', 2048);
-
-        // just for testing and debugging
-        // error_reporting(E_ALL);
-
-        // call_time_pass_reference of errormessage is deprecated - throws warnings in multiauth
-        //if (pam_auth($username, $password, &$errormessage)) {
-        if (pam_auth($username, $password)) {
-            return true;
-        }
-        else {
-            $this->lasterror = $errormessage;
-            return false;
-        }
-    }
-
-    function prevent_local_passwords() {
-        return true;
-    }
-
-    /**
-     * Returns true if this authentication plugin is 'internal'.
-     *
-     * @return bool
-     */
-    function is_internal() {
-        return false;
-    }
-
-    /**
-     * Returns true if this authentication plugin can change the user's
-     * password.
-     *
-     * @return bool
-     */
-    function can_change_password() {
-        return false;
-    }
-
-}
-
-
diff --git a/auth/pam/db/install.php b/auth/pam/db/install.php
deleted file mode 100644 (file)
index c519486..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function xmldb_auth_pam_install() {
-    global $CFG, $DB;
-
-}
diff --git a/auth/pam/db/upgrade.php b/auth/pam/db/upgrade.php
deleted file mode 100644 (file)
index 8fe55c2..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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/>.
-
-/**
- * PAM authentication plugin upgrade code
- *
- * @package    auth_pam
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-/**
- * Function to upgrade auth_pam.
- * @param int $oldversion the version we are upgrading from
- * @return bool result
- */
-function xmldb_auth_pam_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Automatically generated Moodle v3.2.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2017020700) {
-        // Convert info in config plugins from auth/pam to auth_pam.
-        upgrade_fix_config_auth_plugin_names('pam');
-        upgrade_fix_config_auth_plugin_defaults('pam');
-        upgrade_plugin_savepoint(true, 2017020700, 'auth', 'pam');
-    }
-
-    // Automatically generated Moodle v3.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    return true;
-}
diff --git a/auth/pam/lang/en/auth_pam.php b/auth/pam/lang/en/auth_pam.php
deleted file mode 100644 (file)
index e4159be..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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/>.
-
-/**
- * Strings for component 'auth_pam', language 'en'.
- *
- * @package   auth_pam
- * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-$string['auth_pamdescription'] = 'This method uses PAM to access the native usernames on this server. You have to install <a href="http://www.math.ohio-state.edu/~ccunning/pam_auth/">PHP4 PAM Authentication</a> in order to use this module.';
-$string['auth_passwordisexpired'] = 'Your password has expired. Do you want to change your password now?';
-$string['auth_passwordwillexpire'] = 'Your password will expire in {$a} days. Do you want to change your password now?';
-$string['pluginname'] = 'PAM (Pluggable Authentication Modules)';
diff --git a/auth/pam/settings.php b/auth/pam/settings.php
deleted file mode 100644 (file)
index 7a053a3..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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/>.
-
-/**
- * Admin settings and defaults.
- *
- * @package auth_pam
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die;
-
-if ($ADMIN->fulltree) {
-
-    // Introductory explanation.
-    $settings->add(new admin_setting_heading('auth_pam/pluginname', '',
-        new lang_string('auth_pamdescription', 'auth_pam')));
-
-    // Display locking / mapping of profile fields.
-    $authplugin = get_auth_plugin('pam');
-    display_auth_lock_options($settings, $authplugin->authtype, $authplugin->userfields,
-        get_string('auth_fieldlocks_help', 'auth'), false, false);
-}
diff --git a/auth/pam/upgrade.txt b/auth/pam/upgrade.txt
deleted file mode 100644 (file)
index 19972b6..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-This files describes API changes in /auth/pam/*,
-information provided here is intended especially for developers.
-
-=== 3.3 ===
-
-* The config.html file was migrated to use the admin settings API.
-  The identifier for configuration data stored in config_plugins table was converted from 'auth/pam' to 'auth_pam'.
diff --git a/auth/pam/version.php b/auth/pam/version.php
deleted file mode 100644 (file)
index 3589681..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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/>.
-
-/**
- * Version information
- *
- * @package    auth_pam
- * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-$plugin->version   = 2017051500;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2017050500;        // Requires this Moodle version
-$plugin->component = 'auth_pam';       // Full name of the plugin (used for diagnostics)
diff --git a/auth/pop3/auth.php b/auth/pop3/auth.php
deleted file mode 100644 (file)
index 9434944..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-<?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/>.
-
-/**
- * Authentication Plugin: POP3 Authentication
- * Authenticates against a POP3 server.
- *
- * @package auth_pop3
- * @author Martin Dougiamas
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-require_once($CFG->libdir.'/authlib.php');
-
-/**
- * POP3 authentication plugin.
- */
-class auth_plugin_pop3 extends auth_plugin_base {
-
-    /**
-     * Constructor.
-     */
-    public function __construct() {
-        $this->authtype = 'pop3';
-        $this->config = get_config('auth_pop3');
-    }
-
-    /**
-     * Old syntax of class constructor. Deprecated in PHP7.
-     *
-     * @deprecated since Moodle 3.1
-     */
-    public function auth_plugin_pop3() {
-        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
-        self::__construct();
-    }
-
-    /**
-     * Returns true if the username and password work and false if they are
-     * wrong or don't exist.
-     *
-     * @param string $username The username
-     * @param string $password The password
-     * @return bool Authentication success or failure.
-     */
-    function user_login($username, $password) {
-        if (! function_exists('imap_open')) {
-            print_error('auth_pop3notinstalled','auth_pop3');
-            exit;
-        }
-
-        global $CFG;
-        $hosts = explode(';', $this->config->host);   // Could be multiple hosts
-        foreach ($hosts as $host) {                 // Try each host in turn
-            $host = trim($host);
-
-            // remove any trailing slash
-            if (substr($host, -1) == '/') {
-                $host = substr($host, 0, strlen($host) - 1);
-            }
-
-            switch ($this->config->type) {
-                case 'pop3':
-                    $host = '{'.$host.":{$this->config->port}/pop3}{$this->config->mailbox}";
-                break;
-
-                case 'pop3notls':
-                    $host = '{'.$host.":{$this->config->port}/pop3/notls}{$this->config->mailbox}";
-                break;
-
-                case 'pop3cert':
-                    $host = '{'.$host.":{$this->config->port}/pop3/ssl/novalidate-cert}{$this->config->mailbox}";
-                break;
-            }
-
-            error_reporting(0);
-            $connection = imap_open($host, $username, $password);
-            error_reporting($CFG->debug);
-
-            if ($connection) {
-                imap_close($connection);
-                return true;
-            }
-        }
-        return false;  // No matches found
-    }
-
-    function prevent_local_passwords() {
-        return true;
-    }
-
-    /**
-     * Returns true if this authentication plugin is 'internal'.
-     *
-     * @return bool
-     */
-    function is_internal() {
-        return false;
-    }
-
-    /**
-     * Returns true if this authentication plugin can change the user's
-     * password.
-     *
-     * @return bool
-     */
-    function can_change_password() {
-        return !empty($this->config->changepasswordurl);
-    }
-
-    /**
-     * Returns the URL for changing the user's pw, or false if the default can
-     * be used.
-     *
-     * @return moodle_url
-     */
-    function change_password_url() {
-        if (!empty($this->config->changepasswordurl)) {
-            return new moodle_url($this->config->changepasswordurl);
-        } else {
-            return null;
-        }
-    }
-
-}
-
-
diff --git a/auth/pop3/db/install.php b/auth/pop3/db/install.php
deleted file mode 100644 (file)
index 0bd3df6..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-function xmldb_auth_pop3_install() {
-    global $CFG, $DB;
-
-}
diff --git a/auth/pop3/db/upgrade.php b/auth/pop3/db/upgrade.php
deleted file mode 100644 (file)
index 39bc594..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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/>.
-
-/**
- * POP authentication plugin upgrade code
- *
- * @package    auth_pop3
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-/**
- * Function to upgrade auth_pop3.
- * @param int $oldversion the version we are upgrading from
- * @return bool result
- */
-function xmldb_auth_pop3_upgrade($oldversion) {
-    global $CFG, $DB;
-
-    // Automatically generated Moodle v3.2.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    if ($oldversion < 2017020700) {
-        // Convert info in config plugins from auth/pop3 to auth_pop3.
-        upgrade_fix_config_auth_plugin_names('pop3');
-        upgrade_fix_config_auth_plugin_defaults('pop3');
-        upgrade_plugin_savepoint(true, 2017020700, 'auth', 'pop3');
-    }
-
-    // Automatically generated Moodle v3.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    return true;
-}
diff --git a/auth/pop3/lang/en/auth_pop3.php b/auth/pop3/lang/en/auth_pop3.php
deleted file mode 100644 (file)
index 4aa257a..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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/>.
-
-/**
- * Strings for component 'auth_pop3', language 'en'.
- *
- * @package   auth_pop3
- * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-$string['auth_pop3description'] = 'This method uses a POP3 server to check whether a given username and password is valid.';
-$string['auth_pop3host'] = 'The POP3 server address. Use the IP number, not DNS name.';
-$string['auth_pop3host_key'] = 'Host';
-$string['auth_pop3changepasswordurl_key'] = 'Password-change URL';
-$string['auth_pop3mailbox'] = 'Name of the mailbox to attempt a connection with.  (usually INBOX)';
-$string['auth_pop3mailbox_key'] = 'Mailbox';
-$string['auth_pop3notinstalled'] = 'Cannot use POP3 authentication. The PHP IMAP module is not installed.';
-$string['auth_pop3port'] = 'Server port (110 is the most common, 995 is common for SSL)';
-$string['auth_pop3port_key'] = 'Port';
-$string['auth_pop3type'] = 'Server type. If your server uses certificate security, choose pop3cert.';
-$string['auth_pop3type_key'] = 'Type';
-$string['pluginname'] = 'POP3 server';
diff --git a/auth/pop3/settings.php b/auth/pop3/settings.php
deleted file mode 100644 (file)
index fa9c6a9..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?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/>.
-
-/**
- * Admin settings and defaults.
- *
- * @package auth_pop3
- * @copyright  2017 Stephen Bourget
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die;
-
-if ($ADMIN->fulltree) {
-
-    // Introductory explanation.
-    $settings->add(new admin_setting_heading('auth_pop3/pluginname', '', new lang_string('auth_pop3description', 'auth_pop3')));
-
-    // Host.
-    $settings->add(new admin_setting_configtext('auth_pop3/host', get_string('auth_pop3host_key', 'auth_pop3'),
-            get_string('auth_pop3host', 'auth_pop3') . ' ' .get_string('auth_multiplehosts', 'auth'),
-            '127.0.0.1', PARAM_RAW));
-
-    // Type.
-    $pop3options = array();
-    $pop3types = array('pop3', 'pop3cert', 'pop3notls');
-    foreach ($pop3types as $pop3type) {
-        $pop3options[$pop3type] = $pop3type;
-    }
-
-    $settings->add(new admin_setting_configselect('auth_pop3/type',
-        new lang_string('auth_pop3type_key', 'auth_pop3'),
-        new lang_string('auth_pop3type', 'auth_pop3'), 'pop3', $pop3options));
-
-    // Port.
-    $settings->add(new admin_setting_configtext('auth_pop3/port', get_string('auth_pop3port_key', 'auth_pop3'),
-            get_string('auth_pop3port', 'auth_pop3'), '143', PARAM_INT));
-
-    // Mailbox.
-    $settings->add(new admin_setting_configtext('auth_pop3/mailbox', get_string('auth_pop3mailbox_key', 'auth_pop3'),
-            get_string('auth_pop3mailbox', 'auth_pop3'), 'INBOX', PARAM_ALPHANUMEXT));
-
-    // Password change URL.
-    $settings->add(new admin_setting_configtext('auth_pop3/changepasswordurl',
-            get_string('auth_pop3changepasswordurl_key', 'auth_pop3'),
-            get_string('changepasswordhelp', 'auth'), '', PARAM_URL));
-
-    // Display locking / mapping of profile fields.
-    $authplugin = get_auth_plugin('pop3');
-    display_auth_lock_options($settings, $authplugin->authtype, $authplugin->userfields,
-            get_string('auth_fieldlocks_help', 'auth'), false, false);
-}
diff --git a/auth/pop3/upgrade.txt b/auth/pop3/upgrade.txt
deleted file mode 100644 (file)
index 4aee976..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-This files describes API changes in /auth/pop3/*,
-information provided here is intended especially for developers.
-
-=== 3.3 ===
-
-* The config.html file was migrated to use the admin settings API.
-  The identifier for configuration data stored in config_plugins table was converted from 'auth/pop3' to 'auth_pop3'.
diff --git a/auth/pop3/version.php b/auth/pop3/version.php
deleted file mode 100644 (file)
index a4b54ac..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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/>.
-
-/**
- * Version information
- *
- * @package    auth_pop3
- * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-$plugin->version   = 2017051500;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2017050500;        // Requires this Moodle version
-$plugin->component = 'auth_pop3';       // Full name of the plugin (used for diagnostics)
index 2ea5248..b0c6e89 100644 (file)
@@ -1410,8 +1410,9 @@ class backup_block_instance_structure_step extends backup_structure_step {
         // Define each element separated
 
         $block = new backup_nested_element('block', array('id', 'contextid', 'version'), array(
-            'blockname', 'parentcontextid', 'showinsubcontexts', 'pagetypepattern',
-            'subpagepattern', 'defaultregion', 'defaultweight', 'configdata'));
+                'blockname', 'parentcontextid', 'showinsubcontexts', 'pagetypepattern',
+                'subpagepattern', 'defaultregion', 'defaultweight', 'configdata',
+                'timecreated', 'timemodified'));
 
         $positions = new backup_nested_element('block_positions');
 
index f886496..00132f6 100644 (file)
@@ -3937,6 +3937,14 @@ class restore_block_instance_structure_step extends restore_structure_step {
             $data->configdata = base64_encode(serialize((object)$configdata));
         }
 
+        // Set timecreated, timemodified if not included (older backup).
+        if (empty($data->timecreated)) {
+            $data->timecreated = time();
+        }
+        if (empty($data->timemodified)) {
+            $data->timemodified = $data->timecreated;
+        }
+
         // Create the block instance
         $newitemid = $DB->insert_record('block_instances', $data);
         // Save the mapping (with restorefiles support)
index a5f531c..21773b9 100644 (file)
@@ -464,9 +464,10 @@ class core_backup_moodle2_testcase extends advanced_testcase {
      *
      * @param stdClass $course Course object to backup
      * @param int $newdate If non-zero, specifies custom date for new course
+     * @param callable|null $inbetween If specified, function that is called before restore
      * @return int ID of newly restored course
      */
-    protected function backup_and_restore($course, $newdate = 0) {
+    protected function backup_and_restore($course, $newdate = 0, $inbetween = null) {
         global $USER, $CFG;
 
         // Turn off file logging, otherwise it can't delete the file (Windows).
@@ -481,6 +482,10 @@ class core_backup_moodle2_testcase extends advanced_testcase {
         $bc->execute_plan();
         $bc->destroy();
 
+        if ($inbetween) {
+            $inbetween($backupid);
+        }
+
         // Do restore to new course with default settings.
         $newcourseid = restore_dbops::create_new_course(
                 $course->fullname, $course->shortname . '_2', $course->category);
@@ -802,4 +807,64 @@ class core_backup_moodle2_testcase extends advanced_testcase {
         $enrolment = reset($enrolments);
         $this->assertEquals('self', $enrolment->enrol);
     }
+
+    /**
+     * Test the block instance time fields (timecreated, timemodified) through a backup and restore.
+     */
+    public function test_block_instance_times_backup() {
+        global $DB;
+        $this->resetAfterTest();
+
+        $this->setAdminUser();
+        $generator = $this->getDataGenerator();
+
+        // Create course and add HTML block.
+        $course = $generator->create_course();
+        $context = context_course::instance($course->id);
+        $page = new moodle_page();
+        $page->set_context($context);
+        $page->set_course($course);
+        $page->set_pagelayout('standard');
+        $page->set_pagetype('course-view');
+        $page->blocks->load_blocks();
+        $page->blocks->add_block_at_end_of_default_region('html');
+
+        // Update (hack in database) timemodified and timecreated to specific values for testing.
+        $blockdata = $DB->get_record('block_instances',
+                ['blockname' => 'html', 'parentcontextid' => $context->id]);
+        $originalblockid = $blockdata->id;
+        $blockdata->timecreated = 12345;
+        $blockdata->timemodified = 67890;
+        $DB->update_record('block_instances', $blockdata);
+
+        // Do backup and restore.
+        $newcourseid = $this->backup_and_restore($course);
+
+        // Confirm that values were transferred correctly into HTML block on new course.
+        $newcontext = context_course::instance($newcourseid);
+        $blockdata = $DB->get_record('block_instances',
+                ['blockname' => 'html', 'parentcontextid' => $newcontext->id]);
+        $this->assertEquals(12345, $blockdata->timecreated);
+        $this->assertEquals(67890, $blockdata->timemodified);
+
+        // Simulate what happens with an older backup that doesn't have those fields, by removing
+        // them from the backup before doing a restore.
+        $before = time();
+        $newcourseid = $this->backup_and_restore($course, 0, function($backupid) use($originalblockid) {
+            global $CFG;
+            $path = $CFG->dataroot . '/temp/backup/' . $backupid . '/course/blocks/html_' .
+                    $originalblockid . '/block.xml';
+            $xml = file_get_contents($path);
+            $xml = preg_replace('~<timecreated>.*?</timemodified>~s', '', $xml);
+            file_put_contents($path, $xml);
+        });
+        $after = time();
+
+        // The fields not specified should default to current time.
+        $newcontext = context_course::instance($newcourseid);
+        $blockdata = $DB->get_record('block_instances',
+                ['blockname' => 'html', 'parentcontextid' => $newcontext->id]);
+        $this->assertTrue($before <= $blockdata->timecreated && $after >= $blockdata->timecreated);
+        $this->assertTrue($before <= $blockdata->timemodified && $after >= $blockdata->timemodified);
+    }
 }
index 7d529ad..7c73f83 100644 (file)
  * @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';
-
-        // Do not try to add the block if we cannot find the default my_pages entry.
-        // Private => 1 refers to MY_PAGE_PRIVATE.
-        if ($systempage = $DB->get_record('my_pages', array('userid' => null, 'private' => 1))) {
-            $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',
-                'subpagepattern' => $systempage->id,
-            );
-
-            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', $systempage->id);
-            }
-        }
-
-        upgrade_block_savepoint(true, 2014062600, $blockname);
-    }
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index 09f73a6..1d287b5 100644 (file)
  * @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';
-
-        // Do not try to add the block if we cannot find the default my_pages entry.
-        // Private => 1 refers to MY_PAGE_PRIVATE.
-        if ($systempage = $DB->get_record('my_pages', array('userid' => null, 'private' => 1))) {
-            $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',
-                'subpagepattern' => $systempage->id,
-            );
-
-            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', $systempage->id);
-            }
-        }
-
-        upgrade_block_savepoint(true, 2014062600, $blockname);
-    }
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index d867d08..df77631 100644 (file)
  * @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';
-
-        // Do not try to add the block if we cannot find the default my_pages entry.
-        // Private => 1 refers to MY_PAGE_PRIVATE.
-        if ($systempage = $DB->get_record('my_pages', array('userid' => null, 'private' => 1))) {
-            $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',
-                'subpagepattern' => $systempage->id,
-            );
-
-            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', $systempage->id);
-            }
-        }
-
-        upgrade_block_savepoint(true, 2014062600, $blockname);
-    }
-
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
+    global $CFG;
 
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
index 587695b..26f7495 100644 (file)
@@ -66,7 +66,7 @@ class behat_block_comments extends behat_base {
             $this->find_link(get_string('savecomment'))->click();
             // Delay after clicking so that additional comments will have unique time stamps.
             // We delay 1 second which is all we need.
-            $this->getSession()->wait(1000, false);
+            $this->getSession()->wait(1000);
 
         } else {
 
@@ -104,7 +104,7 @@ class behat_block_comments extends behat_base {
         );
 
         // Wait for the animation to finish, in theory is just 1 sec, adding 4 just in case.
-        $this->getSession()->wait(4 * 1000, false);
+        $this->getSession()->wait(4 * 1000);
     }
 
 }
index 12ae568..efb36bd 100644 (file)
@@ -46,15 +46,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_block_community_upgrade($oldversion) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index a04db38..e345754 100644 (file)
@@ -48,15 +48,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_block_completionstatus_upgrade($oldversion, $block) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index 3d972ce..bf3ccdd 100644 (file)
@@ -48,15 +48,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_block_course_summary_upgrade($oldversion, $block) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
diff --git a/blocks/html/classes/search/content.php b/blocks/html/classes/search/content.php
new file mode 100644 (file)
index 0000000..32b20b9
--- /dev/null
@@ -0,0 +1,91 @@
+<?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/>.
+
+/**
+ * Search area for block_html blocks
+ *
+ * @package block_html
+ * @copyright 2017 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace block_html\search;
+
+use core_search\moodle_recordset;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Search area for block_html blocks
+ *
+ * @package block_html
+ * @copyright 2017 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class content extends \core_search\base_block {
+
+    public function get_document($record, $options = array()) {
+        // Create empty document.
+        $doc = \core_search\document_factory::instance($record->id,
+                $this->componentname, $this->areaname);
+
+        // Get stdclass object with data from DB.
+        $data = unserialize(base64_decode($record->configdata));
+
+        // Get content.
+        $content = content_to_text($data->text, $data->format);
+        $doc->set('content', $content);
+
+        if (isset($data->title)) {
+            // If there is a title, use it as title.
+            $doc->set('title', content_to_text($data->title, false));
+        } else {
+            // If there is no title, use the content text again.
+            $doc->set('title', shorten_text($content));
+        }
+
+        // Set standard fields.
+        $doc->set('contextid', $record->contextid);
+        $doc->set('type', \core_search\manager::TYPE_TEXT);
+        $doc->set('courseid', $record->courseid);
+        $doc->set('modified', $record->timemodified);
+        $doc->set('owneruserid', \core_search\manager::NO_OWNER_ID);
+
+        // Mark document new if appropriate.
+        if (isset($options['lastindexedtime']) &&
+                ($options['lastindexedtime'] < $record->timecreated)) {
+            // If the document was created after the last index time, it must be new.
+            $doc->set_is_new(true);
+        }
+
+        return $doc;
+    }
+
+    public function uses_file_indexing() {
+        return true;
+    }
+
+    public function attach_files($document) {
+        $fs = get_file_storage();
+
+        $context = \context::instance_by_id($document->get('contextid'));
+
+        $files = $fs->get_area_files($context->id, 'block_html', 'content');
+        foreach ($files as $file) {
+            $document->add_stored_file($file);
+        }
+    }
+}
index 2899efe..36ee50b 100644 (file)
@@ -33,15 +33,6 @@ defined('MOODLE_INTERNAL') || die();
 function xmldb_block_html_upgrade($oldversion) {
     global $CFG;
 
-    // Moodle v2.8.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v2.9.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Moodle v3.0.0 release upgrade line.
-    // Put any upgrade step following this.
-
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
index bf6df6f..7eb2ad4 100644 (file)
@@ -33,3 +33,4 @@ $string['html:myaddinstance'] = 'Add a new HTML block to Dashboard';
 $string['leaveblanktohide'] = 'leave blank to hide the title';
 $string['newhtmlblock'] = '(new HTML block)';
 $string['pluginname'] = 'HTML';
+$string['search:content'] = 'HTML block content';
index 531a32a..a86b827 100644 (file)
@@ -104,7 +104,8 @@ function block_html_global_db_replace($search, $replace) {
         $config = unserialize(base64_decode($instance->configdata));
         if (isset($config->text) and is_string($config->text)) {
             $config->text = str_replace($search, $replace, $config->text);
-            $DB->set_field('block_instances', 'configdata', base64_encode(serialize($config)), array('id' => $instance->id));
+            $DB->update_record('block_instances', ['id' => $instance->id,
+                    'configdata' => base64_encode(serialize($config)), 'timemodified' => time()]);
         }
     }
     $instances->close();
diff --git a/blocks/html/tests/search_content_test.php b/blocks/html/tests/search_content_test.php
new file mode 100644 (file)
index 0000000..5afb8cd
--- /dev/null
@@ -0,0 +1,191 @@
+<?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/>.
+
+/**
+ * Unit test for search indexing.
+ *
+ * @package block_html
+ * @copyright 2017 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace block_html;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Unit test for search indexing.
+ *
+ * @package block_html
+ * @copyright 2017 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class search_content_testcase extends \advanced_testcase {
+
+    /**
+     * Creates an HTML block on a course.
+     *
+     * @param \stdClass $course Course object
+     * @return \block_html Block instance object
+     */
+    protected function create_block($course) {
+        $page = self::construct_page($course);
+        $page->blocks->add_block_at_end_of_default_region('html');
+
+        // Load the block.
+        $page = self::construct_page($course);
+        $page->blocks->load_blocks();
+        $blocks = $page->blocks->get_blocks_for_region($page->blocks->get_default_region());
+        $block = end($blocks);
+        return $block;
+    }
+
+    /**
+     * Constructs a page object for the test course.
+     *
+     * @param \stdClass $course Moodle course object
+     * @return \moodle_page Page object representing course view
+     */
+    protected static function construct_page($course) {
+&n