Merge branch 'wip_MDL-47303_m28_jquery' of https://github.com/skodak/moodle
authorSam Hemelryk <sam@moodle.com>
Wed, 8 Oct 2014 01:31:40 +0000 (14:31 +1300)
committerSam Hemelryk <sam@moodle.com>
Wed, 8 Oct 2014 01:31:40 +0000 (14:31 +1300)
1047 files changed:
.gitignore
admin/environment.xml
admin/renderer.php
admin/roles/classes/potential_assignees_below_course.php
admin/settings/grades.php
admin/tool/behat/tests/behat/get_and_set_fields.feature
admin/tool/langimport/classes/controller.php [new file with mode: 0644]
admin/tool/langimport/classes/event/langpack_imported.php [new file with mode: 0644]
admin/tool/langimport/classes/event/langpack_removed.php [new file with mode: 0644]
admin/tool/langimport/classes/event/langpack_updated.php [new file with mode: 0644]
admin/tool/langimport/classes/task/update_langpacks_task.php [new file with mode: 0644]
admin/tool/langimport/db/tasks.php [new file with mode: 0644]
admin/tool/langimport/index.php
admin/tool/langimport/lang/en/tool_langimport.php
admin/tool/langimport/tests/behat/behat_tool_langimport.php [new file with mode: 0644]
admin/tool/langimport/tests/behat/manage_langpacks.feature [new file with mode: 0644]
admin/tool/langimport/tests/events_test.php [new file with mode: 0644]
admin/tool/langimport/version.php
admin/tool/messageinbound/classes/edit_handler_form.php [new file with mode: 0644]
admin/tool/messageinbound/classes/manager.php [new file with mode: 0644]
admin/tool/messageinbound/classes/message/inbound/invalid_recipient_handler.php [new file with mode: 0644]
admin/tool/messageinbound/classes/task/cleanup_task.php [new file with mode: 0644]
admin/tool/messageinbound/classes/task/pickup_task.php [new file with mode: 0644]
admin/tool/messageinbound/db/messageinbound_handlers.php [new file with mode: 0644]
admin/tool/messageinbound/db/messages.php [new file with mode: 0644]
admin/tool/messageinbound/db/tasks.php [new file with mode: 0644]
admin/tool/messageinbound/index.php [new file with mode: 0644]
admin/tool/messageinbound/lang/en/tool_messageinbound.php [new file with mode: 0644]
admin/tool/messageinbound/renderer.php [new file with mode: 0644]
admin/tool/messageinbound/settings.php [new file with mode: 0644]
admin/tool/messageinbound/styles.css [new file with mode: 0644]
admin/tool/messageinbound/version.php [moved from question/format/learnwise/version.php with 77% similarity]
auth/ldap/auth.php
auth/tests/behat/behat_auth.php
availability/classes/tree.php
availability/condition/completion/classes/condition.php
availability/condition/date/classes/condition.php
availability/condition/grade/classes/condition.php
availability/condition/group/classes/condition.php
availability/condition/grouping/classes/condition.php
availability/condition/profile/classes/condition.php
availability/tests/tree_test.php
availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-debug.js
availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-min.js
availability/yui/build/moodle-core_availability-form/moodle-core_availability-form.js
availability/yui/src/form/js/form.js
backup/moodle2/backup_stepslib.php
backup/util/ui/backup_moodleform.class.php
backup/util/ui/backup_ui_stage.class.php
backup/util/ui/base_ui_stage.class.php
backup/util/ui/tests/behat/backup_courses.feature
backup/util/ui/tests/behat/behat_backup.php
badges/edit.php
badges/index.php
badges/newbadge.php
badges/view.php
blocks/community/communitycourse.php
blocks/course_overview/lang/en/block_course_overview.php
blocks/course_overview/locallib.php
blocks/course_overview/renderer.php
blocks/course_overview/settings.php
blocks/course_overview/styles.css
calendar/delete.php
calendar/export_execute.php
calendar/lib.php
calendar/renderer.php
cohort/assign.php
cohort/edit.php
cohort/edit_form.php
cohort/externallib.php
cohort/index.php
cohort/lib.php
cohort/tests/behat/access_visible_cohorts.feature [new file with mode: 0644]
cohort/tests/behat/upload_cohorts.feature
cohort/tests/cohortlib_test.php
cohort/tests/externallib_test.php
cohort/tests/fixtures/uploadcohorts1.csv
cohort/upload_form.php
config-dist.php
course/classes/management/helper.php
course/classes/management_renderer.php
course/info.php
course/management.php
course/modlib.php
course/publish/backup.php
course/publish/hubselector.php
course/publish/index.php
course/publish/metadata.php
course/renderer.php
course/reset_form.php
course/resources.php
course/tests/behat/course_search.feature [new file with mode: 0644]
course/tests/courselib_test.php
enrol/cohort/ajax.php [deleted file]
enrol/cohort/edit_form.php
enrol/cohort/lang/en/enrol_cohort.php
enrol/cohort/lib.php
enrol/cohort/locallib.php
enrol/cohort/yui/quickenrolment/assets/skins/sam/quickenrolment.css [deleted file]
enrol/cohort/yui/quickenrolment/assets/skins/sam/sprite.png [deleted file]
enrol/cohort/yui/quickenrolment/quickenrolment.js [deleted file]
enrol/index.php
enrol/locallib.php
enrol/manual/ajax.php
enrol/manual/lang/en/enrol_manual.php
enrol/manual/lib.php
enrol/manual/locallib.php
enrol/manual/yui/quickenrolment/assets/skins/sam/quickenrolment.css
enrol/manual/yui/quickenrolment/quickenrolment.js
enrol/self/edit_form.php
enrol/users.php
files/coursefilesedit.php
files/index.php
grade/edit/scale/edit.php
grade/edit/settings/index.php
grade/edit/tree/action.php
grade/edit/tree/calculation.php
grade/edit/tree/category.php
grade/edit/tree/category_form.php
grade/edit/tree/functions.js
grade/edit/tree/grade_form.php
grade/edit/tree/index.php
grade/edit/tree/item.php
grade/edit/tree/item_form.php
grade/edit/tree/lib.php
grade/edit/tree/outcomeitem.php
grade/lib.php
grade/report/grader/index.php
grade/report/grader/lib.php
grade/report/grader/module.js
grade/report/grader/preferences_form.php
grade/report/grader/settings.php
grade/report/history/classes/output/tablelog.php
grade/report/lib.php
grade/report/overview/lib.php
grade/report/user/lib.php
grade/report/user/settings.php
grade/report/user/styles.css
grade/tests/behat/behat_grade.php
grade/tests/behat/grade_UI_settings.feature [new file with mode: 0644]
grade/tests/behat/grade_aggregation.feature
grade/tests/behat/grade_calculated_weights.feature [new file with mode: 0644]
grade/tests/behat/grade_mingrade.feature [new file with mode: 0644]
grade/tests/behat/grade_natural_normalisation.feature [new file with mode: 0644]
grade/tests/behat/grade_scales.feature [new file with mode: 0644]
grade/tests/behat/grade_view.feature
grade/tests/edittreelib_test.php
grade/tests/report_graderlib_test.php
grade/tests/reportlib_test.php
group/autogroup_form.php
install/lang/hr/install.php
lang/en/backup.php
lang/en/calendar.php
lang/en/cohort.php
lang/en/deprecated.txt
lang/en/grades.php
lang/en/moodle.php
lang/en/plugin.php
lib/adminlib.php
lib/adodb/adodb-active-record.inc.php
lib/adodb/adodb-active-recordx.inc.php
lib/adodb/adodb-csvlib.inc.php
lib/adodb/adodb-datadict.inc.php
lib/adodb/adodb-error.inc.php
lib/adodb/adodb-errorhandler.inc.php
lib/adodb/adodb-errorpear.inc.php
lib/adodb/adodb-exceptions.inc.php
lib/adodb/adodb-iterator.inc.php
lib/adodb/adodb-lib.inc.php
lib/adodb/adodb-memcache.lib.inc.php
lib/adodb/adodb-pager.inc.php
lib/adodb/adodb-pear.inc.php
lib/adodb/adodb-perf.inc.php
lib/adodb/adodb-php4.inc.php
lib/adodb/adodb-time.inc.php
lib/adodb/adodb-xmlschema.inc.php
lib/adodb/adodb-xmlschema03.inc.php
lib/adodb/adodb.inc.php
lib/adodb/datadict/datadict-access.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-db2.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-firebird.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-generic.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-ibase.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-informix.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-mssql.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-mssqlnative.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-mysql.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-oci8.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-postgres.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-sapdb.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-sqlite.inc.php [new file with mode: 0644]
lib/adodb/datadict/datadict-sybase.inc.php [new file with mode: 0644]
lib/adodb/drivers/adodb-access.inc.php
lib/adodb/drivers/adodb-ado.inc.php
lib/adodb/drivers/adodb-ado5.inc.php
lib/adodb/drivers/adodb-ado_access.inc.php
lib/adodb/drivers/adodb-ado_mssql.inc.php
lib/adodb/drivers/adodb-ads.inc.php
lib/adodb/drivers/adodb-borland_ibase.inc.php
lib/adodb/drivers/adodb-csv.inc.php
lib/adodb/drivers/adodb-db2.inc.php
lib/adodb/drivers/adodb-db2oci.inc.php
lib/adodb/drivers/adodb-db2ora.inc.php
lib/adodb/drivers/adodb-fbsql.inc.php
lib/adodb/drivers/adodb-firebird.inc.php
lib/adodb/drivers/adodb-ibase.inc.php
lib/adodb/drivers/adodb-informix.inc.php
lib/adodb/drivers/adodb-informix72.inc.php
lib/adodb/drivers/adodb-ldap.inc.php
lib/adodb/drivers/adodb-mssql.inc.php
lib/adodb/drivers/adodb-mssql_n.inc.php
lib/adodb/drivers/adodb-mssqlnative.inc.php
lib/adodb/drivers/adodb-mssqlpo.inc.php
lib/adodb/drivers/adodb-mysql.inc.php
lib/adodb/drivers/adodb-mysqli.inc.php
lib/adodb/drivers/adodb-mysqlpo.inc.php
lib/adodb/drivers/adodb-mysqlt.inc.php
lib/adodb/drivers/adodb-netezza.inc.php
lib/adodb/drivers/adodb-oci8.inc.php
lib/adodb/drivers/adodb-oci805.inc.php
lib/adodb/drivers/adodb-oci8po.inc.php
lib/adodb/drivers/adodb-oci8quercus.inc.php [new file with mode: 0644]
lib/adodb/drivers/adodb-odbc.inc.php
lib/adodb/drivers/adodb-odbc_db2.inc.php
lib/adodb/drivers/adodb-odbc_mssql.inc.php
lib/adodb/drivers/adodb-odbc_oracle.inc.php
lib/adodb/drivers/adodb-odbtp.inc.php
lib/adodb/drivers/adodb-odbtp_unicode.inc.php
lib/adodb/drivers/adodb-oracle.inc.php
lib/adodb/drivers/adodb-pdo.inc.php
lib/adodb/drivers/adodb-pdo_mssql.inc.php
lib/adodb/drivers/adodb-pdo_mysql.inc.php
lib/adodb/drivers/adodb-pdo_oci.inc.php
lib/adodb/drivers/adodb-pdo_pgsql.inc.php
lib/adodb/drivers/adodb-pdo_sqlite.inc.php
lib/adodb/drivers/adodb-postgres.inc.php
lib/adodb/drivers/adodb-postgres64.inc.php
lib/adodb/drivers/adodb-postgres7.inc.php
lib/adodb/drivers/adodb-postgres8.inc.php
lib/adodb/drivers/adodb-postgres9.inc.php
lib/adodb/drivers/adodb-proxy.inc.php
lib/adodb/drivers/adodb-sapdb.inc.php
lib/adodb/drivers/adodb-sqlanywhere.inc.php
lib/adodb/drivers/adodb-sqlite.inc.php
lib/adodb/drivers/adodb-sqlite3.inc.php
lib/adodb/drivers/adodb-sqlitepo.inc.php
lib/adodb/drivers/adodb-sybase.inc.php
lib/adodb/drivers/adodb-sybase_ase.inc.php
lib/adodb/drivers/adodb-vfp.inc.php
lib/adodb/lang/adodb-en.inc.php
lib/adodb/license.txt
lib/adodb/perf/perf-db2.inc.php
lib/adodb/perf/perf-informix.inc.php
lib/adodb/perf/perf-mssql.inc.php
lib/adodb/perf/perf-mssqlnative.inc.php
lib/adodb/perf/perf-mysql.inc.php
lib/adodb/perf/perf-oci8.inc.php
lib/adodb/perf/perf-postgres.inc.php
lib/adodb/pivottable.inc.php
lib/adodb/readme_moodle.txt
lib/adodb/rsfilter.inc.php
lib/adodb/toexport.inc.php
lib/adodb/tohtml.inc.php
lib/adodb/xmlschema.dtd
lib/adodb/xmlschema03.dtd
lib/adodb/xsl/convert-0.1-0.2.xsl
lib/adodb/xsl/convert-0.1-0.3.xsl
lib/adodb/xsl/convert-0.2-0.1.xsl
lib/adodb/xsl/convert-0.2-0.3.xsl
lib/adodb/xsl/remove-0.2.xsl
lib/adodb/xsl/remove-0.3.xsl
lib/classes/component.php
lib/classes/grades_external.php
lib/classes/message/inbound/address_manager.php [new file with mode: 0644]
lib/classes/message/inbound/handler.php [new file with mode: 0644]
lib/classes/message/inbound/manager.php [new file with mode: 0644]
lib/classes/message/inbound/private_files_handler.php [new file with mode: 0644]
lib/classes/message/inbound/processing_failed_exception.php [new file with mode: 0644]
lib/classes/plugin_manager.php
lib/classes/task/scheduled_task.php
lib/classes/update/deployer.php
lib/coursecatlib.php
lib/db/access.php
lib/db/install.xml [changed mode: 0644->0755]
lib/db/messageinbound_handlers.php [moved from question/format/learnwise/lang/en/qformat_learnwise.php with 70% similarity]
lib/db/services.php
lib/db/upgrade.php
lib/deprecatedlib.php
lib/dml/tests/dml_test.php
lib/editor/atto/plugins/indent/yui/build/moodle-atto_indent-button/moodle-atto_indent-button-debug.js
lib/editor/atto/plugins/indent/yui/build/moodle-atto_indent-button/moodle-atto_indent-button-min.js
lib/editor/atto/plugins/indent/yui/build/moodle-atto_indent-button/moodle-atto_indent-button.js
lib/editor/atto/plugins/indent/yui/src/button/js/button.js
lib/editor/tinymce/readme_moodle.txt
lib/editor/tinymce/tiny_mce/3.5.10/themes/advanced/skins/moodle/content.css
lib/editor/tinymce/version.php
lib/filelib.php
lib/grade/constants.php
lib/grade/grade_category.php
lib/grade/grade_grade.php
lib/grade/grade_item.php
lib/gradelib.php
lib/horde/framework/Horde/Array.php [new file with mode: 0644]
lib/horde/framework/Horde/Array/Sort/Helper.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Base.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Mcrypt.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Openssl.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Php.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Php/Base.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Php/Cbc.php [new file with mode: 0644]
lib/horde/framework/Horde/Crypt/Blowfish/Php/Ecb.php [new file with mode: 0644]
lib/horde/framework/Horde/Domhtml.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception/LastError.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception/NotFound.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception/Pear.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception/PermissionDenied.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception/Translation.php [new file with mode: 0644]
lib/horde/framework/Horde/Exception/Wrapped.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Auth/DigestMD5.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Base.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Base/Debug.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Base/Deprecated.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Base/Mailbox.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Base/Password.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache/Backend.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache/Backend/Cache.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache/Backend/Db.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache/Backend/Hashtable.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache/Backend/Mongo.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Cache/Backend/Null.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Acl.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/AclCommon.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/AclNegative.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/AclRights.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/BaseSubject.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Envelope.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Fetch.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Fetch/Pop3.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Astring.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Atom.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Date.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/DateTime.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Filter/Quote.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Filter/String.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/List.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/ListMailbox.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Mailbox.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Nil.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Nstring.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/Number.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Format/String.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Namespace.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Sync.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Data/Thread.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/DateTime.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Exception/NoSupportExtension.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Exception/NoSupportPop3.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Exception/SearchCharset.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Exception/ServerResponse.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Exception/Sync.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Fetch/Query.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Fetch/Results.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Ids.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Ids/Map.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Ids/Pop3.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Client.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Command.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Command/Continuation.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Pipeline.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Server.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Server/Continuation.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Server/Tagged.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Interaction/Server/Untagged.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Mailbox.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Mailbox/List.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Namespace/List.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Password/Xoauth2.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Search/Query.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket/Catenate.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket/ClientSort.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket/Connection/Base.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket/Connection/Pop3.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket/Connection/Socket.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Socket/Pop3.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Tokenize.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Translation.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Url.php [new file with mode: 0644]
lib/horde/framework/Horde/Imap/Client/Utf7imap.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822/Address.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822/Group.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822/GroupList.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822/Identification.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822/List.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Rfc822/Object.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Lmtphorde.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Mail.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Mock.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Null.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Sendmail.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Smtp.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Smtphorde.php [new file with mode: 0644]
lib/horde/framework/Horde/Mail/Transport/Smtpmx.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Headers.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Magic.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Mail.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Mdn.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Part.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Related.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/Translation.php [new file with mode: 0644]
lib/horde/framework/Horde/Mime/mime.mapping.php [new file with mode: 0644]
lib/horde/framework/Horde/Secret.php [new file with mode: 0644]
lib/horde/framework/Horde/Secret/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Socket/Client.php [new file with mode: 0644]
lib/horde/framework/Horde/Socket/Client/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Existing.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Filter/Bin2hex.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Filter/Crc32.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Filter/Eol.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Filter/Htmlspecialchars.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Filter/Null.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/String.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Temp.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/TempString.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Wrapper/Combine.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Wrapper/CombineStream.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Wrapper/String.php [new file with mode: 0644]
lib/horde/framework/Horde/Stream/Wrapper/StringStream.php [new file with mode: 0644]
lib/horde/framework/Horde/String.php [new file with mode: 0644]
lib/horde/framework/Horde/String/Transliterate.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Array.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Backtrace.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/CaseInsensitiveArray.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/CombineStream.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/ConsistentHash.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Guid.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Inflector.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Memory.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Numerizer.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Numerizer/Locale/Base.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Numerizer/Locale/De.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Numerizer/Locale/Pt.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/ObjectStub.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Randomid.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Stack.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/StringStream.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Stub.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Timer.php [new file with mode: 0644]
lib/horde/framework/Horde/Support/Uuid.php [new file with mode: 0644]
lib/horde/framework/Horde/Text/Flowed.php [new file with mode: 0644]
lib/horde/framework/Horde/Translation.php [new file with mode: 0644]
lib/horde/framework/Horde/Translation/Exception.php [new file with mode: 0644]
lib/horde/framework/Horde/Translation/Handler.php [new file with mode: 0644]
lib/horde/framework/Horde/Translation/Handler/Gettext.php [new file with mode: 0644]
lib/horde/framework/Horde/Util.php [new file with mode: 0644]
lib/horde/framework/Horde/Variables.php [new file with mode: 0644]
lib/horde/locale/Horde_Exception.pot [new file with mode: 0644]
lib/horde/locale/Horde_Imap_Client.pot [new file with mode: 0644]
lib/horde/locale/Horde_Mime.pot [new file with mode: 0644]
lib/horde/locale/ar/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/ar/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/ar/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/ar/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/bg/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/bg/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/bg/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/bg/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/bs/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/bs/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/bs/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/bs/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/ca/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/ca/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/ca/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/ca/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/cs/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/cs/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/cs/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/cs/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/da/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/da/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/da/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/da/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/da/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/da/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/de/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/de/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/de/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/de/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/de/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/de/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/el/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/el/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/el/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/el/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/en/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/en/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/en/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/en/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/es/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/es/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/es/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/es/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/es/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/es/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/et/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/et/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/et/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/et/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/eu/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/eu/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/eu/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/eu/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/eu/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/eu/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/fa/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/fa/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/fa/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/fa/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/fi/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/fi/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/fi/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/fi/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/fi/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/fi/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/fr/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/fr/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/fr/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/fr/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/fr/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/fr/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/gl/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/gl/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/gl/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/gl/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/he/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/he/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/he/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/he/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/hr/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/hr/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/hr/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/hr/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/hu/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/hu/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/hu/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/hu/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/hu/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/hu/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/id/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/id/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/id/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/id/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/is/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/is/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/is/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/is/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/it/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/it/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/it/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/it/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/ja/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/ja/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/ja/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/ja/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/ja/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/ja/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/km/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/km/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/km/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/km/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/ko/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/ko/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/ko/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/ko/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/lt/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/lt/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/lt/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/lt/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/lv/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/lv/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/lv/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/lv/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/mk/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/mk/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/mk/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/mk/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/nb/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/nb/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/nb/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/nb/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/nl/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/nl/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/nl/LC_MESSAGES/Horde_Imap_Client.mo [new file with mode: 0644]
lib/horde/locale/nl/LC_MESSAGES/Horde_Imap_Client.po [new file with mode: 0644]
lib/horde/locale/nl/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/nl/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/nn/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/nn/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/nn/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/nn/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/pl/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/pl/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/pl/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/pl/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/pt/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/pt/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/pt/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/pt/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/pt_BR/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/pt_BR/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/pt_BR/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/pt_BR/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/ro/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/ro/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/ro/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/ro/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/ru/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/ru/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/ru/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/ru/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/sk/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/sk/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/sk/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/sk/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/sl/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/sl/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/sl/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/sl/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/sv/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/sv/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/sv/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/sv/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/tr/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/tr/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/tr/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/tr/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/uk/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/uk/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/uk/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/uk/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/zh_CN/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/zh_CN/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/zh_CN/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/zh_CN/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/locale/zh_TW/LC_MESSAGES/Horde_Exception.mo [new file with mode: 0644]
lib/horde/locale/zh_TW/LC_MESSAGES/Horde_Exception.po [new file with mode: 0644]
lib/horde/locale/zh_TW/LC_MESSAGES/Horde_Mime.mo [new file with mode: 0644]
lib/horde/locale/zh_TW/LC_MESSAGES/Horde_Mime.po [new file with mode: 0644]
lib/horde/readme_moodle.txt [new file with mode: 0644]
lib/markdown/License.md
lib/markdown/Markdown.php
lib/markdown/MarkdownExtra.php
lib/markdown/MarkdownInterface.php
lib/markdown/Readme.md
lib/moodlelib.php
lib/outputcomponents.php
lib/outputrenderers.php
lib/pdflib.php
lib/pear/README.txt
lib/pear/XML/Parser.php [deleted file]
lib/pear/XML/Parser/Simple.php [deleted file]
lib/pear/XML/deprecated.txt [deleted file]
lib/phpmailer/README.md
lib/phpmailer/README_MOODLE.txt
lib/phpmailer/changelog.md
lib/phpmailer/class.phpmailer.php
lib/phpmailer/class.smtp.php
lib/phpmailer/index.html [deleted file]
lib/phpmailer/language/phpmailer.lang-ar.php
lib/phpmailer/language/phpmailer.lang-be.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-br.php
lib/phpmailer/language/phpmailer.lang-ca.php
lib/phpmailer/language/phpmailer.lang-ch.php
lib/phpmailer/language/phpmailer.lang-cz.php
lib/phpmailer/language/phpmailer.lang-de.php
lib/phpmailer/language/phpmailer.lang-dk.php
lib/phpmailer/language/phpmailer.lang-el.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-eo.php
lib/phpmailer/language/phpmailer.lang-es.php
lib/phpmailer/language/phpmailer.lang-et.php
lib/phpmailer/language/phpmailer.lang-fa.php
lib/phpmailer/language/phpmailer.lang-fi.php
lib/phpmailer/language/phpmailer.lang-fo.php
lib/phpmailer/language/phpmailer.lang-fr.php
lib/phpmailer/language/phpmailer.lang-gl.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-he.php
lib/phpmailer/language/phpmailer.lang-hr.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-hu.php
lib/phpmailer/language/phpmailer.lang-it.php
lib/phpmailer/language/phpmailer.lang-ja.php
lib/phpmailer/language/phpmailer.lang-ka.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-lt.php
lib/phpmailer/language/phpmailer.lang-lv.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-nl.php
lib/phpmailer/language/phpmailer.lang-no.php
lib/phpmailer/language/phpmailer.lang-pl.php
lib/phpmailer/language/phpmailer.lang-pt.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-ro.php
lib/phpmailer/language/phpmailer.lang-ru.php
lib/phpmailer/language/phpmailer.lang-se.php
lib/phpmailer/language/phpmailer.lang-sk.php
lib/phpmailer/language/phpmailer.lang-sr.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-tr.php
lib/phpmailer/language/phpmailer.lang-uk.php
lib/phpmailer/language/phpmailer.lang-vi.php [new file with mode: 0644]
lib/phpmailer/language/phpmailer.lang-zh.php
lib/phpmailer/language/phpmailer.lang-zh_cn.php
lib/phpmailer/moodle_phpmailer.php
lib/phpunit/classes/util.php
lib/setuplib.php
lib/tcpdf/CHANGELOG.TXT
lib/tcpdf/README.TXT
lib/tcpdf/composer.json
lib/tcpdf/config/tcpdf_config.php
lib/tcpdf/fonts/freemono.php
lib/tcpdf/fonts/freemono.z
lib/tcpdf/fonts/freemonob.ctg.z
lib/tcpdf/fonts/freemonob.php
lib/tcpdf/fonts/freemonob.z
lib/tcpdf/fonts/freemonobi.ctg.z
lib/tcpdf/fonts/freemonobi.php
lib/tcpdf/fonts/freemonobi.z
lib/tcpdf/fonts/freemonoi.ctg.z
lib/tcpdf/fonts/freemonoi.php
lib/tcpdf/fonts/freemonoi.z
lib/tcpdf/fonts/freesans.ctg.z
lib/tcpdf/fonts/freesans.php
lib/tcpdf/fonts/freesans.z
lib/tcpdf/fonts/freesansb.ctg.z
lib/tcpdf/fonts/freesansb.php
lib/tcpdf/fonts/freesansb.z
lib/tcpdf/fonts/freesansbi.ctg.z
lib/tcpdf/fonts/freesansbi.php
lib/tcpdf/fonts/freesansbi.z
lib/tcpdf/fonts/freesansi.ctg.z
lib/tcpdf/fonts/freesansi.php
lib/tcpdf/fonts/freesansi.z
lib/tcpdf/fonts/freeserif.ctg.z
lib/tcpdf/fonts/freeserif.php
lib/tcpdf/fonts/freeserif.z
lib/tcpdf/fonts/freeserifb.ctg.z
lib/tcpdf/fonts/freeserifb.php
lib/tcpdf/fonts/freeserifb.z
lib/tcpdf/fonts/freeserifbi.ctg.z
lib/tcpdf/fonts/freeserifbi.php
lib/tcpdf/fonts/freeserifbi.z
lib/tcpdf/fonts/freeserifi.ctg.z
lib/tcpdf/fonts/freeserifi.php
lib/tcpdf/fonts/freeserifi.z
lib/tcpdf/include/barcodes/datamatrix.php
lib/tcpdf/include/barcodes/pdf417.php
lib/tcpdf/include/sRGB.icc
lib/tcpdf/include/tcpdf_colors.php
lib/tcpdf/include/tcpdf_filters.php
lib/tcpdf/include/tcpdf_fonts.php
lib/tcpdf/include/tcpdf_images.php
lib/tcpdf/include/tcpdf_static.php
lib/tcpdf/readme_moodle.txt
lib/tcpdf/tcpdf.php
lib/tcpdf/tcpdf_autoconfig.php
lib/tcpdf/tcpdf_barcodes_1d.php
lib/tcpdf/tcpdf_barcodes_2d.php
lib/testing/classes/util.php
lib/testing/generator/data_generator.php
lib/testing/tests/generator_test.php
lib/tests/behat/behat_general.php
lib/tests/behat/behat_navigation.php
lib/tests/moodlelib_test.php
lib/tests/other/pdflibtestpage.php
lib/tests/outputcomponents_test.php
lib/tests/scheduled_task_test.php
lib/thirdpartylibs.xml
lib/typo3/class.t3lib_div.php
lib/typo3/readme_moodle.txt
lib/upgrade.txt
lib/upgradelib.php
lib/yui/build/moodle-core-notification-dialogue/moodle-core-notification-dialogue-debug.js
lib/yui/build/moodle-core-notification-dialogue/moodle-core-notification-dialogue-min.js
lib/yui/build/moodle-core-notification-dialogue/moodle-core-notification-dialogue.js
lib/yui/src/notification/js/dialogue.js
lib/yuilib/2in3/2.9.0/build/yui2-calendar/yui2-calendar-debug.js
lib/yuilib/2in3/2.9.0/build/yui2-calendar/yui2-calendar-min.js
lib/yuilib/2in3/2.9.0/build/yui2-calendar/yui2-calendar.js
message/externallib.php
message/index.php
message/lib.php
message/output/airnotifier/message_output_airnotifier.php
message/output/email/message_output_email.php
message/tests/externallib_test.php
message/tests/fixtures/inbound_fixtures.php [new file with mode: 0644]
message/tests/inbound_test.php [new file with mode: 0644]
mod/assign/backup/moodle2/backup_assign_stepslib.php
mod/assign/backup/moodle2/restore_assign_stepslib.php
mod/assign/db/install.xml
mod/assign/db/upgrade.php
mod/assign/externallib.php
mod/assign/gradingtable.php
mod/assign/lib.php
mod/assign/locallib.php
mod/assign/mod_form.php
mod/assign/renderer.php
mod/assign/tests/externallib_test.php
mod/assign/tests/lib_test.php
mod/assign/tests/locallib_test.php
mod/assign/upgrade.txt
mod/assign/upgradelib.php
mod/assign/version.php
mod/choice/classes/event/answer_submitted.php
mod/choice/classes/event/answer_updated.php
mod/choice/db/install.xml
mod/choice/db/upgrade.php
mod/choice/lang/en/choice.php
mod/choice/lib.php
mod/choice/mod_form.php
mod/choice/renderer.php
mod/choice/tests/behat/behat_mod_choice.php
mod/choice/tests/behat/multiple_options.feature [new file with mode: 0644]
mod/choice/tests/events_test.php
mod/choice/version.php
mod/choice/view.php
mod/forum/classes/existing_subscriber_selector.php
mod/forum/classes/message/inbound/reply_handler.php [new file with mode: 0644]
mod/forum/classes/potential_subscriber_selector.php
mod/forum/classes/subscriptions.php
mod/forum/db/messageinbound_handlers.php [new file with mode: 0644]
mod/forum/discuss.php
mod/forum/externallib.php
mod/forum/lang/en/forum.php
mod/forum/lib.php
mod/forum/post.php
mod/forum/tests/behat/discussion_subscriptions.feature
mod/forum/tests/behat/forum_subscriptions_availability.feature [new file with mode: 0644]
mod/forum/version.php
mod/glossary/showentry.php
mod/lesson/backup/moodle2/backup_lesson_stepslib.php
mod/lesson/backup/moodle2/restore_lesson_activity_task.class.php
mod/lesson/backup/moodle2/restore_lesson_stepslib.php
mod/lesson/db/install.xml
mod/lesson/db/upgrade.php
mod/lesson/editpage.php
mod/lesson/lang/en/lesson.php
mod/lesson/lib.php
mod/lesson/locallib.php
mod/lesson/mod_form.php
mod/lesson/pagetypes/matching.php
mod/lesson/pagetypes/multichoice.php
mod/lesson/pagetypes/numerical.php
mod/lesson/pagetypes/shortanswer.php
mod/lesson/pagetypes/truefalse.php
mod/lesson/report.php
mod/lesson/settings.php
mod/lesson/tests/behat/date_availability.feature
mod/lesson/tests/behat/lesson_navigation.feature
mod/lesson/tests/behat/lesson_review.feature
mod/lesson/tests/behat/password_protection.feature
mod/lesson/tests/behat/questions_images.feature [new file with mode: 0644]
mod/lesson/tests/behat/time_limit.feature
mod/lesson/tests/fixtures/moodle_logo.jpg [new file with mode: 0644]
mod/lesson/version.php
mod/quiz/addrandom.php
mod/quiz/addrandomform.php
mod/quiz/attemptlib.php
mod/quiz/classes/admin_review_setting.php
mod/quiz/classes/output/edit_renderer.php [new file with mode: 0644]
mod/quiz/classes/question/bank/add_action_column.php [new file with mode: 0644]
mod/quiz/classes/question/bank/custom_view.php [new file with mode: 0644]
mod/quiz/classes/question/bank/question_name_text_column.php [new file with mode: 0644]
mod/quiz/classes/repaginate.php [new file with mode: 0644]
mod/quiz/classes/structure.php [new file with mode: 0644]
mod/quiz/db/renamedclasses.php [new file with mode: 0644]
mod/quiz/edit.js [deleted file]
mod/quiz/edit.php
mod/quiz/edit_rest.php [new file with mode: 0644]
mod/quiz/editlib.php [deleted file]
mod/quiz/lang/en/quiz.php
mod/quiz/lib.php
mod/quiz/locallib.php
mod/quiz/mod_form.php
mod/quiz/questionbank.ajax.php [new file with mode: 0644]
mod/quiz/renderer.php
mod/quiz/repaginate.php [new file with mode: 0644]
mod/quiz/styles.css
mod/quiz/tests/attempt_walkthrough_from_csv_test.php
mod/quiz/tests/attempt_walkthrough_test.php
mod/quiz/tests/behat/behat_mod_quiz.php
mod/quiz/tests/behat/completion_condition_attempts_used.feature
mod/quiz/tests/behat/completion_condition_passing_grade.feature
mod/quiz/tests/behat/editing_add.feature [new file with mode: 0644]
mod/quiz/tests/behat/editing_click_move_icon.feature [new file with mode: 0644]
mod/quiz/tests/behat/editing_repaginate.feature [new file with mode: 0644]
mod/quiz/tests/behat/editing_set_marks.feature [new file with mode: 0644]
mod/quiz/tests/editlib_test.php [deleted file]
mod/quiz/tests/events_test.php
mod/quiz/tests/lib_test.php
mod/quiz/tests/locallib_test.php
mod/quiz/tests/repaginate_test.php [new file with mode: 0644]
mod/quiz/tests/structure_test.php [new file with mode: 0644]
mod/quiz/upgrade.txt
mod/quiz/version.php
mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-modform/moodle-mod_quiz-modform-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-modform/moodle-mod_quiz-modform-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-modform/moodle-mod_quiz-modform.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-questionchooser/moodle-mod_quiz-questionchooser-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-questionchooser/moodle-mod_quiz-questionchooser-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-questionchooser/moodle-mod_quiz-questionchooser.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-quizbase/moodle-mod_quiz-quizbase-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-quizbase/moodle-mod_quiz-quizbase-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-quizbase/moodle-mod_quiz-quizbase.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-quizquestionbank/moodle-mod_quiz-quizquestionbank-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-quizquestionbank/moodle-mod_quiz-quizquestionbank-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-quizquestionbank/moodle-mod_quiz-quizquestionbank.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-randomquestion/moodle-mod_quiz-randomquestion-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-randomquestion/moodle-mod_quiz-randomquestion-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-randomquestion/moodle-mod_quiz-randomquestion.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-repaginate/moodle-mod_quiz-repaginate-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-repaginate/moodle-mod_quiz-repaginate-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-repaginate/moodle-mod_quiz-repaginate.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-toolboxes/moodle-mod_quiz-toolboxes-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-toolboxes/moodle-mod_quiz-toolboxes-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-toolboxes/moodle-mod_quiz-toolboxes.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-base/moodle-mod_quiz-util-base-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-base/moodle-mod_quiz-util-base-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-base/moodle-mod_quiz-util-base.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-page/moodle-mod_quiz-util-page-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-page/moodle-mod_quiz-util-page-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-page/moodle-mod_quiz-util-page.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-debug.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-min.js [new file with mode: 0644]
mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot.js [new file with mode: 0644]
mod/quiz/yui/src/dragdrop/build.json [new file with mode: 0644]
mod/quiz/yui/src/dragdrop/js/dragdrop.js [new file with mode: 0644]
mod/quiz/yui/src/dragdrop/js/resource.js [new file with mode: 0644]
mod/quiz/yui/src/dragdrop/js/section.js [new file with mode: 0644]
mod/quiz/yui/src/dragdrop/meta/dragdrop.json [new file with mode: 0644]
mod/quiz/yui/src/modform/build.json [new file with mode: 0644]
mod/quiz/yui/src/modform/js/modform.js [new file with mode: 0644]
mod/quiz/yui/src/modform/meta/modform.json [new file with mode: 0644]
mod/quiz/yui/src/questionchooser/build.json [new file with mode: 0644]
mod/quiz/yui/src/questionchooser/js/questionchooser.js [new file with mode: 0644]
mod/quiz/yui/src/questionchooser/meta/questionchooser.json [new file with mode: 0644]
mod/quiz/yui/src/quizbase/build.json [new file with mode: 0644]
mod/quiz/yui/src/quizbase/js/quizbase.js [new file with mode: 0644]
mod/quiz/yui/src/quizbase/meta/quizbase.json [new file with mode: 0644]
mod/quiz/yui/src/quizquestionbank/build.json [new file with mode: 0644]
mod/quiz/yui/src/quizquestionbank/js/quizquestionbank.js [new file with mode: 0644]
mod/quiz/yui/src/quizquestionbank/meta/quizquestionbank.json [new file with mode: 0644]
mod/quiz/yui/src/randomquestion/build.json [new file with mode: 0644]
mod/quiz/yui/src/randomquestion/js/randomquestion.js [new file with mode: 0644]
mod/quiz/yui/src/randomquestion/meta/randomquestion.json [new file with mode: 0644]
mod/quiz/yui/src/repaginate/build.json [new file with mode: 0644]
mod/quiz/yui/src/repaginate/js/repaginate.js [new file with mode: 0644]
mod/quiz/yui/src/repaginate/meta/repaginate.json [new file with mode: 0644]
mod/quiz/yui/src/toolboxes/build.json [new file with mode: 0644]
mod/quiz/yui/src/toolboxes/js/resource.js [new file with mode: 0644]
mod/quiz/yui/src/toolboxes/js/section.js [new file with mode: 0644]
mod/quiz/yui/src/toolboxes/js/toolbox.js [new file with mode: 0644]
mod/quiz/yui/src/toolboxes/meta/toolboxes.json [new file with mode: 0644]
mod/quiz/yui/src/util/build.json [new file with mode: 0644]
mod/quiz/yui/src/util/js/base.js [new file with mode: 0644]
mod/quiz/yui/src/util/js/page.js [new file with mode: 0644]
mod/quiz/yui/src/util/js/slot.js [new file with mode: 0644]
mod/quiz/yui/src/util/meta/util.json [new file with mode: 0644]
mod/workshop/lang/en/workshop.php
mod/workshop/lib.php
mod/workshop/locallib.php
mod/workshop/tests/generator/lib.php
mod/workshop/tests/generator_test.php
mod/workshop/tests/locallib_test.php
mod/workshop/version.php
notes/index.php
phpunit.xml.dist
pix/e/insert_page_break.png [new file with mode: 0644]
pix/e/insert_page_break.svg [new file with mode: 0644]
pix/e/remove_page_break.png [new file with mode: 0644]
pix/e/remove_page_break.svg [new file with mode: 0644]
pix/t/reset.png [new file with mode: 0644]
pix/t/reset.svg [new file with mode: 0644]
question/addquestion.php
question/classes/bank/checkbox_column.php
question/classes/bank/view.php
question/editlib.php
question/format/gift/tests/behat/import.feature
question/format/learnwise/format.php [deleted file]
question/format/learnwise/learnwise-example.xml [deleted file]
question/format/webct/tests/behat/import.feature
question/format/xml/tests/behat/import.feature
question/question.php
question/tests/behat/delete_questions.feature
question/yui/build/moodle-question-qbankmanager/moodle-question-qbankmanager-debug.js
question/yui/build/moodle-question-qbankmanager/moodle-question-qbankmanager-min.js
question/yui/build/moodle-question-qbankmanager/moodle-question-qbankmanager.js
question/yui/src/qbankmanager/js/qbankmanager.js
report/log/classes/table_log.php
repository/s3/README_MOODLE.txt
repository/s3/S3.php
repository/s3/thirdpartylibs.xml
theme/base/layout/frontpage.php
theme/base/layout/general.php
theme/base/style/calendar.css
theme/base/style/core.css
theme/base/style/grade.css
theme/bootstrapbase/layout/columns1.php
theme/bootstrapbase/layout/columns2.php
theme/bootstrapbase/layout/columns3.php
theme/bootstrapbase/layout/popup.php
theme/bootstrapbase/less/moodle/buttons.less
theme/bootstrapbase/less/moodle/calendar.less
theme/bootstrapbase/less/moodle/core.less
theme/bootstrapbase/less/moodle/expendable.less
theme/bootstrapbase/less/moodle/grade.less
theme/bootstrapbase/less/moodle/modules.less
theme/bootstrapbase/less/moodle/responsive.less
theme/bootstrapbase/style/moodle.css
theme/bootstrapbase/yui/build/moodle-theme_bootstrapbase-bootstrap/moodle-theme_bootstrapbase-bootstrap-debug.js
theme/bootstrapbase/yui/build/moodle-theme_bootstrapbase-bootstrap/moodle-theme_bootstrapbase-bootstrap-min.js
theme/bootstrapbase/yui/build/moodle-theme_bootstrapbase-bootstrap/moodle-theme_bootstrapbase-bootstrap.js
theme/bootstrapbase/yui/src/bootstrap/js/bootstrap.js
theme/clean/layout/columns1.php
theme/clean/layout/columns2.php
theme/clean/layout/columns3.php
user/files.php
user/files_form.php
user/index.php
user/lib.php
user/profile.php
user/view.php
version.php
webservice/lib.php

index 3aced1e..8b976bb 100644 (file)
@@ -35,3 +35,4 @@ composer.lock
 /lib/yuilib/*/build/*/*-coverage.js
 # lib/yuilib/version/module/module-coverage.js
 /lib/yuilib/*/*/*-coverage.js
+atlassian-ide-plugin.xml
index b1cfc26..38ec017 100644 (file)
       </CUSTOM_CHECK>
     </CUSTOM_CHECKS>
   </MOODLE>
+  <MOODLE version="2.8" requires="2.2">
+    <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.1" />
+      <VENDOR name="mssql" version="10.0" />
+      <VENDOR name="oracle" version="10.2" />
+    </DATABASE>
+    <PHP version="5.4.4" 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="optional">
+        <FEEDBACK>
+          <ON_CHECK message="opensslrecommended" />
+        </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="intl" level="optional">
+        <FEEDBACK>
+          <ON_CHECK message="intlrecommended" />
+        </FEEDBACK>
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="json" level="required">
+      </PHP_EXTENSION>
+      <PHP_EXTENSION name="hash" 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="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="quizattemptsupgradedmessage" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
+    </CUSTOM_CHECKS>
+  </MOODLE>
 </COMPATIBILITY_MATRIX>
index eb3925c..26afb90 100644 (file)
@@ -1039,19 +1039,28 @@ class core_admin_renderer extends plugin_renderer_base {
         }
 
         foreach ($plugin->get_other_required_plugins() as $component => $requiredversion) {
-            $ok = true;
             $otherplugin = $pluginman->get_plugin_info($component);
+            $actions = array();
 
             if (is_null($otherplugin)) {
-                $ok = false;
+                // The required plugin is not installed.
+                $class = 'requires-failed requires-missing';
+                $installurl = new moodle_url('https://moodle.org/plugins/view.php', array('plugin' => $component));
+                $uploadurl = new moodle_url('/admin/tool/installaddon/');
+                $actions[] = html_writer::link($installurl, get_string('dependencyinstall', 'core_plugin'));
+                $actions[] = html_writer::link($uploadurl, get_string('dependencyupload', 'core_plugin'));
+
             } else if ($requiredversion != ANY_VERSION and $otherplugin->versiondisk < $requiredversion) {
-                $ok = false;
-            }
+                // The required plugin is installed but needs to be updated.
+                $class = 'requires-failed requires-outdated';
+                if (!$otherplugin->is_standard()) {
+                    $updateurl = new moodle_url($this->page->url, array('sesskey' => sesskey(), 'fetchupdates' => 1));
+                    $actions[] = html_writer::link($updateurl, get_string('checkforupdates', 'core_plugin'));
+                }
 
-            if ($ok) {
-                $class = 'requires-ok';
             } else {
-                $class = 'requires-failed';
+                // Already installed plugin with sufficient version.
+                $class = 'requires-ok';
             }
 
             if ($requiredversion != ANY_VERSION) {
@@ -1059,11 +1068,11 @@ class core_admin_renderer extends plugin_renderer_base {
             } else {
                 $str = 'otherplugin';
             }
-            $componenturl = new moodle_url('https://moodle.org/plugins/view.php?plugin='.$component);
-            $componenturl = html_writer::tag('a', $component, array('href' => $componenturl->out()));
+
             $requires[] = html_writer::tag('li',
-                    get_string($str, 'core_plugin',
-                            array('component' => $componenturl, 'version' => $requiredversion)),
+                    html_writer::div(get_string($str, 'core_plugin',
+                            array('component' => $component, 'version' => $requiredversion)), 'component').
+                    html_writer::div(implode(' | ', $actions), 'actions'),
                     array('class' => $class));
         }
 
index 71664a1..ce60366 100644 (file)
@@ -48,11 +48,12 @@ class core_role_potential_assignees_below_course extends core_role_assign_user_s
         $fields      = 'SELECT ' . $this->required_fields_sql('u');
         $countfields = 'SELECT COUNT(u.id)';
 
-        $sql   = " FROM {user} u
-              LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.roleid = :roleid AND ra.contextid = :contextid)
-                  WHERE u.id IN ($enrolsql)
-                        $wherecondition
-                        AND ra.id IS NULL";
+        $sql   = " FROM ($enrolsql) enrolled_users_view
+                   JOIN {user} u ON u.id = enrolled_users_view.id
+              LEFT JOIN {role_assignments} ra ON (ra.userid = enrolled_users_view.id AND
+                                            ra.roleid = :roleid AND ra.contextid = :contextid)
+                  WHERE ra.id IS NULL
+                        $wherecondition";
         $params['contextid'] = $this->context->id;
         $params['roleid'] = $this->roleid;
 
index 6d12d99..84a5296 100644 (file)
@@ -68,6 +68,10 @@ if (has_capability('moodle/grade:manage', $systemcontext)
 
         $temp->add(new admin_setting_special_gradelimiting());
 
+        $temp->add(new admin_setting_configcheckbox('grade_report_showmin',
+                                                    get_string('minimum_show', 'grades'),
+                                                    get_string('minimum_show_help', 'grades'), '1'));
+
         $temp->add(new admin_setting_special_gradepointmax());
 
         $temp->add(new admin_setting_special_gradepointdefault());
@@ -92,11 +96,9 @@ if (has_capability('moodle/grade:manage', $systemcontext)
                          GRADE_AGGREGATE_MODE            =>new lang_string('aggregatemode', 'grades'),
                          GRADE_AGGREGATE_SUM             =>new lang_string('aggregatesum', 'grades'));
 
-        $defaultvisible = array(GRADE_AGGREGATE_MEAN, GRADE_AGGREGATE_WEIGHTED_MEAN, GRADE_AGGREGATE_WEIGHTED_MEAN2,
-                                GRADE_AGGREGATE_EXTRACREDIT_MEAN, GRADE_AGGREGATE_MEDIAN, GRADE_AGGREGATE_MIN,
-                                GRADE_AGGREGATE_MAX, GRADE_AGGREGATE_MODE, GRADE_AGGREGATE_SUM);
+        $defaultvisible = array(GRADE_AGGREGATE_SUM);
 
-        $defaults = array('value'=>GRADE_AGGREGATE_WEIGHTED_MEAN2, 'forced'=>false, 'adv'=>false);
+        $defaults = array('value' => GRADE_AGGREGATE_SUM, 'forced' => false, 'adv' => false);
         $temp->add(new admin_setting_gradecat_combo('grade_aggregation', new lang_string('aggregation', 'grades'), new lang_string('aggregation_help', 'grades'), $defaults, $options));
 
         $temp->add(new admin_setting_configmultiselect('grade_aggregations_visible', new lang_string('aggregationsvisible', 'grades'),
@@ -125,6 +127,9 @@ if (has_capability('moodle/grade:manage', $systemcontext)
         $defaults['forced'] = false;
         $temp->add(new admin_setting_gradecat_combo('grade_droplow', new lang_string('droplow', 'grades'),
                     new lang_string('droplow_help', 'grades'), $defaults, $options));
+
+        $temp->add(new admin_setting_configcheckbox('grade_overridecat', new lang_string('overridecat', 'grades'),
+                   new lang_string('overridecat_help', 'grades'), 1));
     }
     $ADMIN->add('grades', $temp);
 
index 780a315..5e281be 100644 (file)
@@ -159,6 +159,7 @@ Feature: Verify that all form fields values can be get and set
     And I add a "Lesson" to section "1"
     And I set the following fields to these values:
       | Name | Test lesson |
+      | Description | Test lesson description |
       | available[enabled] | 1 |
     And I set the field "deadline[enabled]" to "1"
     # Checkbox (AJAX) - Checking "the field matches value" before saving.
diff --git a/admin/tool/langimport/classes/controller.php b/admin/tool/langimport/classes/controller.php
new file mode 100644 (file)
index 0000000..06f815e
--- /dev/null
@@ -0,0 +1,237 @@
+<?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/>.
+
+/**
+ * Lang import controller
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport;
+
+defined('MOODLE_INTERNAL') || die();
+require_once($CFG->libdir.'/filelib.php');
+require_once($CFG->libdir.'/componentlib.class.php');
+
+/**
+ * Lang import controller
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class controller {
+    /** @var array list of informational messages */
+    public $info;
+    /** @var array  list of error messages */
+    public $errors;
+    /** @var \lang_installer */
+    private $installer;
+    /** @var array languages available on the remote server */
+    public $availablelangs;
+
+    /**
+     * Constructor.
+     */
+    public function __construct() {
+        make_temp_directory('');
+        make_upload_directory('lang');
+
+        $this->info = array();
+        $this->errors = array();
+        $this->installer = new \lang_installer();
+
+        $this->availablelangs = $this->installer->get_remote_list_of_languages();
+    }
+
+    /**
+     * Install language packs provided
+     *
+     * @param string|array $langs array of langcodes or individual langcodes
+     * @param bool $updating true if updating the langpacks
+     * @return int false if an error encountered or
+     * @throws \moodle_exception when error is encountered installing langpack
+     */
+    public function install_languagepacks($langs, $updating = false) {
+        global $CFG;
+
+        $this->installer->set_queue($langs);
+        $results = $this->installer->run();
+
+        $updatedpacks = 0;
+
+        foreach ($results as $langcode => $langstatus) {
+            switch ($langstatus) {
+                case \lang_installer::RESULT_DOWNLOADERROR:
+                    $a       = new \stdClass();
+                    $a->url  = $this->installer->lang_pack_url($langcode);
+                    $a->dest = $CFG->dataroot.'/lang';
+                    $this->errors[] = get_string('remotedownloaderror', 'error', $a);
+                    throw new \moodle_exception('remotedownloaderror', 'error', $a);
+                    break;
+                case \lang_installer::RESULT_INSTALLED:
+                    $updatedpacks++;
+                    if ($updating) {
+                        event\langpack_updated::event_with_langcode($langcode)->trigger();
+                        $this->info[] = get_string('langpackupdated', 'tool_langimport', $langcode);
+                    } else {
+                        $this->info[] = get_string('langpackinstalled', 'tool_langimport', $langcode);
+                        event\langpack_imported::event_with_langcode($langcode)->trigger();
+                    }
+                    break;
+                case \lang_installer::RESULT_UPTODATE:
+                    $this->info[] = get_string('langpackuptodate', 'tool_langimport', $langcode);
+                    break;
+            }
+        }
+
+        return $updatedpacks;
+    }
+
+    /**
+     * Uninstall language pack
+     *
+     * @param string $lang language code
+     * @return bool true if language succesfull installed
+     */
+    public function uninstall_language($lang) {
+        global $CFG;
+
+        $dest1 = $CFG->dataroot.'/lang/'.$lang;
+        $dest2 = $CFG->dirroot.'/lang/'.$lang;
+        $rm1 = false;
+        $rm2 = false;
+        if (file_exists($dest1)) {
+            $rm1 = remove_dir($dest1);
+        }
+        if (file_exists($dest2)) {
+            $rm2 = remove_dir($dest2);
+        }
+
+        if ($rm1 or $rm2) {
+            $this->info[] = get_string('langpackremoved', 'tool_langimport', $lang);
+            event\langpack_removed::event_with_langcode($lang)->trigger();
+            return true;
+        } else {    // Nothing deleted, possibly due to permission error.
+            $this->errors[] = 'An error has occurred, language pack is not completely uninstalled, please check file permissions';
+            return false;
+        }
+    }
+
+    /**
+     * Updated all install language packs with the latest found on servre
+     *
+     * @return bool true if languages succesfully updated.
+     */
+    public function update_all_installed_languages() {
+        global $CFG;
+
+        if (!$availablelangs = $this->installer->get_remote_list_of_languages()) {
+            $this->errors[] = get_string('cannotdownloadlanguageupdatelist', 'error');
+            return false;
+        }
+
+        $md5array = array();    // Convert to (string)langcode => (string)md5.
+        foreach ($availablelangs as $alang) {
+            $md5array[$alang[0]] = $alang[1];
+        }
+
+        // Filter out unofficial packs.
+        $currentlangs = array_keys(get_string_manager()->get_list_of_translations(true));
+        $updateablelangs = array();
+        foreach ($currentlangs as $clang) {
+            if (!array_key_exists($clang, $md5array)) {
+                $noticeok[] = get_string('langpackupdateskipped', 'tool_langimport', $clang);
+                continue;
+            }
+            $dest1 = $CFG->dataroot.'/lang/'.$clang;
+            $dest2 = $CFG->dirroot.'/lang/'.$clang;
+
+            if (file_exists($dest1.'/langconfig.php') || file_exists($dest2.'/langconfig.php')) {
+                $updateablelangs[] = $clang;
+            }
+        }
+
+        // Filter out packs that have the same md5 key.
+        $neededlangs = array();
+        foreach ($updateablelangs as $ulang) {
+            if (!$this->is_installed_lang($ulang, $md5array[$ulang])) {
+                $neededlangs[] = $ulang;
+            }
+        }
+
+        // Clean-up currently installed versions of the packs.
+        foreach ($neededlangs as $packindex => $pack) {
+            if ($pack == 'en') {
+                continue;
+            }
+
+            // Delete old directories.
+            $dest1 = $CFG->dataroot.'/lang/'.$pack;
+            $dest2 = $CFG->dirroot.'/lang/'.$pack;
+            if (file_exists($dest1)) {
+                if (!remove_dir($dest1)) {
+                    $noticeerror[] = 'Could not delete old directory '.$dest1.', update of '.$pack
+                        .' failed, please check permissions.';
+                    unset($neededlangs[$packindex]);
+                    continue;
+                }
+            }
+            if (file_exists($dest2)) {
+                if (!remove_dir($dest2)) {
+                    $noticeerror[] = 'Could not delete old directory '.$dest2.', update of '.$pack
+                        .' failed, please check permissions.';
+                    unset($neededlangs[$packindex]);
+                    continue;
+                }
+            }
+        }
+
+        try {
+            $updated = $this->install_languagepacks($neededlangs, true);
+        } catch (\moodle_exception $e) {
+            return false;
+        }
+
+        if ($updated) {
+            $this->info[] = get_string('langupdatecomplete', 'tool_langimport');
+        } else {
+            $this->info[] = get_string('nolangupdateneeded', 'tool_langimport');
+        }
+
+        return true;
+    }
+
+    /**
+     * checks the md5 of the zip file, grabbed from download.moodle.org,
+     * against the md5 of the local language file from last update
+     * @param string $lang language code
+     * @param string $md5check md5 to check
+     * @return bool true if installed
+     */
+    public function is_installed_lang($lang, $md5check) {
+        global $CFG;
+        $md5file = $CFG->dataroot.'/lang/'.$lang.'/'.$lang.'.md5';
+        if (file_exists($md5file)) {
+            return (file_get_contents($md5file) == $md5check);
+        }
+        return false;
+    }
+}
+
+
diff --git a/admin/tool/langimport/classes/event/langpack_imported.php b/admin/tool/langimport/classes/event/langpack_imported.php
new file mode 100644 (file)
index 0000000..c8bd149
--- /dev/null
@@ -0,0 +1,114 @@
+<?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/>.
+
+/**
+ * The langimport langpack imported event.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * The tool_langimport langpack imported event class.
+ *
+ * @property-read array $other {
+ *      Extra information about event.
+ *
+ *      - string langcode: the langpage pack code.
+ * }
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class langpack_imported extends \core\event\base {
+    /**
+     * Create instance of event.
+     *
+     * @param string $langcode
+     * @return langpack_updated
+     */
+    public static function event_with_langcode($langcode) {
+        $data = array(
+            'context' => \context_system::instance(),
+            'other' => array(
+                'langcode' => $langcode,
+            )
+        );
+
+        return self::create($data);
+    }
+
+    /**
+     * Init method.
+     *
+     * @return void
+     */
+    protected function init() {
+        $this->data['crud'] = 'c';
+        $this->data['edulevel'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return "The language pack '{$this->other['langcode']}' was installed.";
+    }
+
+    /**
+     * Return localised event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('langpackinstalledevent', 'tool_langimport');
+    }
+
+    /**
+     * Returns relevant URL.
+     *
+     * @return \moodle_url
+     */
+    public function get_url() {
+        return new \moodle_url('/admin/tool/langimport/');
+    }
+
+    /**
+     * Custom validation.
+     *
+     * @throws \coding_exception
+     */
+    protected function validate_data() {
+        parent::validate_data();
+
+        if (!isset($this->other['langcode'])) {
+            throw new \coding_exception('The \'langcode\' value must be set');
+        }
+        // We can't use PARAM_LANG here as the string manager might not be aware of langpack yet.
+        $cleanedlang = clean_param($this->other['langcode'], PARAM_SAFEDIR);
+        if ($cleanedlang !== $this->other['langcode']) {
+            throw new \coding_exception('The \'langcode\' value must be set to a valid language code');
+        }
+    }
+}
diff --git a/admin/tool/langimport/classes/event/langpack_removed.php b/admin/tool/langimport/classes/event/langpack_removed.php
new file mode 100644 (file)
index 0000000..82e5270
--- /dev/null
@@ -0,0 +1,115 @@
+<?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/>.
+
+/**
+ * The langimport langpack removed event.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * The tool_langimport langpack removed event class.
+ *
+ * @property-read array $other {
+ *      Extra information about event.
+ *
+ *      - string langcode: the langpage pack code.
+ * }
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class langpack_removed extends \core\event\base {
+    /**
+     * Create instance of event.
+     *
+     * @param string $langcode
+     * @return langpack_updated
+     */
+    public static function event_with_langcode($langcode) {
+        $data = array(
+            'context' => \context_system::instance(),
+            'other' => array(
+                'langcode' => $langcode,
+            )
+        );
+
+        return self::create($data);
+    }
+
+    /**
+     * Init method.
+     *
+     * @return void
+     */
+    protected function init() {
+        $this->data['crud'] = 'd';
+        $this->data['edulevel'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return "The language pack '{$this->other['langcode']}' was removed.";
+    }
+
+    /**
+     * Returns relevant URL.
+     *
+     * @return \moodle_url
+     */
+    public function get_url() {
+        return new \moodle_url('/admin/tool/langimport/');
+    }
+
+    /**
+     * Return localised event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('langpackremovedevent', 'tool_langimport');
+    }
+
+    /**
+     * Custom validation.
+     *
+     * @throws \coding_exception
+     */
+    protected function validate_data() {
+        parent::validate_data();
+
+        if (!isset($this->other['langcode'])) {
+            throw new \coding_exception('The \'langcode\' value must be set');
+        }
+
+        // We can't use PARAM_LANG here as it queries installed strings.
+        $cleanedlang = clean_param($this->other['langcode'], PARAM_SAFEDIR);
+        if ($cleanedlang !== $this->other['langcode']) {
+            throw new \coding_exception('The \'langcode\' value must be set to a valid language code');
+        }
+    }
+}
diff --git a/admin/tool/langimport/classes/event/langpack_updated.php b/admin/tool/langimport/classes/event/langpack_updated.php
new file mode 100644 (file)
index 0000000..4f0528f
--- /dev/null
@@ -0,0 +1,114 @@
+<?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/>.
+
+/**
+ * The langimport langpack updated event.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * The tool_langimport langpack updated event class.
+ *
+ * @property-read array $other {
+ *      Extra information about event.
+ *
+ *      - string langcode: the langpage pack code.
+ * }
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class langpack_updated extends \core\event\base {
+    /**
+     * Create instance of event.
+     *
+     * @param string $langcode
+     * @return langpack_updated
+     */
+    public static function event_with_langcode($langcode) {
+        $data = array(
+            'context' => \context_system::instance(),
+            'other' => array(
+                'langcode' => $langcode,
+            )
+        );
+
+        return self::create($data);
+    }
+
+    /**
+     * Init method.
+     *
+     * @return void
+     */
+    protected function init() {
+        $this->data['crud'] = 'u';
+        $this->data['edulevel'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return "The language pack '{$this->other['langcode']}' was updated.";
+    }
+
+    /**
+     * Return localised event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('langpackupdatedevent', 'tool_langimport');
+    }
+
+    /**
+     * Returns relevant URL.
+     *
+     * @return \moodle_url
+     */
+    public function get_url() {
+        return new \moodle_url('/admin/tool/langimport/');
+    }
+
+    /**
+     * Custom validation.
+     *
+     * @throws \coding_exception
+     */
+    protected function validate_data() {
+        parent::validate_data();
+
+        if (!isset($this->other['langcode'])) {
+            throw new \coding_exception('The \'langcode\' value must be set');
+        }
+
+        $cleanedlang = clean_param($this->other['langcode'], PARAM_LANG);
+        if ($cleanedlang !== $this->other['langcode']) {
+            throw new \coding_exception('The \'langcode\' value must be set to a valid language code');
+        }
+    }
+}
diff --git a/admin/tool/langimport/classes/task/update_langpacks_task.php b/admin/tool/langimport/classes/task/update_langpacks_task.php
new file mode 100644 (file)
index 0000000..68b9e32
--- /dev/null
@@ -0,0 +1,63 @@
+<?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/>.
+
+/**
+ * A scheduled task for updating langpacks.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+namespace tool_langimport\task;
+
+/**
+ * A scheduled task for updating langpacks.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski <dan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class update_langpacks_task extends \core\task\scheduled_task {
+
+    /**
+     * Get a descriptive name for this task (shown to admins).
+     *
+     * @return string
+     */
+    public function get_name() {
+        return get_string('updatelangs', 'tool_langimport');
+    }
+
+    /**
+     * Run langpack update
+     */
+    public function execute() {
+        $controller = new \tool_langimport\controller();
+        if ($controller->update_all_installed_languages()) {
+            foreach ($controller->info as $message) {
+                mtrace($message);
+            }
+            return true;
+        } else {
+            foreach ($controller->errors as $message) {
+                mtrace($message);
+            }
+            return false;
+        }
+
+    }
+
+}
diff --git a/admin/tool/langimport/db/tasks.php b/admin/tool/langimport/db/tasks.php
new file mode 100644 (file)
index 0000000..bd79f1b
--- /dev/null
@@ -0,0 +1,38 @@
+<?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/>.
+
+/**
+ * Definition of langimport tasks
+ *
+ * @package   tool_langimport
+ * @category  task
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$tasks = array(
+    array(
+        'classname' => 'tool_langimport\task\update_langpacks_task',
+        'blocking' => 0,
+        'minute' => 'R',
+        'hour' => '4',
+        'day' => '*',
+        'month' => '*',
+        'dayofweek' => '*'
+    )
+);
index 01d7a5d..b49dbd3 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-require(dirname(dirname(dirname(dirname(__FILE__)))) . '/config.php');
+require(__DIR__.'/../../../config.php');
 require_once($CFG->libdir.'/adminlib.php');
-require_once($CFG->libdir.'/filelib.php');
-require_once($CFG->libdir.'/componentlib.class.php');
 
 admin_externalpage_setup('toollangimport');
 
@@ -65,37 +63,17 @@ define('UPDATE_ALL_LANG', 5);
 
 get_string_manager()->reset_caches();
 
-$notice_ok    = array();
-$notice_error = array();
+$controller = new tool_langimport\controller();
 
 if (($mode == INSTALLATION_OF_SELECTED_LANG) and confirm_sesskey() and !empty($pack)) {
     core_php_time_limit::raise();
-    make_temp_directory('');
-    make_upload_directory('lang');
-
-    $installer = new lang_installer($pack);
-    $results = $installer->run();
-    foreach ($results as $langcode => $langstatus) {
-        switch ($langstatus) {
-        case lang_installer::RESULT_DOWNLOADERROR:
-            $a       = new stdClass();
-            $a->url  = $installer->lang_pack_url($langcode);
-            $a->dest = $CFG->dataroot.'/lang';
-            print_error('remotedownloaderror', 'error', 'index.php', $a);
-            break;
-        case lang_installer::RESULT_INSTALLED:
-            $notice_ok[] = get_string('langpackinstalled', 'tool_langimport', $langcode);
-            break;
-        case lang_installer::RESULT_UPTODATE:
-            $notice_ok[] = get_string('langpackuptodate', 'tool_langimport', $langcode);
-            break;
-        }
-    }
+    $controller->install_languagepacks($pack);
 }
 
 if ($mode == DELETION_OF_SELECTED_LANG and !empty($uninstalllang)) {
     if ($uninstalllang == 'en') {
-        $notice_error[] = 'English language pack can not be uninstalled';
+        // TODO.
+        $controller->errors[] = 'English language pack can not be uninstalled';
 
     } else if (!$confirm and confirm_sesskey()) {
         echo $OUTPUT->header();
@@ -106,120 +84,13 @@ if ($mode == DELETION_OF_SELECTED_LANG and !empty($uninstalllang)) {
         die;
 
     } else if (confirm_sesskey()) {
-        $dest1 = $CFG->dataroot.'/lang/'.$uninstalllang;
-        $dest2 = $CFG->dirroot.'/lang/'.$uninstalllang;
-        $rm1 = false;
-        $rm2 = false;
-        if (file_exists($dest1)){
-            $rm1 = remove_dir($dest1);
-        }
-        if (file_exists($dest2)){
-            $rm2 = remove_dir($dest2);
-        }
-        if ($rm1 or $rm2) {
-            $notice_ok[] = get_string('langpackremoved', 'tool_langimport');
-        } else {    //nothing deleted, possibly due to permission error
-            $notice_error[] = 'An error has occurred, language pack is not completely uninstalled, please check file permissions';
-        }
+        $controller->uninstall_language($uninstalllang);
     }
 }
 
 if ($mode == UPDATE_ALL_LANG) {
     core_php_time_limit::raise();
-
-    $installer = new lang_installer();
-
-    if (!$availablelangs = $installer->get_remote_list_of_languages()) {
-        print_error('cannotdownloadlanguageupdatelist', 'error');
-    }
-    $md5array = array();    // (string)langcode => (string)md5
-    foreach ($availablelangs as $alang) {
-        $md5array[$alang[0]] = $alang[1];
-    }
-
-    // filter out unofficial packs
-    $currentlangs = array_keys(get_string_manager()->get_list_of_translations(true));
-    $updateablelangs = array();
-    foreach ($currentlangs as $clang) {
-        if (!array_key_exists($clang, $md5array)) {
-            $notice_ok[] = get_string('langpackupdateskipped', 'tool_langimport', $clang);
-            continue;
-        }
-        $dest1 = $CFG->dataroot.'/lang/'.$clang;
-        $dest2 = $CFG->dirroot.'/lang/'.$clang;
-
-        if (file_exists($dest1.'/langconfig.php') || file_exists($dest2.'/langconfig.php')){
-            $updateablelangs[] = $clang;
-        }
-    }
-
-    // then filter out packs that have the same md5 key
-    $neededlangs = array();   // all the packs that needs updating
-    foreach ($updateablelangs as $ulang) {
-        if (!is_installed_lang($ulang, $md5array[$ulang])) {
-            $neededlangs[] = $ulang;
-        }
-    }
-
-    make_temp_directory('');
-    make_upload_directory('lang');
-
-    // clean-up currently installed versions of the packs
-    foreach ($neededlangs as $packindex => $pack) {
-        if ($pack == 'en') {
-            continue;
-        }
-
-        // delete old directories
-        $dest1 = $CFG->dataroot.'/lang/'.$pack;
-        $dest2 = $CFG->dirroot.'/lang/'.$pack;
-        $rm1 = false;
-        $rm2 = false;
-        if (file_exists($dest1)) {
-            if (!remove_dir($dest1)) {
-                $notice_error[] = 'Could not delete old directory '.$dest1.', update of '.$pack.' failed, please check permissions.';
-                unset($neededlangs[$packindex]);
-                continue;
-            }
-        }
-        if (file_exists($dest2)) {
-            if (!remove_dir($dest2)) {
-                $notice_error[] = 'Could not delete old directory '.$dest2.', update of '.$pack.' failed, please check permissions.';
-                unset($neededlangs[$packindex]);
-                continue;
-            }
-        }
-    }
-
-    // install all needed language packs
-    $installer->set_queue($neededlangs);
-    $results = $installer->run();
-    $updated = false;    // any packs updated?
-    foreach ($results as $langcode => $langstatus) {
-        switch ($langstatus) {
-        case lang_installer::RESULT_DOWNLOADERROR:
-            $a       = new stdClass();
-            $a->url  = $installer->lang_pack_url($langcode);
-            $a->dest = $CFG->dataroot.'/lang';
-            print_error('remotedownloaderror', 'error', 'index.php', $a);
-            break;
-        case lang_installer::RESULT_INSTALLED:
-            $updated = true;
-            $notice_ok[] = get_string('langpackinstalled', 'tool_langimport', $langcode);
-            break;
-        case lang_installer::RESULT_UPTODATE:
-            $notice_ok[] = get_string('langpackuptodate', 'tool_langimport', $langcode);
-            break;
-        }
-    }
-
-    if ($updated) {
-        $notice_ok[] = get_string('langupdatecomplete', 'tool_langimport');
-    } else {
-        $notice_ok[] = get_string('nolangupdateneeded', 'tool_langimport');
-    }
-
-    unset($installer);
+    $controller->update_all_installed_languages();
 }
 get_string_manager()->reset_caches();
 
@@ -239,9 +110,7 @@ foreach ($installedlangs as $installedlang => $unused) {
     }
 }
 
-$installer = new lang_installer();
-
-if ($availablelangs = $installer->get_remote_list_of_languages()) {
+if ($availablelangs = $controller->availablelangs) {
     $remote = true;
 } else {
     $remote = false;
@@ -251,18 +120,18 @@ if ($availablelangs = $installer->get_remote_list_of_languages()) {
     echo $OUTPUT->box_end();
 }
 
-if ($notice_ok) {
-    $info = implode('<br />', $notice_ok);
+if ($controller->info) {
+    $info = implode('<br />', $controller->info);
     echo $OUTPUT->notification($info, 'notifysuccess');
 }
 
-if ($notice_error) {
-    $info = implode('<br />', $notice_error);
+if ($controller->errors) {
+    $info = implode('<br />', $controller->errors);
     echo $OUTPUT->notification($info, 'notifyproblem');
 }
 
 if ($missingparents) {
-    foreach ($missingparents as $l=>$parent) {
+    foreach ($missingparents as $l => $parent) {
         $a = new stdClass();
         $a->lang   = $installedlangs[$l];
         $a->parent = $parent;
@@ -306,7 +175,7 @@ echo html_writer::end_tag('td');
 // list of available languages
 $options = array();
 foreach ($availablelangs as $alang) {
-    if (!empty($alang[0]) and trim($alang[0]) !== 'en' and !is_installed_lang($alang[0], $alang[1])) {
+    if (!empty($alang[0]) and trim($alang[0]) !== 'en' and !$controller->is_installed_lang($alang[0], $alang[1])) {
         $options[$alang[0]] = $alang[2].' ('.$alang[0].')';
     }
 }
@@ -331,23 +200,3 @@ echo html_writer::end_tag('table');
 echo $OUTPUT->box_end();
 echo $OUTPUT->footer();
 die();
-
-////////////////////////////////////////////////////////////////////////////////
-// Local functions /////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-
-/**
- * checks the md5 of the zip file, grabbed from download.moodle.org,
- * against the md5 of the local language file from last update
- * @param string $lang
- * @param string $md5check
- * @return bool
- */
-function is_installed_lang($lang, $md5check) {
-    global $CFG;
-    $md5file = $CFG->dataroot.'/lang/'.$lang.'/'.$lang.'.md5';
-    if (file_exists($md5file)){
-        return (file_get_contents($md5file) == $md5check);
-    }
-    return false;
-}
index d7534fb..fba12f9 100644 (file)
@@ -27,10 +27,14 @@ $string['install'] = 'Install selected language pack(s)';
 $string['installedlangs'] = 'Installed language packs';
 $string['langimport'] = 'Language import utility';
 $string['langimportdisabled'] = 'Language import feature has been disabled. You have to update your language packs manually at the file-system level. Do not forget to purge string caches after you do so.';
-$string['langpackinstalled'] = 'Language pack {$a} was successfully installed';
-$string['langpackremoved'] = 'Language pack was uninstalled';
-$string['langpackupdateskipped'] = 'Update of {$a} language pack skipped';
-$string['langpackuptodate'] = 'Language pack {$a} is up-to-date';
+$string['langpackinstalled'] = 'Language pack \'{$a}\' was successfully installed';
+$string['langpackinstalledevent'] = 'Language pack installed';
+$string['langpackremoved'] = 'Language pack \'{$a}\' was uninstalled';
+$string['langpackremovedevent'] = 'Language pack uninstalled';
+$string['langpackupdateskipped'] = 'Update of \'{$a}\' language pack skipped';
+$string['langpackuptodate'] = 'Language pack \'{$a}\' is up-to-date';
+$string['langpackupdated'] = 'Language pack \'{$a}\' was successfully updated';
+$string['langpackupdatedevent'] = 'Language pack updated';
 $string['langupdatecomplete'] = 'Language pack update completed';
 $string['missingcfglangotherroot'] = 'Missing configuration value $CFG->langotherroot';
 $string['missinglangparent'] = 'Missing parent language <em>{$a->parent}</em> of <em>{$a->lang}</em>.';
diff --git a/admin/tool/langimport/tests/behat/behat_tool_langimport.php b/admin/tool/langimport/tests/behat/behat_tool_langimport.php
new file mode 100644 (file)
index 0000000..f2b5729
--- /dev/null
@@ -0,0 +1,81 @@
+<?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/>.
+
+/**
+ * Behat steps definitions for Language import tool
+ *
+ * @package   tool_langimport
+ * @category  test
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
+
+require_once(__DIR__ . '/../../../../../lib/behat/behat_base.php');
+
+use Moodle\BehatExtension\Exception\SkippedException;
+
+/**
+ * Steps definitions related with the Language import tool
+ *
+ * @package   tool_langimport
+ * @category  test
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class behat_tool_langimport extends behat_base {
+
+    /**
+     * This step looks to see if the remote language import tests should be run (indicated by
+     * setting TOOL_LANGIMPORT_REMOTE_TESTS in config.php.
+     *
+     * @Given /^remote langimport tests are enabled$/
+     */
+    public function remote_langimport_tests_are_enabled() {
+        if (!defined('TOOL_LANGIMPORT_REMOTE_TESTS')) {
+            throw new SkippedException('To run the remote langimport tests you must '.
+                'define TOOL_LANGIMPORT_REMOTE_TESTS in config.php');
+        }
+    }
+
+    /**
+     * Downloads a langpack and fakes it being outdated
+     *
+     * @param string $langcode The language code (e.g. en)
+     * @Given /^outdated langpack \'([^\']*)\' is installed$/
+     */
+    public function outdated_langpack_is_installed($langcode) {
+        global $CFG;
+        require_once($CFG->libdir.'/componentlib.class.php');
+
+        // Download the langpack.
+        $dir = make_upload_directory('lang');
+        $installer = new lang_installer($langcode);
+        $result = $installer->run();
+
+        if ($result[$langcode] !== lang_installer::RESULT_INSTALLED) {
+            throw new coding_exception("Failed to install langpack '$langcode'");
+        }
+
+        $path = "$dir/$langcode/$langcode.md5";
+
+        if (!file_exists($path)) {
+            throw new coding_exception("Failed to find '$langcode' checksum");
+        }
+        file_put_contents($path, '000000');
+    }
+}
diff --git a/admin/tool/langimport/tests/behat/manage_langpacks.feature b/admin/tool/langimport/tests/behat/manage_langpacks.feature
new file mode 100644 (file)
index 0000000..ff21c8e
--- /dev/null
@@ -0,0 +1,59 @@
+@tool @tool_langimport
+Feature: Manage language packs
+  In order to support different languages
+  As an administrator
+  I need to be able to add, update and remove language packs
+
+
+  Background:
+    Given remote langimport tests are enabled
+
+  # The pirate language pack is used for testing because its small to download.
+
+  Scenario: Install language pack
+    Given I log in as "admin"
+    And I navigate to "Language packs" node in "Site administration > Language"
+    When I set the field "Available language packs" to "English - Pirate (en_ar)"
+    And I press "Install selected language pack(s)"
+    Then I should see "Language pack 'en_ar' was successfully installed"
+    And the "Installed language packs" select box should contain "English - Pirate (en_ar)"
+    And I navigate to "Live logs" node in "Site administration > Reports"
+    And I should see "The language pack 'en_ar' was installed."
+    And I log out
+
+  Scenario: Update language pack
+    Given outdated langpack 'en_ar' is installed
+    And I log in as "admin"
+    And I navigate to "Language packs" node in "Site administration > Language"
+    When I press "Update all installed language packs"
+    Then I should see "Language pack 'en_ar' was successfully updated"
+    And I should see "Language pack update completed"
+    And I navigate to "Live logs" node in "Site administration > Reports"
+    And I should see "The language pack 'en_ar' was updated."
+    And I log out
+
+  Scenario: Try to uninstall language pack
+    Given I log in as "admin"
+    And I navigate to "Language packs" node in "Site administration > Language"
+    And I set the field "Available language packs" to "English - Pirate (en_ar)"
+    And I press "Install selected language pack(s)"
+    When I set the field "Installed language packs" to "English - Pirate (en_ar)"
+    And I press "Uninstall selected language pack"
+    And I press "Continue"
+    Then I should see "Language pack 'en_ar' was uninstalled"
+    And the "Installed language packs" select box should not contain "English - Pirate (en_ar)"
+    And the "Available language packs" select box should contain "English - Pirate (en_ar)"
+    And I navigate to "Live logs" node in "Site administration > Reports"
+    And I should see "The language pack 'en_ar' was removed."
+    And I should see "Language pack uninstalled"
+    And I log out
+
+  Scenario: Try to uninstall English language pack
+    Given I log in as "admin"
+    And I navigate to "Language packs" node in "Site administration > Language"
+    When I set the field "Installed language packs" to "English (en)"
+    And I press "Uninstall selected language pack"
+    Then I should see "English language pack can not be uninstalled"
+    And I navigate to "Live logs" node in "Site administration > Reports"
+    And I should not see "Language pack uninstalled"
+    And I log out
diff --git a/admin/tool/langimport/tests/events_test.php b/admin/tool/langimport/tests/events_test.php
new file mode 100644 (file)
index 0000000..0a75b34
--- /dev/null
@@ -0,0 +1,102 @@
+<?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/>.
+
+/**
+ * Tests for langimport events.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Test class for langimport events.
+ *
+ * @package    tool_langimport
+ * @copyright  2014 Dan Poltawski
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
+ */
+class tool_langimport_events_testcase extends advanced_testcase {
+
+    /**
+     * Setup testcase.
+     */
+    public function setUp() {
+        $this->setAdminUser();
+        $this->resetAfterTest();
+    }
+
+    public function test_langpack_updated() {
+        global $CFG;
+
+        $event = \tool_langimport\event\langpack_updated::event_with_langcode($CFG->lang);
+
+        // Trigger and capture the event.
+        $sink = $this->redirectEvents();
+        $event->trigger();
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        $this->assertInstanceOf('\tool_langimport\event\langpack_updated', $event);
+        $this->assertEquals(context_system::instance(), $event->get_context());
+    }
+
+    public function test_langpack_updated_validation() {
+        $this->setExpectedException('coding_exception', 'The \'langcode\' value must be set to a valid language code');
+
+        \tool_langimport\event\langpack_updated::event_with_langcode('broken langcode');
+    }
+
+    public function test_langpack_installed() {
+        $event = \tool_langimport\event\langpack_imported::event_with_langcode('fr');
+
+        // Trigger and capture the event.
+        $sink = $this->redirectEvents();
+        $event->trigger();
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        $this->assertInstanceOf('\tool_langimport\event\langpack_imported', $event);
+        $this->assertEquals(context_system::instance(), $event->get_context());
+    }
+
+    public function test_langpack_installed_validation() {
+        $this->setExpectedException('coding_exception', 'The \'langcode\' value must be set to a valid language code');
+
+        \tool_langimport\event\langpack_imported::event_with_langcode('broken langcode');
+    }
+
+    public function test_langpack_removed() {
+        $event = \tool_langimport\event\langpack_removed::event_with_langcode('fr');
+
+        // Trigger and capture the event.
+        $sink = $this->redirectEvents();
+        $event->trigger();
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        $this->assertInstanceOf('\tool_langimport\event\langpack_removed', $event);
+        $this->assertEquals(context_system::instance(), $event->get_context());
+    }
+
+    public function test_langpack_removed_validation() {
+        $this->setExpectedException('coding_exception', 'The \'langcode\' value must be set to a valid language code');
+
+        \tool_langimport\event\langpack_removed::event_with_langcode('broken langcode');
+    }
+}
index 398cfc3..7050367 100644 (file)
@@ -25,6 +25,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051200; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->version   = 2014092801; // The current plugin version (Date: YYYYMMDDXX)
 $plugin->requires  = 2014050800; // Requires this Moodle version
 $plugin->component = 'tool_langimport'; // Full name of the plugin (used for diagnostics)
diff --git a/admin/tool/messageinbound/classes/edit_handler_form.php b/admin/tool/messageinbound/classes/edit_handler_form.php
new file mode 100644 (file)
index 0000000..bcb6af5
--- /dev/null
@@ -0,0 +1,106 @@
+<?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/>.
+
+/**
+ * Form to edit handlers.
+ *
+ * @package    tool_messageinbound
+ * @copyright  2014 Andrew Nicols
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+require_once($CFG->libdir . '/formslib.php');
+
+/**
+ * Form to edit handlers.
+ *
+ * @copyright  2014 Andrew Nicols
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class tool_messageinbound_edit_handler_form extends moodleform {
+    public function definition() {
+        $mform = $this->_form;
+
+        $handler = $this->_customdata['handler'];
+
+        // Set up the options for formatting text for descriptions, etc.
+        $formatoptions = new stdClass();
+        $formatoptions->trusted = false;
+        $formatoptions->noclean = false;
+        $formatoptions->smiley = false;
+        $formatoptions->filter = false;
+        $formatoptions->para = true;
+        $formatoptions->newlines = false;
+        $formatoptions->overflowdiv = true;
+
+        // General information about the handler.
+        $mform->addElement('header', 'general', get_string('general'));
+        $mform->addElement('static', 'name', get_string('name', 'tool_messageinbound'),
+            $handler->name);
+        $mform->addElement('static', 'classname', get_string('classname', 'tool_messageinbound'));
+
+        $description = format_text($handler->description, FORMAT_MARKDOWN, $formatoptions);
+
+        $mform->addElement('static', 'description', get_string('description', 'tool_messageinbound'),
+            $description);
+
+        // Items which can be configured.
+        $mform->addElement('header', 'configuration', get_string('configuration'));
+
+        $options = array(
+            HOURSECS => get_string('onehour', 'tool_messageinbound'),
+            DAYSECS => get_string('oneday', 'tool_messageinbound'),
+            WEEKSECS => get_string('oneweek', 'tool_messageinbound'),
+            YEARSECS => get_string('oneyear', 'tool_messageinbound'),
+            '' => get_string('noexpiry', 'tool_messageinbound'),
+        );
+        $mform->addElement('select', 'defaultexpiration', get_string('defaultexpiration', 'tool_messageinbound'), $options);
+        $mform->addHelpButton('defaultexpiration', 'defaultexpiration', 'tool_messageinbound');
+
+        if ($handler->can_change_validateaddress()) {
+            $mform->addElement('checkbox', 'validateaddress', get_string('requirevalidation', 'tool_messageinbound'));
+            $mform->addHelpButton('validateaddress', 'validateaddress', 'tool_messageinbound');
+        } else {
+            if ($handler->validateaddress) {
+                $text = get_string('yes');
+            } else {
+                $text = get_string('no');
+            }
+            $mform->addElement('static', 'validateaddress_fake', get_string('requirevalidation', 'tool_messageinbound'), $text);
+            $mform->addElement('hidden', 'validateaddress');
+            $mform->addHelpButton('validateaddress_fake', 'fixedvalidateaddress', 'tool_messageinbound');
+            $mform->setType('validateaddress', PARAM_INT);
+        }
+
+        if ($handler->can_change_enabled()) {
+            $mform->addElement('checkbox', 'enabled', get_string('enabled', 'tool_messageinbound'));
+        } else {
+            if ($handler->enabled) {
+                $text = get_string('yes');
+            } else {
+                $text = get_string('no');
+            }
+            $mform->addElement('static', 'enabled_fake', get_string('enabled', 'tool_messageinbound'), $text);
+            $mform->addHelpButton('enabled', 'fixedenabled', 'tool_messageinbound');
+            $mform->addElement('hidden', 'enabled');
+            $mform->setType('enabled', PARAM_INT);
+        }
+
+        $this->add_action_buttons(true, get_string('savechanges'));
+    }
+}
diff --git a/admin/tool/messageinbound/classes/manager.php b/admin/tool/messageinbound/classes/manager.php
new file mode 100644 (file)
index 0000000..ebfa8ab
--- /dev/null
@@ -0,0 +1,953 @@
+<?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/>.
+
+/**
+ * The Mail Pickup Manager.
+ *
+ * @package    tool_messageinbound
+ * @copyright  2014 Andrew Nicols
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_messageinbound;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Mail Pickup Manager.
+ *
+ * @copyright  2014 Andrew Nicols
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class manager {
+
+    /**
+     * @var string The main mailbox to check.
+     */
+    const MAILBOX = 'INBOX';
+
+    /**
+     * @var string The mailbox to store messages in when they are awaiting confirmation.
+     */
+    const CONFIRMATIONFOLDER = 'tobeconfirmed';
+
+    /**
+     * @var string The flag for seen/read messages.
+     */
+    const MESSAGE_SEEN = '\seen';
+
+    /**
+     * @var string The flag for flagged messages.
+     */
+    const MESSAGE_FLAGGED = '\flagged';
+
+    /**
+     * @var string The flag for deleted messages.
+     */
+    const MESSAGE_DELETED = '\deleted';
+
+    /**
+     * @var Horde_Imap_Client_Socket A reference to the IMAP client.
+     */
+    protected $client = null;
+
+    /**
+     * @var \core\message\inbound\address_manager A reference to the Inbound Message Address Manager instance.
+     */
+    protected $addressmanager = null;
+
+    /**
+     * @var stdClass The data for the current message being processed.
+     */
+    protected $currentmessagedata = null;
+
+    /**
+     * Retrieve the connection to the IMAP client.
+     *
+     * @return bool Whether a connection was successfully established.
+     */
+    protected function get_imap_client() {
+        global $CFG;
+
+        if (!\core\message\inbound\manager::is_enabled()) {
+            // E-mail processing not set up.
+            mtrace("Inbound Message not fully configured - exiting early.");
+            return false;
+        }
+
+        mtrace("Connecting to {$CFG->messageinbound_host} as {$CFG->messageinbound_hostuser}...");
+
+        $configuration = array(
+            'username' => $CFG->messageinbound_hostuser,
+            'password' => $CFG->messageinbound_hostpass,
+            'hostspec' => $CFG->messageinbound_host,
+            'secure'   => $CFG->messageinbound_hostssl,
+        );
+
+        $this->client = new \Horde_Imap_Client_Socket($configuration);
+
+        try {
+            $this->client->login();
+            mtrace("Connection established.");
+            return true;
+
+        } catch (\Horde_Imap_Client_Exception $e) {
+            $message = $e->getMessage();
+            mtrace("Unable to connect to IMAP server. Failed with '{$message}'");
+
+            return false;
+        }
+    }
+
+    /**
+     * Shutdown and close the connection to the IMAP client.
+     */
+    protected function close_connection() {
+        if ($this->client) {
+            $this->client->close();
+        }
+        $this->client = null;
+    }
+
+    /**
+     * Get the current mailbox information.
+     *
+     * @return \Horde_Imap_Client_Mailbox
+     */
+    protected function get_mailbox() {
+        // Get the current mailbox.
+        $mailbox = $this->client->currentMailbox();
+
+        if (isset($mailbox['mailbox'])) {
+            return $mailbox['mailbox'];
+        } else {
+            throw new \core\message\inbound\processing_failed_exception('couldnotopenmailbox', 'tool_messageinbound');
+        }
+    }
+
+    /**
+     * Execute the main Inbound Message pickup task.
+     */
+    public function pickup_messages() {
+        if (!$this->get_imap_client()) {
+            return false;
+        }
+
+        // Restrict results to messages which are unseen, and have not been flagged.
+        $search = new \Horde_Imap_Client_Search_Query();
+        $search->flag(self::MESSAGE_SEEN, false);
+        $search->flag(self::MESSAGE_FLAGGED, false);
+        mtrace("Searching for Unseen, Unflagged email in the folder '" . self::MAILBOX . "'");
+        $results = $this->client->search(self::MAILBOX, $search);
+
+        // We require the envelope data and structure of each message.
+        $query = new \Horde_Imap_Client_Fetch_Query();
+        $query->envelope();
+        $query->structure();
+
+        // Retrieve the message id.
+        $messages = $this->client->fetch(self::MAILBOX, $query, array('ids' => $results['match']));
+
+        mtrace("Found " . $messages->count() . " messages to parse. Parsing...");
+        $this->addressmanager = new \core\message\inbound\address_manager();
+        foreach ($messages as $message) {
+            $this->process_message($message);
+        }
+
+        // Close the client connection.
+        $this->close_connection();
+
+        return true;
+    }
+
+    /**
+     * Process a message received and validated by the Inbound Message processor.
+     *
+     * @param stdClass $maildata The data retrieved from the database for the current record.
+     * @return bool Whether the message was successfully processed.
+     */
+    public function process_existing_message(\stdClass $maildata) {
+        // Grab the new IMAP client.
+        if (!$this->get_imap_client()) {
+            return false;
+        }
+
+        // Build the search.
+        $search = new \Horde_Imap_Client_Search_Query();
+        // When dealing with Inbound Message messages, we mark them as flagged and seen. Restrict the search to those criterion.
+        $search->flag(self::MESSAGE_SEEN, true);
+        $search->flag(self::MESSAGE_FLAGGED, true);
+        mtrace("Searching for a Seen, Flagged message in the folder '" . self::CONFIRMATIONFOLDER . "'");
+
+        // Match the message ID.
+        $search->headerText('message-id', $maildata->messageid);
+        $search->headerText('to', $maildata->address);
+
+        $results = $this->client->search(self::CONFIRMATIONFOLDER, $search);
+
+        // Build the base query.
+        $query = new \Horde_Imap_Client_Fetch_Query();
+        $query->envelope();
+        $query->structure();
+
+
+        // Fetch the first message from the client.
+        $messages = $this->client->fetch(self::CONFIRMATIONFOLDER, $query, array('ids' => $results['match']));
+        $this->addressmanager = new \core\message\inbound\address_manager();
+        if ($message = $messages->first()) {
+            mtrace("--> Found the message. Passing back to the pickup system.");
+
+            // Process the message.
+            $this->process_message($message, true, true);
+
+            // Close the client connection.
+            $this->close_connection();
+
+            mtrace("============================================================================");
+&n