Jose Filipi
2 years ago
commit
d89e5c3cfa
19172 changed files with 4062000 additions and 0 deletions
@ -0,0 +1,88 @@ |
|||
# Generated by "grunt ignorefiles" |
|||
*/**/yui/src/*/meta/ |
|||
*/**/build/ |
|||
node_modules/ |
|||
vendor/ |
|||
admin/tool/policy/amd/src/jquery-eu-cookie-law-popup.js |
|||
admin/tool/usertours/amd/src/tour.js |
|||
auth/cas/CAS/ |
|||
cache/stores/mongodb/MongoDB/ |
|||
enrol/lti/ims-blti/ |
|||
filter/algebra/AlgParser.pm |
|||
filter/tex/mimetex.* |
|||
lib/editor/atto/plugins/html/yui/src/codemirror/ |
|||
lib/editor/atto/plugins/html/yui/src/beautify/ |
|||
lib/editor/atto/yui/src/rangy/js/*.* |
|||
lib/editor/tinymce/plugins/pdw/tinymce/ |
|||
lib/editor/tinymce/plugins/spellchecker/rpc.php |
|||
lib/editor/tinymce/tiny_mce/ |
|||
lib/mlbackend/php/phpml/ |
|||
lib/adodb/ |
|||
lib/bennu/ |
|||
lib/evalmath/ |
|||
lib/lessphp/ |
|||
lib/phpexcel/ |
|||
lib/google/ |
|||
lib/htmlpurifier/ |
|||
lib/jabber/ |
|||
lib/minify/matthiasmullie-minify/ |
|||
lib/minify/matthiasmullie-pathconverter/ |
|||
lib/pear/Auth/RADIUS.php |
|||
lib/pear/Crypt/CHAP.php |
|||
lib/pear/HTML/Common.php |
|||
lib/pear/HTML/QuickForm.php |
|||
lib/pear/HTML/QuickForm/ |
|||
lib/pear/PEAR.php |
|||
lib/phpmailer/ |
|||
lib/simplepie/ |
|||
lib/tcpdf/ |
|||
lib/typo3/ |
|||
lib/yuilib/ |
|||
lib/yuilib/gallery/ |
|||
lib/jquery/ |
|||
lib/html2text/ |
|||
lib/markdown/ |
|||
lib/recaptchalib.php |
|||
lib/xhprof/ |
|||
lib/horde/ |
|||
lib/requirejs/ |
|||
lib/amd/src/loglevel.js |
|||
lib/mustache/ |
|||
lib/amd/src/mustache.js |
|||
lib/graphlib.php |
|||
lib/php-css-parser/ |
|||
lib/rtlcss/ |
|||
lib/scssphp/ |
|||
lib/spout/ |
|||
lib/amd/src/chartjs-lazy.js |
|||
lib/maxmind/GeoIp2/ |
|||
lib/maxmind/MaxMind/ |
|||
lib/ltiprovider/ |
|||
lib/amd/src/truncate.js |
|||
lib/fonts/ |
|||
lib/amd/src/adapter.js |
|||
lib/validateurlsyntax.php |
|||
lib/amd/src/popper.js |
|||
lib/geopattern-php/ |
|||
lib/php-jwt/ |
|||
media/player/videojs/amd/src/video-lazy.js |
|||
media/player/videojs/amd/src/Youtube-lazy.js |
|||
media/player/videojs/videojs/ |
|||
media/player/videojs/amd/src/videojs-flash-lazy.js |
|||
media/player/videojs/videojs/video-js.swf |
|||
mod/assign/feedback/editpdf/fpdi/ |
|||
repository/s3/S3.php |
|||
theme/boost/scss/bootstrap/ |
|||
theme/boost/amd/src/alert.js |
|||
theme/boost/amd/src/button.js |
|||
theme/boost/amd/src/carousel.js |
|||
theme/boost/amd/src/collapse.js |
|||
theme/boost/amd/src/dropdown.js |
|||
theme/boost/amd/src/modal.js |
|||
theme/boost/amd/src/popover.js |
|||
theme/boost/amd/src/scrollspy.js |
|||
theme/boost/amd/src/tab.js |
|||
theme/boost/amd/src/tooltip.js |
|||
theme/boost/amd/src/util.js |
|||
theme/boost/amd/src/tether.js |
|||
theme/boost/scss/fontawesome/ |
@ -0,0 +1,214 @@ |
|||
{ |
|||
'plugins': [ |
|||
'promise', |
|||
], |
|||
'env': { |
|||
'browser': true, |
|||
'amd': true |
|||
}, |
|||
'globals': { |
|||
'M': true, |
|||
'Y': true |
|||
}, |
|||
'rules': { |
|||
// See http://eslint.org/docs/rules/ for all rules and explanations of all |
|||
// rules. |
|||
|
|||
// === Possible Errors === |
|||
'comma-dangle': 'off', |
|||
'no-compare-neg-zero': 'error', |
|||
'no-cond-assign': 'error', |
|||
'no-console': 'error', |
|||
'no-constant-condition': 'error', |
|||
'no-control-regex': 'error', |
|||
'no-debugger': 'error', |
|||
'no-dupe-args': 'error', |
|||
'no-dupe-keys': 'error', |
|||
'no-duplicate-case': 'error', |
|||
'no-empty': 'warn', |
|||
'no-empty-character-class': 'error', |
|||
'no-ex-assign': 'error', |
|||
'no-extra-boolean-cast': 'error', |
|||
'no-extra-parens': 'off', |
|||
'no-extra-semi': 'error', |
|||
'no-func-assign': 'error', |
|||
'no-inner-declarations': 'error', |
|||
'no-invalid-regexp': 'error', |
|||
'no-irregular-whitespace': 'error', |
|||
'no-obj-calls': 'error', |
|||
'no-prototype-builtins': 'off', |
|||
'no-regex-spaces': 'error', |
|||
'no-sparse-arrays': 'error', |
|||
'no-unexpected-multiline': 'error', |
|||
'no-unreachable': 'warn', |
|||
'no-unsafe-finally': 'error', |
|||
'no-unsafe-negation': 'error', |
|||
'use-isnan': 'error', |
|||
'valid-jsdoc': ['warn', { 'requireReturn': false, 'requireParamDescription': false, 'requireReturnDescription': false }], |
|||
'valid-typeof': 'error', |
|||
|
|||
// === Best Practices === |
|||
// (these mostly match our jshint config) |
|||
'array-callback-return': 'warn', |
|||
'block-scoped-var': 'warn', |
|||
'complexity': 'warn', |
|||
'consistent-return': 'warn', |
|||
'curly': 'error', |
|||
'dot-notation': 'warn', |
|||
'no-alert': 'warn', |
|||
'no-caller': 'error', |
|||
'no-case-declarations': 'error', |
|||
'no-div-regex': 'error', |
|||
'no-empty-pattern': 'error', |
|||
'no-empty-function': 'warn', |
|||
'no-eq-null': 'error', |
|||
'no-eval': 'error', |
|||
'no-extend-native': 'error', |
|||
'no-extra-bind': 'warn', |
|||
'no-fallthrough': 'error', |
|||
'no-floating-decimal': 'warn', |
|||
'no-global-assign': 'warn', |
|||
'no-implied-eval': 'error', |
|||
'no-invalid-this': 'error', |
|||
'no-iterator': 'error', |
|||
'no-labels': 'error', |
|||
'no-loop-func': 'error', |
|||
'no-multi-spaces': 'warn', |
|||
'no-multi-str': 'error', |
|||
'no-new-func': 'error', |
|||
'no-new-wrappers': 'error', |
|||
'no-octal': 'error', |
|||
'no-octal-escape': 'error', |
|||
'no-proto': 'error', |
|||
'no-redeclare': 'warn', |
|||
'no-return-assign': 'error', |
|||
'no-script-url': 'error', |
|||
'no-self-assign': 'error', |
|||
'no-self-compare': 'error', |
|||
'no-sequences': 'warn', |
|||
'no-throw-literal': 'warn', |
|||
'no-unmodified-loop-condition': 'error', |
|||
'no-unused-expressions': 'error', |
|||
'no-unused-labels': 'error', |
|||
'no-useless-call': 'warn', |
|||
'no-useless-escape': 'warn', |
|||
'no-with': 'error', |
|||
'wrap-iife': ['error', 'any'], |
|||
|
|||
// === Variables === |
|||
'no-delete-var': 'error', |
|||
'no-undef': 'error', |
|||
'no-undef-init': 'error', |
|||
'no-unused-vars': ['error', { 'caughtErrors': 'none' }], |
|||
|
|||
// === Stylistic Issues === |
|||
'array-bracket-spacing': 'warn', |
|||
'block-spacing': 'warn', |
|||
'brace-style': ['warn', '1tbs'], |
|||
'camelcase': 'warn', |
|||
'capitalized-comments': ['warn', 'always', { 'ignoreConsecutiveComments': true }], |
|||
'comma-spacing': ['warn', { 'before': false, 'after': true }], |
|||
'comma-style': ['warn', 'last'], |
|||
'computed-property-spacing': 'error', |
|||
'consistent-this': 'off', |
|||
'eol-last': 'off', |
|||
'func-call-spacing': ['warn', 'never'], |
|||
'func-names': 'off', |
|||
'func-style': 'off', |
|||
// indent currently not doing well with our wrapping style, so disabled. |
|||
'indent': ['off', 4, { 'SwitchCase': 1 }], |
|||
'key-spacing': ['warn', { 'beforeColon': false, 'afterColon': true, 'mode': minimum }], |
|||
'keyword-spacing': 'warn', |
|||
'linebreak-style': ['error', 'unix'], |
|||
'lines-around-comment': 'off', |
|||
'max-len': ['error', 132], |
|||
'max-lines': 'off', |
|||
'max-depth': 'warn', |
|||
'max-nested-callbacks': ['warn', 5], |
|||
'max-params': 'off', |
|||
'max-statements': 'off', |
|||
'max-statements-per-line': ['warn', { max: 2 }], |
|||
'new-cap': ['warn', { 'properties': false }], |
|||
'new-parens': 'warn', |
|||
'newline-after-var': 'off', |
|||
'newline-before-return': 'off', |
|||
'newline-per-chained-call': 'off', |
|||
'no-array-constructor': 'off', |
|||
'no-bitwise': 'error', |
|||
'no-continue': 'off', |
|||
'no-inline-comments': 'off', |
|||
'no-lonely-if': 'off', |
|||
'no-mixed-operators': 'off', |
|||
'no-mixed-spaces-and-tabs': 'error', |
|||
'no-multiple-empty-lines': 'warn', |
|||
'no-negated-condition': 'off', |
|||
'no-nested-ternary': 'warn', |
|||
'no-new-object': 'off', |
|||
'no-plusplus': 'off', |
|||
'no-tabs': 'error', |
|||
'no-ternary': 'off', |
|||
'no-trailing-spaces': 'error', |
|||
'no-underscore-dangle': 'off', |
|||
'no-unneeded-ternary': 'off', |
|||
'no-whitespace-before-property': 'warn', |
|||
'object-curly-newline': 'off', |
|||
'object-curly-spacing': 'warn', |
|||
'object-property-newline': 'off', |
|||
'one-var': 'off', |
|||
'one-var-declaration-per-line': ['warn', 'initializations'], |
|||
'operator-assignment': 'off', |
|||
'operator-linebreak': 'off', |
|||
'padded-blocks': 'off', |
|||
'quote-props': ['warn', 'as-needed', {'unnecessary': false, 'keywords': true, 'numbers': true}], |
|||
'quotes': 'off', |
|||
'require-jsdoc': 'warn', |
|||
'semi': 'error', |
|||
'semi-spacing': ['warn', {'before': false, 'after': true}], |
|||
'sort-vars': 'off', |
|||
'space-before-blocks': 'warn', |
|||
'space-before-function-paren': ['warn', 'never'], |
|||
'space-in-parens': 'warn', |
|||
'space-infix-ops': 'warn', |
|||
'space-unary-ops': 'warn', |
|||
'spaced-comment': 'warn', |
|||
'unicode-bom': 'error', |
|||
'wrap-regex': 'off', |
|||
|
|||
// === Promises === |
|||
'promise/always-return': 'warn', |
|||
'promise/no-return-wrap': 'warn', |
|||
'promise/param-names': 'warn', |
|||
'promise/catch-or-return': ['warn', {terminationMethod: ['catch', 'fail']}], |
|||
'promise/no-native': 'warn', |
|||
'promise/no-promise-in-callback': 'warn', |
|||
'promise/no-callback-in-promise': 'warn', |
|||
'promise/avoid-new': 'warn', |
|||
|
|||
// === Deprecations === |
|||
"no-restricted-properties": ['warn', { |
|||
'object': 'M', |
|||
'property': 'str', |
|||
'message': 'Use AMD module "core/str" or M.util.get_string()' |
|||
}], |
|||
|
|||
}, |
|||
overrides: [ |
|||
{ |
|||
files: ["**/yui/src/**/*.js"], |
|||
// Disable some rules which we can't safely define for YUI rollups. |
|||
rules: { |
|||
'no-undef': 'off', |
|||
'no-unused-vars': 'off', |
|||
'no-unused-expressions': 'off' |
|||
} |
|||
}, |
|||
{ |
|||
files: ["**/amd/src/*.js"], |
|||
// Check AMD with some slightly stricter rules. |
|||
rules: { |
|||
'no-unused-vars': 'error', |
|||
'no-implicit-globals': 'error' |
|||
} |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,20 @@ |
|||
{ |
|||
"indentation": ["on",{ |
|||
"Feature": 0, |
|||
"Background": 2, |
|||
"Scenario": 2, |
|||
"Step": 4, |
|||
"given": 4, |
|||
"and": 4 |
|||
}], |
|||
"no-dupe-feature-names": "on", |
|||
"no-dupe-scenario-names": "off", |
|||
"no-empty-file": "on", |
|||
"no-files-without-scenarios": "on", |
|||
"no-multiple-empty-lines": "on", |
|||
"no-partially-commented-tag-lines": "on", |
|||
"no-trailing-spaces": "on", |
|||
"no-unamed-features": "on", |
|||
"no-unamed-scenarios": "on", |
|||
"no-scenario-outlines-without-examples": "on" |
|||
} |
@ -0,0 +1,3 @@ |
|||
**/yui/build/** -diff |
|||
**/amd/build/** -diff |
|||
lib/dml/oci_native_moodle_package.sql text eol=lf |
@ -0,0 +1,46 @@ |
|||
# This file specifies intentionally untracked files that all Moodle git |
|||
# repositories should ignore. It is recommended not to modify this file in your |
|||
# local clone. Instead, use .git/info/exclude and add new records there as |
|||
# needed. |
|||
# |
|||
# Example: if you deploy a contributed plugin mod/foobar into your site, put |
|||
# the following line into .git/info/exclude file in your Moodle clone: |
|||
# /mod/foobar/ |
|||
# |
|||
# See gitignore(5) man page for more details |
|||
# |
|||
|
|||
# Swap files (vim) |
|||
[._]*.s[a-v][a-z] |
|||
[._]*.sw[a-p] |
|||
[._]s[a-rt-v][a-z] |
|||
[._]ss[a-gi-z] |
|||
[._]sw[a-p] |
|||
# Temporary files including undo |
|||
*~ |
|||
# |
|||
/config.php |
|||
/lib/editor/tinymce/extra/tools/temp/ |
|||
/tags |
|||
/TAGS |
|||
/cscope.* |
|||
/.patches/ |
|||
/.idea/ |
|||
/nbproject/ |
|||
CVS |
|||
.DS_Store |
|||
/.settings/ |
|||
/.project |
|||
/.buildpath |
|||
/.cache |
|||
phpunit.xml |
|||
# Composer support. Do not ignore composer.json, or composer.lock. These should be shipped by us. |
|||
composer.phar |
|||
/vendor/ |
|||
/behat.yml |
|||
*/yui/build/*/*-coverage.js |
|||
/lib/yuilib/*/build/*/*-coverage.js |
|||
# lib/yuilib/version/module/module-coverage.js |
|||
/lib/yuilib/*/*/*-coverage.js |
|||
atlassian-ide-plugin.xml |
|||
/node_modules/ |
@ -0,0 +1,135 @@ |
|||
[submodule "user/profile/field/cpf"] |
|||
path = user/profile/field/cpf |
|||
url = https://github.com/interlegis/moodle_profilefield_cpf.git |
|||
[submodule "enrol/ilbead"] |
|||
path = enrol/ilbead |
|||
url = https://github.com/interlegis/moodle_enrol_ilbead.git |
|||
[submodule "enrol/ilbeadtutorado"] |
|||
path = enrol/ilbeadtutorado |
|||
url = https://github.com/interlegis/moodle_enrol_ilbeadtutorado.git |
|||
[submodule "blocks/completion_progress"] |
|||
path = blocks/completion_progress |
|||
url = https://github.com/interlegis/moodle-block_completion_progress.git |
|||
[submodule "mod/attendance"] |
|||
path = mod/attendance |
|||
url = https://github.com/danmarsden/moodle-mod_attendance.git |
|||
[submodule "mod/certificate"] |
|||
path = mod/certificate |
|||
url = https://github.com/interlegis/moodle_certificates.git |
|||
[submodule "mod/hotpot"] |
|||
path = mod/hotpot |
|||
url = https://github.com/gbateson/moodle-mod_hotpot.git |
|||
[submodule "mod/game"] |
|||
path = mod/game |
|||
url = https://github.com/interlegis/moodle-mod_game.git |
|||
[submodule "mod/journal"] |
|||
path = mod/journal |
|||
url = https://github.com/elearningsoftware/moodle-mod_journal.git |
|||
[submodule "mod/questionnaire"] |
|||
path = mod/questionnaire |
|||
url = https://github.com/PoetOS/moodle-mod_questionnaire.git |
|||
[submodule "mod/quiz/accessrule/reattemptchecker"] |
|||
path = mod/quiz/accessrule/reattemptchecker |
|||
url = https://github.com/learningstacks/moodle-quizaccess_reattemptchecker.git |
|||
[submodule "blocks/get_certificate"] |
|||
path = blocks/get_certificate |
|||
url = https://github.com/interlegis/moodle_get_certificate.git |
|||
[submodule "blocks/enrol_duration"] |
|||
path = blocks/enrol_duration |
|||
url = https://github.com/nrobbins/moodle_block_enrol_duration.git |
|||
[submodule "blocks/verify_certificate"] |
|||
path = blocks/verify_certificate |
|||
url = https://github.com/interlegis/moodle_block_verify_certificate.git |
|||
[submodule "report/messages"] |
|||
path = report/messages |
|||
url = https://github.com/interlegis/moodle_report_messages.git |
|||
[submodule "report/ilbsplit"] |
|||
path = report/ilbsplit |
|||
url = https://github.com/interlegis/moodle-report_ilbsplit.git |
|||
[submodule "report/ilbenrol"] |
|||
path = report/ilbenrol |
|||
url = https://github.com/interlegis/moodle_report_ilbenrol.git |
|||
[submodule "blocks/course_contacts"] |
|||
path = blocks/course_contacts |
|||
url = https://github.com/roelmann/moodle-block_course_contacts.git |
|||
[submodule "blocks/userexpire"] |
|||
path = blocks/userexpire |
|||
url = https://github.com/coderader/moodle-block_userexpire.git |
|||
[submodule "blocks/configurable_reports"] |
|||
path = blocks/configurable_reports |
|||
url = https://github.com/jleyva/moodle-block_configurablereports.git |
|||
[submodule "theme/ilb"] |
|||
path = theme/ilb |
|||
url = https://github.com/interlegis/moodle_theme_ilb.git |
|||
[submodule "local/mass_enroll"] |
|||
path = local/mass_enroll |
|||
url = https://github.com/rogiervandongen/moodle-local_mass_enroll.git |
|||
[submodule "blocks/accessibility"] |
|||
path = blocks/accessibility |
|||
url = https://github.com/hitteshahuja/moodle-block_accessibility.git |
|||
[submodule "blocks/download_certificates"] |
|||
path = blocks/download_certificates |
|||
url = https://github.com/manieer/moodle-block_download_certificates.git |
|||
[submodule "enrol/evl"] |
|||
path = enrol/evl |
|||
url = https://github.com/interlegis/moodle-enrol_evl.git |
|||
[submodule "local/ws_evl"] |
|||
path = local/ws_evl |
|||
url = https://github.com/interlegis/moodle-local_ws_evl.git |
|||
[submodule "blocks/escola_modelo"] |
|||
path = blocks/escola_modelo |
|||
url = https://github.com/interlegis/moodle-block_escola_modelo.git |
|||
[submodule "blocks/fale_conosco"] |
|||
path = blocks/fale_conosco |
|||
url = https://github.com/interlegis/moodle-block_fale_conosco.git |
|||
[submodule "mod/groupselect"] |
|||
path = mod/groupselect |
|||
url = https://github.com/rogerbaba/moodle-mod_groupselect.git |
|||
[submodule "mod/customcert"] |
|||
path = mod/customcert |
|||
url = https://github.com/markn86/moodle-mod_customcert.git |
|||
[submodule "mod/bigbluebuttonbn"] |
|||
path = mod/bigbluebuttonbn |
|||
url = https://github.com/blindsidenetworks/moodle-mod_bigbluebuttonbn.git |
|||
[submodule "blocks/xp"] |
|||
path = blocks/xp |
|||
url = https://github.com/FMCorz/moodle-block_xp.git |
|||
[submodule "mod/zoom"] |
|||
path = mod/zoom |
|||
url = https://github.com/ucla/moodle-mod_zoom.git |
|||
[submodule "enrol/apply"] |
|||
path = enrol/apply |
|||
url = https://github.com/interlegis/moodle-enrol_apply.git |
|||
[submodule "mod/hvp"] |
|||
path = mod/hvp |
|||
url = https://github.com/h5p/moodle-mod_hvp.git |
|||
[submodule "local/o365"] |
|||
path = local/o365 |
|||
url = https://github.com/microsoft/moodle-local_o365.git |
|||
[submodule "auth/oidc"] |
|||
path = auth/oidc |
|||
url = https://github.com/microsoft/moodle-auth_oidc.git |
|||
[submodule "filter/oembed"] |
|||
path = filter/oembed |
|||
url = https://github.com/PoetOS/moodle-filter_oembed.git |
|||
[submodule "blocks/microsoft"] |
|||
path = blocks/microsoft |
|||
url = https://github.com/microsoft/moodle-block_microsoft.git |
|||
[submodule "theme/boost_o365teams"] |
|||
path = theme/boost_o365teams |
|||
url = https://github.com/microsoft/moodle-theme_boost_o365teams.git |
|||
[submodule "repository/office365"] |
|||
path = repository/office365 |
|||
url = https://github.com/microsoft/moodle-repository_office365.git |
|||
[submodule "lib/editor/atto/plugins/teamsmeeting"] |
|||
path = lib/editor/atto/plugins/teamsmeeting |
|||
url = https://github.com/enovation/moodle-atto_teamsmeeting.git |
|||
[submodule "local/webhooks"] |
|||
path = local/webhooks |
|||
url = https://github.com/valentineus/moodle-webhooks.git |
|||
[submodule "local/wsilb"] |
|||
path = local/wsilb |
|||
url = https://github.com/interlegis/moodle-local_wsilb.git |
|||
[submodule "mod/palestra"] |
|||
path = mod/palestra |
|||
url = https://github.com/interlegis/moodle-mod_palestra.git |
@ -0,0 +1,58 @@ |
|||
// NOTE: We use eslint now. This file is used only by shifter. We keep the configuration |
|||
// here because shifter uses jshint after modules have been concating. Eslint can't |
|||
// currently do this. |
|||
{ |
|||
"asi": false, |
|||
"bitwise": true, |
|||
"boss": false, |
|||
"browser": true, |
|||
"curly": true, |
|||
"debug": false, |
|||
"eqeqeq": false, |
|||
"eqnull": false, |
|||
"es5": false, |
|||
"esnext": false, |
|||
"evil": false, |
|||
"expr": false, |
|||
"forin": false, |
|||
"funcscope": false, |
|||
"globalstrict": false, |
|||
"immed": true, |
|||
"indent": 4, |
|||
"iterator": false, |
|||
"lastsemic": false, |
|||
"latedef": true, |
|||
"laxbreak": true, |
|||
"laxcomma": false, |
|||
"loopfunc": false, |
|||
"maxerr": 500, |
|||
"maxlen": 132, |
|||
"multistr": false, |
|||
"newcap": true, |
|||
"noarg": true, |
|||
"noempty": true, |
|||
"nomen": false, |
|||
"onecase": false, |
|||
"onevar": false, |
|||
"passfail": false, |
|||
"plusplus": false, |
|||
"predef": [ |
|||
"M", |
|||
"define", |
|||
"require" |
|||
], |
|||
"proto": false, |
|||
"regexdash": false, |
|||
"regexp": false, |
|||
"scripturl": false, |
|||
"shadow": false, |
|||
"smarttabs": false, |
|||
"strict": false, |
|||
"sub": false, |
|||
"supernew": false, |
|||
"trailing": true, |
|||
"undef": true, |
|||
"unused": true, |
|||
"white": false, |
|||
"yui": true |
|||
} |
@ -0,0 +1,5 @@ |
|||
{ |
|||
"coverage": false, |
|||
"lint": "config", |
|||
"clean": true |
|||
} |
@ -0,0 +1,89 @@ |
|||
# Generated by "grunt ignorefiles" |
|||
**/yui/build/* |
|||
theme/boost/style/moodle.css |
|||
theme/classic/style/moodle.css |
|||
node_modules/ |
|||
vendor/ |
|||
admin/tool/policy/amd/src/jquery-eu-cookie-law-popup.js |
|||
admin/tool/usertours/amd/src/tour.js |
|||
auth/cas/CAS/ |
|||
cache/stores/mongodb/MongoDB/ |
|||
enrol/lti/ims-blti/ |
|||
filter/algebra/AlgParser.pm |
|||
filter/tex/mimetex.* |
|||
lib/editor/atto/plugins/html/yui/src/codemirror/ |
|||
lib/editor/atto/plugins/html/yui/src/beautify/ |
|||
lib/editor/atto/yui/src/rangy/js/*.* |
|||
lib/editor/tinymce/plugins/pdw/tinymce/ |
|||
lib/editor/tinymce/plugins/spellchecker/rpc.php |
|||
lib/editor/tinymce/tiny_mce/ |
|||
lib/mlbackend/php/phpml/ |
|||
lib/adodb/ |
|||
lib/bennu/ |
|||
lib/evalmath/ |
|||
lib/lessphp/ |
|||
lib/phpexcel/ |
|||
lib/google/ |
|||
lib/htmlpurifier/ |
|||
lib/jabber/ |
|||
lib/minify/matthiasmullie-minify/ |
|||
lib/minify/matthiasmullie-pathconverter/ |
|||
lib/pear/Auth/RADIUS.php |
|||
lib/pear/Crypt/CHAP.php |
|||
lib/pear/HTML/Common.php |
|||
lib/pear/HTML/QuickForm.php |
|||
lib/pear/HTML/QuickForm/ |
|||
lib/pear/PEAR.php |
|||
lib/phpmailer/ |
|||
lib/simplepie/ |
|||
lib/tcpdf/ |
|||
lib/typo3/ |
|||
lib/yuilib/ |
|||
lib/yuilib/gallery/ |
|||
lib/jquery/ |
|||
lib/html2text/ |
|||
lib/markdown/ |
|||
lib/recaptchalib.php |
|||
lib/xhprof/ |
|||
lib/horde/ |
|||
lib/requirejs/ |
|||
lib/amd/src/loglevel.js |
|||
lib/mustache/ |
|||
lib/amd/src/mustache.js |
|||
lib/graphlib.php |
|||
lib/php-css-parser/ |
|||
lib/rtlcss/ |
|||
lib/scssphp/ |
|||
lib/spout/ |
|||
lib/amd/src/chartjs-lazy.js |
|||
lib/maxmind/GeoIp2/ |
|||
lib/maxmind/MaxMind/ |
|||
lib/ltiprovider/ |
|||
lib/amd/src/truncate.js |
|||
lib/fonts/ |
|||
lib/amd/src/adapter.js |
|||
lib/validateurlsyntax.php |
|||
lib/amd/src/popper.js |
|||
lib/geopattern-php/ |
|||
lib/php-jwt/ |
|||
media/player/videojs/amd/src/video-lazy.js |
|||
media/player/videojs/amd/src/Youtube-lazy.js |
|||
media/player/videojs/videojs/ |
|||
media/player/videojs/amd/src/videojs-flash-lazy.js |
|||
media/player/videojs/videojs/video-js.swf |
|||
mod/assign/feedback/editpdf/fpdi/ |
|||
repository/s3/S3.php |
|||
theme/boost/scss/bootstrap/ |
|||
theme/boost/amd/src/alert.js |
|||
theme/boost/amd/src/button.js |
|||
theme/boost/amd/src/carousel.js |
|||
theme/boost/amd/src/collapse.js |
|||
theme/boost/amd/src/dropdown.js |
|||
theme/boost/amd/src/modal.js |
|||
theme/boost/amd/src/popover.js |
|||
theme/boost/amd/src/scrollspy.js |
|||
theme/boost/amd/src/tab.js |
|||
theme/boost/amd/src/tooltip.js |
|||
theme/boost/amd/src/util.js |
|||
theme/boost/amd/src/tether.js |
|||
theme/boost/scss/fontawesome/ |
@ -0,0 +1,95 @@ |
|||
{ |
|||
"plugins": [ |
|||
"stylelint-csstree-validator" |
|||
], |
|||
"rules": { |
|||
"csstree/validator": true, |
|||
"at-rule-empty-line-before": [ "always", |
|||
{"except": [ "blockless-after-blockless"], ignore: ["after-comment", "inside-block"]} |
|||
], |
|||
"at-rule-name-case": "lower", |
|||
"at-rule-name-space-after": "always-single-line", |
|||
"at-rule-no-unknown": null, # Enabled for non-scss in grunt. |
|||
"at-rule-semicolon-newline-after": "always", |
|||
"at-rule-semicolon-space-before": "never", |
|||
"block-closing-brace-newline-after": "always", |
|||
"block-closing-brace-newline-before": "always", |
|||
"block-closing-brace-space-before": "always-single-line", |
|||
"block-no-empty": true, |
|||
"block-opening-brace-newline-after": "always", |
|||
"block-opening-brace-space-after": "always-single-line", |
|||
"block-opening-brace-space-before": "always", |
|||
"color-hex-case": ["lower", { "severity": "warning" }], |
|||
"color-hex-length": ["short", { "severity": "warning" }], |
|||
"color-no-invalid-hex": true, |
|||
"declaration-bang-space-after": "never", |
|||
"declaration-bang-space-before": "always", |
|||
"declaration-block-no-duplicate-properties": true, |
|||
"declaration-block-no-shorthand-property-overrides": true, |
|||
"declaration-block-semicolon-newline-after": "always-multi-line", |
|||
"declaration-block-semicolon-space-after": "always-single-line", |
|||
"declaration-block-semicolon-space-before": "never", |
|||
"declaration-block-single-line-max-declarations": 1, |
|||
"declaration-block-trailing-semicolon": "always", |
|||
"declaration-colon-newline-after": "always-multi-line", |
|||
"declaration-colon-space-after": "always-single-line", |
|||
"declaration-colon-space-before": "never", |
|||
"declaration-no-important": true, |
|||
"font-family-no-duplicate-names": true, |
|||
"function-calc-no-unspaced-operator": true, |
|||
"function-comma-newline-after": "always-multi-line", |
|||
"function-comma-space-after": "always-single-line", |
|||
"function-comma-space-before": "never", |
|||
"function-linear-gradient-no-nonstandard-direction": true, |
|||
"function-max-empty-lines": 0, |
|||
"function-name-case": "lower", |
|||
"function-parentheses-newline-inside": "always-multi-line", |
|||
"function-parentheses-space-inside": "never-single-line", |
|||
"function-url-scheme-blacklist": ["data"], |
|||
"function-whitespace-after": "always", |
|||
"indentation": 4, |
|||
"keyframe-declaration-no-important": true, |
|||
"length-zero-no-unit": [true, { "severity": "warning" }], |
|||
"max-empty-lines": 2, |
|||
"max-line-length": [132, { "severity": "warning" }], |
|||
"media-feature-colon-space-after": "always", |
|||
"media-feature-colon-space-before": "never", |
|||
"media-feature-parentheses-space-inside": "never", |
|||
"media-feature-range-operator-space-after": "always", |
|||
"media-feature-range-operator-space-before": "always", |
|||
"media-query-list-comma-newline-after": "always-multi-line", |
|||
"media-query-list-comma-space-after": "always-single-line", |
|||
"media-query-list-comma-space-before": "never", |
|||
"no-empty-source": true, |
|||
"no-eol-whitespace": true, |
|||
"no-extra-semicolons": [true, { "severity": "warning" }], |
|||
"no-invalid-double-slash-comments": true, |
|||
"no-unknown-animations": true, |
|||
"property-case": "lower", |
|||
"property-no-unknown": true, |
|||
"selector-attribute-brackets-space-inside": "never", |
|||
"selector-attribute-operator-space-after": "never", |
|||
"selector-attribute-operator-space-before": "never", |
|||
"selector-combinator-space-after": "always", |
|||
"selector-combinator-space-before": "always", |
|||
"selector-list-comma-newline-after": "always", |
|||
"selector-list-comma-space-before": "never", |
|||
"selector-max-empty-lines": 0, |
|||
"selector-pseudo-class-case": "lower", |
|||
"selector-pseudo-class-no-unknown": true, |
|||
"selector-pseudo-class-parentheses-space-inside": "never", |
|||
"selector-pseudo-element-case": "lower", |
|||
"selector-pseudo-element-no-unknown": true, |
|||
"selector-type-case": "lower", |
|||
"selector-type-no-unknown": true, |
|||
"string-no-newline": true, |
|||
"time-min-milliseconds": 100, |
|||
"unit-blacklist": ["pt"], |
|||
"unit-case": "lower", |
|||
"unit-no-unknown": true, |
|||
"value-keyword-case": ["lower", {"ignoreKeywords": ["/(@|$)/"]}], |
|||
"value-list-comma-newline-after": "always-multi-line", |
|||
"value-list-comma-space-after": "always-single-line", |
|||
"value-list-comma-space-before": "never", |
|||
} |
|||
} |
@ -0,0 +1,287 @@ |
|||
# PLEASE NOTE: Travis is not currently utilised by the Moodle core integration |
|||
# process (which uses our internal CI system) this file is here for the benefit |
|||
# of community developers git clones - see MDL-51458. |
|||
|
|||
sudo: required |
|||
|
|||
# We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976 |
|||
# is fixed. |
|||
notifications: |
|||
email: false |
|||
|
|||
language: php |
|||
|
|||
php: |
|||
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org. |
|||
- 7.2 |
|||
- 7.1 |
|||
|
|||
addons: |
|||
postgresql: "9.6" |
|||
packages: |
|||
- mysql-server-5.6 |
|||
- mysql-client-core-5.6 |
|||
- mysql-client-5.6 |
|||
|
|||
# Redis tests are currently failing on php 7.2 due to https://bugs.php.net/bug.php?id=75628 |
|||
# services: |
|||
# - redis-server |
|||
|
|||
env: |
|||
# Although we want to run these jobs and see failures as quickly as possible, we also want to get the slowest job to |
|||
# start first so that the total run time is not too high. |
|||
# |
|||
# We only run MySQL on PHP 7.2, so run that first. |
|||
# CI Tests should be second-highest in priority as these only take <= 60 seconds to run under normal circumstances. |
|||
# Postgres is significantly is pretty reasonable in its run-time. |
|||
|
|||
# Run unit tests on MySQL |
|||
- DB=mysqli TASK=PHPUNIT |
|||
|
|||
# Run CI Tests without running PHPUnit. |
|||
- DB=none TASK=CITEST |
|||
|
|||
# Run unit tests on Postgres |
|||
- DB=pgsql TASK=PHPUNIT |
|||
|
|||
# Perform an upgrade test too. |
|||
- DB=pgsql TASK=UPGRADE |
|||
|
|||
matrix: |
|||
# Enable fast finish. |
|||
# This will fail the build if a single job fails (except those in allow_failures). |
|||
# It will not stop the jobs from running. |
|||
fast_finish: true |
|||
|
|||
include: |
|||
# Run grunt/npm install on highest version ('node' is an alias for the latest node.js version.) |
|||
- php: 7.2 |
|||
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon' |
|||
|
|||
exclude: |
|||
# MySQL - it's just too slow. |
|||
# Exclude it on all versions except for 7.2 |
|||
|
|||
- env: DB=mysqli TASK=PHPUNIT |
|||
php: 7.1 |
|||
|
|||
cache: |
|||
directories: |
|||
- $HOME/.composer/cache |
|||
- $HOME/.npm |
|||
|
|||
install: |
|||
- > |
|||
if [ "$DB" = 'mysqli' ]; |
|||
then |
|||
sudo mkdir /mnt/ramdisk |
|||
sudo mount -t tmpfs -o size=1024m tmpfs /mnt/ramdisk |
|||
sudo stop mysql |
|||
sudo mv /var/lib/mysql /mnt/ramdisk |
|||
sudo ln -s /mnt/ramdisk/mysql /var/lib/mysql |
|||
sudo start mysql |
|||
fi |
|||
- > |
|||
if [ "$DB" = 'pgsql' ]; |
|||
then |
|||
sudo mkdir /mnt/ramdisk |
|||
sudo mount -t tmpfs -o size=1024m tmpfs /mnt/ramdisk |
|||
sudo service postgresql stop |
|||
sudo mv /var/lib/postgresql /mnt/ramdisk |
|||
sudo ln -s /mnt/ramdisk/postgresql /var/lib/postgresql |
|||
sudo service postgresql start 9.6 |
|||
fi |
|||
- > |
|||
if [ "$TASK" = 'PHPUNIT' ]; |
|||
then |
|||
if [ -n "$GITHUB_APITOKEN" ]; then |
|||
composer config github-oauth.github.com $GITHUB_APITOKEN; |
|||
echo 'auth.json' >> .git/info/exclude |
|||
fi |
|||
|
|||
# Enable Redis. |
|||
# Redis tests are currently failing on php 7.2 due to https://bugs.php.net/bug.php?id=75628 |
|||
# echo 'extension="redis.so"' > /tmp/redis.ini |
|||
# phpenv config-add /tmp/redis.ini |
|||
|
|||
# Install composer dependencies. |
|||
# We need --no-interaction in case we hit API limits for composer. This causes it to fall back to a standard clone. |
|||
# Typically it should be able to use the Composer cache if any other job has already completed before we started here. |
|||
travis_retry composer install --prefer-dist --no-interaction; |
|||
fi |
|||
|
|||
- > |
|||
if [ "$TASK" = 'GRUNT' ]; |
|||
then |
|||
nvm install $NVM_VERSION ; |
|||
nvm use $NVM_VERSION ; |
|||
fi |
|||
|
|||
before_script: |
|||
- phpenv config-rm xdebug.ini |
|||
- > |
|||
if [ "$TASK" = 'PHPUNIT' -o "$TASK" = 'UPGRADE' ]; |
|||
then |
|||
# Copy generic configuration in place. |
|||
cp config-dist.php config.php ; |
|||
|
|||
# Create the moodledata directory. |
|||
mkdir -p "$HOME"/roots/base |
|||
|
|||
# The database name and password. |
|||
sed -i \ |
|||
-e "s%= 'moodle'%= 'travis_ci_test'%" \ |
|||
-e "s%= 'password'%= ''%" \ |
|||
config.php ; |
|||
|
|||
# The wwwroot and dataroot. |
|||
sed -i \ |
|||
-e "s%http://example.com/moodle%https://localhost%" \ |
|||
-e "s%/home/example/moodledata%/home/travis/roots/base%" \ |
|||
config.php ; |
|||
|
|||
if [ "$DB" = 'pgsql' ]; |
|||
then |
|||
# Postgres-specific setup. |
|||
sed -i \ |
|||
-e "s%= 'username'%= 'postgres'%" \ |
|||
config.php ; |
|||
|
|||
psql -c 'CREATE DATABASE travis_ci_test;' -U postgres; |
|||
fi |
|||
|
|||
if [ "$DB" = 'mysqli' ]; |
|||
then |
|||
# MySQL-specific setup. |
|||
sed -i \ |
|||
-e "s%= 'pgsql'%= 'mysqli'%" \ |
|||
-e "s%= 'username'%= 'travis'%" \ |
|||
-e "s%=> 'utf8mb4_unicode_ci'%=> 'utf8mb4_bin'%" \ |
|||
config.php; |
|||
|
|||
mysql -u root -e 'SET GLOBAL innodb_file_format=barracuda;' ; |
|||
mysql -u root -e 'SET GLOBAL innodb_file_per_table=ON;' ; |
|||
mysql -u root -e 'SET GLOBAL innodb_large_prefix=ON;' ; |
|||
mysql -e 'CREATE DATABASE travis_ci_test DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_bin;' ; |
|||
fi |
|||
fi |
|||
|
|||
- > |
|||
if [ "$TASK" = 'PHPUNIT' ]; |
|||
then |
|||
# Create a directory for the phpunit dataroot. |
|||
mkdir -p "$HOME"/roots/phpunit |
|||
|
|||
# The phpunit dataroot and prefix.. |
|||
# Redis tests are currently failing on php 7.2 due to https://bugs.php.net/bug.php?id=75628 |
|||
# -e "/require_once/i \\define('TEST_SESSION_REDIS_HOST', '127.0.0.1');" \ |
|||
sed -i \ |
|||
-e "/require_once/i \\\$CFG->phpunit_dataroot = '\/home\/travis\/roots\/phpunit';" \ |
|||
-e "/require_once/i \\\$CFG->phpunit_prefix = 'p_';" \ |
|||
config.php ; |
|||
|
|||
# Initialise PHPUnit for Moodle. |
|||
php admin/tool/phpunit/cli/init.php |
|||
fi |
|||
|
|||
- > |
|||
if [ "$TASK" = 'GRUNT' ]; |
|||
then |
|||
npm install --no-spin; |
|||
npm install --no-spin -g grunt ; |
|||
fi |
|||
|
|||
######################################################################## |
|||
# CI Tests |
|||
######################################################################## |
|||
- > |
|||
if [ "$TASK" = 'CITEST' ]; |
|||
then |
|||
# Note - this is deliberately placed in the script section as we |
|||
# should not add any code until after phpunit has run. |
|||
|
|||
# The following repositories are required. |
|||
# The local_ci repository does the actual checking. |
|||
git clone https://github.com/moodlehq/moodle-local_ci.git local/ci |
|||
|
|||
# We need the official upstream for comparison |
|||
git remote add upstream https://github.com/moodle/moodle.git; |
|||
|
|||
git fetch upstream MOODLE_37_STABLE; |
|||
export GIT_PREVIOUS_COMMIT="`git merge-base FETCH_HEAD $TRAVIS_COMMIT`"; |
|||
export GIT_COMMIT="$TRAVIS_COMMIT"; |
|||
export UPSTREAM_FETCH_HEAD=`git rev-parse FETCH_HEAD` |
|||
|
|||
# Variables required by our linter. |
|||
export gitcmd=`which git`; |
|||
export gitdir="$TRAVIS_BUILD_DIR"; |
|||
export phpcmd=`which php`; |
|||
fi |
|||
|
|||
######################################################################## |
|||
# Upgrade test |
|||
######################################################################## |
|||
- > |
|||
if [ "$TASK" = 'UPGRADE' ]; |
|||
then |
|||
# We need the official upstream. |
|||
git remote add upstream https://github.com/moodle/moodle.git; |
|||
|
|||
# Checkout 30 STABLE branch (the first version compatible with PHP 7.x) |
|||
git fetch upstream MOODLE_30_STABLE; |
|||
git checkout MOODLE_30_STABLE; |
|||
|
|||
# Perform the upgrade |
|||
php admin/cli/install_database.php --agree-license --adminpass=Password --adminemail=admin@example.com --fullname="Upgrade test" --shortname=Upgrade; |
|||
|
|||
# Return to the previous commit |
|||
git checkout -; |
|||
|
|||
# Perform the upgrade |
|||
php admin/cli/upgrade.php --non-interactive --allow-unstable ; |
|||
|
|||
# The local_ci repository can be used to check upgrade savepoints. |
|||
git clone https://github.com/moodlehq/moodle-local_ci.git local/ci ; |
|||
fi |
|||
|
|||
script: |
|||
- > |
|||
if [ "$TASK" = 'PHPUNIT' ]; |
|||
then |
|||
vendor/bin/phpunit --fail-on-risky --disallow-test-output --verbose; |
|||
fi |
|||
|
|||
- > |
|||
if [ "$TASK" = 'CITEST' ]; |
|||
then |
|||
bash local/ci/php_lint/php_lint.sh; |
|||
fi |
|||
|
|||
- > |
|||
if [ "$TASK" = 'GRUNT' ]; |
|||
then |
|||
grunt ; |
|||
# Add all files to the git index and then run diff --cached to see all changes. |
|||
# This ensures that we get the status of all files, including new files. |
|||
# We ignore npm-shrinkwrap.json to make the tasks immune to npm changes. |
|||
git add . ; |
|||
git reset -- npm-shrinkwrap.json ; |
|||
git diff --cached --exit-code ; |
|||
fi |
|||
|
|||
######################################################################## |
|||
# Upgrade test |
|||
######################################################################## |
|||
- > |
|||
if [ "$TASK" = 'UPGRADE' ]; |
|||
then |
|||
cp local/ci/check_upgrade_savepoints/check_upgrade_savepoints.php ./check_upgrade_savepoints.php |
|||
result=`php check_upgrade_savepoints.php`; |
|||
# Check if there are problems |
|||
count=`echo "$result" | grep -P "ERROR|WARN" | wc -l` ; |
|||
if (($count > 0)); |
|||
then |
|||
echo "$result" |
|||
exit 1 ; |
|||
fi |
|||
fi |
@ -0,0 +1,56 @@ |
|||
CONTRIBUTING TO MOODLE |
|||
====================== |
|||
|
|||
Moodle is made by people like you. We are members of a big worldwide community |
|||
of developers, designers, teachers, testers, translators and other users. We |
|||
work in universities, schools, companies and other places. You are very welcome |
|||
to join us and contribute to the project. |
|||
|
|||
See <https://docs.moodle.org/dev/Contributing_to_Moodle> for the many ways you |
|||
can help, not only with coding. |
|||
|
|||
Moodle is open to community contributions to core, though all code must go |
|||
through peer-review, automated behaviour testing, continuous integration and |
|||
human post-integration checks. |
|||
|
|||
Pull requests |
|||
------------- |
|||
|
|||
Please do not open pull requests via Github. The repository there is just a |
|||
mirror of the official repository at <https://git.moodle.org>. Issues are |
|||
reported and patches provided via <https://tracker.moodle.org>. See below for |
|||
more information. |
|||
|
|||
Moodle core bug fixes and new features |
|||
-------------------------------------- |
|||
|
|||
During the years of intensive development, a mature process of including |
|||
submitted patches has evolved. |
|||
|
|||
* Every bug fix or new feature must have a tracker issue. |
|||
* You publish the branch implementing the fix or new feature in your public |
|||
clone of the moodle.git repository (typically on Github). |
|||
* Your patch is peer-reviewed, discussed, integrated, tested and then released |
|||
as a part of moodle.git. |
|||
* New features are developed on the master branch. Bug fixes are also |
|||
backported to currently supported maintenance (stable) branches. |
|||
|
|||
For further details, see <https://docs.moodle.org/dev/Process>. |
|||
|
|||
Moodle plugins |
|||
-------------- |
|||
|
|||
Moodle has a framework for additional plugins to extend its functionality. We |
|||
have a Moodle plugins directory <https://moodle.org/plugins/> where you can |
|||
register and maintain your plugin. Plugins hosted in the plugins directory can |
|||
be easily installed and updated via the Moodle administration interface. |
|||
|
|||
* You are expected to have a public source code repository with your plugin |
|||
code. |
|||
* After registering your plugin in the plugins directory it is reviewed before |
|||
being published. |
|||
* You are expected to continuously release updated versions of the plugin via |
|||
the plugins directory. We do not pull from your code repository; you must do |
|||
it explicitly. |
|||
|
|||
For further details, see <https://docs.moodle.org/dev/Plugin_contribution>. |
@ -0,0 +1,674 @@ |
|||
GNU GENERAL PUBLIC LICENSE |
|||
Version 3, 29 June 2007 |
|||
|
|||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
Preamble |
|||
|
|||
The GNU General Public License is a free, copyleft license for |
|||
software and other kinds of works. |
|||
|
|||
The licenses for most software and other practical works are designed |
|||
to take away your freedom to share and change the works. By contrast, |
|||
the GNU General Public License is intended to guarantee your freedom to |
|||
share and change all versions of a program--to make sure it remains free |
|||
software for all its users. We, the Free Software Foundation, use the |
|||
GNU General Public License for most of our software; it applies also to |
|||
any other work released this way by its authors. You can apply it to |
|||
your programs, too. |
|||
|
|||
When we speak of free software, we are referring to freedom, not |
|||
price. Our General Public Licenses are designed to make sure that you |
|||
have the freedom to distribute copies of free software (and charge for |
|||
them if you wish), that you receive source code or can get it if you |
|||
want it, that you can change the software or use pieces of it in new |
|||
free programs, and that you know you can do these things. |
|||
|
|||
To protect your rights, we need to prevent others from denying you |
|||
these rights or asking you to surrender the rights. Therefore, you have |
|||
certain responsibilities if you distribute copies of the software, or if |
|||
you modify it: responsibilities to respect the freedom of others. |
|||
|
|||
For example, if you distribute copies of such a program, whether |
|||
gratis or for a fee, you must pass on to the recipients the same |
|||
freedoms that you received. You must make sure that they, too, receive |
|||
or can get the source code. And you must show them these terms so they |
|||
know their rights. |
|||
|
|||
Developers that use the GNU GPL protect your rights with two steps: |
|||
(1) assert copyright on the software, and (2) offer you this License |
|||
giving you legal permission to copy, distribute and/or modify it. |
|||
|
|||
For the developers' and authors' protection, the GPL clearly explains |
|||
that there is no warranty for this free software. For both users' and |
|||
authors' sake, the GPL requires that modified versions be marked as |
|||
changed, so that their problems will not be attributed erroneously to |
|||
authors of previous versions. |
|||
|
|||
Some devices are designed to deny users access to install or run |
|||
modified versions of the software inside them, although the manufacturer |
|||
can do so. This is fundamentally incompatible with the aim of |
|||
protecting users' freedom to change the software. The systematic |
|||
pattern of such abuse occurs in the area of products for individuals to |
|||
use, which is precisely where it is most unacceptable. Therefore, we |
|||
have designed this version of the GPL to prohibit the practice for those |
|||
products. If such problems arise substantially in other domains, we |
|||
stand ready to extend this provision to those domains in future versions |
|||
of the GPL, as needed to protect the freedom of users. |
|||
|
|||
Finally, every program is threatened constantly by software patents. |
|||
States should not allow patents to restrict development and use of |
|||
software on general-purpose computers, but in those that do, we wish to |
|||
avoid the special danger that patents applied to a free program could |
|||
make it effectively proprietary. To prevent this, the GPL assures that |
|||
patents cannot be used to render the program non-free. |
|||
|
|||
The precise terms and conditions for copying, distribution and |
|||
modification follow. |
|||
|
|||
TERMS AND CONDITIONS |
|||
|
|||
0. Definitions. |
|||
|
|||
"This License" refers to version 3 of the GNU General Public License. |
|||
|
|||
"Copyright" also means copyright-like laws that apply to other kinds of |
|||
works, such as semiconductor masks. |
|||
|
|||
"The Program" refers to any copyrightable work licensed under this |
|||
License. Each licensee is addressed as "you". "Licensees" and |
|||
"recipients" may be individuals or organizations. |
|||
|
|||
To "modify" a work means to copy from or adapt all or part of the work |
|||
in a fashion requiring copyright permission, other than the making of an |
|||
exact copy. The resulting work is called a "modified version" of the |
|||
earlier work or a work "based on" the earlier work. |
|||
|
|||
A "covered work" means either the unmodified Program or a work based |
|||
on the Program. |
|||
|
|||
To "propagate" a work means to do anything with it that, without |
|||
permission, would make you directly or secondarily liable for |
|||
infringement under applicable copyright law, except executing it on a |
|||
computer or modifying a private copy. Propagation includes copying, |
|||
distribution (with or without modification), making available to the |
|||
public, and in some countries other activities as well. |
|||
|
|||
To "convey" a work means any kind of propagation that enables other |
|||
parties to make or receive copies. Mere interaction with a user through |
|||
a computer network, with no transfer of a copy, is not conveying. |
|||
|
|||
An interactive user interface displays "Appropriate Legal Notices" |
|||
to the extent that it includes a convenient and prominently visible |
|||
feature that (1) displays an appropriate copyright notice, and (2) |
|||
tells the user that there is no warranty for the work (except to the |
|||
extent that warranties are provided), that licensees may convey the |
|||
work under this License, and how to view a copy of this License. If |
|||
the interface presents a list of user commands or options, such as a |
|||
menu, a prominent item in the list meets this criterion. |
|||
|
|||
1. Source Code. |
|||
|
|||
The "source code" for a work means the preferred form of the work |
|||
for making modifications to it. "Object code" means any non-source |
|||
form of a work. |
|||
|
|||
A "Standard Interface" means an interface that either is an official |
|||
standard defined by a recognized standards body, or, in the case of |
|||
interfaces specified for a particular programming language, one that |
|||
is widely used among developers working in that language. |
|||
|
|||
The "System Libraries" of an executable work include anything, other |
|||
than the work as a whole, that (a) is included in the normal form of |
|||
packaging a Major Component, but which is not part of that Major |
|||
Component, and (b) serves only to enable use of the work with that |
|||
Major Component, or to implement a Standard Interface for which an |
|||
implementation is available to the public in source code form. A |
|||
"Major Component", in this context, means a major essential component |
|||
(kernel, window system, and so on) of the specific operating system |
|||
(if any) on which the executable work runs, or a compiler used to |
|||
produce the work, or an object code interpreter used to run it. |
|||
|
|||
The "Corresponding Source" for a work in object code form means all |
|||
the source code needed to generate, install, and (for an executable |
|||
work) run the object code and to modify the work, including scripts to |
|||
control those activities. However, it does not include the work's |
|||
System Libraries, or general-purpose tools or generally available free |
|||
programs which are used unmodified in performing those activities but |
|||
which are not part of the work. For example, Corresponding Source |
|||
includes interface definition files associated with source files for |
|||
the work, and the source code for shared libraries and dynamically |
|||
linked subprograms that the work is specifically designed to require, |
|||
such as by intimate data communication or control flow between those |
|||
subprograms and other parts of the work. |
|||
|
|||
The Corresponding Source need not include anything that users |
|||
can regenerate automatically from other parts of the Corresponding |
|||
Source. |
|||
|
|||
The Corresponding Source for a work in source code form is that |
|||
same work. |
|||
|
|||
2. Basic Permissions. |
|||
|
|||
All rights granted under this License are granted for the term of |
|||
copyright on the Program, and are irrevocable provided the stated |
|||
conditions are met. This License explicitly affirms your unlimited |
|||
permission to run the unmodified Program. The output from running a |
|||
covered work is covered by this License only if the output, given its |
|||
content, constitutes a covered work. This License acknowledges your |
|||
rights of fair use or other equivalent, as provided by copyright law. |
|||
|
|||
You may make, run and propagate covered works that you do not |
|||
convey, without conditions so long as your license otherwise remains |
|||
in force. You may convey covered works to others for the sole purpose |
|||
of having them make modifications exclusively for you, or provide you |
|||
with facilities for running those works, provided that you comply with |
|||
the terms of this License in conveying all material for which you do |
|||
not control copyright. Those thus making or running the covered works |
|||
for you must do so exclusively on your behalf, under your direction |
|||
and control, on terms that prohibit them from making any copies of |
|||
your copyrighted material outside their relationship with you. |
|||
|
|||
Conveying under any other circumstances is permitted solely under |
|||
the conditions stated below. Sublicensing is not allowed; section 10 |
|||
makes it unnecessary. |
|||
|
|||
3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
|||
|
|||
No covered work shall be deemed part of an effective technological |
|||
measure under any applicable law fulfilling obligations under article |
|||
11 of the WIPO copyright treaty adopted on 20 December 1996, or |
|||
similar laws prohibiting or restricting circumvention of such |
|||
measures. |
|||
|
|||
When you convey a covered work, you waive any legal power to forbid |
|||
circumvention of technological measures to the extent such circumvention |
|||
is effected by exercising rights under this License with respect to |
|||
the covered work, and you disclaim any intention to limit operation or |
|||
modification of the work as a means of enforcing, against the work's |
|||
users, your or third parties' legal rights to forbid circumvention of |
|||
technological measures. |
|||
|
|||
4. Conveying Verbatim Copies. |
|||
|
|||
You may convey verbatim copies of the Program's source code as you |
|||
receive it, in any medium, provided that you conspicuously and |
|||
appropriately publish on each copy an appropriate copyright notice; |
|||
keep intact all notices stating that this License and any |
|||
non-permissive terms added in accord with section 7 apply to the code; |
|||
keep intact all notices of the absence of any warranty; and give all |
|||
recipients a copy of this License along with the Program. |
|||
|
|||
You may charge any price or no price for each copy that you convey, |
|||
and you may offer support or warranty protection for a fee. |
|||
|
|||
5. Conveying Modified Source Versions. |
|||
|
|||
You may convey a work based on the Program, or the modifications to |
|||
produce it from the Program, in the form of source code under the |
|||
terms of section 4, provided that you also meet all of these conditions: |
|||
|
|||
a) The work must carry prominent notices stating that you modified |
|||
it, and giving a relevant date. |
|||
|
|||
b) The work must carry prominent notices stating that it is |
|||
released under this License and any conditions added under section |
|||
7. This requirement modifies the requirement in section 4 to |
|||
"keep intact all notices". |
|||
|
|||
c) You must license the entire work, as a whole, under this |
|||
License to anyone who comes into possession of a copy. This |
|||
License will therefore apply, along with any applicable section 7 |
|||
additional terms, to the whole of the work, and all its parts, |
|||
regardless of how they are packaged. This License gives no |
|||
permission to license the work in any other way, but it does not |
|||
invalidate such permission if you have separately received it. |
|||
|
|||
d) If the work has interactive user interfaces, each must display |
|||
Appropriate Legal Notices; however, if the Program has interactive |
|||
interfaces that do not display Appropriate Legal Notices, your |
|||
work need not make them do so. |
|||
|
|||
A compilation of a covered work with other separate and independent |
|||
works, which are not by their nature extensions of the covered work, |
|||
and which are not combined with it such as to form a larger program, |
|||
in or on a volume of a storage or distribution medium, is called an |
|||
"aggregate" if the compilation and its resulting copyright are not |
|||
used to limit the access or legal rights of the compilation's users |
|||
beyond what the individual works permit. Inclusion of a covered work |
|||
in an aggregate does not cause this License to apply to the other |
|||
parts of the aggregate. |
|||
|
|||
6. Conveying Non-Source Forms. |
|||
|
|||
You may convey a covered work in object code form under the terms |
|||
of sections 4 and 5, provided that you also convey the |
|||
machine-readable Corresponding Source under the terms of this License, |
|||
in one of these ways: |
|||
|
|||
a) Convey the object code in, or embodied in, a physical product |
|||
(including a physical distribution medium), accompanied by the |
|||
Corresponding Source fixed on a durable physical medium |
|||
customarily used for software interchange. |
|||
|
|||
b) Convey the object code in, or embodied in, a physical product |
|||
(including a physical distribution medium), accompanied by a |
|||
written offer, valid for at least three years and valid for as |
|||
long as you offer spare parts or customer support for that product |
|||
model, to give anyone who possesses the object code either (1) a |
|||
copy of the Corresponding Source for all the software in the |
|||
product that is covered by this License, on a durable physical |
|||
medium customarily used for software interchange, for a price no |
|||
more than your reasonable cost of physically performing this |
|||
conveying of source, or (2) access to copy the |
|||
Corresponding Source from a network server at no charge. |
|||
|
|||
c) Convey individual copies of the object code with a copy of the |
|||
written offer to provide the Corresponding Source. This |
|||
alternative is allowed only occasionally and noncommercially, and |
|||
only if you received the object code with such an offer, in accord |
|||
with subsection 6b. |
|||
|
|||
d) Convey the object code by offering access from a designated |
|||
place (gratis or for a charge), and offer equivalent access to the |
|||
Corresponding Source in the same way through the same place at no |
|||
further charge. You need not require recipients to copy the |
|||
Corresponding Source along with the object code. If the place to |
|||
copy the object code is a network server, the Corresponding Source |
|||
may be on a different server (operated by you or a third party) |
|||
that supports equivalent copying facilities, provided you maintain |
|||
clear directions next to the object code saying where to find the |
|||
Corresponding Source. Regardless of what server hosts the |
|||
Corresponding Source, you remain obligated to ensure that it is |
|||
available for as long as needed to satisfy these requirements. |
|||
|
|||
e) Convey the object code using peer-to-peer transmission, provided |
|||
you inform other peers where the object code and Corresponding |
|||
Source of the work are being offered to the general public at no |
|||
charge under subsection 6d. |
|||
|
|||
A separable portion of the object code, whose source code is excluded |
|||
from the Corresponding Source as a System Library, need not be |
|||
included in conveying the object code work. |
|||
|
|||
A "User Product" is either (1) a "consumer product", which means any |
|||
tangible personal property which is normally used for personal, family, |
|||
or household purposes, or (2) anything designed or sold for incorporation |
|||
into a dwelling. In determining whether a product is a consumer product, |
|||
doubtful cases shall be resolved in favor of coverage. For a particular |
|||
product received by a particular user, "normally used" refers to a |
|||
typical or common use of that class of product, regardless of the status |
|||
of the particular user or of the way in which the particular user |
|||
actually uses, or expects or is expected to use, the product. A product |
|||
is a consumer product regardless of whether the product has substantial |
|||
commercial, industrial or non-consumer uses, unless such uses represent |
|||
the only significant mode of use of the product. |
|||
|
|||
"Installation Information" for a User Product means any methods, |
|||
procedures, authorization keys, or other information required to install |
|||
and execute modified versions of a covered work in that User Product from |
|||
a modified version of its Corresponding Source. The information must |
|||
suffice to ensure that the continued functioning of the modified object |
|||
code is in no case prevented or interfered with solely because |
|||
modification has been made. |
|||
|
|||
If you convey an object code work under this section in, or with, or |
|||
specifically for use in, a User Product, and the conveying occurs as |
|||
part of a transaction in which the right of possession and use of the |
|||
User Product is transferred to the recipient in perpetuity or for a |
|||
fixed term (regardless of how the transaction is characterized), the |
|||
Corresponding Source conveyed under this section must be accompanied |
|||
by the Installation Information. But this requirement does not apply |
|||
if neither you nor any third party retains the ability to install |
|||
modified object code on the User Product (for example, the work has |
|||
been installed in ROM). |
|||
|
|||
The requirement to provide Installation Information does not include a |
|||
requirement to continue to provide support service, warranty, or updates |
|||
for a work that has been modified or installed by the recipient, or for |
|||
the User Product in which it has been modified or installed. Access to a |
|||
network may be denied when the modification itself materially and |
|||
adversely affects the operation of the network or violates the rules and |
|||
protocols for communication across the network. |
|||
|
|||
Corresponding Source conveyed, and Installation Information provided, |
|||
in accord with this section must be in a format that is publicly |
|||
documented (and with an implementation available to the public in |
|||
source code form), and must require no special password or key for |
|||
unpacking, reading or copying. |
|||
|
|||
7. Additional Terms. |
|||
|
|||
"Additional permissions" are terms that supplement the terms of this |
|||
License by making exceptions from one or more of its conditions. |
|||
Additional permissions that are applicable to the entire Program shall |
|||
be treated as though they were included in this License, to the extent |
|||
that they are valid under applicable law. If additional permissions |
|||
apply only to part of the Program, that part may be used separately |
|||
under those permissions, but the entire Program remains governed by |
|||
this License without regard to the additional permissions. |
|||
|
|||
When you convey a copy of a covered work, you may at your option |
|||
remove any additional permissions from that copy, or from any part of |
|||
it. (Additional permissions may be written to require their own |
|||
removal in certain cases when you modify the work.) You may place |
|||
additional permissions on material, added by you to a covered work, |
|||
for which you have or can give appropriate copyright permission. |
|||
|
|||
Notwithstanding any other provision of this License, for material you |
|||
add to a covered work, you may (if authorized by the copyright holders of |
|||
that material) supplement the terms of this License with terms: |
|||
|
|||
a) Disclaiming warranty or limiting liability differently from the |
|||
terms of sections 15 and 16 of this License; or |
|||
|
|||
b) Requiring preservation of specified reasonable legal notices or |
|||
author attributions in that material or in the Appropriate Legal |
|||
Notices displayed by works containing it; or |
|||
|
|||
c) Prohibiting misrepresentation of the origin of that material, or |
|||
requiring that modified versions of such material be marked in |
|||
reasonable ways as different from the original version; or |
|||
|
|||
d) Limiting the use for publicity purposes of names of licensors or |
|||
authors of the material; or |
|||
|
|||
e) Declining to grant rights under trademark law for use of some |
|||
trade names, trademarks, or service marks; or |
|||
|
|||
f) Requiring indemnification of licensors and authors of that |
|||
material by anyone who conveys the material (or modified versions of |
|||
it) with contractual assumptions of liability to the recipient, for |
|||
any liability that these contractual assumptions directly impose on |
|||
those licensors and authors. |
|||
|
|||
All other non-permissive additional terms are considered "further |
|||
restrictions" within the meaning of section 10. If the Program as you |
|||
received it, or any part of it, contains a notice stating that it is |
|||
governed by this License along with a term that is a further |
|||
restriction, you may remove that term. If a license document contains |
|||
a further restriction but permits relicensing or conveying under this |
|||
License, you may add to a covered work material governed by the terms |
|||
of that license document, provided that the further restriction does |
|||
not survive such relicensing or conveying. |
|||
|
|||
If you add terms to a covered work in accord with this section, you |
|||
must place, in the relevant source files, a statement of the |
|||
additional terms that apply to those files, or a notice indicating |
|||
where to find the applicable terms. |
|||
|
|||
Additional terms, permissive or non-permissive, may be stated in the |
|||
form of a separately written license, or stated as exceptions; |
|||
the above requirements apply either way. |
|||
|
|||
8. Termination. |
|||
|
|||
You may not propagate or modify a covered work except as expressly |
|||
provided under this License. Any attempt otherwise to propagate or |
|||
modify it is void, and will automatically terminate your rights under |
|||
this License (including any patent licenses granted under the third |
|||
paragraph of section 11). |
|||
|
|||
However, if you cease all violation of this License, then your |
|||
license from a particular copyright holder is reinstated (a) |
|||
provisionally, unless and until the copyright holder explicitly and |
|||
finally terminates your license, and (b) permanently, if the copyright |
|||
holder fails to notify you of the violation by some reasonable means |
|||
prior to 60 days after the cessation. |
|||
|
|||
Moreover, your license from a particular copyright holder is |
|||
reinstated permanently if the copyright holder notifies you of the |
|||
violation by some reasonable means, this is the first time you have |
|||
received notice of violation of this License (for any work) from that |
|||
copyright holder, and you cure the violation prior to 30 days after |
|||
your receipt of the notice. |
|||
|
|||
Termination of your rights under this section does not terminate the |
|||
licenses of parties who have received copies or rights from you under |
|||
this License. If your rights have been terminated and not permanently |
|||
reinstated, you do not qualify to receive new licenses for the same |
|||
material under section 10. |
|||
|
|||
9. Acceptance Not Required for Having Copies. |
|||
|
|||
You are not required to accept this License in order to receive or |
|||
run a copy of the Program. Ancillary propagation of a covered work |
|||
occurring solely as a consequence of using peer-to-peer transmission |
|||
to receive a copy likewise does not require acceptance. However, |
|||
nothing other than this License grants you permission to propagate or |
|||
modify any covered work. These actions infringe copyright if you do |
|||
not accept this License. Therefore, by modifying or propagating a |
|||
covered work, you indicate your acceptance of this License to do so. |
|||
|
|||
10. Automatic Licensing of Downstream Recipients. |
|||
|
|||
Each time you convey a covered work, the recipient automatically |
|||
receives a license from the original licensors, to run, modify and |
|||
propagate that work, subject to this License. You are not responsible |
|||
for enforcing compliance by third parties with this License. |
|||
|
|||
An "entity transaction" is a transaction transferring control of an |
|||
organization, or substantially all assets of one, or subdividing an |
|||
organization, or merging organizations. If propagation of a covered |
|||
work results from an entity transaction, each party to that |
|||
transaction who receives a copy of the work also receives whatever |
|||
licenses to the work the party's predecessor in interest had or could |
|||
give under the previous paragraph, plus a right to possession of the |
|||
Corresponding Source of the work from the predecessor in interest, if |
|||
the predecessor has it or can get it with reasonable efforts. |
|||
|
|||
You may not impose any further restrictions on the exercise of the |
|||
rights granted or affirmed under this License. For example, you may |
|||
not impose a license fee, royalty, or other charge for exercise of |
|||
rights granted under this License, and you may not initiate litigation |
|||
(including a cross-claim or counterclaim in a lawsuit) alleging that |
|||
any patent claim is infringed by making, using, selling, offering for |
|||
sale, or importing the Program or any portion of it. |
|||
|
|||
11. Patents. |
|||
|
|||
A "contributor" is a copyright holder who authorizes use under this |
|||
License of the Program or a work on which the Program is based. The |
|||
work thus licensed is called the contributor's "contributor version". |
|||
|
|||
A contributor's "essential patent claims" are all patent claims |
|||
owned or controlled by the contributor, whether already acquired or |
|||
hereafter acquired, that would be infringed by some manner, permitted |
|||
by this License, of making, using, or selling its contributor version, |
|||
but do not include claims that would be infringed only as a |
|||
consequence of further modification of the contributor version. For |
|||
purposes of this definition, "control" includes the right to grant |
|||
patent sublicenses in a manner consistent with the requirements of |
|||
this License. |
|||
|
|||
Each contributor grants you a non-exclusive, worldwide, royalty-free |
|||
patent license under the contributor's essential patent claims, to |
|||
make, use, sell, offer for sale, import and otherwise run, modify and |
|||
propagate the contents of its contributor version. |
|||
|
|||
In the following three paragraphs, a "patent license" is any express |
|||
agreement or commitment, however denominated, not to enforce a patent |
|||
(such as an express permission to practice a patent or covenant not to |
|||
sue for patent infringement). To "grant" such a patent license to a |
|||
party means to make such an agreement or commitment not to enforce a |
|||
patent against the party. |
|||
|
|||
If you convey a covered work, knowingly relying on a patent license, |
|||
and the Corresponding Source of the work is not available for anyone |
|||
to copy, free of charge and under the terms of this License, through a |
|||
publicly available network server or other readily accessible means, |
|||
then you must either (1) cause the Corresponding Source to be so |
|||
available, or (2) arrange to deprive yourself of the benefit of the |
|||
patent license for this particular work, or (3) arrange, in a manner |
|||
consistent with the requirements of this License, to extend the patent |
|||
license to downstream recipients. "Knowingly relying" means you have |
|||
actual knowledge that, but for the patent license, your conveying the |
|||
covered work in a country, or your recipient's use of the covered work |
|||
in a country, would infringe one or more identifiable patents in that |
|||
country that you have reason to believe are valid. |
|||
|
|||
If, pursuant to or in connection with a single transaction or |
|||
arrangement, you convey, or propagate by procuring conveyance of, a |
|||
covered work, and grant a patent license to some of the parties |
|||
receiving the covered work authorizing them to use, propagate, modify |
|||
or convey a specific copy of the covered work, then the patent license |
|||
you grant is automatically extended to all recipients of the covered |
|||
work and works based on it. |
|||
|
|||
A patent license is "discriminatory" if it does not include within |
|||
the scope of its coverage, prohibits the exercise of, or is |
|||
conditioned on the non-exercise of one or more of the rights that are |
|||
specifically granted under this License. You may not convey a covered |
|||
work if you are a party to an arrangement with a third party that is |
|||
in the business of distributing software, under which you make payment |
|||
to the third party based on the extent of your activity of conveying |
|||
the work, and under which the third party grants, to any of the |
|||
parties who would receive the covered work from you, a discriminatory |
|||
patent license (a) in connection with copies of the covered work |
|||
conveyed by you (or copies made from those copies), or (b) primarily |
|||
for and in connection with specific products or compilations that |
|||
contain the covered work, unless you entered into that arrangement, |
|||
or that patent license was granted, prior to 28 March 2007. |
|||
|
|||
Nothing in this License shall be construed as excluding or limiting |
|||
any implied license or other defenses to infringement that may |
|||
otherwise be available to you under applicable patent law. |
|||
|
|||
12. No Surrender of Others' Freedom. |
|||
|
|||
If conditions are imposed on you (whether by court order, agreement or |
|||
otherwise) that contradict the conditions of this License, they do not |
|||
excuse you from the conditions of this License. If you cannot convey a |
|||
covered work so as to satisfy simultaneously your obligations under this |
|||
License and any other pertinent obligations, then as a consequence you may |
|||
not convey it at all. For example, if you agree to terms that obligate you |
|||
to collect a royalty for further conveying from those to whom you convey |
|||
the Program, the only way you could satisfy both those terms and this |
|||
License would be to refrain entirely from conveying the Program. |
|||
|
|||
13. Use with the GNU Affero General Public License. |
|||
|
|||
Notwithstanding any other provision of this License, you have |
|||
permission to link or combine any covered work with a work licensed |
|||
under version 3 of the GNU Affero General Public License into a single |
|||
combined work, and to convey the resulting work. The terms of this |
|||
License will continue to apply to the part which is the covered work, |
|||
but the special requirements of the GNU Affero General Public License, |
|||
section 13, concerning interaction through a network will apply to the |
|||
combination as such. |
|||
|
|||
14. Revised Versions of this License. |
|||
|
|||
The Free Software Foundation may publish revised and/or new versions of |
|||
the GNU General Public License from time to time. Such new versions will |
|||
be similar in spirit to the present version, but may differ in detail to |
|||
address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the |
|||
Program specifies that a certain numbered version of the GNU General |
|||
Public License "or any later version" applies to it, you have the |
|||
option of following the terms and conditions either of that numbered |
|||
version or of any later version published by the Free Software |
|||
Foundation. If the Program does not specify a version number of the |
|||
GNU General Public License, you may choose any version ever published |
|||
by the Free Software Foundation. |
|||
|
|||
If the Program specifies that a proxy can decide which future |
|||
versions of the GNU General Public License can be used, that proxy's |
|||
public statement of acceptance of a version permanently authorizes you |
|||
to choose that version for the Program. |
|||
|
|||
Later license versions may give you additional or different |
|||
permissions. However, no additional obligations are imposed on any |
|||
author or copyright holder as a result of your choosing to follow a |
|||
later version. |
|||
|
|||
15. Disclaimer of Warranty. |
|||
|
|||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
|||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
|||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
|||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
|||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
|||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
|||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
|||
|
|||
16. Limitation of Liability. |
|||
|
|||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
|||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
|||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
|||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
|||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
|||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
|||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
|||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
|||
SUCH DAMAGES. |
|||
|
|||
17. Interpretation of Sections 15 and 16. |
|||
|
|||
If the disclaimer of warranty and limitation of liability provided |
|||
above cannot be given local legal effect according to their terms, |
|||
reviewing courts shall apply local law that most closely approximates |
|||
an absolute waiver of all civil liability in connection with the |
|||
Program, unless a warranty or assumption of liability accompanies a |
|||
copy of the Program in return for a fee. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
How to Apply These Terms to Your New Programs |
|||
|
|||
If you develop a new program, and you want it to be of the greatest |
|||
possible use to the public, the best way to achieve this is to make it |
|||
free software which everyone can redistribute and change under these terms. |
|||
|
|||
To do so, attach the following notices to the program. It is safest |
|||
to attach them to the start of each source file to most effectively |
|||
state the exclusion of warranty; and each file should have at least |
|||
the "copyright" line and a pointer to where the full notice is found. |
|||
|
|||
<one line to give the program's name and a brief idea of what it does.> |
|||
Copyright (C) <year> <name of author> |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program 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 this program. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
Also add information on how to contact you by electronic and paper mail. |
|||
|
|||
If the program does terminal interaction, make it output a short |
|||
notice like this when it starts in an interactive mode: |
|||
|
|||
<program> Copyright (C) <year> <name of author> |
|||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
|||
This is free software, and you are welcome to redistribute it |
|||
under certain conditions; type `show c' for details. |
|||
|
|||
The hypothetical commands `show w' and `show c' should show the appropriate |
|||
parts of the General Public License. Of course, your program's commands |
|||
might be different; for a GUI interface, you would use an "about box". |
|||
|
|||
You should also get your employer (if you work as a programmer) or school, |
|||
if any, to sign a "copyright disclaimer" for the program, if necessary. |
|||
For more information on this, and how to apply and follow the GNU GPL, see |
|||
<http://www.gnu.org/licenses/>. |
|||
|
|||
The GNU General Public License does not permit incorporating your program |
|||
into proprietary programs. If your program is a subroutine library, you |
|||
may consider it more useful to permit linking proprietary applications with |
|||
the library. If this is what you want to do, use the GNU Lesser General |
|||
Public License instead of this License. But first, please read |
|||
<http://www.gnu.org/philosophy/why-not-lgpl.html>. |
@ -0,0 +1,367 @@ |
|||
// 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/>.
|
|||
/* jshint node: true, browser: false */ |
|||
/* eslint-env node */ |
|||
|
|||
/** |
|||
* @copyright 2014 Andrew Nicols |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|||
*/ |
|||
|
|||
/** |
|||
* Grunt configuration |
|||
*/ |
|||
|
|||
module.exports = function(grunt) { |
|||
var path = require('path'), |
|||
tasks = {}, |
|||
cwd = process.env.PWD || process.cwd(), |
|||
async = require('async'), |
|||
DOMParser = require('xmldom').DOMParser, |
|||
xpath = require('xpath'), |
|||
semver = require('semver'); |
|||
|
|||
// Verify the node version is new enough.
|
|||
var expected = semver.validRange(grunt.file.readJSON('package.json').engines.node); |
|||
var actual = semver.valid(process.version); |
|||
if (!semver.satisfies(actual, expected)) { |
|||
grunt.fail.fatal('Node version not satisfied. Require ' + expected + ', version installed: ' + actual); |
|||
} |
|||
|
|||
// Windows users can't run grunt in a subdirectory, so allow them to set
|
|||
// the root by passing --root=path/to/dir.
|
|||
if (grunt.option('root')) { |
|||
var root = grunt.option('root'); |
|||
if (grunt.file.exists(__dirname, root)) { |
|||
cwd = path.join(__dirname, root); |
|||
grunt.log.ok('Setting root to ' + cwd); |
|||
} else { |
|||
grunt.fail.fatal('Setting root to ' + root + ' failed - path does not exist'); |
|||
} |
|||
} |
|||
|
|||
var inAMD = path.basename(cwd) == 'amd'; |
|||
|
|||
// Globbing pattern for matching all AMD JS source files.
|
|||
var amdSrc = [inAMD ? cwd + '/src/*.js' : '**/amd/src/*.js']; |
|||
|
|||
/** |
|||
* Function to generate the destination for the uglify task |
|||
* (e.g. build/file.min.js). This function will be passed to |
|||
* the rename property of files array when building dynamically: |
|||
* http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically
|
|||
* |
|||
* @param {String} destPath the current destination |
|||
* @param {String} srcPath the matched src path |
|||
* @return {String} The rewritten destination path. |
|||
*/ |
|||
var uglifyRename = function(destPath, srcPath) { |
|||
destPath = srcPath.replace('src', 'build'); |
|||
destPath = destPath.replace('.js', '.min.js'); |
|||
destPath = path.resolve(cwd, destPath); |
|||
return destPath; |
|||
}; |
|||
|
|||
/** |
|||
* Find thirdpartylibs.xml and generate an array of paths contained within |
|||
* them (used to generate ignore files and so on). |
|||
* |
|||
* @return {array} The list of thirdparty paths. |
|||
*/ |
|||
var getThirdPartyPathsFromXML = function() { |
|||
var thirdpartyfiles = grunt.file.expand('*/**/thirdpartylibs.xml'); |
|||
var libs = ['node_modules/', 'vendor/']; |
|||
|
|||
thirdpartyfiles.forEach(function(file) { |
|||
var dirname = path.dirname(file); |
|||
|
|||
var doc = new DOMParser().parseFromString(grunt.file.read(file)); |
|||
var nodes = xpath.select("/libraries/library/location/text()", doc); |
|||
|
|||
nodes.forEach(function(node) { |
|||
var lib = path.join(dirname, node.toString()); |
|||
if (grunt.file.isDir(lib)) { |
|||
// Ensure trailing slash on dirs.
|
|||
lib = lib.replace(/\/?$/, '/'); |
|||
} |
|||
|
|||
// Look for duplicate paths before adding to array.
|
|||
if (libs.indexOf(lib) === -1) { |
|||
libs.push(lib); |
|||
} |
|||
}); |
|||
}); |
|||
return libs; |
|||
}; |
|||
|
|||
// Project configuration.
|
|||
grunt.initConfig({ |
|||
eslint: { |
|||
// Even though warnings dont stop the build we don't display warnings by default because
|
|||
// at this moment we've got too many core warnings.
|
|||
options: {quiet: !grunt.option('show-lint-warnings')}, |
|||
amd: {src: amdSrc}, |
|||
// Check YUI module source files.
|
|||
yui: {src: ['**/yui/src/**/*.js', '!*/**/yui/src/*/meta/*.js']} |
|||
}, |
|||
uglify: { |
|||
amd: { |
|||
files: [{ |
|||
expand: true, |
|||
src: amdSrc, |
|||
rename: uglifyRename |
|||
}], |
|||
options: {report: 'none'} |
|||
} |
|||
}, |
|||
sass: { |
|||
dist: { |
|||
files: { |
|||
"theme/boost/style/moodle.css": "theme/boost/scss/preset/default.scss", |
|||
"theme/classic/style/moodle.css": "theme/classic/scss/classicgrunt.scss" |
|||
} |
|||
}, |
|||
options: { |
|||
includePaths: ["theme/boost/scss/", "theme/classic/scss/"] |
|||
} |
|||
}, |
|||
watch: { |
|||
options: { |
|||
nospawn: true // We need not to spawn so config can be changed dynamically.
|
|||
}, |
|||
amd: { |
|||
files: ['**/amd/src/**/*.js'], |
|||
tasks: ['amd'] |
|||
}, |
|||
yui: { |
|||
files: ['**/yui/src/**/*.js'], |
|||
tasks: ['yui'] |
|||
}, |
|||
gherkinlint: { |
|||
files: ['**/tests/behat/*.feature'], |
|||
tasks: ['gherkinlint'] |
|||
} |
|||
}, |
|||
shifter: { |
|||
options: { |
|||
recursive: true, |
|||
paths: [cwd] |
|||
} |
|||
}, |
|||
gherkinlint: { |
|||
options: { |
|||
files: ['**/tests/behat/*.feature'], |
|||
} |
|||
}, |
|||
stylelint: { |
|||
scss: { |
|||
options: {syntax: 'scss'}, |
|||
src: ['*/**/*.scss'] |
|||
}, |
|||
css: { |
|||
src: ['*/**/*.css'], |
|||
options: { |
|||
configOverrides: { |
|||
rules: { |
|||
// These rules have to be disabled in .stylelintrc for scss compat.
|
|||
"at-rule-no-unknown": true, |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
|
|||
/** |
|||
* Generate ignore files (utilising thirdpartylibs.xml data) |
|||
*/ |
|||
tasks.ignorefiles = function() { |
|||
// An array of paths to third party directories.
|
|||
var thirdPartyPaths = getThirdPartyPathsFromXML(); |
|||
// Generate .eslintignore.
|
|||
var eslintIgnores = ['# Generated by "grunt ignorefiles"', '*/**/yui/src/*/meta/', '*/**/build/'].concat(thirdPartyPaths); |
|||
grunt.file.write('.eslintignore', eslintIgnores.join('\n')); |
|||
// Generate .stylelintignore.
|
|||
var stylelintIgnores = [ |
|||
'# Generated by "grunt ignorefiles"', |
|||
'**/yui/build/*', |
|||
'theme/boost/style/moodle.css', |
|||
'theme/classic/style/moodle.css', |
|||
].concat(thirdPartyPaths); |
|||
grunt.file.write('.stylelintignore', stylelintIgnores.join('\n')); |
|||
}; |
|||
|
|||
/** |
|||
* Shifter task. Is configured with a path to a specific file or a directory, |
|||
* in the case of a specific file it will work out the right module to be built. |
|||
* |
|||
* Note that this task runs the invidiaul shifter jobs async (becase it spawns |
|||
* so be careful to to call done(). |
|||
*/ |
|||
tasks.shifter = function() { |
|||
var done = this.async(), |
|||
options = grunt.config('shifter.options'); |
|||
|
|||
// Run the shifter processes one at a time to avoid confusing output.
|
|||
async.eachSeries(options.paths, function(src, filedone) { |
|||
var args = []; |
|||
args.push(path.normalize(__dirname + '/node_modules/shifter/bin/shifter')); |
|||
|
|||
// Always ignore the node_modules directory.
|
|||
args.push('--excludes', 'node_modules'); |
|||
|
|||
// Determine the most appropriate options to run with based upon the current location.
|
|||
if (grunt.file.isMatch('**/yui/**/*.js', src)) { |
|||
// When passed a JS file, build our containing module (this happen with
|
|||
// watch).
|
|||
grunt.log.debug('Shifter passed a specific JS file'); |
|||
src = path.dirname(path.dirname(src)); |
|||
options.recursive = false; |
|||
} else if (grunt.file.isMatch('**/yui/src', src)) { |
|||
// When in a src directory --walk all modules.
|
|||
grunt.log.debug('In a src directory'); |
|||
args.push('--walk'); |
|||
options.recursive = false; |
|||
} else if (grunt.file.isMatch('**/yui/src/*', src)) { |
|||
// When in module, only build our module.
|
|||
grunt.log.debug('In a module directory'); |
|||
options.recursive = false; |
|||
} else if (grunt.file.isMatch('**/yui/src/*/js', src)) { |
|||
// When in module src, only build our module.
|
|||
grunt.log.debug('In a source directory'); |
|||
src = path.dirname(src); |
|||
options.recursive = false; |
|||
} |
|||
|
|||
if (grunt.option('watch')) { |
|||
grunt.fail.fatal('The --watch option has been removed, please use `grunt watch` instead'); |
|||
} |
|||
|
|||
// Add the stderr option if appropriate
|
|||
if (grunt.option('verbose')) { |
|||
args.push('--lint-stderr'); |
|||
} |
|||
|
|||
if (grunt.option('no-color')) { |
|||
args.push('--color=false'); |
|||
} |
|||
|
|||
var execShifter = function() { |
|||
|
|||
grunt.log.ok("Running shifter on " + src); |
|||
grunt.util.spawn({ |
|||
cmd: "node", |
|||
args: args, |
|||
opts: {cwd: src, stdio: 'inherit', env: process.env} |
|||
}, function(error, result, code) { |
|||
if (code) { |
|||
grunt.fail.fatal('Shifter failed with code: ' + code); |
|||
} else { |
|||
grunt.log.ok('Shifter build complete.'); |
|||
filedone(); |
|||
} |
|||
}); |
|||
}; |
|||
|
|||
// Actually run shifter.
|
|||
if (!options.recursive) { |
|||
execShifter(); |
|||
} else { |
|||
// Check that there are yui modules otherwise shifter ends with exit code 1.
|
|||
if (grunt.file.expand({cwd: src}, '**/yui/src/**/*.js').length > 0) { |
|||
args.push('--recursive'); |
|||
execShifter(); |
|||
} else { |
|||
grunt.log.ok('No YUI modules to build.'); |
|||
filedone(); |
|||
} |
|||
} |
|||
}, done); |
|||
}; |
|||
|
|||
tasks.gherkinlint = function() { |
|||
var done = this.async(), |
|||
options = grunt.config('gherkinlint.options'); |
|||
|
|||
var args = grunt.file.expand(options.files); |
|||
args.unshift(path.normalize(__dirname + '/node_modules/.bin/gherkin-lint')); |
|||
grunt.util.spawn({ |
|||
cmd: 'node', |
|||
args: args, |
|||
opts: {stdio: 'inherit', env: process.env} |
|||
}, function(error, result, code) { |
|||
// Propagate the exit code.
|
|||
done(code === 0); |
|||
}); |
|||
}; |
|||
|
|||
tasks.startup = function() { |
|||
// Are we in a YUI directory?
|
|||
if (path.basename(path.resolve(cwd, '../../')) == 'yui') { |
|||
grunt.task.run('yui'); |
|||
// Are we in an AMD directory?
|
|||
} else if (inAMD) { |
|||
grunt.task.run('amd'); |
|||
} else { |
|||
// Run them all!.
|
|||
grunt.task.run('css'); |
|||
grunt.task.run('js'); |
|||
grunt.task.run('gherkinlint'); |
|||
} |
|||
}; |
|||
|
|||
// On watch, we dynamically modify config to build only affected files. This
|
|||
// method is slightly complicated to deal with multiple changed files at once (copied
|
|||
// from the grunt-contrib-watch readme).
|
|||
var changedFiles = Object.create(null); |
|||
var onChange = grunt.util._.debounce(function() { |
|||
var files = Object.keys(changedFiles); |
|||
grunt.config('eslint.amd.src', files); |
|||
grunt.config('eslint.yui.src', files); |
|||
grunt.config('uglify.amd.files', [{expand: true, src: files, rename: uglifyRename}]); |
|||
grunt.config('shifter.options.paths', files); |
|||
grunt.config('gherkinlint.options.files', files); |
|||
changedFiles = Object.create(null); |
|||
}, 200); |
|||
|
|||
grunt.event.on('watch', function(action, filepath) { |
|||
changedFiles[filepath] = action; |
|||
onChange(); |
|||
}); |
|||
|
|||
// Register NPM tasks.
|
|||
grunt.loadNpmTasks('grunt-contrib-uglify'); |
|||
grunt.loadNpmTasks('grunt-contrib-watch'); |
|||
grunt.loadNpmTasks('grunt-sass'); |
|||
grunt.loadNpmTasks('grunt-eslint'); |
|||
grunt.loadNpmTasks('grunt-stylelint'); |
|||
|
|||
// Register JS tasks.
|
|||
grunt.registerTask('shifter', 'Run Shifter against the current directory', tasks.shifter); |
|||
grunt.registerTask('gherkinlint', 'Run gherkinlint against the current directory', tasks.gherkinlint); |
|||
grunt.registerTask('ignorefiles', 'Generate ignore files for linters', tasks.ignorefiles); |
|||
grunt.registerTask('yui', ['eslint:yui', 'shifter']); |
|||
grunt.registerTask('amd', ['eslint:amd', 'uglify']); |
|||
grunt.registerTask('js', ['amd', 'yui']); |
|||
|
|||
// Register CSS taks.
|
|||
grunt.registerTask('css', ['stylelint:scss', 'sass', 'stylelint:css']); |
|||
|
|||
// Register the startup task.
|
|||
grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup); |
|||
|
|||
// Register the default task.
|
|||
grunt.registerTask('default', ['startup']); |
|||
}; |
@ -0,0 +1,20 @@ |
|||
MOODLE INSTALLATION |
|||
=================== |
|||
|
|||
Here is a short summary of the installation process (which can take just a few |
|||
minutes): |
|||
|
|||
1. Move the Moodle files into your web directory. |
|||
|
|||
2. Create a single database for Moodle to store all its tables in (or choose an |
|||
existing database). |
|||
|
|||
3. Visit your Moodle site with a browser. You should be taken to the |
|||
install.php script, which will lead you through creating a config.php file |
|||
and then setting up Moodle, creating an admin account etc. |
|||
|
|||
4. Set up a cron task to call the file admin/cron.php every minute. |
|||
|
|||
For more information, see <https://docs.moodle.org/en/Installing_Moodle>. |
|||
|
|||
Good luck and have fun! |
@ -0,0 +1,7 @@ |
|||
*** PLEASE DO NOT OPEN PULL REQUESTS VIA GITHUB *** |
|||
|
|||
The moodle.git repository at Github is just a mirror of the official repository. We do not accept pull requests at Github. |
|||
|
|||
See CONTRIBUTING.txt guidelines for how to contribute patches for Moodle. Thank you. |
|||
|
|||
-- |
@ -0,0 +1,28 @@ |
|||
.-..-. |
|||
_____ | || | |
|||
/____/-.---_ .---. .---. .-.| || | .---. |
|||
| | _ _ |/ _ \/ _ \/ _ || |/ __ \ |
|||
* | | | | | || |_| || |_| || |_| || || |___/ |
|||
|_| |_| |_|\_____/\_____/\_____||_|\_____) |
|||
|
|||
Moodle - the world's open source learning platform |
|||
|
|||
Moodle <https://moodle.org> is a learning platform designed to provide |
|||
educators, administrators and learners with a single robust, secure and |
|||
integrated system to create personalised learning environments. |
|||
|
|||
You can download Moodle <https://download.moodle.org> and run it on your own |
|||
web server, ask one of our Moodle Partners <https://moodle.com/partners/> to |
|||
assist you, or have a MoodleCloud site <https://moodle.com/cloud/> set up for |
|||
you. |
|||
|
|||
Moodle is widely used around the world by universities, schools, companies and |
|||
all manner of organisations and individuals. |
|||
|
|||
Moodle is provided freely as open source software, under the GNU General Public |
|||
License <https://docs.moodle.org/dev/License>. |
|||
|
|||
Moodle is written in PHP and JavaScript and uses an SQL database for storing |
|||
the data. |
|||
|
|||
See <https://docs.moodle.org> for details of Moodle's many features. |
@ -0,0 +1,48 @@ |
|||
MOODLE TRADEMARKS POLICY |
|||
======================== |
|||
|
|||
The word "Moodle" is trademarked in many countries around the world. The word |
|||
was originally an acronym: Modular Object-Oriented Dynamic Learning |
|||
Environment. The trademark is owned by Martin Dougiamas, Founder and Director |
|||
of Moodle. |
|||
|
|||
The law obligates trademark owners to police their marks and prevent the use of |
|||
confusingly similar names by third parties. Through this policy we’d like to |
|||
make it clear how Moodle-related projects, organisations, and people can use |
|||
the Moodle trademark. We’d also like to be clear about how use of the word is |
|||
restricted when used to promote commercial Moodle services. We do this to |
|||
protect the very business model that allows us to continue developing Moodle |
|||
for you. |
|||
|
|||
Allowed uses |
|||
------------ |
|||
|
|||
The following uses don’t require any permission at all: |
|||
|
|||
* Referring to the software or the Moodle project. |
|||
* Describing your own Moodle implementation (including within corporate |
|||
settings). |
|||
* Describing a Moodle-based community hub. |
|||
* Describing some software you’ve made that integrates with Moodle |
|||
(eg a Moodle integration feature on another system). |
|||
|
|||
Restricted uses |
|||
--------------- |
|||
|
|||
The following uses are generally prohibited without explicit and direct |
|||
permission being granted to you by Moodle Pty Ltd. We do this to protect the |
|||
Moodle project from software and sites which could confuse people. Please |
|||
contact us to ask for permission in writing. |
|||
|
|||
* You can’t use "Moodle" in the name of your software (including Mobile apps) |
|||
* You can’t use "Moodle" in your company name |
|||
* You can’t use "Moodle" in your domain name |
|||
* You can’t use "Moodle" in advertising-related keywords (such as Adsense) |
|||
* You can’t use "Moodle" to describe services around Moodle (such as hosting, |
|||
training, support, consulting, course creation services, theme development, |
|||
customisation, installation, integration and certification). This applies |
|||
even if you do not charge for the services. Note that usually only Moodle |
|||
Partners have this permission. |
|||
|
|||
For information about the Moodle Partner Certification Mark as well as for how |
|||
to contact us, please see <https://moodle.com/trademarks/>. |
@ -0,0 +1,48 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* Admin settings search form |
|||
* |
|||
* @package admin |
|||
* @copyright 2016 Damyon Wiese |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
require_once $CFG->libdir.'/formslib.php'; |
|||
|
|||
/** |
|||
* Admin settings search form |
|||
* |
|||
* @package admin |
|||
* @copyright 2016 Damyon Wiese |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
class admin_settings_search_form extends moodleform { |
|||
function definition () { |
|||
$mform = $this->_form; |
|||
|
|||
//$mform->addElement('header', 'settingsheader', get_string('search', 'admin')); |
|||
$elements = []; |
|||
$elements[] = $mform->createElement('text', 'query', get_string('query', 'admin')); |
|||
$elements[] = $mform->createElement('submit', 'search', get_string('search')); |
|||
$mform->addGroup($elements); |
|||
$mform->setType('query', PARAM_RAW); |
|||
$mform->setDefault('query', optional_param('query', '', PARAM_RAW)); |
|||
} |
|||
} |
@ -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/>. |
|||
|
|||
/** |
|||
* Allows admin to configure antiviruses. |
|||
* |
|||
* @package core_antivirus |
|||
* @copyright 2015 Ruslan Kabalin, Lancaster University. |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$antivirus = required_param('antivirus', PARAM_PLUGIN); |
|||
$confirm = optional_param('confirm', 0, PARAM_BOOL); |
|||
|
|||
$PAGE->set_url('/admin/antiviruses.php', array('action' => $action, 'antivirus' => $antivirus)); |
|||
$PAGE->set_context(context_system::instance()); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', context_system::instance()); |
|||
|
|||
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageantiviruses"; |
|||
|
|||
// Get currently installed and enabled antivirus plugins. |
|||
$availableantiviruses = \core\antivirus\manager::get_available(); |
|||
if (!empty($antivirus) and empty($availableantiviruses[$antivirus])) { |
|||
redirect ($returnurl); |
|||
} |
|||
|
|||
$activeantiviruses = explode(',', $CFG->antiviruses); |
|||
foreach ($activeantiviruses as $key => $active) { |
|||
if (empty($availableantiviruses[$active])) { |
|||
unset($activeantiviruses[$key]); |
|||
} |
|||
} |
|||
|
|||
if (!confirm_sesskey()) { |
|||
redirect($returnurl); |
|||
} |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
// Remove from enabled list. |
|||
$key = array_search($antivirus, $activeantiviruses); |
|||
unset($activeantiviruses[$key]); |
|||
break; |
|||
|
|||
case 'enable': |
|||
// Add to enabled list. |
|||
if (!in_array($antivirus, $activeantiviruses)) { |
|||
$activeantiviruses[] = $antivirus; |
|||
$activeantiviruses = array_unique($activeantiviruses); |
|||
} |
|||
break; |
|||
|
|||
case 'down': |
|||
$key = array_search($antivirus, $activeantiviruses); |
|||
// Check auth plugin is valid. |
|||
if ($key !== false) { |
|||
// Move down the list. |
|||
if ($key < (count($activeantiviruses) - 1)) { |
|||
$fsave = $activeantiviruses[$key]; |
|||
$activeantiviruses[$key] = $activeantiviruses[$key + 1]; |
|||
$activeantiviruses[$key + 1] = $fsave; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case 'up': |
|||
$key = array_search($antivirus, $activeantiviruses); |
|||
// Check auth is valid. |
|||
if ($key !== false) { |
|||
// Move up the list. |
|||
if ($key >= 1) { |
|||
$fsave = $activeantiviruses[$key]; |
|||
$activeantiviruses[$key] = $activeantiviruses[$key - 1]; |
|||
$activeantiviruses[$key - 1] = $fsave; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
default: |
|||
break; |
|||
} |
|||
|
|||
set_config('antiviruses', implode(',', $activeantiviruses)); |
|||
core_plugin_manager::reset_caches(); |
|||
|
|||
redirect ($returnurl); |
@ -0,0 +1,105 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* Allows admin to edit all auth plugin settings. |
|||
* |
|||
* JH: copied and Hax0rd from admin/enrol.php and admin/filters.php |
|||
* |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', context_system::instance()); |
|||
|
|||
$returnurl = new moodle_url('/admin/settings.php', array('section'=>'manageauths')); |
|||
|
|||
$PAGE->set_url($returnurl); |
|||
|
|||
$action = optional_param('action', '', PARAM_ALPHANUMEXT); |
|||
$auth = optional_param('auth', '', PARAM_PLUGIN); |
|||
|
|||
get_enabled_auth_plugins(true); // fix the list of enabled auths |
|||
if (empty($CFG->auth)) { |
|||
$authsenabled = array(); |
|||
} else { |
|||
$authsenabled = explode(',', $CFG->auth); |
|||
} |
|||
|
|||
if (!empty($auth) and !exists_auth_plugin($auth)) { |
|||
print_error('pluginnotinstalled', 'auth', $returnurl, $auth); |
|||
} |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////// |
|||
// process actions |
|||
|
|||
if (!confirm_sesskey()) { |
|||
redirect($returnurl); |
|||
} |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
// remove from enabled list |
|||
$key = array_search($auth, $authsenabled); |
|||
if ($key !== false) { |
|||
unset($authsenabled[$key]); |
|||
set_config('auth', implode(',', $authsenabled)); |
|||
} |
|||
|
|||
if ($auth == $CFG->registerauth) { |
|||
set_config('registerauth', ''); |
|||
} |
|||
\core\session\manager::gc(); // Remove stale sessions. |
|||
core_plugin_manager::reset_caches(); |
|||
break; |
|||
|
|||
case 'enable': |
|||
// add to enabled list |
|||
if (!in_array($auth, $authsenabled)) { |
|||
$authsenabled[] = $auth; |
|||
$authsenabled = array_unique($authsenabled); |
|||
set_config('auth', implode(',', $authsenabled)); |
|||
} |
|||
\core\session\manager::gc(); // Remove stale sessions. |
|||
core_plugin_manager::reset_caches(); |
|||
break; |
|||
|
|||
case 'down': |
|||
$key = array_search($auth, $authsenabled); |
|||
// check auth plugin is valid |
|||
if ($key === false) { |
|||
print_error('pluginnotenabled', 'auth', $returnurl, $auth); |
|||
} |
|||
// move down the list |
|||
if ($key < (count($authsenabled) - 1)) { |
|||
$fsave = $authsenabled[$key]; |
|||
$authsenabled[$key] = $authsenabled[$key + 1]; |
|||
$authsenabled[$key + 1] = $fsave; |
|||
set_config('auth', implode(',', $authsenabled)); |
|||
} |
|||
break; |
|||
|
|||
case 'up': |
|||
$key = array_search($auth, $authsenabled); |
|||
// check auth is valid |
|||
if ($key === false) { |
|||
print_error('pluginnotenabled', 'auth', $returnurl, $auth); |
|||
} |
|||
// move up the list |
|||
if ($key >= 1) { |
|||
$fsave = $authsenabled[$key]; |
|||
$authsenabled[$key] = $authsenabled[$key - 1]; |
|||
$authsenabled[$key - 1] = $fsave; |
|||
set_config('auth', implode(',', $authsenabled)); |
|||
} |
|||
break; |
|||
|
|||
default: |
|||
break; |
|||
} |
|||
|
|||
redirect($returnurl); |
|||
|
|||
|
@ -0,0 +1,212 @@ |
|||
<?php |
|||
/** |
|||
* Edit configuration for an individual auth plugin |
|||
*/ |
|||
|
|||
require_once '../config.php'; |
|||
require_once $CFG->libdir.'/adminlib.php'; |
|||
|
|||
$auth = required_param('auth', PARAM_PLUGIN); |
|||
$PAGE->set_pagetype('admin-auth-' . $auth); |
|||
|
|||
admin_externalpage_setup('authsetting'.$auth); |
|||
|
|||
$authplugin = get_auth_plugin($auth); |
|||
$err = array(); |
|||
|
|||
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageauths"; |
|||
|
|||
debugging("Use of config.html files in authentication plugins have been deprecated. " . |
|||
" Please migrate your plugin to use the admin settings API", DEBUG_DEVELOPER); |
|||
|
|||
// save configuration changes |
|||
if ($frm = data_submitted() and confirm_sesskey()) { |
|||
|
|||
$authplugin->validate_form($frm, $err); |
|||
|
|||
if (count($err) == 0) { |
|||
|
|||
// save plugin config |
|||
if ($authplugin->process_config($frm)) { |
|||
|
|||
// save field lock configuration |
|||
foreach ($frm as $name => $value) { |
|||
if (preg_match('/^lockconfig_(.+?)$/', $name, $matches)) { |
|||
$plugin = "auth/$auth"; |
|||
$name = $matches[1]; |
|||
set_config($name, $value, $plugin); |
|||
} |
|||
} |
|||
redirect($returnurl); |
|||
exit; |
|||
} |
|||
} else { |
|||
foreach ($err as $key => $value) { |
|||
$focus = "form.$key"; |
|||
} |
|||
} |
|||
} else { |
|||
$frmlegacystyle = get_config('auth/'.$auth); |
|||
$frmnewstyle = get_config('auth_'.$auth); |
|||
$frm = (object)array_merge((array)$frmlegacystyle, (array)$frmnewstyle); |
|||
} |
|||
|
|||
$user_fields = $authplugin->userfields; |
|||
//$user_fields = array("firstname", "lastname", "email", "phone1", "phone2", "institution", "department", "address", "city", "country", "description", "idnumber", "lang"); |
|||
|
|||
/// Get the auth title (from core or own auth lang files) |
|||
$authtitle = $authplugin->get_title(); |
|||
/// Get the auth descriptions (from core or own auth lang files) |
|||
$authdescription = $authplugin->get_description(); |
|||
|
|||
// output configuration form |
|||
echo $OUTPUT->header(); |
|||
|
|||
// choose an authentication method |
|||
echo "<form id=\"authmenu\" method=\"post\" action=\"auth_config.php\">\n"; |
|||
echo "<div>\n"; |
|||
echo "<input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />\n"; |
|||
echo "<input type=\"hidden\" name=\"auth\" value=\"".$auth."\" />\n"; |
|||
|
|||
// auth plugin description |
|||
echo $OUTPUT->box_start(); |
|||
echo $OUTPUT->heading($authtitle); |
|||
echo $OUTPUT->box_start('informationbox'); |
|||
echo $authdescription; |
|||
echo $OUTPUT->box_end(); |
|||
echo "<hr />\n"; |
|||
$authplugin->config_form($frm, $err, $user_fields); |
|||
echo $OUTPUT->box_end(); |
|||
echo '<p style="text-align: center"><input type="submit" value="' . get_string("savechanges") . "\" /></p>\n"; |
|||
echo "</div>\n"; |
|||
echo "</form>\n"; |
|||
|
|||
$PAGE->requires->string_for_js('unmaskpassword', 'core_form'); |
|||
$PAGE->requires->yui_module('moodle-auth-passwordunmask', 'M.auth.passwordunmask'); |
|||
|
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
|
|||
/// Functions ///////////////////////////////////////////////////////////////// |
|||
|
|||
|
|||
/** |
|||
* auth field locking |
|||
* Good enough for most auth plugins |
|||
* but some may want a custom one if they are offering |
|||
* other options |
|||
* Note: lockconfig_ fields have special handling. |
|||
* |
|||
* @param string $auth authentication plugin shortname |
|||
* @param array $user_fields user profile fields |
|||
* @param string $helptext help text to be displayed at top of form |
|||
* @param boolean $retrieveopts Map fields or lock only. |
|||
* @param boolean $updateopts Allow remote updates |
|||
* @param array $customfields list of custom profile fields |
|||
* @deprecated since Moodle 3.3 |
|||
*/ |
|||
function print_auth_lock_options($auth, $user_fields, $helptext, $retrieveopts, $updateopts, $customfields = array()) { |
|||
global $DB, $OUTPUT; |
|||
debugging("The function 'print_auth_lock_options' has been deprecated, " . |
|||
"Please migrate your code to use the admin settings API and use the function 'display_auth_lock_options' instead. ", |
|||
DEBUG_DEVELOPER); |
|||
|
|||
echo '<tr><td colspan="3">'; |
|||
if ($retrieveopts) { |
|||
echo $OUTPUT->heading(get_string('auth_data_mapping', 'auth')); |
|||
} else { |
|||
echo $OUTPUT->heading(get_string('auth_fieldlocks', 'auth')); |
|||
} |
|||
echo '</td></tr>'; |
|||
|
|||
$lockoptions = array ('unlocked' => get_string('unlocked', 'auth'), |
|||
'unlockedifempty' => get_string('unlockedifempty', 'auth'), |
|||
'locked' => get_string('locked', 'auth')); |
|||
$updatelocaloptions = array('oncreate' => get_string('update_oncreate', 'auth'), |
|||
'onlogin' => get_string('update_onlogin', 'auth')); |
|||
$updateextoptions = array('0' => get_string('update_never', 'auth'), |
|||
'1' => get_string('update_onupdate', 'auth')); |
|||
|
|||
$pluginconfig = get_config("auth/$auth"); |
|||
|
|||
// Helptext is on a field with rowspan. |
|||
if (empty($helptext)) { |
|||
$helptext = ' '; |
|||
} |
|||
|
|||
// If we have custom fields then merge them with user fields. |
|||
if (!empty($customfields)) { |
|||
$user_fields = array_merge($user_fields, $customfields); |
|||
} |
|||
|
|||
if (!empty($customfields)) { |
|||
$customfieldname = $DB->get_records('user_info_field', null, '', 'shortname, name'); |
|||
} |
|||
foreach ($user_fields as $field) { |
|||
// Define some vars we'll work with. |
|||
if (!isset($pluginconfig->{"field_map_$field"})) { |
|||
$pluginconfig->{"field_map_$field"} = ''; |
|||
} |
|||
if (!isset($pluginconfig->{"field_updatelocal_$field"})) { |
|||
$pluginconfig->{"field_updatelocal_$field"} = ''; |
|||
} |
|||
if (!isset($pluginconfig->{"field_updateremote_$field"})) { |
|||
$pluginconfig->{"field_updateremote_$field"} = ''; |
|||
} |
|||
if (!isset($pluginconfig->{"field_lock_$field"})) { |
|||
$pluginconfig->{"field_lock_$field"} = ''; |
|||
} |
|||
|
|||
// Define the fieldname we display to the user. |
|||
$fieldname = $field; |
|||
if ($fieldname === 'lang') { |
|||
$fieldname = get_string('language'); |
|||
} elseif (!empty($customfields) && in_array($field, $customfields)) { |
|||
// If custom field then pick name from database. |
|||
$fieldshortname = str_replace('profile_field_', '', $fieldname); |
|||
$fieldname = $customfieldname[$fieldshortname]->name; |
|||
if (core_text::strlen($fieldshortname) > 67) { |
|||
// If custom profile field name is longer than 67 characters we will not be able to store the setting |
|||
// such as 'field_updateremote_profile_field_NOTSOSHORTSHORTNAME' in the database because the character |
|||
// limit for the setting name is 100. |
|||
continue; |
|||
} |
|||
} elseif ($fieldname == 'url') { |
|||
$fieldname = get_string('webpage'); |
|||
} else { |
|||
$fieldname = get_string($fieldname); |
|||
} |
|||
if ($retrieveopts) { |
|||
$varname = 'field_map_' . $field; |
|||
|
|||
echo '<tr valign="top"><td align="right">'; |
|||
echo '<label for="lockconfig_'.$varname.'">'.$fieldname.'</label>'; |
|||
echo '</td><td>'; |
|||
|
|||
echo "<input id=\"lockconfig_{$varname}\" name=\"lockconfig_{$varname}\" type=\"text\" size=\"30\" value=\"{$pluginconfig->$varname}\" />"; |
|||
echo '<div style="text-align: right">'; |
|||
echo '<label for="menulockconfig_field_updatelocal_'.$field.'">'.get_string('auth_updatelocal', 'auth') . '</label> '; |
|||
echo html_writer::select($updatelocaloptions, "lockconfig_field_updatelocal_{$field}", $pluginconfig->{"field_updatelocal_$field"}, false); |
|||
echo '<br />'; |
|||
if ($updateopts) { |
|||
echo '<label for="menulockconfig_field_updateremote_'.$field.'">'.get_string('auth_updateremote', 'auth') . '</label> '; |
|||
echo html_writer::select($updateextoptions, "lockconfig_field_updateremote_{$field}", $pluginconfig->{"field_updateremote_$field"}, false); |
|||
echo '<br />'; |
|||
} |
|||
echo '<label for="menulockconfig_field_lock_'.$field.'">'.get_string('auth_fieldlock', 'auth') . '</label> '; |
|||
echo html_writer::select($lockoptions, "lockconfig_field_lock_{$field}", $pluginconfig->{"field_lock_$field"}, false); |
|||
echo '</div>'; |
|||
} else { |
|||
echo '<tr valign="top"><td align="right">'; |
|||
echo '<label for="menulockconfig_field_lock_'.$field.'">'.$fieldname.'</label>'; |
|||
echo '</td><td>'; |
|||
echo html_writer::select($lockoptions, "lockconfig_field_lock_{$field}", $pluginconfig->{"field_lock_$field"}, false); |
|||
} |
|||
echo '</td>'; |
|||
if (!empty($helptext)) { |
|||
echo '<td rowspan="' . count($user_fields) . '">' . $helptext . '</td>'; |
|||
$helptext = ''; |
|||
} |
|||
echo '</tr>'; |
|||
} |
|||
} |
@ -0,0 +1,238 @@ |
|||
<?php |
|||
|
|||
// Allows the admin to configure blocks (hide/show, uninstall and configure) |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/blocklib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
admin_externalpage_setup('manageblocks'); |
|||
|
|||
$confirm = optional_param('confirm', 0, PARAM_BOOL); |
|||
$hide = optional_param('hide', 0, PARAM_INT); |
|||
$show = optional_param('show', 0, PARAM_INT); |
|||
$unprotect = optional_param('unprotect', 0, PARAM_INT); |
|||
$protect = optional_param('protect', 0, PARAM_INT); |
|||
|
|||
/// Print headings |
|||
|
|||
$strmanageblocks = get_string('manageblocks'); |
|||
$struninstall = get_string('uninstallplugin', 'core_admin'); |
|||
$strversion = get_string('version'); |
|||
$strhide = get_string('hide'); |
|||
$strshow = get_string('show'); |
|||
$strsettings = get_string('settings'); |
|||
$strcourses = get_string('blockinstances', 'admin'); |
|||
$strname = get_string('name'); |
|||
$strshowblockcourse = get_string('showblockcourse'); |
|||
$strprotecthdr = get_string('blockprotect', 'admin'). $OUTPUT->help_icon('blockprotect','admin'); |
|||
$strprotect = get_string('blockprotect', 'admin'); |
|||
$strunprotect = get_string('blockunprotect', 'admin'); |
|||
|
|||
/// If data submitted, then process and store. |
|||
|
|||
if (!empty($hide) && confirm_sesskey()) { |
|||
if (!$block = $DB->get_record('block', array('id'=>$hide))) { |
|||
print_error('blockdoesnotexist', 'error'); |
|||
} |
|||
$DB->set_field('block', 'visible', '0', array('id'=>$block->id)); // Hide block |
|||
add_to_config_log('block_visibility', $block->visible, '0', $block->name); |
|||
core_plugin_manager::reset_caches(); |
|||
admin_get_root(true, false); // settings not required - only pages |
|||
} |
|||
|
|||
if (!empty($show) && confirm_sesskey() ) { |
|||
if (!$block = $DB->get_record('block', array('id'=>$show))) { |
|||
print_error('blockdoesnotexist', 'error'); |
|||
} |
|||
$DB->set_field('block', 'visible', '1', array('id'=>$block->id)); // Show block |
|||
add_to_config_log('block_visibility', $block->visible, '1', $block->name); |
|||
core_plugin_manager::reset_caches(); |
|||
admin_get_root(true, false); // settings not required - only pages |
|||
} |
|||
|
|||
if (!empty($protect) && confirm_sesskey()) { |
|||
block_manager::protect_block((int)$protect); |
|||
admin_get_root(true, false); // settings not required - only pages |
|||
} |
|||
|
|||
if (!empty($unprotect) && confirm_sesskey()) { |
|||
block_manager::unprotect_block((int)$unprotect); |
|||
admin_get_root(true, false); // settings not required - only pages |
|||
} |
|||
|
|||
$undeletableblocktypes = block_manager::get_undeletable_block_types(); |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading($strmanageblocks); |
|||
|
|||
/// Main display starts here |
|||
|
|||
/// Get and sort the existing blocks |
|||
|
|||
if (!$blocks = $DB->get_records('block', array(), 'name ASC')) { |
|||
print_error('noblocks', 'error'); // Should never happen |
|||
} |
|||
|
|||
$incompatible = array(); |
|||
|
|||
/// Print the table of all blocks |
|||
|
|||
$table = new flexible_table('admin-blocks-compatible'); |
|||
|
|||
$table->define_columns(array('name', 'instances', 'version', 'hideshow', 'undeletable', 'settings', 'uninstall')); |
|||
$table->define_headers(array($strname, $strcourses, $strversion, $strhide.'/'.$strshow, $strprotecthdr, $strsettings, $struninstall)); |
|||
$table->define_baseurl($CFG->wwwroot.'/'.$CFG->admin.'/blocks.php'); |
|||
$table->set_attribute('class', 'admintable blockstable generaltable'); |
|||
$table->set_attribute('id', 'compatibleblockstable'); |
|||
$table->setup(); |
|||
$tablerows = array(); |
|||
|
|||
// Sort blocks using current locale. |
|||
$blocknames = array(); |
|||
foreach ($blocks as $blockid=>$block) { |
|||
$blockname = $block->name; |
|||
if (file_exists("$CFG->dirroot/blocks/$blockname/block_$blockname.php")) { |
|||
$blocknames[$blockid] = get_string('pluginname', 'block_'.$blockname); |
|||
} else { |
|||
$blocknames[$blockid] = $blockname; |
|||
} |
|||
} |
|||
core_collator::asort($blocknames); |
|||
|
|||
foreach ($blocknames as $blockid=>$strblockname) { |
|||
$block = $blocks[$blockid]; |
|||
$blockname = $block->name; |
|||
$dbversion = get_config('block_'.$block->name, 'version'); |
|||
|
|||
if (!file_exists("$CFG->dirroot/blocks/$blockname/block_$blockname.php")) { |
|||
$blockobject = false; |
|||
$strblockname = '<span class="notifyproblem">'.$strblockname.' ('.get_string('missingfromdisk').')</span>'; |
|||
$plugin = new stdClass(); |
|||
$plugin->version = $dbversion; |
|||
|
|||
} else { |
|||
$plugin = new stdClass(); |
|||
$plugin->version = '???'; |
|||
if (file_exists("$CFG->dirroot/blocks/$blockname/version.php")) { |
|||
include("$CFG->dirroot/blocks/$blockname/version.php"); |
|||
} |
|||
|
|||
if (!$blockobject = block_instance($block->name)) { |
|||
$incompatible[] = $block; |
|||
continue; |
|||
} |
|||
} |
|||
|
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('block_'.$blockname, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $struninstall); |
|||
} else { |
|||
$uninstall = ''; |
|||
} |
|||
|
|||
$settings = ''; // By default, no configuration |
|||
if ($blockobject and $blockobject->has_config()) { |
|||
$blocksettings = admin_get_root()->locate('blocksetting' . $block->name); |
|||
|
|||
if ($blocksettings instanceof admin_externalpage) { |
|||
$settings = '<a href="' . $blocksettings->url . '">' . get_string('settings') . '</a>'; |
|||
} else if ($blocksettings instanceof admin_settingpage) { |
|||
$settings = '<a href="'.$CFG->wwwroot.'/'.$CFG->admin.'/settings.php?section=blocksetting'.$block->name.'">'.$strsettings.'</a>'; |
|||
} else if (!file_exists($CFG->dirroot.'/blocks/'.$block->name.'/settings.php')) { |
|||
// If the block's settings node was not found, we check that the block really provides the settings.php file. |
|||
// Note that blocks can inject their settings to other nodes in the admin tree without using the default locations. |
|||
// This can be done by assigning null to $setting in settings.php and it is a valid case. |
|||
debugging('Warning: block_'.$block->name.' returns true in has_config() but does not provide a settings.php file', |
|||
DEBUG_DEVELOPER); |
|||
} |
|||
} |
|||
|
|||
// MDL-11167, blocks can be placed on mymoodle, or the blogs page |
|||
// and it should not show up on course search page |
|||
|
|||
$totalcount = $DB->count_records('block_instances', array('blockname'=>$blockname)); |
|||
$count = $DB->count_records('block_instances', array('blockname'=>$blockname, 'pagetypepattern'=>'course-view-*')); |
|||
|
|||
if ($count>0) { |
|||
$blocklist = "<a href=\"{$CFG->wwwroot}/course/search.php?blocklist=$blockid&sesskey=".sesskey()."\" "; |
|||
$blocklist .= "title=\"$strshowblockcourse\" >$totalcount</a>"; |
|||
} |
|||
else { |
|||
$blocklist = "$totalcount"; |
|||
} |
|||
$class = ''; // Nothing fancy, by default |
|||
|
|||
if (!$blockobject) { |
|||
// ignore |
|||
$visible = ''; |
|||
} else if ($blocks[$blockid]->visible) { |
|||
$visible = '<a href="blocks.php?hide='.$blockid.'&sesskey='.sesskey().'" title="'.$strhide.'">'. |
|||
$OUTPUT->pix_icon('t/hide', $strhide) . '</a>'; |
|||
} else { |
|||
$visible = '<a href="blocks.php?show='.$blockid.'&sesskey='.sesskey().'" title="'.$strshow.'">'. |
|||
$OUTPUT->pix_icon('t/show', $strshow) . '</a>'; |
|||
$class = 'dimmed_text'; |
|||
} |
|||
|
|||
if ($dbversion == $plugin->version) { |
|||
$version = $dbversion; |
|||
} else { |
|||
$version = "$dbversion ($plugin->version)"; |
|||
} |
|||
|
|||
if (!$blockobject) { |
|||
// ignore |
|||
$undeletable = ''; |
|||
} else if (in_array($blockname, $undeletableblocktypes)) { |
|||
$undeletable = '<a href="blocks.php?unprotect='.$blockid.'&sesskey='.sesskey().'" title="'.$strunprotect.'">'. |
|||
$OUTPUT->pix_icon('t/unlock', $strunprotect) . '</a>'; |
|||
} else { |
|||
$undeletable = '<a href="blocks.php?protect='.$blockid.'&sesskey='.sesskey().'" title="'.$strprotect.'">'. |
|||
$OUTPUT->pix_icon('t/lock', $strprotect) . '</a>'; |
|||
} |
|||
|
|||
$row = array( |
|||
$strblockname, |
|||
$blocklist, |
|||
$version, |
|||
$visible, |
|||
$undeletable, |
|||
$settings, |
|||
$uninstall, |
|||
); |
|||
$table->add_data($row, $class); |
|||
} |
|||
|
|||
$table->print_html(); |
|||
|
|||
if (!empty($incompatible)) { |
|||
echo $OUTPUT->heading(get_string('incompatibleblocks', 'blockstable', 'admin')); |
|||
|
|||
$table = new flexible_table('admin-blocks-incompatible'); |
|||
|
|||
$table->define_columns(array('block', 'uninstall')); |
|||
$table->define_headers(array($strname, $struninstall)); |
|||
$table->define_baseurl($CFG->wwwroot.'/'.$CFG->admin.'/blocks.php'); |
|||
|
|||
$table->set_attribute('class', 'incompatibleblockstable generaltable'); |
|||
|
|||
$table->setup(); |
|||
|
|||
foreach ($incompatible as $block) { |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('block_'.$block->name, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $struninstall); |
|||
} else { |
|||
$uninstall = ''; |
|||
} |
|||
$table->add_data(array( |
|||
$block->name, |
|||
$uninstall, |
|||
)); |
|||
} |
|||
$table->print_html(); |
|||
} |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
|
@ -0,0 +1,162 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This file is used to display a categories sub categories, external pages, and settings. |
|||
* |
|||
* @since Moodle 2.3 |
|||
* @package admin |
|||
* @copyright 2011 Sam Hemelryk |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$category = required_param('category', PARAM_SAFEDIR); |
|||
$return = optional_param('return','', PARAM_ALPHA); |
|||
$adminediting = optional_param('adminedit', -1, PARAM_BOOL); |
|||
|
|||
/// no guest autologin |
|||
require_login(0, false); |
|||
$PAGE->set_context(context_system::instance()); |
|||
$PAGE->set_url('/admin/category.php', array('category' => $category)); |
|||
$PAGE->set_pagetype('admin-setting-' . $category); |
|||
$PAGE->set_pagelayout('admin'); |
|||
$PAGE->navigation->clear_cache(); |
|||
|
|||
$adminroot = admin_get_root(); // need all settings |
|||
$settingspage = $adminroot->locate($category, true); |
|||
|
|||
if (empty($settingspage) or !($settingspage instanceof admin_category)) { |
|||
print_error('categoryerror', 'admin', "$CFG->wwwroot/$CFG->admin/"); |
|||
} |
|||
|
|||
if (!($settingspage->check_access())) { |
|||
print_error('accessdenied', 'admin'); |
|||
} |
|||
|
|||
|
|||
$statusmsg = ''; |
|||
$errormsg = ''; |
|||
|
|||
if ($data = data_submitted() and confirm_sesskey()) { |
|||
$count = admin_write_settings($data); |
|||
if (empty($adminroot->errors)) { |
|||
// No errors. Did we change any setting? If so, then indicate success. |
|||
if ($count) { |
|||
$statusmsg = get_string('changessaved'); |
|||
} else { |
|||
switch ($return) { |
|||
case 'site': redirect("$CFG->wwwroot/"); |
|||
case 'admin': redirect("$CFG->wwwroot/$CFG->admin/"); |
|||
} |
|||
} |
|||
} else { |
|||
$errormsg = get_string('errorwithsettings', 'admin'); |
|||
$firsterror = reset($adminroot->errors); |
|||
} |
|||
$settingspage = $adminroot->locate($category, true); |
|||
} |
|||
|
|||
if ($PAGE->user_allowed_editing() && $adminediting != -1) { |
|||
$USER->editing = $adminediting; |
|||
} |
|||
$buttons = null; |
|||
if ($PAGE->user_allowed_editing()) { |
|||
$url = clone($PAGE->url); |
|||
if ($PAGE->user_is_editing()) { |
|||
$caption = get_string('blockseditoff'); |
|||
$url->param('adminedit', 'off'); |
|||
} else { |
|||
$caption = get_string('blocksediton'); |
|||
$url->param('adminedit', 'on'); |
|||
} |
|||
$buttons = $OUTPUT->single_button($url, $caption, 'get'); |
|||
} |
|||
|
|||
$savebutton = false; |
|||
$outputhtml = ''; |
|||
foreach ($settingspage->children as $childpage) { |
|||
if ($childpage->is_hidden() || !$childpage->check_access()) { |
|||
continue; |
|||
} |
|||
if ($childpage instanceof admin_externalpage) { |
|||
$outputhtml .= $OUTPUT->heading(html_writer::link($childpage->url, $childpage->visiblename), 3); |
|||
} else if ($childpage instanceof admin_settingpage) { |
|||
$outputhtml .= $OUTPUT->heading(html_writer::link(new moodle_url('/'.$CFG->admin.'/settings.php', array('section' => $childpage->name)), $childpage->visiblename), 3); |
|||
// If its a settings page and has settings lets display them. |
|||
if (!empty($childpage->settings)) { |
|||
$outputhtml .= html_writer::start_tag('fieldset', array('class' => 'adminsettings')); |
|||
foreach ($childpage->settings as $setting) { |
|||
if (empty($setting->nosave)) { |
|||
$savebutton = true; |
|||
} |
|||
$fullname = $setting->get_full_name(); |
|||
if (array_key_exists($fullname, $adminroot->errors)) { |
|||
$data = $adminroot->errors[$fullname]->data; |
|||
} else { |
|||
$data = $setting->get_setting(); |
|||
} |
|||
$outputhtml .= html_writer::tag('div', '<!-- -->', array('class' => 'clearer')); |
|||
$outputhtml .= $setting->output_html($data); |
|||
} |
|||
$outputhtml .= html_writer::end_tag('fieldset'); |
|||
} |
|||
} else if ($childpage instanceof admin_category) { |
|||
$outputhtml .= $OUTPUT->heading(html_writer::link(new moodle_url('/'.$CFG->admin.'/category.php', array('category' => $childpage->name)), get_string('admincategory', 'admin', $childpage->visiblename)), 3); |
|||
} |
|||
} |
|||
if ($savebutton) { |
|||
$outputhtml .= html_writer::start_tag('div', array('class' => 'form-buttons')); |
|||
$outputhtml .= html_writer::empty_tag('input', array('class' => 'btn btn-primary form-submit', 'type' => 'submit', 'value' => get_string('savechanges','admin'))); |
|||
$outputhtml .= html_writer::end_tag('div'); |
|||
} |
|||
|
|||
$visiblepathtosection = array_reverse($settingspage->visiblepath); |
|||
$PAGE->set_title("$SITE->shortname: " . implode(": ",$visiblepathtosection)); |
|||
$PAGE->set_heading($SITE->fullname); |
|||
if ($buttons) { |
|||
$PAGE->set_button($buttons); |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
if ($errormsg !== '') { |
|||
echo $OUTPUT->notification($errormsg); |
|||
} else if ($statusmsg !== '') { |
|||
echo $OUTPUT->notification($statusmsg, 'notifysuccess'); |
|||
} |
|||
|
|||
$path = array_reverse($settingspage->visiblepath); |
|||
if (is_array($path)) { |
|||
$visiblename = join(' / ', $path); |
|||
} else { |
|||
$visiblename = $path; |
|||
} |
|||
echo $OUTPUT->heading(get_string('admincategory', 'admin', $visiblename), 2); |
|||
|
|||
echo html_writer::start_tag('form', array('action' => '', 'method' => 'post', 'id' => 'adminsettings')); |
|||
echo html_writer::start_tag('div'); |
|||
echo html_writer::input_hidden_params(new moodle_url($PAGE->url, array('sesskey' => sesskey(), 'return' => $return))); |
|||
echo html_writer::end_tag('div'); |
|||
echo html_writer::start_tag('fieldset'); |
|||
echo html_writer::tag('div', '<!-- -->', array('class' => 'clearer')); |
|||
echo $outputhtml; |
|||
echo html_writer::end_tag('fieldset'); |
|||
echo html_writer::end_tag('form'); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,75 @@ |
|||
<?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 for selective purging of caches. |
|||
* |
|||
* @package core |
|||
* @copyright 2018 The Open University |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
namespace core_admin\form; |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
require_once($CFG->libdir.'/formslib.php'); |
|||
|
|||
/** |
|||
* Form for selecting which caches to purge on admin/purgecaches.php |
|||
* |
|||
* @package core |
|||
* @copyright 2018 The Open University |
|||
* @author Mark Johnson <mark.johnson@open.ac.uk> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
class purge_caches extends \moodleform { |
|||
/** |
|||
* Define a "Purge all caches" button, and a fieldset with checkboxes for selectively purging separate caches. |
|||
*/ |
|||
public function definition() { |
|||
$mform = $this->_form; |
|||
$mform->addElement('hidden', 'returnurl', $this->_customdata['returnurl']); |
|||
$mform->setType('returnurl', PARAM_LOCALURL); |
|||
$mform->addElement('submit', 'all', get_string('purgecaches', 'admin')); |
|||
$mform->addElement('header', 'purgecacheheader', get_string('purgeselectedcaches', 'admin')); |
|||
$checkboxes = [ |
|||
$mform->createElement('advcheckbox', 'theme', '', get_string('purgethemecache', 'admin')), |
|||
$mform->createElement('advcheckbox', 'lang', '', get_string('purgelangcache', 'admin')), |
|||
$mform->createElement('advcheckbox', 'js', '', get_string('purgejscache', 'admin')), |
|||
$mform->createElement('advcheckbox', 'filter', '', get_string('purgefiltercache', 'admin')), |
|||
$mform->createElement('advcheckbox', 'muc', '', get_string('purgemuc', 'admin')), |
|||
$mform->createElement('advcheckbox', 'other', '', get_string('purgeothercaches', 'admin')) |
|||
]; |
|||
$mform->addGroup($checkboxes, 'purgeselectedoptions'); |
|||
$mform->addElement('submit', 'purgeselectedcaches', get_string('purgeselectedcaches', 'admin')); |
|||
} |
|||
|
|||
/** |
|||
* If the "Purge selected caches" button was pressed, ensure at least one cache was selected. |
|||
* |
|||
* @param array $data |
|||
* @param array $files |
|||
* @return array Error messages |
|||
*/ |
|||
public function validation($data, $files) { |
|||
$errors = []; |
|||
if (isset($data['purgeselectedcaches']) && empty(array_filter($data['purgeselectedoptions']))) { |
|||
$errors['purgeselectedoptions'] = get_string('purgecachesnoneselected', 'admin'); |
|||
} |
|||
return $errors; |
|||
} |
|||
} |
@ -0,0 +1,59 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Testing outgoing mail configuration form |
|||
* |
|||
* @package core |
|||
* @copyright 2019 Victor Deniz <victor@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
namespace core_admin\form; |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
require_once($CFG->libdir.'/formslib.php'); |
|||
|
|||
/** |
|||
* Test mail form |
|||
* |
|||
* @package core |
|||
* @copyright 2019 Victor Deniz <victor@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
class testoutgoingmailconf_form extends \moodleform { |
|||
/** |
|||
* Add elements to form |
|||
*/ |
|||
public function definition() { |
|||
$mform = $this->_form; |
|||
|
|||
// Recipient. |
|||
$options = ['maxlength' => '100', 'size' => '25']; |
|||
$mform->addElement('text', 'recipient', get_string('testoutgoingmailconf_toemail', 'admin'), $options); |
|||
$mform->setType('recipient', PARAM_EMAIL); |
|||
$mform->addRule('recipient', get_string('required'), 'required'); |
|||
|
|||
$buttonarray = array(); |
|||
$buttonarray[] = $mform->createElement('submit', 'send', get_string('testoutgoingmailconf_sendtest', 'admin')); |
|||
$buttonarray[] = $mform->createElement('cancel'); |
|||
|
|||
$mform->addGroup($buttonarray, 'buttonar', '', array(' '), false); |
|||
$mform->closeHeaderBefore('buttonar'); |
|||
|
|||
} |
|||
} |
@ -0,0 +1,41 @@ |
|||
<?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/>. |
|||
/** |
|||
* Privacy Subsystem implementation for core_admin. |
|||
* |
|||
* @package core_admin |
|||
* @copyright 2018 Carlos Escobedo <carlos@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
namespace core_admin\privacy; |
|||
defined('MOODLE_INTERNAL') || die(); |
|||
/** |
|||
* Privacy Subsystem for core_admin implementing null_provider. |
|||
* |
|||
* @copyright 2018 Carlos Escobedo <carlos@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
class provider implements \core_privacy\local\metadata\null_provider { |
|||
/** |
|||
* Get the language string identifier with the component's language |
|||
* file to explain why this plugin stores no data. |
|||
* |
|||
* @return string |
|||
*/ |
|||
public static function get_reason() : string { |
|||
return 'privacy:metadata'; |
|||
} |
|||
} |
@ -0,0 +1,288 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Task log table. |
|||
* |
|||
* @package core_admin |
|||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
namespace core_admin; |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
require_once($CFG->libdir . '/tablelib.php'); |
|||
|
|||
/** |
|||
* Table to display list of task logs. |
|||
* |
|||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
class task_log_table extends \table_sql { |
|||
|
|||
/** |
|||
* Constructor for the task_log table. |
|||
* |
|||
* @param string $filter |
|||
* @param int $resultfilter |
|||
*/ |
|||
public function __construct(string $filter = '', int $resultfilter = null) { |
|||
global $DB; |
|||
|
|||
if (-1 === $resultfilter) { |
|||
$resultfilter = null; |
|||
} |
|||
|
|||
parent::__construct('tasklogs'); |
|||
|
|||
$columnheaders = [ |
|||
'classname' => get_string('name'), |
|||
'type' => get_string('tasktype', 'admin'), |
|||
'userid' => get_string('user', 'admin'), |
|||
'timestart' => get_string('task_starttime', 'admin'), |
|||
'duration' => get_string('task_duration', 'admin'), |
|||
'db' => get_string('task_dbstats', 'admin'), |
|||
'result' => get_string('task_result', 'admin'), |
|||
'actions' => '', |
|||
]; |
|||
$this->define_columns(array_keys($columnheaders)); |
|||
$this->define_headers(array_values($columnheaders)); |
|||
|
|||
// The name column is a header. |
|||
$this->define_header_column('classname'); |
|||
|
|||
// This table is not collapsible. |
|||
$this->collapsible(false); |
|||
|
|||
// The actions class should not wrap. Use the BS text utility class. |
|||
$this->column_class('actions', 'text-nowrap'); |
|||
|
|||
// Allow pagination. |
|||
$this->pageable(true); |
|||
|
|||
// Allow sorting. Default to sort by timestarted DESC. |
|||
$this->sortable(true, 'timestart', SORT_DESC); |
|||
|
|||
// Add filtering. |
|||
$where = []; |
|||
$params = []; |
|||
if (!empty($filter)) { |
|||
$orwhere = []; |
|||
$filter = str_replace('\\', '\\\\', $filter); |
|||
|
|||
// Check the class name. |
|||
$orwhere[] = $DB->sql_like('classname', ':classfilter', false, false); |
|||
$params['classfilter'] = '%' . $DB->sql_like_escape($filter) . '%'; |
|||
|
|||
$orwhere[] = $DB->sql_like('output', ':outputfilter', false, false); |
|||
$params['outputfilter'] = '%' . $DB->sql_like_escape($filter) . '%'; |
|||
|
|||
$where[] = "(" . implode(' OR ', $orwhere) . ")"; |
|||
} |
|||
|
|||
if (null !== $resultfilter) { |
|||
$where[] = 'tl.result = :result'; |
|||
$params['result'] = $resultfilter; |
|||
} |
|||
|
|||
$where = implode(' AND ', $where); |
|||
|
|||
$this->set_sql('', '', $where, $params); |
|||
} |
|||
|
|||
/** |
|||
* Query the db. Store results in the table object for use by build_table. |
|||
* |
|||
* @param int $pagesize size of page for paginated displayed table. |
|||
* @param bool $useinitialsbar do you want to use the initials bar. Bar |
|||
* will only be used if there is a fullname column defined for the table. |
|||
*/ |
|||
public function query_db($pagesize, $useinitialsbar = true) { |
|||
global $DB; |
|||
|
|||
// Fetch the attempts. |
|||
$sort = $this->get_sql_sort(); |
|||
if ($sort) { |
|||
$sort = "ORDER BY $sort"; |
|||
} |
|||
|
|||
$extrafields = get_extra_user_fields(\context_system::instance()); |
|||
$userfields = \user_picture::fields('u', $extrafields, 'userid2', 'user'); |
|||
|
|||
$where = ''; |
|||
if (!empty($this->sql->where)) { |
|||
$where = "WHERE {$this->sql->where}"; |
|||
} |
|||
|
|||
$sql = "SELECT |
|||
tl.*, |
|||
tl.dbreads + tl.dbwrites AS db, |
|||
tl.timeend - tl.timestart AS duration, |
|||
{$userfields} |
|||
FROM {task_log} tl |
|||
LEFT JOIN {user} u ON u.id = tl.userid |
|||
{$where} |
|||
{$sort}"; |
|||
|
|||
$this->pagesize($pagesize, $DB->count_records_sql("SELECT COUNT('x') FROM {task_log} tl {$where}", $this->sql->params)); |
|||
if (!$this->is_downloading()) { |
|||
$this->rawdata = $DB->get_records_sql($sql, $this->sql->params, $this->get_page_start(), $this->get_page_size()); |
|||
} else { |
|||
$this->rawdata = $DB->get_records_sql($sql, $this->sql->params); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Format the name cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_classname($row) : string { |
|||
$output = ''; |
|||
if (class_exists($row->classname)) { |
|||
$task = new $row->classname; |
|||
if ($task instanceof \core\task\scheduled_task) { |
|||
$output = $task->get_name(); |
|||
} |
|||
} |
|||
|
|||
$output .= \html_writer::tag('div', "\\{$row->classname}", [ |
|||
'class' => 'task-class', |
|||
]); |
|||
return $output; |
|||
} |
|||
|
|||
/** |
|||
* Format the type cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_type($row) : string { |
|||
if (\core\task\database_logger::TYPE_SCHEDULED == $row->type) { |
|||
return get_string('task_type:scheduled', 'admin'); |
|||
} else { |
|||
return get_string('task_type:adhoc', 'admin'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Format the timestart cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_result($row) : string { |
|||
if ($row->result) { |
|||
return get_string('task_result:failed', 'admin'); |
|||
} else { |
|||
return get_string('success'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Format the timestart cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_timestart($row) : string { |
|||
return userdate($row->timestart, get_string('strftimedatetimeshort', 'langconfig')); |
|||
} |
|||
|
|||
/** |
|||
* Format the duration cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_duration($row) : string { |
|||
$duration = round($row->timeend - $row->timestart, 2); |
|||
|
|||
if (empty($duration)) { |
|||
// The format_time function returns 'now' when the difference is exactly 0. |
|||
// Note: format_time performs concatenation in exactly this fashion so we should do this for consistency. |
|||
return '0 ' . get_string('secs', 'moodle'); |
|||
} |
|||
|
|||
return format_time($duration); |
|||
} |
|||
|
|||
/** |
|||
* Format the DB details cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_db($row) : string { |
|||
$output = ''; |
|||
|
|||
$output .= \html_writer::div(get_string('task_stats:dbreads', 'admin', $row->dbreads)); |
|||
$output .= \html_writer::div(get_string('task_stats:dbwrites', 'admin', $row->dbwrites)); |
|||
|
|||
return $output; |
|||
} |
|||
|
|||
/** |
|||
* Format the actions cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_actions($row) : string { |
|||
global $OUTPUT; |
|||
|
|||
$actions = []; |
|||
|
|||
$url = new \moodle_url('/admin/tasklogs.php', ['logid' => $row->id]); |
|||
|
|||
// Quick view. |
|||
$actions[] = $OUTPUT->action_icon( |
|||
$url, |
|||
new \pix_icon('e/search', get_string('view')), |
|||
new \popup_action('click', $url) |
|||
); |
|||
|
|||
// Download. |
|||
$actions[] = $OUTPUT->action_icon( |
|||
new \moodle_url($url, ['download' => true]), |
|||
new \pix_icon('t/download', get_string('download')) |
|||
); |
|||
|
|||
return implode(' ', $actions); |
|||
} |
|||
|
|||
/** |
|||
* Format the user cell. |
|||
* |
|||
* @param \stdClass $row |
|||
* @return string |
|||
*/ |
|||
public function col_userid($row) : string { |
|||
if (empty($row->userid)) { |
|||
return ''; |
|||
} |
|||
|
|||
$user = (object) []; |
|||
username_load_fields_from_object($user, $row, 'user'); |
|||
|
|||
return fullname($user); |
|||
} |
|||
} |
@ -0,0 +1,111 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This hack is intended for clustered sites that do not want |
|||
* to use shared cachedir for component cache. |
|||
* |
|||
* This file needs to be called after any change in PHP files in dataroot, |
|||
* that is before upgrade and install. |
|||
* |
|||
* @package core |
|||
* @copyright 2013 Petr Skoda (skodak) {@link http://skodak.org} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
|
|||
define('CLI_SCRIPT', true); |
|||
define('ABORT_AFTER_CONFIG', true); // We need just the values from config.php. |
|||
define('CACHE_DISABLE_ALL', true); // This prevents reading of existing caches. |
|||
define('IGNORE_COMPONENT_CACHE', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
// Now get cli options. |
|||
list($options, $unrecognized) = cli_get_params( |
|||
array( |
|||
'file' => false, |
|||
'rebuild' => false, |
|||
'print' => false, |
|||
'help' => false |
|||
), |
|||
array( |
|||
'h' => 'help' |
|||
) |
|||
); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); |
|||
} |
|||
|
|||
if (!$options['rebuild'] and !$options['file'] and !$options['print']) { |
|||
$help = |
|||
"Create alternative component cache file |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
--rebuild Rebuild \$CFG->alternative_component_cache file |
|||
--file=filepath Save component cache to file |
|||
--print Print component cache file content |
|||
|
|||
Example: |
|||
\$ php admin/cli/rebuild_alternative_component_cache.php --rebuild |
|||
"; |
|||
|
|||
echo $help; |
|||
exit(0); |
|||
} |
|||
|
|||
error_reporting(E_ALL | E_STRICT); |
|||
ini_set('display_errors', 1); |
|||
|
|||
$content = core_component::get_cache_content(); |
|||
|
|||
if ($options['print']) { |
|||
echo $content; |
|||
exit(0); |
|||
} |
|||
|
|||
if ($options['rebuild']) { |
|||
if (empty($CFG->alternative_component_cache)) { |
|||
fwrite(STDERR, 'config.php does not contain $CFG->alternative_component_cache setting'); |
|||
fwrite(STDERR, "\n"); |
|||
exit(2); |
|||
} |
|||
$target = $CFG->alternative_component_cache; |
|||
} else { |
|||
$target = $options['file']; |
|||
} |
|||
|
|||
if (!$target) { |
|||
fwrite(STDERR, "Invalid target file $target"); |
|||
fwrite(STDERR, "\n"); |
|||
exit(1); |
|||
} |
|||
|
|||
$bytes = file_put_contents($target, $content); |
|||
|
|||
if (!$bytes) { |
|||
fwrite(STDERR, "Error writing to $target"); |
|||
fwrite(STDERR, "\n"); |
|||
exit(1); |
|||
} |
|||
|
|||
// Success. |
|||
echo "File $target was updated\n"; |
|||
exit(0); |
@ -0,0 +1,99 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Automated backups CLI cron |
|||
* |
|||
* This script executes |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2010 Sam Hemelryk |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); // cli only functions |
|||
require_once($CFG->libdir.'/cronlib.php'); |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false), |
|||
array('h'=>'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Execute automated backups. |
|||
|
|||
This script executes automated backups completely and is designed to be |
|||
called via cron. |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/automated_backups.php |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
if (CLI_MAINTENANCE) { |
|||
echo "CLI maintenance mode active, backup execution suspended.\n"; |
|||
exit(1); |
|||
} |
|||
|
|||
if (moodle_needs_upgrading()) { |
|||
echo "Moodle upgrade pending, backup execution suspended.\n"; |
|||
exit(1); |
|||
} |
|||
|
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/gradelib.php'); |
|||
|
|||
if (!empty($CFG->showcronsql)) { |
|||
$DB->set_debug(true); |
|||
} |
|||
if (!empty($CFG->showcrondebugging)) { |
|||
set_debugging(DEBUG_DEVELOPER, true); |
|||
} |
|||
|
|||
$starttime = microtime(); |
|||
|
|||
/// emulate normal session |
|||
cron_setup_user(); |
|||
|
|||
/// Start output log |
|||
$timenow = time(); |
|||
|
|||
mtrace("Server Time: ".date('r',$timenow)."\n\n"); |
|||
|
|||
// Run automated backups if required. |
|||
require_once($CFG->dirroot.'/backup/util/includes/backup_includes.php'); |
|||
require_once($CFG->dirroot.'/backup/util/helper/backup_cron_helper.class.php'); |
|||
backup_cron_automated_helper::run_automated_backup(backup_cron_automated_helper::RUN_IMMEDIATELY); |
|||
|
|||
mtrace("Automated cron backups completed correctly"); |
|||
|
|||
$difftime = microtime_diff($starttime, microtime()); |
|||
mtrace("Execution took ".$difftime." seconds"); |
@ -0,0 +1,119 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script allows to do backup. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2013 Lancaster University |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', 1); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php'); |
|||
|
|||
// Now get cli options. |
|||
list($options, $unrecognized) = cli_get_params(array( |
|||
'courseid' => false, |
|||
'courseshortname' => '', |
|||
'destination' => '', |
|||
'help' => false, |
|||
), array('h' => 'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help'] || !($options['courseid'] || $options['courseshortname'])) { |
|||
$help = <<<EOL |
|||
Perform backup of the given course. |
|||
|
|||
Options: |
|||
--courseid=INTEGER Course ID for backup. |
|||
--courseshortname=STRING Course shortname for backup. |
|||
--destination=STRING Path where to store backup file. If not set the backup |
|||
will be stored within the course backup file area. |
|||
-h, --help Print out this help. |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/backup.php --courseid=2 --destination=/moodle/backup/\n |
|||
EOL; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
$admin = get_admin(); |
|||
if (!$admin) { |
|||
mtrace("Error: No admin account was found"); |
|||
die; |
|||
} |
|||
|
|||
// Do we need to store backup somewhere else? |
|||
$dir = rtrim($options['destination'], '/'); |
|||
if (!empty($dir)) { |
|||
if (!file_exists($dir) || !is_dir($dir) || !is_writable($dir)) { |
|||
mtrace("Destination directory does not exists or not writable."); |
|||
die; |
|||
} |
|||
} |
|||
|
|||
// Check that the course exists. |
|||
if ($options['courseid']) { |
|||
$course = $DB->get_record('course', array('id' => $options['courseid']), '*', MUST_EXIST); |
|||
} else if ($options['courseshortname']) { |
|||
$course = $DB->get_record('course', array('shortname' => $options['courseshortname']), '*', MUST_EXIST); |
|||
} |
|||
|
|||
cli_heading('Performing backup...'); |
|||
$bc = new backup_controller(backup::TYPE_1COURSE, $course->id, backup::FORMAT_MOODLE, |
|||
backup::INTERACTIVE_YES, backup::MODE_GENERAL, $admin->id); |
|||
// Set the default filename. |
|||
$format = $bc->get_format(); |
|||
$type = $bc->get_type(); |
|||
$id = $bc->get_id(); |
|||
$users = $bc->get_plan()->get_setting('users')->get_value(); |
|||
$anonymised = $bc->get_plan()->get_setting('anonymize')->get_value(); |
|||
$filename = backup_plan_dbops::get_default_backup_filename($format, $type, $id, $users, $anonymised); |
|||
$bc->get_plan()->get_setting('filename')->set_value($filename); |
|||
|
|||
// Execution. |
|||
$bc->finish_ui(); |
|||
$bc->execute_plan(); |
|||
$results = $bc->get_results(); |
|||
$file = $results['backup_destination']; // May be empty if file already moved to target location. |
|||
|
|||
// Do we need to store backup somewhere else? |
|||
if (!empty($dir)) { |
|||
if ($file) { |
|||
mtrace("Writing " . $dir.'/'.$filename); |
|||
if ($file->copy_content_to($dir.'/'.$filename)) { |
|||
$file->delete(); |
|||
mtrace("Backup completed."); |
|||
} else { |
|||
mtrace("Destination directory does not exist or is not writable. Leaving the backup in the course backup file area."); |
|||
} |
|||
} |
|||
} else { |
|||
mtrace("Backup completed, the new file is listed in the backup area of the given course"); |
|||
} |
|||
$bc->destroy(); |
|||
exit(0); |
@ -0,0 +1,119 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Build and store theme CSS. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2017 Ryan Wyllie <ryan@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once("$CFG->libdir/clilib.php"); |
|||
require_once("$CFG->libdir/csslib.php"); |
|||
require_once("$CFG->libdir/outputlib.php"); |
|||
|
|||
$longparams = [ |
|||
'themes' => null, |
|||
'direction' => null, |
|||
'help' => false, |
|||
'verbose' => false |
|||
]; |
|||
|
|||
$shortmappings = [ |
|||
't' => 'themes', |
|||
'd' => 'direction', |
|||
'h' => 'help', |
|||
'v' => 'verbose' |
|||
]; |
|||
|
|||
// Get CLI params. |
|||
list($options, $unrecognized) = cli_get_params($longparams, $shortmappings); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
echo |
|||
"Compile the CSS for one or more installed themes. |
|||
Existing CSS caches will replaced. |
|||
By default all themes will be recompiled unless otherwise specified. |
|||
|
|||
Options: |
|||
-t, --themes A comma separated list of themes to be compiled |
|||
-d, --direction Only compile a single direction (either ltr or rtl) |
|||
-v, --verbose Print info comments to stdout |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$ sudo -u www-data /usr/bin/php admin/cli/build_theme_css.php --themes=boost --direction=ltr |
|||
"; |
|||
|
|||
die; |
|||
} |
|||
|
|||
if (empty($options['verbose'])) { |
|||
$trace = new null_progress_trace(); |
|||
} else { |
|||
$trace = new text_progress_trace(); |
|||
} |
|||
|
|||
cli_heading('Build theme css'); |
|||
|
|||
// Determine which themes we need to build. |
|||
$themenames = []; |
|||
if (is_null($options['themes'])) { |
|||
$trace->output('No themes specified. Finding all installed themes.'); |
|||
$themenames = array_keys(core_component::get_plugin_list('theme')); |
|||
} else { |
|||
if (is_string($options['themes'])) { |
|||
$themenames = explode(',', $options['themes']); |
|||
} else { |
|||
cli_error('--themes must be a comma separated list of theme names'); |
|||
} |
|||
} |
|||
|
|||
$trace->output('Checking that each theme is correctly installed...'); |
|||
$themeconfigs = []; |
|||
foreach ($themenames as $themename) { |
|||
if (is_null(theme_get_config_file_path($themename))) { |
|||
cli_error("Unable to find theme config for {$themename}"); |
|||
} |
|||
|
|||
// Load the config for the theme. |
|||
$themeconfigs[] = theme_config::load($themename); |
|||
} |
|||
|
|||
$directions = ['ltr', 'rtl']; |
|||
|
|||
if (!is_null($options['direction'])) { |
|||
if (!in_array($options['direction'], $directions)) { |
|||
cli_error("--direction must be either ltr or rtl"); |
|||
} |
|||
|
|||
$directions = [$options['direction']]; |
|||
} |
|||
|
|||
$trace->output('Building CSS for themes: ' . implode(', ', $themenames)); |
|||
theme_build_css_for_themes($themeconfigs, $directions); |
|||
|
|||
exit(0); |
@ -0,0 +1,173 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* CLI script allowing to get and set config values. |
|||
* |
|||
* This is technically just a thin wrapper for {@link get_config()} and |
|||
* {@link set_config()} functions. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2017 David Mudrák <david@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
$usage = "Displays the current value of the given site setting. Allows to set it to the given value, too. |
|||
|
|||
Usage: |
|||
# php cfg.php [--component=<componentname>] [--json] [--shell-arg] |
|||
# php cfg.php --name=<configname> [--component=<componentname>] [--shell-arg] [--no-eol] |
|||
# php cfg.php --name=<configname> [--component=<componentname>] --set=<value> |
|||
# php cfg.php --name=<configname> [--component=<componentname>] --unset |
|||
# php cfg.php [--help|-h] |
|||
|
|||
Options: |
|||
-h --help Print this help. |
|||
--component=<frankenstyle> Name of the component the variable is part of. Defaults to core. |
|||
--name=<configname> Name of the configuration variable to get/set. If missing, print all |
|||
configuration variables of the given component. |
|||
--set=<value> Set the given variable to this value. |
|||
--unset Unset the given variable. |
|||
--shell-arg Escape output values so that they can be directly used as shell script arguments. |
|||
--json Encode output list of values using JSON notation. |
|||
--no-eol Do not include the trailing new line character when printing the value. |
|||
|
|||
The list of all variables of the given component can be printed as |
|||
tab-separated list (default) or JSON object (--json). Particular values are |
|||
printed as raw text values, optionally escaped so that they can be directly |
|||
used as shell script arguments (--shell-arg). Single values are displayed with |
|||
trailing new line by default, unless explicitly disabled (--no-eol). |
|||
|
|||
In the read mode, the script exits with success status 0 if the requested value |
|||
is found. If the requested variable is not set, the script exits with status 3. |
|||
When listing all variables of the component, the exit status is always 0 even |
|||
if no variables for the given component are found. When setting/unsetting a |
|||
value, the exit status is 0. When attempting to set/unset a value that has |
|||
already been hard-set in config.php, the script exits with error status 4. In |
|||
case of unexpected error, the script exits with error status 1. |
|||
|
|||
Examples: |
|||
|
|||
# php cfg.php |
|||
Prints tab-separated list of all core configuration variables and their values. |
|||
|
|||
# php cfg.php --json |
|||
Prints list of all core configuration variables and their values as a JSON object. |
|||
|
|||
# php cfg.php --name=release |
|||
Prints the given configuration variable - e.g. \$CFG->release in this case. |
|||
|
|||
# php cfg.php --component=tool_recyclebin |
|||
# Prints tab-separated list of the plugin's configuration variables. |
|||
|
|||
# export DATAROOT=\$(php cfg.php --name=dataroot --shell-arg --no-eol) |
|||
Stores the given configuration variable in the shell variable, escaped |
|||
so that it can be safely used as a shell argument. |
|||
|
|||
# php cfg.php --name=theme --set=classic |
|||
Sets the given configuration variable to the given value. |
|||
|
|||
# php cfg.php --name=noemailever --unset |
|||
Unsets the previously configured variable. |
|||
"; |
|||
|
|||
list($options, $unrecognised) = cli_get_params([ |
|||
'help' => false, |
|||
'component' => null, |
|||
'name' => null, |
|||
'set' => null, |
|||
'unset' => false, |
|||
'shell-arg' => false, |
|||
'json' => false, |
|||
'no-eol' => false, |
|||
], [ |
|||
'h' => 'help' |
|||
]); |
|||
|
|||
if ($unrecognised) { |
|||
$unrecognised = implode(PHP_EOL.' ', $unrecognised); |
|||
cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
cli_writeln($usage); |
|||
exit(2); |
|||
} |
|||
|
|||
if ($options['unset'] || $options['set'] !== null) { |
|||
// Unset the variable or set it to the given value. |
|||
if (empty($options['name'])) { |
|||
cli_error('Missing configuration variable name', 2); |
|||
} |
|||
|
|||
// Check that the variable is not hard-set in the main config.php already. |
|||
if (array_key_exists($options['name'], $CFG->config_php_settings)) { |
|||
cli_error('The configuration variable is hard-set in the config.php, unable to change.', 4); |
|||
} |
|||
|
|||
set_config($options['name'], $options['set'], $options['component']); |
|||
exit(0); |
|||
} |
|||
|
|||
if ($options['name'] === null) { |
|||
// List all variables provided by the component (defaults to core). |
|||
$got = get_config($options['component']); |
|||
|
|||
if ($options['json']) { |
|||
cli_writeln(json_encode($got)); |
|||
|
|||
} else { |
|||
foreach ($got as $name => $value) { |
|||
if ($options['shell-arg']) { |
|||
$value = escapeshellarg($value); |
|||
} |
|||
cli_writeln($name."\t".$value); |
|||
} |
|||
} |
|||
|
|||
exit(0); |
|||
|
|||
} else { |
|||
// Display the value of a single variable. |
|||
|
|||
$got = get_config($options['component'], $options['name']); |
|||
|
|||
if ($got === false) { |
|||
cli_error('No such configuration variable found.', 3); |
|||
} |
|||
|
|||
if ($options['shell-arg']) { |
|||
$got = escapeshellarg($got); |
|||
} |
|||
|
|||
if ($options['json']) { |
|||
$got = json_encode($got); |
|||
} |
|||
|
|||
if ($options['no-eol']) { |
|||
cli_write($got); |
|||
} else { |
|||
cli_writeln($got); |
|||
} |
|||
|
|||
exit(0); |
|||
} |
@ -0,0 +1,76 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Validate that the current db structure matches the install.xml files. |
|||
* |
|||
* @package core |
|||
* @copyright 2014 Totara Learning Solutions Ltd {@link http://www.totaralms.com/} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
* @author Petr Skoda <petr.skoda@totaralms.com> |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__ . '/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
$help = "Validate database structure |
|||
|
|||
Options: |
|||
-h, --help Print out this help. |
|||
|
|||
Example: |
|||
\$ sudo -u www-data /usr/bin/php admin/cli/check_database_schema.php |
|||
"; |
|||
|
|||
list($options, $unrecognized) = cli_get_params( |
|||
array( |
|||
'help' => false, |
|||
), |
|||
array( |
|||
'h' => 'help', |
|||
) |
|||
); |
|||
|
|||
if ($options['help']) { |
|||
echo $help; |
|||
exit(0); |
|||
} |
|||
|
|||
if (empty($CFG->version)) { |
|||
echo "Database is not yet installed.\n"; |
|||
exit(2); |
|||
} |
|||
|
|||
$dbmanager = $DB->get_manager(); |
|||
$schema = $dbmanager->get_install_xml_schema(); |
|||
|
|||
if (!$errors = $dbmanager->check_database_schema($schema)) { |
|||
echo "Database structure is ok.\n"; |
|||
exit(0); |
|||
} |
|||
|
|||
foreach ($errors as $table => $items) { |
|||
cli_separator(); |
|||
echo "$table\n"; |
|||
foreach ($items as $item) { |
|||
echo " * $item\n"; |
|||
} |
|||
} |
|||
cli_separator(); |
|||
|
|||
exit(1); |
@ -0,0 +1,61 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* CLI cron |
|||
* |
|||
* This script looks through all the module directories for cron.php files |
|||
* and runs them. These files can contain cleanup functions, email functions |
|||
* or anything that needs to be run on a regular basis. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2009 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); // cli only functions |
|||
require_once($CFG->libdir.'/cronlib.php'); |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false), |
|||
array('h'=>'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Execute periodic cron actions. |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/cron.php |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
cron_run(); |
@ -0,0 +1,125 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script fixed incorrectly deleted users. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2013 Marina Glancy |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
// Get cli options. |
|||
list($options, $unrecognized) = cli_get_params( |
|||
array( |
|||
'courses' => false, |
|||
'fix' => false, |
|||
'help' => false |
|||
), |
|||
array( |
|||
'h' => 'help', |
|||
'c' => 'courses', |
|||
'f' => 'fix' |
|||
) |
|||
); |
|||
|
|||
if ($options['help'] || empty($options['courses'])) { |
|||
$help = |
|||
"Checks and fixes that course modules and sections reference each other correctly. |
|||
|
|||
Compares DB fields course_sections.sequence and course_modules.section |
|||
checking that: |
|||
- course_sections.sequence contains each module id not more than once in the course |
|||
- for each moduleid from course_sections.sequence the field course_modules.section |
|||
refers to the same section id (this means course_sections.sequence is more |
|||
important if they are different) |
|||
- each module in the course is present in one of course_sections.sequence |
|||
- section sequences do not contain non-existing course modules |
|||
|
|||
If there are any mismatches, the message is displayed. If --fix is specified, |
|||
the records in DB are corrected. |
|||
|
|||
This script may run for a long time on big systems if called for all courses. |
|||
|
|||
Avoid executing the script when another user may simultaneously edit any of the |
|||
courses being checked (recommended to run in mainenance mode). |
|||
|
|||
Options: |
|||
-c, --courses List courses that need to be checked (comma-separated |
|||
values or * for all). Required |
|||
-f, --fix Fix the mismatches in DB. If not specified check only and |
|||
report problems to STDERR |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=* |
|||
\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=2,3,4 --fix |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
$courseslist = preg_split('/\s*,\s*/', $options['courses'], -1, PREG_SPLIT_NO_EMPTY); |
|||
if (in_array('*', $courseslist)) { |
|||
$where = ''; |
|||
$params = array(); |
|||
} else { |
|||
list($sql, $params) = $DB->get_in_or_equal($courseslist, SQL_PARAMS_NAMED, 'id'); |
|||
$where = 'WHERE id '. $sql; |
|||
} |
|||
$coursescount = $DB->get_field_sql('SELECT count(id) FROM {course} '. $where, $params); |
|||
|
|||
if (!$coursescount) { |
|||
cli_error('No courses found'); |
|||
} |
|||
echo "Checking $coursescount courses...\n\n"; |
|||
|
|||
require_once($CFG->dirroot. '/course/lib.php'); |
|||
|
|||
$problems = array(); |
|||
$courses = $DB->get_fieldset_sql('SELECT id FROM {course} '. $where, $params); |
|||
foreach ($courses as $courseid) { |
|||
$errors = course_integrity_check($courseid, null, null, true, empty($options['fix'])); |
|||
if ($errors) { |
|||
if (!empty($options['fix'])) { |
|||
// Reset the course cache to make sure cache is recalculated next time the course is viewed. |
|||
rebuild_course_cache($courseid, true); |
|||
} |
|||
foreach ($errors as $error) { |
|||
cli_problem($error); |
|||
} |
|||
$problems[] = $courseid; |
|||
} else { |
|||
echo "Course [$courseid] is OK\n"; |
|||
} |
|||
} |
|||
if (!count($problems)) { |
|||
echo "\n...All courses are OK\n"; |
|||
} else { |
|||
if (!empty($options['fix'])) { |
|||
echo "\n...Found and fixed ".count($problems)." courses with problems". "\n"; |
|||
} else { |
|||
echo "\n...Found ".count($problems)." courses with problems. To fix run:\n"; |
|||
echo "\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=".join(',', $problems)." --fix". "\n"; |
|||
} |
|||
} |
@ -0,0 +1,92 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script fixed incorrectly deleted users. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2013 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
|
|||
// Now get cli options. |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false), |
|||
array('h'=>'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Fix incorrectly deleted users. |
|||
|
|||
This scripts detects users that are marked as deleted instead |
|||
of calling delete_user(). |
|||
|
|||
Deleted users do not have original username, idnumber or email, |
|||
we must also delete all roles, enrolments, group memberships, etc. |
|||
|
|||
Please note this script does not delete any public information |
|||
such as forum posts. |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/fix_deleted_users.php |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
cli_heading('Looking for sloppy user deletes'); |
|||
|
|||
// Look for sloppy deleted users where somebody only flipped the deleted flag. |
|||
$sql = "SELECT * |
|||
FROM {user} |
|||
WHERE deleted = 1 AND email LIKE '%@%' AND username NOT LIKE '%@%'"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
foreach ($rs as $user) { |
|||
echo "Redeleting user $user->id: $user->username ($user->email)\n"; |
|||
delete_user($user); |
|||
} |
|||
$rs->close(); |
|||
|
|||
cli_heading('Deleting all leftovers'); |
|||
|
|||
$DB->set_field('user', 'idnumber', '', array('deleted'=>1)); |
|||
|
|||
$DB->delete_records_select('role_assignments', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('cohort_members', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('groups_members', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('user_enrolments', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('user_preferences', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('user_info_data', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('user_lastaccess', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('external_tokens', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
$DB->delete_records_select('external_services_users', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); |
|||
|
|||
exit(0); |
@ -0,0 +1,103 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script fixes orphaned question categories. |
|||
* |
|||
* Orphaned question categories have had their associated context deleted |
|||
* but the category itself remains in the database with an invalid context. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2013 Tyler Bannister (tyler.bannister@remote-learner.net) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
require_once($CFG->libdir.'/questionlib.php'); |
|||
|
|||
$long = array('fix' => false, 'help' => false); |
|||
$short = array('f' => 'fix', 'h' => 'help'); |
|||
|
|||
// Now get cli options. |
|||
list($options, $unrecognized) = cli_get_params($long, $short); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Fix orphaned question categories. |
|||
|
|||
This scripts detects question categories that have had their |
|||
context deleted, thus severing them from their original purpose. |
|||
|
|||
This script will find the orphaned categories and delete the unused |
|||
questions in each category found. Used questions will not be |
|||
deleted, instead they will be moved to a rescue question category. |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
-f, --fix Fix the orphaned question categories in the DB. |
|||
If not specified only check and report problems to STDERR. |
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_question_categories.php |
|||
\$sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_question_categories.php -f |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
cli_heading('Checking for orphaned categories'); |
|||
|
|||
|
|||
$sql = 'SELECT qc.id, qc.contextid, qc.name |
|||
FROM {question_categories} qc |
|||
LEFT JOIN {context} c ON qc.contextid = c.id |
|||
WHERE c.id IS NULL'; |
|||
$categories = $DB->get_recordset_sql($sql); |
|||
|
|||
$i = 0; |
|||
foreach ($categories as $category) { |
|||
$i += 1; |
|||
echo "Found orphaned category: {$category->name}\n"; |
|||
if (!empty($options['fix'])) { |
|||
echo "Cleaning..."; |
|||
// One transaction per category. |
|||
$transaction = $DB->start_delegated_transaction(); |
|||
question_category_delete_safe($category); |
|||
$transaction->allow_commit(); |
|||
echo " Done!\n"; |
|||
} |
|||
} |
|||
|
|||
if (($i > 0) && !empty($options['fix'])) { |
|||
echo "Found and removed {$i} orphaned question categories\n"; |
|||
} else if ($i > 0) { |
|||
echo "Found {$i} orphaned question categories. To fix, run:\n"; |
|||
echo "\$sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_question_categories.php --fix\n"; |
|||
} else { |
|||
echo "No orphaned question categories found.\n"; |
|||
} |
|||
|
|||
|
|||
$categories->close(); |
@ -0,0 +1,817 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script creates config.php file and prepares database. |
|||
* |
|||
* This script is not intended for beginners! |
|||
* Potential problems: |
|||
* - su to apache account or sudo before execution |
|||
* - not compatible with Windows platform |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2009 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
// extra execution prevention - we can not just require config.php here |
|||
if (isset($_SERVER['REMOTE_ADDR'])) { |
|||
exit(1); |
|||
} |
|||
|
|||
// Force OPcache reset if used, we do not want any stale caches |
|||
// when preparing test environment. |
|||
if (function_exists('opcache_reset')) { |
|||
opcache_reset(); |
|||
} |
|||
|
|||
$help = |
|||
"Command line Moodle installer, creates config.php and initializes database. |
|||
Please note you must execute this script with the same uid as apache |
|||
or use chmod/chown after installation. |
|||
|
|||
Site defaults may be changed via local/defaults.php. |
|||
|
|||
Options: |
|||
--chmod=OCTAL-MODE Permissions of new directories created within dataroot. |
|||
Default is 2777. You may want to change it to 2770 |
|||
or 2750 or 750. See chmod man page for details. |
|||
--lang=CODE Installation and default site language. |
|||
--wwwroot=URL Web address for the Moodle site, |
|||
required in non-interactive mode. |
|||
--dataroot=DIR Location of the moodle data folder, |
|||
must not be web accessible. Default is moodledata |
|||
in the parent directory. |
|||
--dbtype=TYPE Database type. Default is mysqli |
|||
--dbhost=HOST Database host. Default is localhost |
|||
--dbname=NAME Database name. Default is moodle |
|||
--dbuser=USERNAME Database user. Default is root |
|||
--dbpass=PASSWORD Database password. Default is blank |
|||
--dbport=NUMBER Use database port. |
|||
--dbsocket=PATH Use database socket, 1 means default. Available for some databases only. |
|||
--prefix=STRING Table prefix for above database tables. Default is mdl_ |
|||
--fullname=STRING The fullname of the site |
|||
--shortname=STRING The shortname of the site |
|||
--summary=STRING The summary to be displayed on the front page |
|||
--adminuser=USERNAME Username for the moodle admin account. Default is admin |
|||
--adminpass=PASSWORD Password for the moodle admin account, |
|||
required in non-interactive mode. |
|||
--adminemail=STRING Email address for the moodle admin account. |
|||
--upgradekey=STRING The upgrade key to be set in the config.php, leave empty to not set it. |
|||
--non-interactive No interactive questions, installation fails if any |
|||
problem encountered. |
|||
--agree-license Indicates agreement with software license, |
|||
required in non-interactive mode. |
|||
--allow-unstable Install even if the version is not marked as stable yet, |
|||
required in non-interactive mode. |
|||
--skip-database Stop the installation before installing the database. |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/install.php --lang=cs |
|||
"; //TODO: localize, mark as needed in install - to be translated later when everything is finished |
|||
|
|||
|
|||
// distro specific customisation |
|||
$distrolibfile = __DIR__.'/../../install/distrolib.php'; |
|||
$distro = null; |
|||
if (file_exists($distrolibfile)) { |
|||
require_once($distrolibfile); |
|||
if (function_exists('distro_get_config')) { |
|||
$distro = distro_get_config(); |
|||
} |
|||
} |
|||
|
|||
// Nothing to do if config.php exists |
|||
$configfile = __DIR__.'/../../config.php'; |
|||
if (file_exists($configfile)) { |
|||
require($configfile); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false), array('h'=>'help')); |
|||
|
|||
if ($options['help']) { |
|||
echo $help; |
|||
echo "\n\n"; |
|||
} |
|||
|
|||
if ($DB->get_manager()->table_exists('config')) { |
|||
cli_error(get_string('clialreadyinstalled', 'install')); |
|||
} else { |
|||
cli_error(get_string('clialreadyconfigured', 'install')); |
|||
} |
|||
} |
|||
|
|||
$olddir = getcwd(); |
|||
|
|||
// change directory so that includes below work properly |
|||
chdir(dirname($_SERVER['argv'][0])); |
|||
|
|||
// Servers should define a default timezone in php.ini, but if they don't then make sure something is defined. |
|||
if (!function_exists('date_default_timezone_set') or !function_exists('date_default_timezone_get')) { |
|||
fwrite(STDERR, "Timezone functions are not available.\n"); |
|||
exit(1); |
|||
} |
|||
date_default_timezone_set(@date_default_timezone_get()); |
|||
|
|||
// make sure PHP errors are displayed - helps with diagnosing of problems |
|||
@error_reporting(E_ALL); |
|||
@ini_set('display_errors', '1'); |
|||
// we need a lot of memory |
|||
@ini_set('memory_limit', '128M'); |
|||
|
|||
/** Used by library scripts to check they are being called by Moodle */ |
|||
define('MOODLE_INTERNAL', true); |
|||
|
|||
// Disables all caching. |
|||
define('CACHE_DISABLE_ALL', true); |
|||
|
|||
define('PHPUNIT_TEST', false); |
|||
|
|||
define('IGNORE_COMPONENT_CACHE', true); |
|||
|
|||
// Check that PHP is of a sufficient version as soon as possible. |
|||
require_once(__DIR__.'/../../lib/phpminimumversionlib.php'); |
|||
moodle_require_minimum_php_version(); |
|||
|
|||
// set up configuration |
|||
global $CFG; |
|||
$CFG = new stdClass(); |
|||
$CFG->lang = 'en'; |
|||
$CFG->dirroot = dirname(dirname(__DIR__)); |
|||
$CFG->libdir = "$CFG->dirroot/lib"; |
|||
$CFG->wwwroot = "http://localhost"; |
|||
$CFG->httpswwwroot = $CFG->wwwroot; |
|||
$CFG->docroot = 'http://docs.moodle.org'; |
|||
$CFG->running_installer = true; |
|||
$CFG->early_install_lang = true; |
|||
$CFG->ostype = (stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'darwin')) ? 'WINDOWS' : 'UNIX'; |
|||
$CFG->dboptions = array(); |
|||
$CFG->debug = (E_ALL | E_STRICT); |
|||
$CFG->debugdisplay = true; |
|||
$CFG->debugdeveloper = true; |
|||
|
|||
$parts = explode('/', str_replace('\\', '/', dirname(__DIR__))); |
|||
$CFG->admin = array_pop($parts); |
|||
|
|||
//point pear include path to moodles lib/pear so that includes and requires will search there for files before anywhere else |
|||
//the problem is that we need specific version of quickforms and hacked excel files :-( |
|||
ini_set('include_path', $CFG->libdir.'/pear' . PATH_SEPARATOR . ini_get('include_path')); |
|||
|
|||
require_once($CFG->libdir.'/classes/component.php'); |
|||
require_once($CFG->libdir.'/classes/text.php'); |
|||
require_once($CFG->libdir.'/classes/string_manager.php'); |
|||
require_once($CFG->libdir.'/classes/string_manager_install.php'); |
|||
require_once($CFG->libdir.'/classes/string_manager_standard.php'); |
|||
require_once($CFG->libdir.'/installlib.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
require_once($CFG->libdir.'/setuplib.php'); |
|||
require_once($CFG->libdir.'/weblib.php'); |
|||
require_once($CFG->libdir.'/dmllib.php'); |
|||
require_once($CFG->libdir.'/moodlelib.php'); |
|||
require_once($CFG->libdir.'/deprecatedlib.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/componentlib.class.php'); |
|||
require_once($CFG->dirroot.'/cache/lib.php'); |
|||
|
|||
// Register our classloader, in theory somebody might want to replace it to load other hacked core classes. |
|||
// Required because the database checks below lead to session interaction which is going to lead us to requiring autoloaded classes. |
|||
if (defined('COMPONENT_CLASSLOADER')) { |
|||
spl_autoload_register(COMPONENT_CLASSLOADER); |
|||
} else { |
|||
spl_autoload_register('core_component::classloader'); |
|||
} |
|||
|
|||
require($CFG->dirroot.'/version.php'); |
|||
$CFG->target_release = $release; |
|||
|
|||
\core\session\manager::init_empty_session(); |
|||
global $SESSION; |
|||
global $USER; |
|||
|
|||
global $COURSE; |
|||
$COURSE = new stdClass(); |
|||
$COURSE->id = 1; |
|||
|
|||
global $SITE; |
|||
$SITE = $COURSE; |
|||
define('SITEID', 1); |
|||
|
|||
//Database types |
|||
$databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'native'), |
|||
'mariadb'=> moodle_database::get_driver_instance('mariadb', 'native'), |
|||
'pgsql' => moodle_database::get_driver_instance('pgsql', 'native'), |
|||
'oci' => moodle_database::get_driver_instance('oci', 'native'), |
|||
'sqlsrv' => moodle_database::get_driver_instance('sqlsrv', 'native'), // MS SQL*Server PHP driver |
|||
); |
|||
foreach ($databases as $type=>$database) { |
|||
if ($database->driver_installed() !== true) { |
|||
unset($databases[$type]); |
|||
} |
|||
} |
|||
if (empty($databases)) { |
|||
$defaultdb = ''; |
|||
} else { |
|||
reset($databases); |
|||
$defaultdb = key($databases); |
|||
} |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params( |
|||
array( |
|||
'chmod' => isset($distro->directorypermissions) ? sprintf('%04o',$distro->directorypermissions) : '2777', // let distros set dir permissions |
|||
'lang' => $CFG->lang, |
|||
'wwwroot' => '', |
|||
'dataroot' => empty($distro->dataroot) ? str_replace('\\', '/', dirname(dirname(dirname(__DIR__))).'/moodledata'): $distro->dataroot, // initialised later after including libs or by distro |
|||
'dbtype' => empty($distro->dbtype) ? $defaultdb : $distro->dbtype, // let distro skip dbtype selection |
|||
'dbhost' => empty($distro->dbhost) ? 'localhost' : $distro->dbhost, // let distros set dbhost |
|||
'dbname' => 'moodle', |
|||
'dbuser' => empty($distro->dbuser) ? 'root' : $distro->dbuser, // let distros set dbuser |
|||
'dbpass' => '', |
|||
'dbport' => '', |
|||
'dbsocket' => '', |
|||
'prefix' => 'mdl_', |
|||
'fullname' => '', |
|||
'shortname' => '', |
|||
'summary' => '', |
|||
'adminuser' => 'admin', |
|||
'adminpass' => '', |
|||
'adminemail' => '', |
|||
'upgradekey' => '', |
|||
'non-interactive' => false, |
|||
'agree-license' => false, |
|||
'allow-unstable' => false, |
|||
'skip-database' => false, |
|||
'help' => false |
|||
), |
|||
array( |
|||
'h' => 'help' |
|||
) |
|||
); |
|||
|
|||
$interactive = empty($options['non-interactive']); |
|||
|
|||
// set up language |
|||
$lang = clean_param($options['lang'], PARAM_SAFEDIR); |
|||
$languages = get_string_manager()->get_list_of_translations(); |
|||
if (array_key_exists($lang, $languages)) { |
|||
$CFG->lang = $lang; |
|||
} |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
//Print header |
|||
cli_logo(); |
|||
echo PHP_EOL; |
|||
echo get_string('cliinstallheader', 'install', $CFG->target_release)."\n"; |
|||
|
|||
//Fist select language |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
// Do not put the langs into columns because it is not compatible with RTL. |
|||
$default = $CFG->lang; |
|||
cli_heading(get_string('chooselanguagehead', 'install')); |
|||
if (array_key_exists($default, $languages)) { |
|||
echo $default.' - '.$languages[$default]."\n"; |
|||
} |
|||
if ($default !== 'en') { |
|||
echo 'en - English (en)'."\n"; |
|||
} |
|||
echo '? - '.get_string('availablelangs', 'install')."\n"; |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $CFG->lang); |
|||
$error = ''; |
|||
do { |
|||
echo $error; |
|||
$input = cli_input($prompt, $default); |
|||
|
|||
if ($input === '?') { |
|||
echo implode("\n", $languages)."\n"; |
|||
$error = "\n"; |
|||
|
|||
} else { |
|||
$input = clean_param($input, PARAM_SAFEDIR); |
|||
|
|||
if (!array_key_exists($input, $languages)) { |
|||
$error = get_string('cliincorrectvalueretry', 'admin')."\n"; |
|||
} else { |
|||
$error = ''; |
|||
} |
|||
} |
|||
} while ($error !== ''); |
|||
$CFG->lang = $input; |
|||
} else { |
|||
// already selected and verified |
|||
} |
|||
|
|||
// Set directorypermissions first |
|||
$chmod = octdec(clean_param($options['chmod'], PARAM_INT)); |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('datarootpermission', 'install')); |
|||
$prompt = get_string('clitypevaluedefault', 'admin', decoct($chmod)); |
|||
$error = ''; |
|||
do { |
|||
echo $error; |
|||
$input = cli_input($prompt, decoct($chmod)); |
|||
$input = octdec(clean_param($input, PARAM_INT)); |
|||
if (empty($input)) { |
|||
$error = get_string('cliincorrectvalueretry', 'admin')."\n"; |
|||
} else { |
|||
$error = ''; |
|||
} |
|||
} while ($error !== ''); |
|||
$chmod = $input; |
|||
|
|||
} else { |
|||
if (empty($chmod)) { |
|||
$a = (object)array('option' => 'chmod', 'value' => decoct($chmod)); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
} |
|||
$CFG->directorypermissions = $chmod; |
|||
$CFG->filepermissions = ($CFG->directorypermissions & 0666); |
|||
$CFG->umaskpermissions = (($CFG->directorypermissions & 0777) ^ 0777); |
|||
|
|||
//We need wwwroot before we test dataroot |
|||
$wwwroot = clean_param($options['wwwroot'], PARAM_URL); |
|||
$wwwroot = trim($wwwroot, '/'); |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('wwwroot', 'install')); |
|||
if (strpos($wwwroot, 'http') === 0) { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $wwwroot); |
|||
} else { |
|||
$wwwroot = null; |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
$error = ''; |
|||
do { |
|||
echo $error; |
|||
$input = cli_input($prompt, $wwwroot); |
|||
$input = clean_param($input, PARAM_URL); |
|||
$input = trim($input, '/'); |
|||
if (strpos($input, 'http') !== 0) { |
|||
$error = get_string('cliincorrectvalueretry', 'admin')."\n"; |
|||
} else { |
|||
$error = ''; |
|||
} |
|||
} while ($error !== ''); |
|||
$wwwroot = $input; |
|||
|
|||
} else { |
|||
if (strpos($wwwroot, 'http') !== 0) { |
|||
$a = (object)array('option'=>'wwwroot', 'value'=>$wwwroot); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
} |
|||
$CFG->wwwroot = $wwwroot; |
|||
$CFG->httpswwwroot = $CFG->wwwroot; |
|||
|
|||
|
|||
//We need dataroot before lang download |
|||
$CFG->dataroot = $options['dataroot']; |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
$i=0; |
|||
while(is_dataroot_insecure()) { |
|||
$parrent = dirname($CFG->dataroot); |
|||
$i++; |
|||
if ($parrent == '/' or $parrent == '.' or preg_match('/^[a-z]:\\\?$/i', $parrent) or ($i > 100)) { |
|||
$CFG->dataroot = ''; //can not find secure location for dataroot |
|||
break; |
|||
} |
|||
$CFG->dataroot = dirname($parrent).'/moodledata'; |
|||
} |
|||
cli_heading(get_string('dataroot', 'install')); |
|||
$error = ''; |
|||
do { |
|||
if ($CFG->dataroot !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $CFG->dataroot); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
echo $error; |
|||
$CFG->dataroot = cli_input($prompt, $CFG->dataroot); |
|||
if ($CFG->dataroot === '') { |
|||
$error = get_string('cliincorrectvalueretry', 'admin')."\n"; |
|||
} else if (is_dataroot_insecure()) { |
|||
$CFG->dataroot = ''; |
|||
$error = get_string('pathsunsecuredataroot', 'install')."\n"; |
|||
} else { |
|||
if (install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) { |
|||
$error = ''; |
|||
} else { |
|||
$a = (object)array('dataroot' => $CFG->dataroot); |
|||
$error = get_string('pathserrcreatedataroot', 'install', $a)."\n"; |
|||
} |
|||
} |
|||
|
|||
} while ($error !== ''); |
|||
|
|||
} else { |
|||
if (is_dataroot_insecure()) { |
|||
cli_error(get_string('pathsunsecuredataroot', 'install')); |
|||
} |
|||
if (!install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) { |
|||
$a = (object)array('dataroot' => $CFG->dataroot); |
|||
cli_error(get_string('pathserrcreatedataroot', 'install', $a)); |
|||
} |
|||
} |
|||
$CFG->tempdir = $CFG->dataroot.'/temp'; |
|||
$CFG->backuptempdir = $CFG->tempdir.'/backup'; |
|||
$CFG->cachedir = $CFG->dataroot.'/cache'; |
|||
$CFG->localcachedir = $CFG->dataroot.'/localcache'; |
|||
|
|||
// download required lang packs |
|||
if ($CFG->lang !== 'en') { |
|||
$installer = new lang_installer($CFG->lang); |
|||
$results = $installer->run(); |
|||
foreach ($results as $langcode => $langstatus) { |
|||
if ($langstatus === lang_installer::RESULT_DOWNLOADERROR) { |
|||
$a = new stdClass(); |
|||
$a->url = $installer->lang_pack_url($langcode); |
|||
$a->dest = $CFG->dataroot.'/lang'; |
|||
cli_problem(get_string('remotedownloaderror', 'error', $a)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// switch the string_manager instance to stop using install/lang/ |
|||
$CFG->early_install_lang = false; |
|||
$CFG->langotherroot = $CFG->dataroot.'/lang'; |
|||
$CFG->langlocalroot = $CFG->dataroot.'/lang'; |
|||
get_string_manager(true); |
|||
|
|||
// make sure we are installing stable release or require a confirmation |
|||
if (isset($maturity)) { |
|||
if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) { |
|||
$maturitylevel = get_string('maturity'.$maturity, 'admin'); |
|||
|
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('notice')); |
|||
echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL; |
|||
echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL; |
|||
echo get_string('continue') . PHP_EOL; |
|||
$prompt = get_string('cliyesnoprompt', 'admin'); |
|||
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin'))); |
|||
if ($input == get_string('clianswerno', 'admin')) { |
|||
exit(1); |
|||
} |
|||
} else { |
|||
cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel)); |
|||
cli_error(get_string('maturityallowunstable', 'admin')); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// ask for db type - show only drivers available |
|||
if ($interactive) { |
|||
$options['dbtype'] = strtolower($options['dbtype']); |
|||
cli_separator(); |
|||
cli_heading(get_string('databasetypehead', 'install')); |
|||
foreach ($databases as $type=>$database) { |
|||
echo " $type \n"; |
|||
} |
|||
if (!empty($databases[$options['dbtype']])) { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbtype']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
$CFG->dbtype = cli_input($prompt, $options['dbtype'], array_keys($databases)); |
|||
|
|||
} else { |
|||
if (empty($databases[$options['dbtype']])) { |
|||
$a = (object)array('option'=>'dbtype', 'value'=>$options['dbtype']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
$CFG->dbtype = $options['dbtype']; |
|||
} |
|||
$database = $databases[$CFG->dbtype]; |
|||
|
|||
|
|||
// ask for db host |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('databasehost', 'install')); |
|||
if ($options['dbhost'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbhost']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
$CFG->dbhost = cli_input($prompt, $options['dbhost']); |
|||
|
|||
} else { |
|||
$CFG->dbhost = $options['dbhost']; |
|||
} |
|||
|
|||
// ask for db name |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('databasename', 'install')); |
|||
if ($options['dbname'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbname']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
$CFG->dbname = cli_input($prompt, $options['dbname']); |
|||
|
|||
} else { |
|||
$CFG->dbname = $options['dbname']; |
|||
} |
|||
|
|||
// ask for db prefix |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('dbprefix', 'install')); |
|||
//TODO: solve somehow the prefix trouble for oci |
|||
if ($options['prefix'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['prefix']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
$CFG->prefix = cli_input($prompt, $options['prefix']); |
|||
|
|||
} else { |
|||
$CFG->prefix = $options['prefix']; |
|||
} |
|||
|
|||
// ask for db port |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('databaseport', 'install')); |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbport']); |
|||
$CFG->dboptions['dbport'] = (int)cli_input($prompt, $options['dbport']); |
|||
|
|||
} else { |
|||
$CFG->dboptions['dbport'] = (int)$options['dbport']; |
|||
} |
|||
if ($CFG->dboptions['dbport'] <= 0) { |
|||
$CFG->dboptions['dbport'] = ''; |
|||
} |
|||
|
|||
// ask for db socket |
|||
if ($CFG->ostype === 'WINDOWS') { |
|||
$CFG->dboptions['dbsocket'] = ''; |
|||
|
|||
} else if ($interactive and empty($CFG->dboptions['dbport'])) { |
|||
cli_separator(); |
|||
cli_heading(get_string('databasesocket', 'install')); |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbsocket']); |
|||
$CFG->dboptions['dbsocket'] = cli_input($prompt, $options['dbsocket']); |
|||
|
|||
} else { |
|||
$CFG->dboptions['dbsocket'] = $options['dbsocket']; |
|||
} |
|||
|
|||
// ask for db user |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('databaseuser', 'install')); |
|||
if ($options['dbuser'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbuser']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
$CFG->dbuser = cli_input($prompt, $options['dbuser']); |
|||
|
|||
} else { |
|||
$CFG->dbuser = $options['dbuser']; |
|||
} |
|||
|
|||
// ask for db password |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('databasepass', 'install')); |
|||
do { |
|||
if ($options['dbpass'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbpass']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
|
|||
$CFG->dbpass = cli_input($prompt, $options['dbpass']); |
|||
if (function_exists('distro_pre_create_db')) { // Hook for distros needing to do something before DB creation |
|||
$distro = distro_pre_create_db($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']), $distro); |
|||
} |
|||
$hint_database = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket'])); |
|||
} while ($hint_database !== ''); |
|||
|
|||
} else { |
|||
$CFG->dbpass = $options['dbpass']; |
|||
$hint_database = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket'])); |
|||
if ($hint_database !== '') { |
|||
cli_error(get_string('dbconnectionerror', 'install')); |
|||
} |
|||
} |
|||
|
|||
// ask for fullname |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('fullsitename', 'moodle')); |
|||
|
|||
if ($options['fullname'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
|
|||
do { |
|||
$options['fullname'] = cli_input($prompt, $options['fullname']); |
|||
} while (empty($options['fullname'])); |
|||
} else { |
|||
if (empty($options['fullname'])) { |
|||
$a = (object)array('option'=>'fullname', 'value'=>$options['fullname']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
} |
|||
|
|||
// ask for shortname |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('shortsitename', 'moodle')); |
|||
|
|||
if ($options['shortname'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
|
|||
do { |
|||
$options['shortname'] = cli_input($prompt, $options['shortname']); |
|||
} while (empty($options['shortname'])); |
|||
} else { |
|||
if (empty($options['shortname'])) { |
|||
$a = (object)array('option'=>'shortname', 'value'=>$options['shortname']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
} |
|||
|
|||
// ask for admin user name |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('cliadminusername', 'install')); |
|||
if (!empty($options['adminuser'])) { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
} |
|||
do { |
|||
$options['adminuser'] = cli_input($prompt, $options['adminuser']); |
|||
} while (empty($options['adminuser']) or $options['adminuser'] === 'guest'); |
|||
} else { |
|||
if (empty($options['adminuser']) or $options['adminuser'] === 'guest') { |
|||
$a = (object)array('option'=>'adminuser', 'value'=>$options['adminuser']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
} |
|||
|
|||
// ask for admin user password |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('cliadminpassword', 'install')); |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
do { |
|||
$options['adminpass'] = cli_input($prompt); |
|||
} while (empty($options['adminpass']) or $options['adminpass'] === 'admin'); |
|||
} else { |
|||
if (empty($options['adminpass']) or $options['adminpass'] === 'admin') { |
|||
$a = (object)array('option'=>'adminpass', 'value'=>$options['adminpass']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
} |
|||
|
|||
// Ask for the admin email address. |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('cliadminemail', 'install')); |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminemail']); |
|||
$options['adminemail'] = cli_input($prompt, $options['adminemail']); |
|||
} |
|||
|
|||
// Validate that the address provided was an e-mail address. |
|||
if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) { |
|||
$a = (object) array('option' => 'adminemail', 'value' => $options['adminemail']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
|
|||
// Ask for the upgrade key. |
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('upgradekeyset', 'admin')); |
|||
if ($options['upgradekey'] !== '') { |
|||
$prompt = get_string('clitypevaluedefault', 'admin', $options['upgradekey']); |
|||
$options['upgradekey'] = cli_input($prompt, $options['upgradekey']); |
|||
} else { |
|||
$prompt = get_string('clitypevalue', 'admin'); |
|||
$options['upgradekey'] = cli_input($prompt); |
|||
} |
|||
} |
|||
|
|||
// Set the upgrade key if it was provided. |
|||
if ($options['upgradekey'] !== '') { |
|||
$CFG->upgradekey = $options['upgradekey']; |
|||
} |
|||
|
|||
if ($interactive) { |
|||
if (!$options['agree-license']) { |
|||
cli_separator(); |
|||
cli_heading(get_string('copyrightnotice')); |
|||
echo "Moodle - Modular Object-Oriented Dynamic Learning Environment\n"; |
|||
echo get_string('gpl3')."\n\n"; |
|||
echo get_string('doyouagree')."\n"; |
|||
$prompt = get_string('cliyesnoprompt', 'admin'); |
|||
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin'))); |
|||
if ($input == get_string('clianswerno', 'admin')) { |
|||
exit(1); |
|||
} |
|||
} |
|||
} else { |
|||
if (!$options['agree-license']) { |
|||
cli_error(get_string('climustagreelicense', 'install')); |
|||
} |
|||
} |
|||
|
|||
// Finally we have all info needed for config.php |
|||
$configphp = install_generate_configphp($database, $CFG); |
|||
umask(0137); |
|||
if (($fh = fopen($configfile, 'w')) !== false) { |
|||
fwrite($fh, $configphp); |
|||
fclose($fh); |
|||
} |
|||
|
|||
if (!file_exists($configfile)) { |
|||
cli_error('Can not create config file.'); |
|||
} |
|||
|
|||
// remember selected language |
|||
$installlang = $CFG->lang; |
|||
// return back to original dir before executing setup.php which changes the dir again |
|||
chdir($olddir); |
|||
// We have config.php, it is a real php script from now on :-) |
|||
require($configfile); |
|||
|
|||
// use selected language |
|||
$CFG->lang = $installlang; |
|||
$SESSION->lang = $CFG->lang; |
|||
|
|||
require("$CFG->dirroot/version.php"); |
|||
|
|||
// Test environment first. |
|||
require_once($CFG->libdir . '/environmentlib.php'); |
|||
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); |
|||
if (!$envstatus) { |
|||
$errors = environment_get_errors($environment_results); |
|||
cli_heading(get_string('environment', 'admin')); |
|||
foreach ($errors as $error) { |
|||
list($info, $report) = $error; |
|||
echo "!! $info !!\n$report\n\n"; |
|||
} |
|||
exit(1); |
|||
} |
|||
|
|||
// Test plugin dependencies. |
|||
$failed = array(); |
|||
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { |
|||
cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); |
|||
cli_error(get_string('pluginschecktodo', 'admin')); |
|||
} |
|||
|
|||
if (!$options['skip-database']) { |
|||
install_cli_database($options, $interactive); |
|||
// This needs to happen at the end to ensure it occurs after all caches |
|||
// have been purged for the last time. |
|||
// This will build a cached version of the current theme for the user |
|||
// to immediately start browsing the site. |
|||
require_once($CFG->libdir.'/upgradelib.php'); |
|||
upgrade_themes(); |
|||
} else { |
|||
echo get_string('cliskipdatabase', 'install')."\n"; |
|||
} |
|||
|
|||
echo get_string('cliinstallfinished', 'install')."\n"; |
|||
exit(0); // 0 means success |
@ -0,0 +1,189 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This installs Moodle into empty database, config.php must already exist. |
|||
* |
|||
* This script is intended for advanced usage such as in Debian packages. |
|||
* - sudo to www-data (apache account) before |
|||
* - not compatible with Windows platform |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2010 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
define('CACHE_DISABLE_ALL', true); |
|||
|
|||
// extra execution prevention - we can not just require config.php here |
|||
if (isset($_SERVER['REMOTE_ADDR'])) { |
|||
exit(1); |
|||
} |
|||
|
|||
// Force OPcache reset if used, we do not want any stale caches |
|||
// when preparing test environment. |
|||
if (function_exists('opcache_reset')) { |
|||
opcache_reset(); |
|||
} |
|||
|
|||
$help = |
|||
"Advanced command line Moodle database installer. |
|||
Please note you must execute this script with the same uid as apache. |
|||
|
|||
Site defaults may be changed via local/defaults.php. |
|||
|
|||
Options: |
|||
--lang=CODE Installation and default site language. Default is en. |
|||
--adminuser=USERNAME Username for the moodle admin account. Default is admin. |
|||
--adminpass=PASSWORD Password for the moodle admin account. |
|||
--adminemail=STRING Email address for the moodle admin account. |
|||
--agree-license Indicates agreement with software license. |
|||
--fullname=STRING Name of the site |
|||
--shortname=STRING Name of the site |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/install_database.php --lang=cs --adminpass=soMePass123 --agree-license |
|||
"; |
|||
|
|||
// Check that PHP is of a sufficient version as soon as possible. |
|||
require_once(__DIR__.'/../../lib/phpminimumversionlib.php'); |
|||
moodle_require_minimum_php_version(); |
|||
|
|||
// Nothing to do if config.php does not exist |
|||
$configfile = __DIR__.'/../../config.php'; |
|||
if (!file_exists($configfile)) { |
|||
fwrite(STDERR, 'config.php does not exist, can not continue'); // do not localize |
|||
fwrite(STDERR, "\n"); |
|||
exit(1); |
|||
} |
|||
|
|||
// Include necessary libs |
|||
require($configfile); |
|||
|
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
require_once($CFG->libdir.'/installlib.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/componentlib.class.php'); |
|||
|
|||
$CFG->early_install_lang = true; |
|||
get_string_manager(true); |
|||
|
|||
raise_memory_limit(MEMORY_EXTRA); |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params( |
|||
array( |
|||
'lang' => 'en', |
|||
'adminuser' => 'admin', |
|||
'adminpass' => '', |
|||
'adminemail' => '', |
|||
'fullname' => '', |
|||
'shortname' => '', |
|||
'agree-license' => false, |
|||
'help' => false |
|||
), |
|||
array( |
|||
'h' => 'help' |
|||
) |
|||
); |
|||
|
|||
// We show help text even if tables are installed. |
|||
if ($options['help']) { |
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
// Make sure no tables are installed yet. |
|||
if ($DB->get_tables() ) { |
|||
cli_error(get_string('clitablesexist', 'install')); |
|||
} |
|||
|
|||
if (!$options['agree-license']) { |
|||
cli_error('You have to agree to the license. --help prints out the help'); // TODO: localize |
|||
} |
|||
|
|||
if ($options['adminpass'] === true or $options['adminpass'] === '') { |
|||
cli_error('You have to specify admin password. --help prints out the help'); // TODO: localize |
|||
} |
|||
|
|||
// Validate that the address provided was an e-mail address. |
|||
if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) { |
|||
$a = (object) array('option' => 'adminemail', 'value' => $options['adminemail']); |
|||
cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); |
|||
} |
|||
|
|||
$options['lang'] = clean_param($options['lang'], PARAM_SAFEDIR); |
|||
if (!file_exists($CFG->dirroot.'/install/lang/'.$options['lang'])) { |
|||
$options['lang'] = 'en'; |
|||
} |
|||
$CFG->lang = $options['lang']; |
|||
|
|||
// download required lang packs |
|||
if ($CFG->lang !== 'en') { |
|||
make_upload_directory('lang'); |
|||
$installer = new lang_installer($CFG->lang); |
|||
$results = $installer->run(); |
|||
foreach ($results as $langcode => $langstatus) { |
|||
if ($langstatus === lang_installer::RESULT_DOWNLOADERROR) { |
|||
$a = new stdClass(); |
|||
$a->url = $installer->lang_pack_url($langcode); |
|||
$a->dest = $CFG->dataroot.'/lang'; |
|||
cli_problem(get_string('remotedownloaderror', 'error', $a)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// switch the string_manager instance to stop using install/lang/ |
|||
$CFG->early_install_lang = false; |
|||
get_string_manager(true); |
|||
|
|||
require("$CFG->dirroot/version.php"); |
|||
|
|||
// Test environment first. |
|||
require_once($CFG->libdir . '/environmentlib.php'); |
|||
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); |
|||
if (!$envstatus) { |
|||
$errors = environment_get_errors($environment_results); |
|||
cli_heading(get_string('environment', 'admin')); |
|||
foreach ($errors as $error) { |
|||
list($info, $report) = $error; |
|||
echo "!! $info !!\n$report\n\n"; |
|||
} |
|||
exit(1); |
|||
} |
|||
|
|||
// Test plugin dependencies. |
|||
$failed = array(); |
|||
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { |
|||
cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); |
|||
cli_error(get_string('pluginschecktodo', 'admin')); |
|||
} |
|||
|
|||
install_cli_database($options, true); |
|||
|
|||
// This needs to happen at the end to ensure it occurs after all caches |
|||
// have been purged for the last time. |
|||
// This will build a cached version of the current theme for the user |
|||
// to immediately start browsing the site. |
|||
require_once($CFG->libdir.'/upgradelib.php'); |
|||
upgrade_themes(); |
|||
|
|||
echo get_string('cliinstallfinished', 'install')."\n"; |
|||
exit(0); // 0 means success |
@ -0,0 +1,55 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* CLI script to kill all user sessions without asking for confirmation. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2017 Alexander Bias <alexander.bias@uni-ulm.de> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
list($options, $unrecognized) = cli_get_params(array('help' => false), array('h' => 'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Kill all Moodle sessions |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/kill_all_sessions.php |
|||
"; |
|||
|
|||
echo $help; |
|||
exit(0); |
|||
} |
|||
|
|||
\core\session\manager::kill_all_sessions(); |
|||
|
|||
exit(0); |
@ -0,0 +1,112 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Enable or disable maintenance mode. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2009 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once("$CFG->libdir/clilib.php"); |
|||
require_once("$CFG->libdir/adminlib.php"); |
|||
|
|||
|
|||
// Now get cli options. |
|||
list($options, $unrecognized) = cli_get_params(array('enable'=>false, 'enablelater'=>0, 'enableold'=>false, 'disable'=>false, 'help'=>false), |
|||
array('h'=>'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Maintenance mode settings. |
|||
Current status displayed if not option specified. |
|||
|
|||
Options: |
|||
--enable Enable CLI maintenance mode |
|||
--enablelater=MINUTES Number of minutes before entering CLI maintenance mode |
|||
--enableold Enable legacy half-maintenance mode |
|||
--disable Disable maintenance mode |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$ sudo -u www-data /usr/bin/php admin/cli/maintenance.php |
|||
"; //TODO: localize - to be translated later when everything is finished |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
cli_heading(get_string('sitemaintenancemode', 'admin')." ($CFG->wwwroot)"); |
|||
|
|||
if ($options['enablelater']) { |
|||
if (file_exists("$CFG->dataroot/climaintenance.html")) { |
|||
// Already enabled, sorry. |
|||
echo get_string('clistatusenabled', 'admin')."\n"; |
|||
return 1; |
|||
} |
|||
|
|||
$time = time() + ($options['enablelater']*60); |
|||
set_config('maintenance_later', $time); |
|||
|
|||
echo get_string('clistatusenabledlater', 'admin', userdate($time))."\n"; |
|||
return 0; |
|||
|
|||
} else if ($options['enable']) { |
|||
if (file_exists("$CFG->dataroot/climaintenance.html")) { |
|||
// The maintenance is already enabled, nothing to do. |
|||
} else { |
|||
enable_cli_maintenance_mode(); |
|||
} |
|||
set_config('maintenance_enabled', 0); |
|||
unset_config('maintenance_later'); |
|||
echo get_string('sitemaintenanceoncli', 'admin')."\n"; |
|||
exit(0); |
|||
|
|||
} else if ($options['enableold']) { |
|||
set_config('maintenance_enabled', 1); |
|||
unset_config('maintenance_later'); |
|||
echo get_string('sitemaintenanceon', 'admin')."\n"; |
|||
exit(0); |
|||
|
|||
} else if ($options['disable']) { |
|||
set_config('maintenance_enabled', 0); |
|||
unset_config('maintenance_later'); |
|||
if (file_exists("$CFG->dataroot/climaintenance.html")) { |
|||
unlink("$CFG->dataroot/climaintenance.html"); |
|||
} |
|||
echo get_string('sitemaintenanceoff', 'admin')."\n"; |
|||
exit(0); |
|||
} |
|||
|
|||
if (!empty($CFG->maintenance_enabled) or file_exists("$CFG->dataroot/climaintenance.html")) { |
|||
echo get_string('clistatusenabled', 'admin')."\n"; |
|||
|
|||
} else if (isset($CFG->maintenance_later)) { |
|||
echo get_string('clistatusenabledlater', 'admin', userdate($CFG->maintenance_later))."\n"; |
|||
|
|||
} else { |
|||
echo get_string('clistatusdisabled', 'admin')."\n"; |
|||
} |
@ -0,0 +1,328 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* MySQL collation conversion tool. |
|||
* |
|||
* @package core |
|||
* @copyright 2012 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); // cli only functions |
|||
|
|||
if ($DB->get_dbfamily() !== 'mysql') { |
|||
cli_error('This function is designed for MySQL databases only!'); |
|||
} |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false, 'list'=>false, 'collation'=>false, 'available'=>false), |
|||
array('h'=>'help', 'l'=>'list', 'a'=>'available')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
$help = |
|||
"MySQL collation conversions script. |
|||
|
|||
It is strongly recommended to stop the web server before the conversion. |
|||
This script may be executed before the main upgrade - 1.9.x data for example. |
|||
|
|||
Options: |
|||
--collation=COLLATION Convert MySQL tables to different collation |
|||
-l, --list Show table and column information |
|||
-a, --available Show list of available collations |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$ sudo -u www-data /usr/bin/php admin/cli/mysql_collation.php --collation=utf8mb4_unicode_ci |
|||
"; |
|||
|
|||
if (!empty($options['collation'])) { |
|||
$collations = mysql_get_collations(); |
|||
$collation = clean_param($options['collation'], PARAM_ALPHANUMEXT); |
|||
$collation = strtolower($collation); |
|||
if (!isset($collations[$collation])) { |
|||
cli_error("Error: collation '$collation' is not available on this server!"); |
|||
} |
|||
|
|||
$collationinfo = explode('_', $collation); |
|||
$charset = reset($collationinfo); |
|||
|
|||
$engine = strtolower($DB->get_dbengine()); |
|||
|
|||
// Do checks for utf8mb4. |
|||
if (strpos($collation, 'utf8mb4') === 0) { |
|||
// Do we have the right engine? |
|||
if ($engine !== 'innodb' && $engine !== 'xtradb') { |
|||
cli_error("Error: '$collation' requires InnoDB or XtraDB set as the engine."); |
|||
} |
|||
// Are we using Barracuda? |
|||
if ($DB->get_row_format() != 'Barracuda') { |
|||
// Try setting it here. |
|||
try { |
|||
$DB->execute("SET GLOBAL innodb_file_format=Barracuda"); |
|||
} catch (dml_exception $e) { |
|||
cli_error("Error: '$collation' requires the file format to be set to Barracuda. |
|||
An attempt was made to change the format, but it failed. Please try doing this manually."); |
|||
} |
|||
echo "GLOBAL SETTING: innodb_file_format changed to Barracuda\n"; |
|||
} |
|||
// Is one file per table being used? |
|||
if (!$DB->is_file_per_table_enabled()) { |
|||
try { |
|||
$DB->execute("SET GLOBAL innodb_file_per_table=1"); |
|||
} catch (dml_exception $e) { |
|||
cli_error("Error: '$collation' requires the setting 'innodb_file_per_table' be set to 'ON'. |
|||
An attempt was made to change the format, but it failed. Please try doing this manually."); |
|||
} |
|||
echo "GLOBAL SETTING: innodb_file_per_table changed to 1\n"; |
|||
} |
|||
// Is large prefix set? |
|||
if (!$DB->is_large_prefix_enabled()) { |
|||
try { |
|||
$DB->execute("SET GLOBAL innodb_large_prefix=1"); |
|||
} catch (dml_exception $e) { |
|||
cli_error("Error: '$collation' requires the setting 'innodb_large_prefix' be set to 'ON'. |
|||
An attempt was made to change the format, but it failed. Please try doing this manually."); |
|||
} |
|||
echo "GLOBAL SETTING: innodb_large_prefix changed to 1\n"; |
|||
} |
|||
} |
|||
|
|||
$sql = "SHOW VARIABLES LIKE 'collation_database'"; |
|||
if (!$dbcollation = $DB->get_record_sql($sql)) { |
|||
cli_error("Error: Could not access collation information on the database."); |
|||
} |
|||
$sql = "SHOW VARIABLES LIKE 'character_set_database'"; |
|||
if (!$dbcharset = $DB->get_record_sql($sql)) { |
|||
cli_error("Error: Could not access character set information on the database."); |
|||
} |
|||
if ($dbcollation->value !== $collation || $dbcharset->value !== $charset) { |
|||
// Try to convert the DB. |
|||
echo "Converting database to '$collation' for $CFG->wwwroot:\n"; |
|||
$sql = "ALTER DATABASE $CFG->dbname DEFAULT CHARACTER SET $charset DEFAULT COLLATE = $collation"; |
|||
try { |
|||
$DB->change_database_structure($sql); |
|||
} catch (exception $e) { |
|||
cli_error("Error: Tried to alter the database with no success. Please try manually changing the database |
|||
to the new collation and character set and then run this script again."); |
|||
} |
|||
echo "DATABASE CONVERTED\n"; |
|||
} |
|||
|
|||
echo "Converting tables and columns to '$collation' for $CFG->wwwroot:\n"; |
|||
$prefix = $DB->get_prefix(); |
|||
$prefix = str_replace('_', '\\_', $prefix); |
|||
$sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
$converted = 0; |
|||
$skipped = 0; |
|||
$errors = 0; |
|||
foreach ($rs as $table) { |
|||
echo str_pad($table->name, 40). " - "; |
|||
|
|||
if ($table->collation === $collation) { |
|||
echo "NO CHANGE\n"; |
|||
$skipped++; |
|||
|
|||
} else { |
|||
try { |
|||
$DB->change_database_structure("ALTER TABLE $table->name CONVERT TO CHARACTER SET $charset COLLATE $collation"); |
|||
echo "CONVERTED\n"; |
|||
$converted++; |
|||
} catch (ddl_exception $e) { |
|||
$result = mysql_set_row_format($table->name, $charset, $collation, $engine); |
|||
if ($result) { |
|||
echo "CONVERTED\n"; |
|||
$converted++; |
|||
} else { |
|||
// We don't know what the problem is. Stop the conversion. |
|||
cli_error("Error: Tried to convert $table->name, but there was a problem. Please check the details of this |
|||
table and try again."); |
|||
die(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
$sql = "SHOW FULL COLUMNS FROM $table->name WHERE collation IS NOT NULL"; |
|||
$rs2 = $DB->get_recordset_sql($sql); |
|||
foreach ($rs2 as $column) { |
|||
$column = (object)array_change_key_case((array)$column, CASE_LOWER); |
|||
echo ' '.str_pad($column->field, 36). " - "; |
|||
if ($column->collation === $collation) { |
|||
echo "NO CHANGE\n"; |
|||
$skipped++; |
|||
continue; |
|||
} |
|||
|
|||
// Check for utf8mb4 collation. |
|||
$rowformat = $DB->get_row_format_sql($engine, $collation); |
|||
|
|||
if ($column->type === 'tinytext' or $column->type === 'mediumtext' or $column->type === 'text' or $column->type === 'longtext') { |
|||
$notnull = ($column->null === 'NO') ? 'NOT NULL' : 'NULL'; |
|||
$default = (!is_null($column->default) and $column->default !== '') ? "DEFAULT '$column->default'" : ''; |
|||
// primary, unique and inc are not supported for texts |
|||
$sql = "ALTER TABLE $table->name |
|||
MODIFY COLUMN $column->field $column->type |
|||
CHARACTER SET $charset |
|||
COLLATE $collation $notnull $default"; |
|||
$DB->change_database_structure($sql); |
|||
|
|||
} else if (strpos($column->type, 'varchar') === 0) { |
|||
$notnull = ($column->null === 'NO') ? 'NOT NULL' : 'NULL'; |
|||
$default = !is_null($column->default) ? "DEFAULT '$column->default'" : ''; |
|||
|
|||
if ($rowformat != '') { |
|||
$sql = "ALTER TABLE $table->name $rowformat"; |
|||
$DB->change_database_structure($sql); |
|||
} |
|||
|
|||
$sql = "ALTER TABLE $table->name |
|||
MODIFY COLUMN $column->field $column->type |
|||
CHARACTER SET $charset |
|||
COLLATE $collation $notnull $default"; |
|||
$DB->change_database_structure($sql); |
|||
} else { |
|||
echo "ERROR (unknown column type: $column->type)\n"; |
|||
$errors++; |
|||
continue; |
|||
} |
|||
echo "CONVERTED\n"; |
|||
$converted++; |
|||
} |
|||
$rs2->close(); |
|||
} |
|||
$rs->close(); |
|||
echo "Converted: $converted, skipped: $skipped, errors: $errors\n"; |
|||
exit(0); // success |
|||
|
|||
} else if (!empty($options['list'])) { |
|||
echo "List of tables for $CFG->wwwroot:\n"; |
|||
$prefix = $DB->get_prefix(); |
|||
$prefix = str_replace('_', '\\_', $prefix); |
|||
$sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
$counts = array(); |
|||
foreach ($rs as $table) { |
|||
if (isset($counts[$table->collation])) { |
|||
$counts[$table->collation]++; |
|||
} else { |
|||
$counts[$table->collation] = 1; |
|||
} |
|||
echo str_pad($table->name, 40); |
|||
echo $table->collation. "\n"; |
|||
$collations = mysql_get_column_collations($table->name); |
|||
foreach ($collations as $columname=>$collation) { |
|||
if (isset($counts[$collation])) { |
|||
$counts[$collation]++; |
|||
} else { |
|||
$counts[$collation] = 1; |
|||
} |
|||
echo ' '; |
|||
echo str_pad($columname, 36); |
|||
echo $collation. "\n"; |
|||
} |
|||
} |
|||
$rs->close(); |
|||
|
|||
echo "\n"; |
|||
echo "Table collations summary for $CFG->wwwroot:\n"; |
|||
foreach ($counts as $collation => $count) { |
|||
echo "$collation: $count\n"; |
|||
} |
|||
exit(0); // success |
|||
|
|||
} else if (!empty($options['available'])) { |
|||
echo "List of available MySQL collations for $CFG->wwwroot:\n"; |
|||
$collations = mysql_get_collations(); |
|||
foreach ($collations as $collation) { |
|||
echo " $collation\n"; |
|||
} |
|||
die; |
|||
|
|||
} else { |
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
|
|||
|
|||
// ========== Some functions ============== |
|||
|
|||
function mysql_get_collations() { |
|||
global $DB; |
|||
|
|||
$collations = array(); |
|||
$sql = "SHOW COLLATION |
|||
WHERE Collation LIKE 'utf8\_%' AND Charset = 'utf8' |
|||
OR Collation LIKE 'utf8mb4\_%' AND Charset = 'utf8mb4'"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
foreach ($rs as $collation) { |
|||
$collations[$collation->collation] = $collation->collation; |
|||
} |
|||
$rs->close(); |
|||
|
|||
$collation = $DB->get_dbcollation(); |
|||
if (isset($collations[$collation])) { |
|||
$collations[$collation] .= ' (default)'; |
|||
} |
|||
|
|||
return $collations; |
|||
} |
|||
|
|||
function mysql_get_column_collations($tablename) { |
|||
global $DB; |
|||
|
|||
$collations = array(); |
|||
$sql = "SELECT column_name, collation_name |
|||
FROM INFORMATION_SCHEMA.COLUMNS |
|||
WHERE table_schema = DATABASE() AND table_name = ? AND collation_name IS NOT NULL"; |
|||
$rs = $DB->get_recordset_sql($sql, array($tablename)); |
|||
foreach($rs as $record) { |
|||
$collations[$record->column_name] = $record->collation_name; |
|||
} |
|||
$rs->close(); |
|||
return $collations; |
|||
} |
|||
|
|||
function mysql_set_row_format($tablename, $charset, $collation, $engine) { |
|||
global $DB; |
|||
|
|||
$sql = "SELECT row_format |
|||
FROM INFORMATION_SCHEMA.TABLES |
|||
WHERE table_schema = DATABASE() AND table_name = ?"; |
|||
$rs = $DB->get_record_sql($sql, array($tablename)); |
|||
if ($rs) { |
|||
if ($rs->row_format == 'Compact' || $rs->row_format == 'Redundant') { |
|||
$rowformat = $DB->get_row_format_sql($engine, $collation); |
|||
// Try to convert to compressed format and then try updating the collation again. |
|||
$DB->change_database_structure("ALTER TABLE $tablename $rowformat"); |
|||
$DB->change_database_structure("ALTER TABLE $tablename CONVERT TO CHARACTER SET $charset COLLATE $collation"); |
|||
} else { |
|||
// Row format may not be the problem. Can not diagnose problem. Send fail reply. |
|||
return false; |
|||
} |
|||
} else { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
@ -0,0 +1,202 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* MySQL table row compression tool tool. |
|||
* |
|||
* @package core |
|||
* @copyright 2014 Totara Learning Solutions Ltd {@link http://www.totaralms.com/} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
* @author Petr Skoda <petr.skoda@totaralms.com> |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir . '/clilib.php'); |
|||
|
|||
if ($DB->get_dbfamily() !== 'mysql') { |
|||
cli_error('This script is used for MySQL databases only.'); |
|||
} |
|||
|
|||
$engine = strtolower($DB->get_dbengine()); |
|||
if ($engine !== 'innodb' and $engine !== 'xtradb') { |
|||
cli_error('This script is for MySQL servers using InnoDB or XtraDB engines only.'); |
|||
} |
|||
|
|||
list($options, $unrecognized) = cli_get_params( |
|||
array('help' => false, 'info' => false, 'list' => false, 'fix' => false, 'showsql' => false), |
|||
array('h' => 'help', 'i' => 'info', 'l' => 'list', 'f' => 'fix', 's' => 'showsql') |
|||
); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
$help = |
|||
"Script for detection of row size problems in MySQL InnoDB tables. |
|||
|
|||
By default InnoDB storage table is using legacy Antelope file format |
|||
which has major restriction on database row size. |
|||
Use this script to detect and fix database tables with potential data |
|||
overflow problems. |
|||
|
|||
Options: |
|||
-i, --info Show database information |
|||
-l, --list List problematic tables |
|||
-f, --fix Attempt to fix all tables (requires SUPER privilege) |
|||
-s, --showsql Print SQL statements for fixing of tables |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$ sudo -u www-data /usr/bin/php admin/cli/mysql_compressed_rows.php -l |
|||
"; |
|||
|
|||
/** @var mysql_sql_generator $generator */ |
|||
$generator = $DB->get_manager()->generator; |
|||
|
|||
$info = $DB->get_server_info(); |
|||
$filepertable = $DB->get_record_sql("SHOW VARIABLES LIKE 'innodb_file_per_table'"); |
|||
$filepertable = $filepertable ? $filepertable->value : ''; |
|||
$fileformat = $DB->get_record_sql("SHOW VARIABLES LIKE 'innodb_file_format'"); |
|||
$fileformat = $fileformat ? $fileformat->value : ''; |
|||
$prefix = $DB->get_prefix(); |
|||
$database = $CFG->dbname; |
|||
|
|||
if (!empty($options['info'])) { |
|||
echo "Database version: " . $info['description'] . "\n"; |
|||
echo "Database name: $database\n"; |
|||
echo "Database engine: " . $DB->get_dbengine() . "\n"; |
|||
echo "innodb_file_per_table: $filepertable\n"; |
|||
echo "innodb_file_format: $fileformat\n"; |
|||
|
|||
exit(0); |
|||
|
|||
} else if (!empty($options['list'])) { |
|||
$problem = false; |
|||
foreach ($DB->get_tables(false) as $table) { |
|||
$columns = $DB->get_columns($table, false); |
|||
$size = $generator->guess_antelope_row_size($columns); |
|||
$format = $DB->get_row_format($table); |
|||
if ($size <= $generator::ANTELOPE_MAX_ROW_SIZE) { |
|||
continue; |
|||
} |
|||
|
|||
echo str_pad($prefix . $table, 32, ' ', STR_PAD_RIGHT); |
|||
echo str_pad($format, 11, ' ', STR_PAD_RIGHT); |
|||
|
|||
if ($format === 'Compact' or $format === 'Redundant') { |
|||
$problem = true; |
|||
echo " (needs fixing)\n"; |
|||
|
|||
} else if ($format !== 'Compressed' and $format !== 'Dynamic') { |
|||
echo " (unknown)\n"; |
|||
|
|||
} else { |
|||
echo "\n"; |
|||
} |
|||
} |
|||
|
|||
if ($problem) { |
|||
exit(1); |
|||
} |
|||
exit(0); |
|||
|
|||
} else if (!empty($options['fix'])) { |
|||
$fixtables = array(); |
|||
foreach ($DB->get_tables(false) as $table) { |
|||
$columns = $DB->get_columns($table, false); |
|||
$size = $generator->guess_antelope_row_size($columns); |
|||
$format = $DB->get_row_format($table); |
|||
if ($size <= $generator::ANTELOPE_MAX_ROW_SIZE) { |
|||
continue; |
|||
} |
|||
if ($format === 'Compact' or $format === 'Redundant') { |
|||
$fixtables[$table] = $table; |
|||
} |
|||
} |
|||
|
|||
if (!$fixtables) { |
|||
echo "No changes necessary\n"; |
|||
exit(0); |
|||
} |
|||
|
|||
if ($filepertable !== 'ON') { |
|||
try { |
|||
$DB->execute("SET GLOBAL innodb_file_per_table=1"); |
|||
} catch (dml_exception $e) { |
|||
echo "Cannot enable GLOBAL innodb_file_per_table setting, use --showsql option and execute the statements manually."; |
|||
throw $e; |
|||
} |
|||
} |
|||
if ($fileformat !== 'Barracuda') { |
|||
try { |
|||
$DB->execute("SET GLOBAL innodb_file_format=Barracuda"); |
|||
} catch (dml_exception $e) { |
|||
echo "Cannot change GLOBAL innodb_file_format setting, use --showsql option and execute the statements manually."; |
|||
throw $e; |
|||
} |
|||
} |
|||
|
|||
if (!$DB->is_compressed_row_format_supported(false)) { |
|||
echo "MySQL server is not compatible with compressed row format."; |
|||
exit(1); |
|||
} |
|||
|
|||
foreach ($fixtables as $table) { |
|||
$DB->change_database_structure("ALTER TABLE {$prefix}$table ROW_FORMAT=Compressed"); |
|||
echo str_pad($prefix . $table, 32, ' ', STR_PAD_RIGHT) . " ... Compressed\n"; |
|||
} |
|||
|
|||
exit(0); |
|||
|
|||
} else if (!empty($options['showsql'])) { |
|||
$fixtables = array(); |
|||
|
|||
foreach ($DB->get_tables(false) as $table) { |
|||
$columns = $DB->get_columns($table, false); |
|||
$size = $generator->guess_antelope_row_size($columns); |
|||
$format = $DB->get_row_format($table); |
|||
if ($size <= $generator::ANTELOPE_MAX_ROW_SIZE) { |
|||
continue; |
|||
} |
|||
if ($format === 'Compact' or $format === 'Redundant') { |
|||
$fixtables[$table] = $table; |
|||
} |
|||
} |
|||
if (!$fixtables) { |
|||
echo "No changes necessary\n"; |
|||
exit(0); |
|||
} |
|||
|
|||
echo "Copy the following SQL statements and execute them using account with SUPER privilege:\n\n"; |
|||
echo "USE $database;\n"; |
|||
echo "SET SESSION sql_mode=STRICT_ALL_TABLES;\n"; |
|||
echo "SET GLOBAL innodb_file_per_table=1;\n"; |
|||
echo "SET GLOBAL innodb_file_format=Barracuda;\n"; |
|||
foreach ($fixtables as $table) { |
|||
echo "ALTER TABLE {$prefix}$table ROW_FORMAT=Compressed;\n"; |
|||
} |
|||
echo "\n"; |
|||
exit(0); |
|||
|
|||
} else { |
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
|
@ -0,0 +1,180 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* MySQL engine conversion tool. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2009 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); // cli only functions |
|||
|
|||
if ($DB->get_dbfamily() !== 'mysql') { |
|||
cli_error('This function is designed for MySQL databases only!'); |
|||
} |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false, 'list'=>false, 'engine'=>false, 'available'=>false), |
|||
array('h'=>'help', 'l'=>'list', 'a'=>'available')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
$help = |
|||
"MySQL engine conversions script. |
|||
|
|||
It is recommended to stop the web server before the conversion. |
|||
Do not use MyISAM if possible, because it is not ACID compliant |
|||
and does not support transactions. |
|||
|
|||
Options: |
|||
--engine=ENGINE Convert MySQL tables to different engine |
|||
-l, --list Show table information |
|||
-a, --available Show list of available engines |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/mysql_engine.php --engine=InnoDB |
|||
"; |
|||
|
|||
if (!empty($options['engine'])) { |
|||
$engines = mysql_get_engines(); |
|||
$engine = clean_param($options['engine'], PARAM_ALPHA); |
|||
if (!isset($engines[strtoupper($engine)])) { |
|||
cli_error("Error: engine '$engine' is not available on this server!"); |
|||
} |
|||
|
|||
echo "Converting tables to '$engine' for $CFG->wwwroot:\n"; |
|||
$prefix = $DB->get_prefix(); |
|||
$prefix = str_replace('_', '\\_', $prefix); |
|||
$sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
$converted = 0; |
|||
$skipped = 0; |
|||
$errors = 0; |
|||
foreach ($rs as $table) { |
|||
if (strtoupper($table->engine) === strtoupper($engine)) { |
|||
$newengine = mysql_get_table_engine($table->name); |
|||
echo str_pad($table->name, 40). " - NO CONVERSION NEEDED ($newengine)\n"; |
|||
$skipped++; |
|||
continue; |
|||
} |
|||
echo str_pad($table->name, 40). " - "; |
|||
|
|||
try { |
|||
$DB->change_database_structure("ALTER TABLE {$table->name} ENGINE = $engine"); |
|||
$newengine = mysql_get_table_engine($table->name); |
|||
if (strtoupper($newengine) !== strtoupper($engine)) { |
|||
echo "ERROR ($newengine)\n"; |
|||
$errors++; |
|||
continue; |
|||
} |
|||
echo "DONE ($newengine)\n"; |
|||
$converted++; |
|||
} catch (moodle_exception $e) { |
|||
echo $e->getMessage()."\n"; |
|||
$errors++; |
|||
continue; |
|||
} |
|||
} |
|||
$rs->close(); |
|||
echo "Converted: $converted, skipped: $skipped, errors: $errors\n"; |
|||
exit(0); // success |
|||
|
|||
} else if (!empty($options['list'])) { |
|||
echo "List of tables for $CFG->wwwroot:\n"; |
|||
$prefix = $DB->get_prefix(); |
|||
$prefix = str_replace('_', '\\_', $prefix); |
|||
$sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
$counts = array(); |
|||
foreach ($rs as $table) { |
|||
if (isset($counts[$table->engine])) { |
|||
$counts[$table->engine]++; |
|||
} else { |
|||
$counts[$table->engine] = 1; |
|||
} |
|||
echo str_pad($table->engine, 10); |
|||
echo $table->name . "\n"; |
|||
} |
|||
$rs->close(); |
|||
|
|||
echo "\n"; |
|||
echo "Table engines summary for $CFG->wwwroot:\n"; |
|||
foreach ($counts as $engine => $count) { |
|||
echo "$engine: $count\n"; |
|||
} |
|||
exit(0); // success |
|||
|
|||
} else if (!empty($options['available'])) { |
|||
echo "List of available MySQL engines for $CFG->wwwroot:\n"; |
|||
$engines = mysql_get_engines(); |
|||
foreach ($engines as $engine) { |
|||
echo " $engine\n"; |
|||
} |
|||
die; |
|||
|
|||
} else { |
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
|
|||
|
|||
// ========== Some functions ============== |
|||
|
|||
function mysql_get_engines() { |
|||
global $DB; |
|||
|
|||
$sql = "SHOW Engines"; |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
$engines = array(); |
|||
foreach ($rs as $engine) { |
|||
if (strtoupper($engine->support) !== 'YES' and strtoupper($engine->support) !== 'DEFAULT') { |
|||
continue; |
|||
} |
|||
$engines[strtoupper($engine->engine)] = $engine->engine; |
|||
if (strtoupper($engine->support) === 'DEFAULT') { |
|||
$engines[strtoupper($engine->engine)] .= ' (default)'; |
|||
} |
|||
} |
|||
$rs->close(); |
|||
|
|||
return $engines; |
|||
} |
|||
|
|||
function mysql_get_table_engine($tablename) { |
|||
global $DB; |
|||
|
|||
$engine = null; |
|||
$sql = "SHOW TABLE STATUS WHERE Name = '$tablename'"; // no special chars expected here |
|||
$rs = $DB->get_recordset_sql($sql); |
|||
if ($rs->valid()) { |
|||
$record = $rs->current(); |
|||
$engine = $record->engine; |
|||
} |
|||
$rs->close(); |
|||
return $engine; |
|||
} |
@ -0,0 +1,76 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* CLI script to purge caches without asking for confirmation. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2011 David Mudrak <david@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
$longoptions = [ |
|||
'help' => false, |
|||
'muc' => false, |
|||
'theme' => false, |
|||
'lang' => false, |
|||
'js' => false, |
|||
'filter' => false, |
|||
'other' => false |
|||
]; |
|||
list($options, $unrecognized) = cli_get_params($longoptions, ['h' => 'help']); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
// The indentation of this string is "wrong" but this is to avoid a extra whitespace in console output. |
|||
$help = <<<EOF |
|||
Invalidates Moodle internal caches |
|||
|
|||
Specific caches can be defined (alone or in combination) using arguments. If none are specified, |
|||
all caches will be purged. |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
--muc Purge all MUC caches (includes lang cache) |
|||
--theme Purge theme cache |
|||
--lang Purge language string cache |
|||
--js Purge JavaScript cache |
|||
--filter Purge text filter cache |
|||
--other Purge all file caches and other miscellaneous caches (may include MUC |
|||
if using cachestore_file). |
|||
|
|||
Example: |
|||
\$ sudo -u www-data /usr/bin/php admin/cli/purge_caches.php |
|||
|
|||
EOF; |
|||
|
|||
echo $help; |
|||
exit(0); |
|||
} |
|||
|
|||
purge_caches(array_filter($options)); |
|||
|
|||
exit(0); |
@ -0,0 +1,108 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script allows you to reset any local user password. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2009 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); // cli only functions |
|||
|
|||
// Define the input options. |
|||
$longparams = array( |
|||
'help' => false, |
|||
'username' => '', |
|||
'password' => '', |
|||
'ignore-password-policy' => false |
|||
); |
|||
|
|||
$shortparams = array( |
|||
'h' => 'help', |
|||
'u' => 'username', |
|||
'p' => 'password', |
|||
'i' => 'ignore-password-policy' |
|||
); |
|||
|
|||
// now get cli options |
|||
list($options, $unrecognized) = cli_get_params($longparams, $shortparams); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Reset local user passwords, useful especially for admin acounts. |
|||
|
|||
There are no security checks here because anybody who is able to |
|||
execute this file may execute any PHP too. |
|||
|
|||
Options: |
|||
-h, --help Print out this help |
|||
-u, --username=username Specify username to change |
|||
-p, --password=newpassword Specify new password |
|||
--ignore-password-policy Ignore password policy when setting password |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/reset_password.php |
|||
\$sudo -u www-data /usr/bin/php admin/cli/reset_password.php --username=rosaura --password=jiu3jiu --ignore-password-policy |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
if ($options['username'] == '' ) { |
|||
cli_heading('Password reset'); |
|||
$prompt = "Enter username (manual authentication only)"; |
|||
$username = cli_input($prompt); |
|||
} else { |
|||
$username = $options['username']; |
|||
} |
|||
|
|||
if (!$user = $DB->get_record('user', array('auth'=>'manual', 'username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id))) { |
|||
cli_error("Can not find user '$username'"); |
|||
} |
|||
|
|||
if ($options['password'] == '' ) { |
|||
$prompt = "Enter new password"; |
|||
$password = cli_input($prompt); |
|||
} else { |
|||
$password = $options['password']; |
|||
} |
|||
|
|||
$errmsg = '';//prevent eclipse warning |
|||
if (!$options['ignore-password-policy'] ) { |
|||
if (!check_password_policy($password, $errmsg)) { |
|||
cli_error(html_to_text($errmsg, 0)); |
|||
} |
|||
} |
|||
|
|||
$hashedpassword = hash_internal_user_password($password); |
|||
|
|||
$DB->set_field('user', 'password', $hashedpassword, array('id'=>$user->id)); |
|||
|
|||
echo "Password changed\n"; |
|||
|
|||
exit(0); // 0 means success. |
@ -0,0 +1,182 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script implements some useful svg manipulation tricks. |
|||
* |
|||
* @package core_admin |
|||
* @subpackage cli |
|||
* @copyright 2012 Petr Skoda {@link http://skodak.org} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
|
|||
// Now get cli options. |
|||
list($options, $unrecognized) = cli_get_params(array('help'=>false, 'ie9fix'=>false, 'noaspectratio'=>false, 'path'=>$CFG->dirroot), |
|||
array('h'=>'help')); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
// If necessary add files that should be ignored - such as in 3rd party plugins. |
|||
$blacklist = array(); |
|||
$path = $options['path']; |
|||
if (!file_exists($path)) { |
|||
cli_error("Invalid path $path"); |
|||
} |
|||
|
|||
if ($options['ie9fix']) { |
|||
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_ie9fix', $blacklist); |
|||
|
|||
} else if ($options['noaspectratio']) { |
|||
core_admin_recurse_svgs($path, '', 'core_admin_svgtool_noaspectratio', $blacklist); |
|||
|
|||
} else { |
|||
$help = |
|||
"Some svg image tweaks for icon designers. |
|||
|
|||
Options: |
|||
|
|||
-h, --help Print out this help |
|||
--ie9fix Adds preserveAspectRatio=\"xMinYMid meet\" to every svg image |
|||
--noaspectratio Removes preserveAspectRatio from svg files |
|||
--path=PATH Path to directory or file to be converted, by default \$CFG->dirroot |
|||
|
|||
Examples: |
|||
\$ php svgtool.php --ie9fix |
|||
\$ php svgtool.php --ie9fix --path=../../../pix |
|||
\$ php svgtool.php --noaspectratio |
|||
"; |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
exit(0); |
|||
|
|||
/** |
|||
* Fixes SVG images for IE9. |
|||
* |
|||
* @param string $file |
|||
*/ |
|||
function core_admin_svgtool_ie9fix($file) { |
|||
global $CFG; |
|||
|
|||
if (strpos($file, $CFG->dirroot.DIRECTORY_SEPARATOR) === 0) { |
|||
$relfile = substr($file, strlen($CFG->dirroot)); |
|||
} else { |
|||
$relfile = $file; |
|||
} |
|||
|
|||
$content = file_get_contents($file); |
|||
|
|||
if (!preg_match('/<svg\s[^>]*>/', $content, $matches)) { |
|||
echo " skipping $relfile (invalid format)\n"; |
|||
return; |
|||
} |
|||
$svg = $matches[0]; |
|||
if (strpos($svg, 'preserveAspectRatio') !== false) { |
|||
return; |
|||
} |
|||
|
|||
if (!is_writable($file)) { |
|||
echo " skipping $relfile (can not modify file)\n"; |
|||
return; |
|||
} |
|||
|
|||
$newsvg = rtrim($svg, '>').' preserveAspectRatio="xMinYMid meet">'; |
|||
|
|||
$content = str_replace($svg, $newsvg, $content); |
|||
echo "converting $relfile\n"; |
|||
file_put_contents($file, $content); |
|||
} |
|||
|
|||
/** |
|||
* Removes preserveAspectRatio attributes from SVG images. |
|||
* |
|||
* @param string $file |
|||
*/ |
|||
function core_admin_svgtool_noaspectratio($file) { |
|||
global $CFG; |
|||
|
|||
if (strpos($file, $CFG->dirroot.DIRECTORY_SEPARATOR) === 0) { |
|||
$relfile = substr($file, strlen($CFG->dirroot)); |
|||
} else { |
|||
$relfile = $file; |
|||
} |
|||
|
|||
$content = file_get_contents($file); |
|||
|
|||
if (!preg_match('/<svg\s[^>]*>/', $content, $matches)) { |
|||
echo " skipping $relfile (invalid format)\n"; |
|||
return; |
|||
} |
|||
$svg = $matches[0]; |
|||
if (strpos($svg, 'preserveAspectRatio="xMinYMid meet"') === false) { |
|||
return; |
|||
} |
|||
|
|||
if (!is_writable($file)) { |
|||
echo " skipping $relfile (can not modify file)\n"; |
|||
return; |
|||
} |
|||
|
|||
$newsvg = preg_replace('/ ?preserveAspectRatio="xMinYMid meet"/', '', $svg); |
|||
|
|||
$content = str_replace($svg, $newsvg, $content); |
|||
echo "resetting $relfile\n"; |
|||
file_put_contents($file, $content); |
|||
} |
|||
|
|||
/** |
|||
* Recursively works through directories of this theme, finding and fixing SVG images. |
|||
* |
|||
* @param string $base |
|||
* @param string $sub |
|||
* @param string $filecallback |
|||
* @param array $blacklist |
|||
*/ |
|||
function core_admin_recurse_svgs($base, $sub, $filecallback, $blacklist) { |
|||
if (is_dir("$base/$sub")) { |
|||
$items = new DirectoryIterator("$base/$sub"); |
|||
foreach ($items as $item) { |
|||
if ($item->isDot()) { |
|||
continue; |
|||
} |
|||
$file = $item->getFilename(); |
|||
core_admin_recurse_svgs("$base/$sub", $file, $filecallback, $blacklist); |
|||
} |
|||
unset($item); |
|||
unset($items); |
|||
return; |
|||
|
|||
} else if (is_file("$base/$sub")) { |
|||
if (substr($sub, -4) !== '.svg') { |
|||
return; |
|||
} |
|||
$file = realpath("$base/$sub"); |
|||
if (in_array($file, $blacklist)) { |
|||
return; |
|||
} |
|||
$filecallback($file); |
|||
} |
|||
} |
@ -0,0 +1,163 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* CLI script to uninstall plugins. |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2018 Dmitrii Metelkin <dmitriim@catalyst-au.net> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
|
|||
require(__DIR__ . '/../../config.php'); |
|||
require_once($CFG->libdir . '/clilib.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$help = "Command line tool to uninstall plugins. |
|||
|
|||
Options: |
|||
-h --help Print this help. |
|||
--show-all Displays a list of all installed plugins. |
|||
--show-missing Displays a list of plugins missing from disk. |
|||
--purge-missing Uninstall all missing from disk plugins. |
|||
--plugins=<plugin name> A comma separated list of plugins to be uninstalled. E.g. mod_assign,mod_forum |
|||
--run Execute uninstall. If this option is not set, then the script will be run in a dry mode. |
|||
|
|||
Examples: |
|||
|
|||
# php uninstall_plugins.php --show-all |
|||
Prints tab-separated list of all installed plugins. |
|||
|
|||
# php uninstall_plugins.php --show-missing |
|||
Prints tab-separated list of all missing from disk plugins. |
|||
|
|||
# php uninstall_plugins.php --purge-missing |
|||
A dry run of uninstalling all missing plugins. |
|||
|
|||
# php uninstall_plugins.php --purge-missing --run |
|||
Run uninstall of all missing plugins. |
|||
|
|||
# php uninstall_plugins.php --plugins=mod_assign,mod_forum |
|||
A dry run of uninstalling mod_assign and mod_forum plugins. |
|||
|
|||
# php uninstall_plugins.php --plugins=mod_assign,mod_forum --run |
|||
Run uninstall for mod_assign and mod_forum plugins. |
|||
"; |
|||
|
|||
list($options, $unrecognised) = cli_get_params([ |
|||
'help' => false, |
|||
'show-all' => false, |
|||
'show-missing' => false, |
|||
'purge-missing' => false, |
|||
'plugins' => false, |
|||
'run' => false, |
|||
], [ |
|||
'h' => 'help' |
|||
]); |
|||
|
|||
if ($unrecognised) { |
|||
$unrecognised = implode(PHP_EOL.' ', $unrecognised); |
|||
cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
cli_writeln($help); |
|||
exit(0); |
|||
} |
|||
|
|||
$pluginman = core_plugin_manager::instance(); |
|||
$plugininfo = $pluginman->get_plugins(); |
|||
|
|||
if ($options['show-all'] || $options['show-missing']) { |
|||
foreach ($plugininfo as $type => $plugins) { |
|||
foreach ($plugins as $name => $plugin) { |
|||
$pluginstring = $plugin->component . "\t" . $plugin->displayname; |
|||
|
|||
if ($options['show-all']) { |
|||
cli_writeln($pluginstring); |
|||
} else { |
|||
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) { |
|||
cli_writeln($pluginstring); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
exit(0); |
|||
} |
|||
|
|||
if ($options['purge-missing']) { |
|||
foreach ($plugininfo as $type => $plugins) { |
|||
foreach ($plugins as $name => $plugin) { |
|||
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) { |
|||
|
|||
$pluginstring = $plugin->component . "\t" . $plugin->displayname; |
|||
|
|||
if ($pluginman->can_uninstall_plugin($plugin->component)) { |
|||
if ($options['run']) { |
|||
cli_writeln('Uninstalling: ' . $pluginstring); |
|||
|
|||
$progress = new progress_trace_buffer(new text_progress_trace(), true); |
|||
$pluginman->uninstall_plugin($plugin->component, $progress); |
|||
$progress->finished(); |
|||
cli_write($progress->get_buffer()); |
|||
} else { |
|||
cli_writeln('Will be uninstalled: ' . $pluginstring); |
|||
} |
|||
} else { |
|||
cli_writeln('Can not be uninstalled: ' . $pluginstring); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
exit(0); |
|||
} |
|||
|
|||
if ($options['plugins']) { |
|||
$components = explode(',', $options['plugins']); |
|||
foreach ($components as $component) { |
|||
$plugin = $pluginman->get_plugin_info($component); |
|||
|
|||
if (is_null($plugin)) { |
|||
cli_writeln('Unknown plugin: ' . $component); |
|||
} else { |
|||
$pluginstring = $plugin->component . "\t" . $plugin->displayname; |
|||
|
|||
if ($pluginman->can_uninstall_plugin($plugin->component)) { |
|||
if ($options['run']) { |
|||
cli_writeln('Uninstalling: ' . $pluginstring); |
|||
$progress = new progress_trace_buffer(new text_progress_trace(), true); |
|||
$pluginman->uninstall_plugin($plugin->component, $progress); |
|||
$progress->finished(); |
|||
cli_write($progress->get_buffer()); |
|||
} else { |
|||
cli_writeln('Will be uninstalled: ' . $pluginstring); |
|||
} |
|||
} else { |
|||
cli_writeln('Can not be uninstalled: ' . $pluginstring); |
|||
} |
|||
} |
|||
} |
|||
|
|||
exit(0); |
|||
} |
|||
|
|||
cli_writeln($help); |
|||
exit(0); |
@ -0,0 +1,217 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script creates config.php file and prepares database. |
|||
* |
|||
* This script is not intended for beginners! |
|||
* Potential problems: |
|||
* - su to apache account or sudo before execution |
|||
* - not compatible with Windows platform |
|||
* |
|||
* @package core |
|||
* @subpackage cli |
|||
* @copyright 2009 Petr Skoda (http://skodak.org) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
// Force OPcache reset if used, we do not want any stale caches |
|||
// when detecting if upgrade necessary or when running upgrade. |
|||
if (function_exists('opcache_reset') and !isset($_SERVER['REMOTE_ADDR'])) { |
|||
opcache_reset(); |
|||
} |
|||
|
|||
define('CLI_SCRIPT', true); |
|||
define('CACHE_DISABLE_ALL', true); |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions |
|||
require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions |
|||
require_once($CFG->libdir.'/clilib.php'); // cli only functions |
|||
require_once($CFG->libdir.'/environmentlib.php'); |
|||
|
|||
// now get cli options |
|||
$lang = isset($SESSION->lang) ? $SESSION->lang : $CFG->lang; |
|||
list($options, $unrecognized) = cli_get_params( |
|||
array( |
|||
'non-interactive' => false, |
|||
'allow-unstable' => false, |
|||
'help' => false, |
|||
'lang' => $lang, |
|||
'verbose-settings' => false |
|||
), |
|||
array( |
|||
'h' => 'help' |
|||
) |
|||
); |
|||
|
|||
if ($options['lang']) { |
|||
$SESSION->lang = $options['lang']; |
|||
} |
|||
|
|||
$interactive = empty($options['non-interactive']); |
|||
|
|||
if ($unrecognized) { |
|||
$unrecognized = implode("\n ", $unrecognized); |
|||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); |
|||
} |
|||
|
|||
if ($options['help']) { |
|||
$help = |
|||
"Command line Moodle upgrade. |
|||
Please note you must execute this script with the same uid as apache! |
|||
|
|||
Site defaults may be changed via local/defaults.php. |
|||
|
|||
Options: |
|||
--non-interactive No interactive questions or confirmations |
|||
--allow-unstable Upgrade even if the version is not marked as stable yet, |
|||
required in non-interactive mode. |
|||
--lang=CODE Set preferred language for CLI output. Defaults to the |
|||
site language if not set. Defaults to 'en' if the lang |
|||
parameter is invalid or if the language pack is not |
|||
installed. |
|||
--verbose-settings Show new settings values. By default only the name of |
|||
new core or plugin settings are displayed. This option |
|||
outputs the new values as well as the setting name. |
|||
-h, --help Print out this help |
|||
|
|||
Example: |
|||
\$sudo -u www-data /usr/bin/php admin/cli/upgrade.php |
|||
"; //TODO: localize - to be translated later when everything is finished |
|||
|
|||
echo $help; |
|||
die; |
|||
} |
|||
|
|||
if (empty($CFG->version)) { |
|||
cli_error(get_string('missingconfigversion', 'debug')); |
|||
} |
|||
|
|||
require("$CFG->dirroot/version.php"); // defines $version, $release, $branch and $maturity |
|||
$CFG->target_release = $release; // used during installation and upgrades |
|||
|
|||
if ($version < $CFG->version) { |
|||
cli_error(get_string('downgradedcore', 'error')); |
|||
} |
|||
|
|||
$oldversion = "$CFG->release ($CFG->version)"; |
|||
$newversion = "$release ($version)"; |
|||
|
|||
if (!moodle_needs_upgrading()) { |
|||
cli_error(get_string('cliupgradenoneed', 'core_admin', $newversion), 0); |
|||
} |
|||
|
|||
// Test environment first. |
|||
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); |
|||
if (!$envstatus) { |
|||
$errors = environment_get_errors($environment_results); |
|||
cli_heading(get_string('environment', 'admin')); |
|||
foreach ($errors as $error) { |
|||
list($info, $report) = $error; |
|||
echo "!! $info !!\n$report\n\n"; |
|||
} |
|||
exit(1); |
|||
} |
|||
|
|||
// Test plugin dependencies. |
|||
$failed = array(); |
|||
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { |
|||
cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); |
|||
cli_error(get_string('pluginschecktodo', 'admin')); |
|||
} |
|||
|
|||
$a = new stdClass(); |
|||
$a->oldversion = $oldversion; |
|||
$a->newversion = $newversion; |
|||
|
|||
if ($interactive) { |
|||
echo cli_heading(get_string('databasechecking', '', $a)) . PHP_EOL; |
|||
} |
|||
|
|||
// make sure we are upgrading to a stable release or display a warning |
|||
if (isset($maturity)) { |
|||
if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) { |
|||
$maturitylevel = get_string('maturity'.$maturity, 'admin'); |
|||
|
|||
if ($interactive) { |
|||
cli_separator(); |
|||
cli_heading(get_string('notice')); |
|||
echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL; |
|||
echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL; |
|||
cli_separator(); |
|||
} else { |
|||
cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel)); |
|||
cli_error(get_string('maturityallowunstable', 'admin')); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($interactive) { |
|||
echo html_to_text(get_string('upgradesure', 'admin', $newversion))."\n"; |
|||
$prompt = get_string('cliyesnoprompt', 'admin'); |
|||
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin'))); |
|||
if ($input == get_string('clianswerno', 'admin')) { |
|||
exit(1); |
|||
} |
|||
} |
|||
|
|||
if ($version > $CFG->version) { |
|||
// We purge all of MUC's caches here. |
|||
// Caches are disabled for upgrade by CACHE_DISABLE_ALL so we must set the first arg to true. |
|||
// This ensures a real config object is loaded and the stores will be purged. |
|||
// This is the only way we can purge custom caches such as memcache or APC. |
|||
// Note: all other calls to caches will still used the disabled API. |
|||
cache_helper::purge_all(true); |
|||
upgrade_core($version, true); |
|||
} |
|||
set_config('release', $release); |
|||
set_config('branch', $branch); |
|||
|
|||
// unconditionally upgrade |
|||
upgrade_noncore(true); |
|||
|
|||
// log in as admin - we need doanything permission when applying defaults |
|||
\core\session\manager::set_user(get_admin()); |
|||
|
|||
// Apply default settings and output those that have changed. |
|||
cli_heading(get_string('cliupgradedefaultheading', 'admin')); |
|||
$settingsoutput = admin_apply_default_settings(null, false); |
|||
|
|||
foreach ($settingsoutput as $setting => $value) { |
|||
|
|||
if ($options['verbose-settings']) { |
|||
$stringvlaues = array( |
|||
'name' => $setting, |
|||
'defaultsetting' => var_export($value, true) // Expand objects. |
|||
); |
|||
echo get_string('cliupgradedefaultverbose', 'admin', $stringvlaues) . PHP_EOL; |
|||
|
|||
} else { |
|||
echo get_string('cliupgradedefault', 'admin', $setting) . PHP_EOL; |
|||
|
|||
} |
|||
} |
|||
|
|||
// This needs to happen at the end to ensure it occurs after all caches |
|||
// have been purged for the last time. |
|||
// This will build a cached version of the current theme for the user |
|||
// to immediately start browsing the site. |
|||
upgrade_themes(); |
|||
|
|||
echo get_string('cliupgradefinished', 'admin', $a)."\n"; |
|||
exit(0); // 0 means success |
@ -0,0 +1,83 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows the admin to enable, disable and uninstall course formats |
|||
* |
|||
* @package core_admin |
|||
* @copyright 2012 Marina Glancy |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$formatname = required_param('format', PARAM_PLUGIN); |
|||
|
|||
$syscontext = context_system::instance(); |
|||
$PAGE->set_url('/admin/courseformats.php'); |
|||
$PAGE->set_context($syscontext); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', $syscontext); |
|||
require_sesskey(); |
|||
|
|||
$return = new moodle_url('/admin/settings.php', array('section' => 'manageformats')); |
|||
|
|||
$formatplugins = core_plugin_manager::instance()->get_plugins_of_type('format'); |
|||
$sortorder = array_flip(array_keys($formatplugins)); |
|||
|
|||
if (!isset($formatplugins[$formatname])) { |
|||
print_error('courseformatnotfound', 'error', $return, $formatname); |
|||
} |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
if ($formatplugins[$formatname]->is_enabled()) { |
|||
if (get_config('moodlecourse', 'format') === $formatname) { |
|||
print_error('cannotdisableformat', 'error', $return); |
|||
} |
|||
set_config('disabled', 1, 'format_'. $formatname); |
|||
core_plugin_manager::reset_caches(); |
|||
} |
|||
break; |
|||
case 'enable': |
|||
if (!$formatplugins[$formatname]->is_enabled()) { |
|||
unset_config('disabled', 'format_'. $formatname); |
|||
core_plugin_manager::reset_caches(); |
|||
} |
|||
break; |
|||
case 'up': |
|||
if ($sortorder[$formatname]) { |
|||
$currentindex = $sortorder[$formatname]; |
|||
$seq = array_keys($formatplugins); |
|||
$seq[$currentindex] = $seq[$currentindex-1]; |
|||
$seq[$currentindex-1] = $formatname; |
|||
set_config('format_plugins_sortorder', implode(',', $seq)); |
|||
} |
|||
break; |
|||
case 'down': |
|||
if ($sortorder[$formatname] < count($sortorder)-1) { |
|||
$currentindex = $sortorder[$formatname]; |
|||
$seq = array_keys($formatplugins); |
|||
$seq[$currentindex] = $seq[$currentindex+1]; |
|||
$seq[$currentindex+1] = $formatname; |
|||
set_config('format_plugins_sortorder', implode(',', $seq)); |
|||
} |
|||
break; |
|||
} |
|||
redirect($return); |
@ -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/>. |
|||
|
|||
/** |
|||
* Web cron |
|||
* |
|||
* This script looks through all the module directories for cron.php files |
|||
* and runs them. These files can contain cleanup functions, email functions |
|||
* or anything that needs to be run on a regular basis. |
|||
* |
|||
* This file is best run from cron on the host system (ie outside PHP). |
|||
* It is strongly recommended to add password protection via admin settings. |
|||
* |
|||
* eg wget -q -O /dev/null 'http: *moodle.somewhere.edu/admin/cron.php?password=SeCreT666' |
|||
* |
|||
* It is also possible to use CLI script admin/cli/cron.php instead, |
|||
* you can not call this script from command line any more. |
|||
* |
|||
* @package core |
|||
* @subpackage admin |
|||
* @copyright 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
|
|||
if (defined('STDIN')) { |
|||
fwrite(STDERR, "ERROR: This script no longer supports CLI, please use admin/cli/cron.php instead\n"); |
|||
exit(1); |
|||
} |
|||
|
|||
// This is a fake CLI script, it is a really ugly hack which emulates |
|||
// CLI via web interface, please do not use this hack elsewhere |
|||
define('CLI_SCRIPT', true); |
|||
define('WEB_CRON_EMULATED_CLI', 'defined'); // ugly ugly hack, do not use elsewhere please |
|||
define('NO_OUTPUT_BUFFERING', true); |
|||
|
|||
require('../config.php'); |
|||
require_once($CFG->libdir.'/clilib.php'); |
|||
require_once($CFG->libdir.'/cronlib.php'); |
|||
|
|||
// extra safety |
|||
\core\session\manager::write_close(); |
|||
|
|||
// check if execution allowed |
|||
if (!empty($CFG->cronclionly)) { |
|||
// This script can only be run via the cli. |
|||
print_error('cronerrorclionly', 'admin'); |
|||
exit; |
|||
} |
|||
// This script is being called via the web, so check the password if there is one. |
|||
if (!empty($CFG->cronremotepassword)) { |
|||
$pass = optional_param('password', '', PARAM_RAW); |
|||
if ($pass != $CFG->cronremotepassword) { |
|||
// wrong password. |
|||
print_error('cronerrorpassword', 'admin'); |
|||
exit; |
|||
} |
|||
} |
|||
|
|||
// send mime type and encoding |
|||
@header('Content-Type: text/plain; charset=utf-8'); |
|||
|
|||
// we do not want html markup in emulated CLI |
|||
@ini_set('html_errors', 'off'); |
|||
|
|||
// execute the cron |
|||
cron_run(); |
@ -0,0 +1,62 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows the admin to enable, disable and uninstall custom fields |
|||
* |
|||
* @package core_admin |
|||
* @copyright 2018 Daniel Neis Araujo |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$customfieldname = required_param('field', PARAM_PLUGIN); |
|||
|
|||
$syscontext = context_system::instance(); |
|||
$PAGE->set_url('/admin/customfields.php'); |
|||
$PAGE->set_context($syscontext); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', $syscontext); |
|||
require_sesskey(); |
|||
|
|||
$return = new moodle_url('/admin/settings.php', array('section' => 'managecustomfields')); |
|||
|
|||
$customfieldplugins = core_plugin_manager::instance()->get_plugins_of_type('customfield'); |
|||
$sortorder = array_flip(array_keys($customfieldplugins)); |
|||
|
|||
if (!isset($customfieldplugins[$customfieldname])) { |
|||
print_error('customfieldnotfound', 'error', $return, $customfieldname); |
|||
} |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
if ($customfieldplugins[$customfieldname]->is_enabled()) { |
|||
set_config('disabled', 1, 'customfield_'. $customfieldname); |
|||
core_plugin_manager::reset_caches(); |
|||
} |
|||
break; |
|||
case 'enable': |
|||
if (!$customfieldplugins[$customfieldname]->is_enabled()) { |
|||
unset_config('disabled', 'customfield_'. $customfieldname); |
|||
core_plugin_manager::reset_caches(); |
|||
} |
|||
break; |
|||
} |
|||
redirect($return); |
@ -0,0 +1,82 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Lets users manage data formats |
|||
* |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License |
|||
* @copyright 2016 Brendan Heywood (brendan@catalyst-au.net) |
|||
* @package core |
|||
* @subpackage dataformat |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$name = required_param('name', PARAM_PLUGIN); |
|||
|
|||
$syscontext = context_system::instance(); |
|||
$PAGE->set_url('/admin/dataformats.php'); |
|||
$PAGE->set_context($syscontext); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', $syscontext); |
|||
require_sesskey(); |
|||
|
|||
$return = new moodle_url('/admin/settings.php', array('section' => 'managedataformats')); |
|||
|
|||
$plugins = core_plugin_manager::instance()->get_plugins_of_type('dataformat'); |
|||
$sortorder = array_flip(array_keys($plugins)); |
|||
|
|||
if (!isset($plugins[$name])) { |
|||
print_error('courseformatnotfound', 'error', $return, $name); |
|||
} |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
if ($plugins[$name]->is_enabled()) { |
|||
set_config('disabled', 1, 'dataformat_'. $name); |
|||
core_plugin_manager::reset_caches(); |
|||
} |
|||
break; |
|||
case 'enable': |
|||
if (!$plugins[$name]->is_enabled()) { |
|||
unset_config('disabled', 'dataformat_'. $name); |
|||
core_plugin_manager::reset_caches(); |
|||
} |
|||
break; |
|||
case 'up': |
|||
if ($sortorder[$name]) { |
|||
$currentindex = $sortorder[$name]; |
|||
$seq = array_keys($plugins); |
|||
$seq[$currentindex] = $seq[$currentindex - 1]; |
|||
$seq[$currentindex - 1] = $name; |
|||
set_config('dataformat_plugins_sortorder', implode(',', $seq)); |
|||
} |
|||
break; |
|||
case 'down': |
|||
if ($sortorder[$name] < count($sortorder) - 1) { |
|||
$currentindex = $sortorder[$name]; |
|||
$seq = array_keys($plugins); |
|||
$seq[$currentindex] = $seq[$currentindex + 1]; |
|||
$seq[$currentindex + 1] = $name; |
|||
set_config('dataformat_plugins_sortorder', implode(',', $seq)); |
|||
} |
|||
break; |
|||
} |
|||
redirect($return); |
|||
|
@ -0,0 +1,104 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* Allows admin to configure editors. |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$editor = required_param('editor', PARAM_PLUGIN); |
|||
$confirm = optional_param('confirm', 0, PARAM_BOOL); |
|||
|
|||
$PAGE->set_url('/admin/editors.php', array('action'=>$action, 'editor'=>$editor)); |
|||
$PAGE->set_context(context_system::instance()); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', context_system::instance()); |
|||
|
|||
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageeditors"; |
|||
|
|||
// get currently installed and enabled auth plugins |
|||
$available_editors = editors_get_available(); |
|||
if (!empty($editor) and empty($available_editors[$editor])) { |
|||
redirect ($returnurl); |
|||
} |
|||
|
|||
$active_editors = explode(',', $CFG->texteditors); |
|||
foreach ($active_editors as $key=>$active) { |
|||
if (empty($available_editors[$active])) { |
|||
unset($active_editors[$key]); |
|||
} |
|||
} |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////// |
|||
// process actions |
|||
|
|||
if (!confirm_sesskey()) { |
|||
redirect($returnurl); |
|||
} |
|||
|
|||
|
|||
$return = true; |
|||
switch ($action) { |
|||
case 'disable': |
|||
// remove from enabled list |
|||
$key = array_search($editor, $active_editors); |
|||
unset($active_editors[$key]); |
|||
add_to_config_log('editor_visibility', '1', '0', $editor); |
|||
break; |
|||
|
|||
case 'enable': |
|||
// add to enabled list |
|||
if (!in_array($editor, $active_editors)) { |
|||
$active_editors[] = $editor; |
|||
$active_editors = array_unique($active_editors); |
|||
add_to_config_log('editor_visibility', '0', '1', $editor); |
|||
} |
|||
break; |
|||
|
|||
case 'down': |
|||
$key = array_search($editor, $active_editors); |
|||
// check auth plugin is valid |
|||
if ($key !== false) { |
|||
// move down the list |
|||
if ($key < (count($active_editors) - 1)) { |
|||
$fsave = $active_editors[$key]; |
|||
$active_editors[$key] = $active_editors[$key + 1]; |
|||
$active_editors[$key + 1] = $fsave; |
|||
add_to_config_log('editor_position', $key, $key + 1, $editor); |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case 'up': |
|||
$key = array_search($editor, $active_editors); |
|||
// check auth is valid |
|||
if ($key !== false) { |
|||
// move up the list |
|||
if ($key >= 1) { |
|||
$fsave = $active_editors[$key]; |
|||
$active_editors[$key] = $active_editors[$key - 1]; |
|||
$active_editors[$key - 1] = $fsave; |
|||
add_to_config_log('editor_position', $key, $key - 1, $editor); |
|||
} |
|||
} |
|||
break; |
|||
|
|||
default: |
|||
break; |
|||
} |
|||
|
|||
// at least one editor must be active |
|||
if (empty($active_editors)) { |
|||
$active_editors = array('textarea'); |
|||
} |
|||
|
|||
set_config('texteditors', implode(',', $active_editors)); |
|||
core_plugin_manager::reset_caches(); |
|||
|
|||
if ($return) { |
|||
redirect ($returnurl); |
|||
} |
@ -0,0 +1,133 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Enrol config manipulation script. |
|||
* |
|||
* @package core |
|||
* @subpackage enrol |
|||
* @copyright 2010 Petr Skoda {@link http://skodak.org} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('NO_OUTPUT_BUFFERING', true); |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$enrol = required_param('enrol', PARAM_PLUGIN); |
|||
$confirm = optional_param('confirm', 0, PARAM_BOOL); |
|||
|
|||
$PAGE->set_url('/admin/enrol.php'); |
|||
$PAGE->set_context(context_system::instance()); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', context_system::instance()); |
|||
require_sesskey(); |
|||
|
|||
$enabled = enrol_get_plugins(true); |
|||
$all = enrol_get_plugins(false); |
|||
|
|||
$return = new moodle_url('/admin/settings.php', array('section'=>'manageenrols')); |
|||
|
|||
$syscontext = context_system::instance(); |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
unset($enabled[$enrol]); |
|||
set_config('enrol_plugins_enabled', implode(',', array_keys($enabled))); |
|||
core_plugin_manager::reset_caches(); |
|||
$syscontext->mark_dirty(); // resets all enrol caches |
|||
break; |
|||
|
|||
case 'enable': |
|||
if (!isset($all[$enrol])) { |
|||
break; |
|||
} |
|||
$enabled = array_keys($enabled); |
|||
$enabled[] = $enrol; |
|||
set_config('enrol_plugins_enabled', implode(',', $enabled)); |
|||
core_plugin_manager::reset_caches(); |
|||
$syscontext->mark_dirty(); // resets all enrol caches |
|||
break; |
|||
|
|||
case 'up': |
|||
if (!isset($enabled[$enrol])) { |
|||
break; |
|||
} |
|||
$enabled = array_keys($enabled); |
|||
$enabled = array_flip($enabled); |
|||
$current = $enabled[$enrol]; |
|||
if ($current == 0) { |
|||
break; //already at the top |
|||
} |
|||
$enabled = array_flip($enabled); |
|||
$enabled[$current] = $enabled[$current - 1]; |
|||
$enabled[$current - 1] = $enrol; |
|||
set_config('enrol_plugins_enabled', implode(',', $enabled)); |
|||
break; |
|||
|
|||
case 'down': |
|||
if (!isset($enabled[$enrol])) { |
|||
break; |
|||
} |
|||
$enabled = array_keys($enabled); |
|||
$enabled = array_flip($enabled); |
|||
$current = $enabled[$enrol]; |
|||
if ($current == count($enabled) - 1) { |
|||
break; //already at the end |
|||
} |
|||
$enabled = array_flip($enabled); |
|||
$enabled[$current] = $enabled[$current + 1]; |
|||
$enabled[$current + 1] = $enrol; |
|||
set_config('enrol_plugins_enabled', implode(',', $enabled)); |
|||
break; |
|||
|
|||
case 'migrate': |
|||
if (get_string_manager()->string_exists('pluginname', 'enrol_'.$enrol)) { |
|||
$strplugin = get_string('pluginname', 'enrol_'.$enrol); |
|||
} else { |
|||
$strplugin = $enrol; |
|||
} |
|||
|
|||
$PAGE->set_title($strplugin); |
|||
echo $OUTPUT->header(); |
|||
|
|||
// This may take a long time. |
|||
core_php_time_limit::raise(); |
|||
|
|||
// Disable plugin to prevent concurrent cron execution. |
|||
unset($enabled[$enrol]); |
|||
set_config('enrol_plugins_enabled', implode(',', array_keys($enabled))); |
|||
|
|||
echo $OUTPUT->heading(get_string('uninstallmigrating', 'enrol', 'enrol_'.$enrol)); |
|||
|
|||
require_once("$CFG->dirroot/enrol/manual/locallib.php"); |
|||
enrol_manual_migrate_plugin_enrolments($enrol); |
|||
|
|||
echo $OUTPUT->notification(get_string('success'), 'notifysuccess'); |
|||
|
|||
if (!$return = core_plugin_manager::instance()->get_uninstall_url('enrol_'.$enrol, 'manage')) { |
|||
$return = new moodle_url('/admin/plugins.php'); |
|||
} |
|||
echo $OUTPUT->continue_button($return); |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} |
|||
|
|||
|
|||
redirect($return); |
@ -0,0 +1,109 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This file is the admin frontend to execute all the checks available |
|||
* in the environment.xml file. It includes database, php and |
|||
* php_extensions. Also, it's possible to update the xml file |
|||
* from moodle.org be able to check more and more versions. |
|||
* |
|||
* @package core |
|||
* @subpackage admin |
|||
* @copyright 2006 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/environmentlib.php'); |
|||
require_once($CFG->libdir.'/componentlib.class.php'); |
|||
|
|||
// Parameters |
|||
$action = optional_param('action', '', PARAM_ALPHANUMEXT); |
|||
$version = optional_param('version', '', PARAM_FILE); // |
|||
|
|||
$extraurlparams = array(); |
|||
if ($version) { |
|||
$extraurlparams['version'] = $version; |
|||
} |
|||
admin_externalpage_setup('environment', '', $extraurlparams); |
|||
|
|||
// Handle the 'updatecomponent' action |
|||
if ($action == 'updatecomponent' && confirm_sesskey()) { |
|||
// Create component installer and execute it |
|||
if ($cd = new component_installer('https://download.moodle.org', |
|||
'environment', |
|||
'environment.zip')) { |
|||
$status = $cd->install(); //returns COMPONENT_(ERROR | UPTODATE | INSTALLED) |
|||
switch ($status) { |
|||
case COMPONENT_ERROR: |
|||
if ($cd->get_error() == 'remotedownloaderror') { |
|||
$a = new stdClass(); |
|||
$a->url = 'https://download.moodle.org/environment/environment.zip'; |
|||
$a->dest = $CFG->dataroot . '/'; |
|||
print_error($cd->get_error(), 'error', $PAGE->url, $a); |
|||
die(); |
|||
|
|||
} else { |
|||
print_error($cd->get_error(), 'error', $PAGE->url); |
|||
die(); |
|||
} |
|||
|
|||
case COMPONENT_UPTODATE: |
|||
redirect($PAGE->url, get_string($cd->get_error(), 'error')); |
|||
die; |
|||
|
|||
case COMPONENT_INSTALLED: |
|||
redirect($PAGE->url, get_string('componentinstalled', 'admin')); |
|||
die; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Get current Moodle version |
|||
$current_version = $CFG->release; |
|||
|
|||
// Calculate list of versions |
|||
$versions = array(); |
|||
if ($contents = load_environment_xml()) { |
|||
if ($env_versions = get_list_of_environment_versions($contents)) { |
|||
// Set the current version at the beginning |
|||
$env_version = normalize_version($current_version); //We need this later (for the upwards) |
|||
$versions[$env_version] = $current_version; |
|||
// If no version has been previously selected, default to $current_version |
|||
if (empty($version)) { |
|||
$version = $env_version; |
|||
} |
|||
//Iterate over each version, adding bigger than current |
|||
foreach ($env_versions as $env_version) { |
|||
if (version_compare(normalize_version($current_version), $env_version, '<')) { |
|||
$versions[$env_version] = $env_version; |
|||
} |
|||
} |
|||
// Add 'upwards' to the last element |
|||
$versions[$env_version] = $env_version.' '.get_string('upwards', 'admin'); |
|||
} else { |
|||
$versions = array('error' => get_string('error')); |
|||
} |
|||
} |
|||
|
|||
// Get the results of the environment check. |
|||
list($envstatus, $environment_results) = check_moodle_environment($version, ENV_SELECT_NEWER); |
|||
|
|||
// Display the page. |
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
echo $output->environment_check_page($versions, $version, $envstatus, $environment_results); |
File diff suppressed because it is too large
@ -0,0 +1,249 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Filter management page. |
|||
* |
|||
* @package core |
|||
* @copyright 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$action = optional_param('action', '', PARAM_ALPHA); |
|||
$filterpath = optional_param('filterpath', '', PARAM_PLUGIN); |
|||
|
|||
admin_externalpage_setup('managefilters'); |
|||
|
|||
// Clean up bogus filter states first. |
|||
$plugininfos = core_plugin_manager::instance()->get_plugins_of_type('filter'); |
|||
$filters = array(); |
|||
$states = filter_get_global_states(); |
|||
foreach ($states as $state) { |
|||
if (!isset($plugininfos[$state->filter]) and !get_config('filter_'.$state->filter, 'version')) { |
|||
// Purge messy leftovers after incorrectly uninstalled plugins and unfinished installs. |
|||
$DB->delete_records('filter_active', array('filter' => $state->filter)); |
|||
$DB->delete_records('filter_config', array('filter' => $state->filter)); |
|||
error_log('Deleted bogus "filter_'.$state->filter.'" states and config data.'); |
|||
} else { |
|||
$filters[$state->filter] = $state; |
|||
} |
|||
} |
|||
|
|||
// Add properly installed and upgraded filters to the global states table. |
|||
foreach ($plugininfos as $filter => $info) { |
|||
if (isset($filters[$filter])) { |
|||
continue; |
|||
} |
|||
/** @var \core\plugininfo\base $info */ |
|||
if ($info->is_installed_and_upgraded()) { |
|||
filter_set_global_state($filter, TEXTFILTER_DISABLED); |
|||
$states = filter_get_global_states(); |
|||
foreach ($states as $state) { |
|||
if ($state->filter === $filter) { |
|||
$filters[$filter] = $state; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($action) { |
|||
require_sesskey(); |
|||
} |
|||
|
|||
// Process actions. |
|||
switch ($action) { |
|||
|
|||
case 'setstate': |
|||
if (isset($filters[$filterpath]) and $newstate = optional_param('newstate', '', PARAM_INT)) { |
|||
filter_set_global_state($filterpath, $newstate); |
|||
if ($newstate == TEXTFILTER_DISABLED) { |
|||
filter_set_applies_to_strings($filterpath, false); |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case 'setapplyto': |
|||
if (isset($filters[$filterpath])) { |
|||
$applytostrings = optional_param('stringstoo', false, PARAM_BOOL); |
|||
filter_set_applies_to_strings($filterpath, $applytostrings); |
|||
} |
|||
break; |
|||
|
|||
case 'down': |
|||
if (isset($filters[$filterpath])) { |
|||
filter_set_global_state($filterpath, $filters[$filterpath]->active, 1); |
|||
} |
|||
break; |
|||
|
|||
case 'up': |
|||
if (isset($filters[$filterpath])) { |
|||
$oldpos = $filters[$filterpath]->sortorder; |
|||
filter_set_global_state($filterpath, $filters[$filterpath]->active, -1); |
|||
} |
|||
break; |
|||
} |
|||
|
|||
// Reset caches and return. |
|||
if ($action) { |
|||
reset_text_filters_cache(); |
|||
core_plugin_manager::reset_caches(); |
|||
redirect(new moodle_url('/admin/filters.php')); |
|||
} |
|||
|
|||
// Print the page heading. |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('filtersettings', 'admin')); |
|||
|
|||
$states = filter_get_global_states(); |
|||
$stringfilters = filter_get_string_filters(); |
|||
|
|||
$table = new html_table(); |
|||
$table->head = array(get_string('filter'), get_string('isactive', 'filters'), |
|||
get_string('order'), get_string('applyto', 'filters'), get_string('settings'), get_string('uninstallplugin', 'core_admin')); |
|||
$table->colclasses = array ('leftalign', 'leftalign', 'centeralign', 'leftalign', 'leftalign', 'leftalign'); |
|||
$table->attributes['class'] = 'admintable generaltable'; |
|||
$table->id = 'filterssetting'; |
|||
$table->data = array(); |
|||
|
|||
$lastactive = null; |
|||
foreach ($states as $state) { |
|||
if ($state->active != TEXTFILTER_DISABLED) { |
|||
$lastactive = $state->filter; |
|||
} |
|||
} |
|||
|
|||
// Iterate through filters adding to display table. |
|||
$firstrow = true; |
|||
foreach ($states as $state) { |
|||
$filter = $state->filter; |
|||
if (!isset($plugininfos[$filter])) { |
|||
continue; |
|||
} |
|||
$plugininfo = $plugininfos[$filter]; |
|||
$applytostrings = isset($stringfilters[$filter]) && $state->active != TEXTFILTER_DISABLED; |
|||
$row = get_table_row($plugininfo, $state, $firstrow, $filter == $lastactive, $applytostrings); |
|||
$table->data[] = $row; |
|||
if ($state->active == TEXTFILTER_DISABLED) { |
|||
$table->rowclasses[] = 'dimmed_text'; |
|||
} else { |
|||
$table->rowclasses[] = ''; |
|||
} |
|||
$firstrow = false; |
|||
} |
|||
|
|||
echo html_writer::table($table); |
|||
echo '<p class="filtersettingnote">' . get_string('filterallwarning', 'filters') . '</p>'; |
|||
echo $OUTPUT->footer(); |
|||
die; |
|||
|
|||
|
|||
/** |
|||
* Return action URL. |
|||
* |
|||
* @param string $filterpath |
|||
* @param string $action |
|||
* @return moodle_url |
|||
*/ |
|||
function filters_action_url($filterpath, $action) { |
|||
if ($action === 'delete') { |
|||
return core_plugin_manager::instance()->get_uninstall_url('filter_'.$filterpath, 'manage'); |
|||
} |
|||
return new moodle_url('/admin/filters.php', array('sesskey'=>sesskey(), 'filterpath'=>$filterpath, 'action'=>$action)); |
|||
} |
|||
|
|||
/** |
|||
* Construct table record. |
|||
* |
|||
* @param \core\plugininfo\filter $plugininfo |
|||
* @param stdClass $state |
|||
* @param bool $isfirstrow |
|||
* @param bool $islastactive |
|||
* @param bool $applytostrings |
|||
* @return array data |
|||
*/ |
|||
function get_table_row(\core\plugininfo\filter $plugininfo, $state, $isfirstrow, $islastactive, $applytostrings) { |
|||
global $OUTPUT; |
|||
$row = array(); |
|||
$filter = $state->filter; |
|||
$active = $plugininfo->is_installed_and_upgraded(); |
|||
|
|||
static $activechoices; |
|||
static $applytochoices; |
|||
if (!isset($activechoices)) { |
|||
$activechoices = array( |
|||
TEXTFILTER_DISABLED => get_string('disabled', 'core_filters'), |
|||
TEXTFILTER_OFF => get_string('offbutavailable', 'core_filters'), |
|||
TEXTFILTER_ON => get_string('on', 'core_filters'), |
|||
); |
|||
$applytochoices = array( |
|||
0 => get_string('content', 'core_filters'), |
|||
1 => get_string('contentandheadings', 'core_filters'), |
|||
); |
|||
} |
|||
|
|||
// Filter name. |
|||
$displayname = $plugininfo->displayname; |
|||
if (!$plugininfo->rootdir) { |
|||
$displayname = '<span class="error">' . $displayname . ' - ' . get_string('status_missing', 'core_plugin') . '</span>'; |
|||
} else if (!$active) { |
|||
$displayname = '<span class="error">' . $displayname . ' - ' . get_string('error') . '</span>'; |
|||
} |
|||
$row[] = $displayname; |
|||
|
|||
// Disable/off/on. |
|||
$select = new single_select(filters_action_url($filter, 'setstate'), 'newstate', $activechoices, $state->active, null, 'active' . $filter); |
|||
$select->set_label(get_string('isactive', 'filters'), array('class' => 'accesshide')); |
|||
$row[] = $OUTPUT->render($select); |
|||
|
|||
// Re-order. |
|||
$updown = ''; |
|||
$spacer = $OUTPUT->spacer(); |
|||
if ($state->active != TEXTFILTER_DISABLED) { |
|||
if (!$isfirstrow) { |
|||
$updown .= $OUTPUT->action_icon(filters_action_url($filter, 'up'), new pix_icon('t/up', get_string('up'), '', array('class' => 'iconsmall'))); |
|||
} else { |
|||
$updown .= $spacer; |
|||
} |
|||
if (!$islastactive) { |
|||
$updown .= $OUTPUT->action_icon(filters_action_url($filter, 'down'), new pix_icon('t/down', get_string('down'), '', array('class' => 'iconsmall'))); |
|||
} else { |
|||
$updown .= $spacer; |
|||
} |
|||
} |
|||
$row[] = $updown; |
|||
|
|||
// Apply to strings. |
|||
$select = new single_select(filters_action_url($filter, 'setapplyto'), 'stringstoo', $applytochoices, $applytostrings, null, 'applyto' . $filter); |
|||
$select->set_label(get_string('applyto', 'filters'), array('class' => 'accesshide')); |
|||
$select->disabled = ($state->active == TEXTFILTER_DISABLED); |
|||
$row[] = $OUTPUT->render($select); |
|||
|
|||
// Settings link, if required. |
|||
if ($active and filter_has_global_settings($filter)) { |
|||
$row[] = html_writer::link(new moodle_url('/admin/settings.php', array('section'=>'filtersetting'.$filter)), get_string('settings')); |
|||
} else { |
|||
$row[] = ''; |
|||
} |
|||
|
|||
// Uninstall. |
|||
$row[] = html_writer::link(filters_action_url($filter, 'delete'), get_string('uninstallplugin', 'core_admin')); |
|||
|
|||
return $row; |
|||
} |
@ -0,0 +1,891 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Main administration script. |
|||
* |
|||
* @package core |
|||
* @copyright 1999 onwards Martin Dougiamas (http://dougiamas.com) |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
// Check that config.php exists, if not then call the install script |
|||
if (!file_exists('../config.php')) { |
|||
header('Location: ../install.php'); |
|||
die(); |
|||
} |
|||
|
|||
// Check that PHP is of a sufficient version as soon as possible. |
|||
require_once(__DIR__.'/../lib/phpminimumversionlib.php'); |
|||
moodle_require_minimum_php_version(); |
|||
|
|||
// make sure iconv is available and actually works |
|||
if (!function_exists('iconv')) { |
|||
// this should not happen, this must be very borked install |
|||
echo 'Moodle requires the iconv PHP extension. Please install or enable the iconv extension.'; |
|||
die(); |
|||
} |
|||
|
|||
// Make sure php5-json is available. |
|||
if (!function_exists('json_encode') || !function_exists('json_decode')) { |
|||
// This also shouldn't happen. |
|||
echo 'Moodle requires the json PHP extension. Please install or enable the json extension.'; |
|||
die(); |
|||
} |
|||
|
|||
// Make sure xml extension is available. |
|||
if (!extension_loaded('xml')) { |
|||
echo 'Moodle requires the xml PHP extension. Please install or enable the xml extension.'; |
|||
die(); |
|||
} |
|||
|
|||
define('NO_OUTPUT_BUFFERING', true); |
|||
|
|||
if (isset($_POST['upgradekey'])) { |
|||
// Before you start reporting issues about the collision attacks against |
|||
// SHA-1, you should understand that we are not actually attempting to do |
|||
// any cryptography here. This is hashed purely so that the key is not |
|||
// that apparent in the address bar itself. Anyone who catches the HTTP |
|||
// traffic can immediately use it as a valid admin key. |
|||
header('Location: index.php?cache=0&upgradekeyhash='.sha1($_POST['upgradekey'])); |
|||
die(); |
|||
} |
|||
|
|||
if ((isset($_GET['cache']) and $_GET['cache'] === '0') |
|||
or (isset($_POST['cache']) and $_POST['cache'] === '0') |
|||
or (!isset($_POST['cache']) and !isset($_GET['cache']) and empty($_GET['sesskey']) and empty($_POST['sesskey']))) { |
|||
// Prevent caching at all cost when visiting this page directly, |
|||
// we redirect to self once we known no upgrades are necessary. |
|||
// Note: $_GET and $_POST are used here intentionally because our param cleaning is not loaded yet. |
|||
// Note2: the sesskey is present in all block editing hacks, we can not redirect there, so enable caching. |
|||
define('CACHE_DISABLE_ALL', true); |
|||
|
|||
// Force OPcache reset if used, we do not want any stale caches |
|||
// when detecting if upgrade necessary or when running upgrade. |
|||
if (function_exists('opcache_reset')) { |
|||
opcache_reset(); |
|||
} |
|||
$cache = 0; |
|||
|
|||
} else { |
|||
$cache = 1; |
|||
} |
|||
|
|||
require('../config.php'); |
|||
|
|||
// Invalidate the cache of version.php in any circumstances to help core_component |
|||
// detecting if the version has changed and component cache should be reset. |
|||
if (function_exists('opcache_invalidate')) { |
|||
opcache_invalidate($CFG->dirroot . '/version.php', true); |
|||
} |
|||
// Make sure the component cache gets rebuilt if necessary, any method that |
|||
// indirectly calls the protected init() method is good here. |
|||
core_component::get_core_subsystems(); |
|||
|
|||
if (is_major_upgrade_required() && isloggedin()) { |
|||
// A major upgrade is required. |
|||
// Terminate the session and redirect back here before anything DB-related happens. |
|||
redirect_if_major_upgrade_required(); |
|||
} |
|||
|
|||
require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions |
|||
require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions |
|||
|
|||
$confirmupgrade = optional_param('confirmupgrade', 0, PARAM_BOOL); // Core upgrade confirmed? |
|||
$confirmrelease = optional_param('confirmrelease', 0, PARAM_BOOL); // Core release info and server checks confirmed? |
|||
$confirmplugins = optional_param('confirmplugincheck', 0, PARAM_BOOL); // Plugins check page confirmed? |
|||
$showallplugins = optional_param('showallplugins', 0, PARAM_BOOL); // Show all plugins on the plugins check page? |
|||
$agreelicense = optional_param('agreelicense', 0, PARAM_BOOL); // GPL license confirmed for installation? |
|||
$fetchupdates = optional_param('fetchupdates', 0, PARAM_BOOL); // Should check for available updates? |
|||
$newaddonreq = optional_param('installaddonrequest', null, PARAM_RAW); // Plugin installation requested at moodle.org/plugins. |
|||
$upgradekeyhash = optional_param('upgradekeyhash', null, PARAM_ALPHANUM); // Hash of provided upgrade key. |
|||
$installdep = optional_param('installdep', null, PARAM_COMPONENT); // Install given missing dependency (required plugin). |
|||
$installdepx = optional_param('installdepx', false, PARAM_BOOL); // Install all missing dependencies. |
|||
$confirminstalldep = optional_param('confirminstalldep', false, PARAM_BOOL); // Installing dependencies confirmed. |
|||
$abortinstall = optional_param('abortinstall', null, PARAM_COMPONENT); // Cancel installation of the given new plugin. |
|||
$abortinstallx = optional_param('abortinstallx', null, PARAM_BOOL); // Cancel installation of all new plugins. |
|||
$confirmabortinstall = optional_param('confirmabortinstall', false, PARAM_BOOL); // Installation cancel confirmed. |
|||
$abortupgrade = optional_param('abortupgrade', null, PARAM_COMPONENT); // Cancel upgrade of the given existing plugin. |
|||
$abortupgradex = optional_param('abortupgradex', null, PARAM_BOOL); // Cancel upgrade of all upgradable plugins. |
|||
$confirmabortupgrade = optional_param('confirmabortupgrade', false, PARAM_BOOL); // Upgrade cancel confirmed. |
|||
$installupdate = optional_param('installupdate', null, PARAM_COMPONENT); // Install given available update. |
|||
$installupdateversion = optional_param('installupdateversion', null, PARAM_INT); // Version of the available update to install. |
|||
$installupdatex = optional_param('installupdatex', false, PARAM_BOOL); // Install all available plugin updates. |
|||
$confirminstallupdate = optional_param('confirminstallupdate', false, PARAM_BOOL); // Available update(s) install confirmed? |
|||
|
|||
if (!empty($CFG->disableupdateautodeploy)) { |
|||
// Invalidate all requests to install plugins via the admin UI. |
|||
$newaddonreq = null; |
|||
$installdep = null; |
|||
$installdepx = false; |
|||
$abortupgrade = null; |
|||
$abortupgradex = null; |
|||
$installupdate = null; |
|||
$installupdateversion = null; |
|||
$installupdatex = false; |
|||
} |
|||
|
|||
// Set up PAGE. |
|||
$url = new moodle_url('/admin/index.php'); |
|||
$url->param('cache', $cache); |
|||
if (isset($upgradekeyhash)) { |
|||
$url->param('upgradekeyhash', $upgradekeyhash); |
|||
} |
|||
$PAGE->set_url($url); |
|||
unset($url); |
|||
|
|||
// Are we returning from an add-on installation request at moodle.org/plugins? |
|||
if ($newaddonreq and !$cache and empty($CFG->disableupdateautodeploy)) { |
|||
$target = new moodle_url('/admin/tool/installaddon/index.php', array( |
|||
'installaddonrequest' => $newaddonreq, |
|||
'confirm' => 0)); |
|||
if (!isloggedin() or isguestuser()) { |
|||
// Login and go the the add-on tool page. |
|||
$SESSION->wantsurl = $target->out(); |
|||
redirect(get_login_url()); |
|||
} |
|||
redirect($target); |
|||
} |
|||
|
|||
$PAGE->set_pagelayout('admin'); // Set a default pagelayout |
|||
|
|||
$documentationlink = '<a href="http://docs.moodle.org/en/Installation">Installation docs</a>'; |
|||
|
|||
// Check some PHP server settings |
|||
|
|||
if (ini_get_bool('session.auto_start')) { |
|||
print_error('phpvaroff', 'debug', '', (object)array('name'=>'session.auto_start', 'link'=>$documentationlink)); |
|||
} |
|||
|
|||
if (!ini_get_bool('file_uploads')) { |
|||
print_error('phpvaron', 'debug', '', (object)array('name'=>'file_uploads', 'link'=>$documentationlink)); |
|||
} |
|||
|
|||
if (is_float_problem()) { |
|||
print_error('phpfloatproblem', 'admin', '', $documentationlink); |
|||
} |
|||
|
|||
// Set some necessary variables during set-up to avoid PHP warnings later on this page |
|||
if (!isset($CFG->release)) { |
|||
$CFG->release = ''; |
|||
} |
|||
if (!isset($CFG->version)) { |
|||
$CFG->version = ''; |
|||
} |
|||
if (!isset($CFG->branch)) { |
|||
$CFG->branch = ''; |
|||
} |
|||
|
|||
$version = null; |
|||
$release = null; |
|||
$branch = null; |
|||
require("$CFG->dirroot/version.php"); // defines $version, $release, $branch and $maturity |
|||
$CFG->target_release = $release; // used during installation and upgrades |
|||
|
|||
if (!$version or !$release) { |
|||
print_error('withoutversion', 'debug'); // without version, stop |
|||
} |
|||
|
|||
if (!core_tables_exist()) { |
|||
$PAGE->set_pagelayout('maintenance'); |
|||
$PAGE->set_popup_notification_allowed(false); |
|||
|
|||
// fake some settings |
|||
$CFG->docroot = 'http://docs.moodle.org'; |
|||
|
|||
$strinstallation = get_string('installation', 'install'); |
|||
|
|||
// remove current session content completely |
|||
\core\session\manager::terminate_current(); |
|||
|
|||
if (empty($agreelicense)) { |
|||
$strlicense = get_string('license'); |
|||
|
|||
$PAGE->navbar->add($strlicense); |
|||
$PAGE->set_title($strinstallation.' - Moodle '.$CFG->target_release); |
|||
$PAGE->set_heading($strinstallation); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
echo $output->install_licence_page(); |
|||
die(); |
|||
} |
|||
if (empty($confirmrelease)) { |
|||
require_once($CFG->libdir.'/environmentlib.php'); |
|||
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); |
|||
$strcurrentrelease = get_string('currentrelease'); |
|||
|
|||
$PAGE->navbar->add($strcurrentrelease); |
|||
$PAGE->set_title($strinstallation); |
|||
$PAGE->set_heading($strinstallation . ' - Moodle ' . $CFG->target_release); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
echo $output->install_environment_page($maturity, $envstatus, $environment_results, $release); |
|||
die(); |
|||
} |
|||
|
|||
// check plugin dependencies |
|||
$failed = array(); |
|||
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { |
|||
$PAGE->navbar->add(get_string('pluginscheck', 'admin')); |
|||
$PAGE->set_title($strinstallation); |
|||
$PAGE->set_heading($strinstallation . ' - Moodle ' . $CFG->target_release); |
|||
|
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
$url = new moodle_url($PAGE->url, array('agreelicense' => 1, 'confirmrelease' => 1, 'lang' => $CFG->lang)); |
|||
echo $output->unsatisfied_dependencies_page($version, $failed, $url); |
|||
die(); |
|||
} |
|||
unset($failed); |
|||
|
|||
//TODO: add a page with list of non-standard plugins here |
|||
|
|||
$strdatabasesetup = get_string('databasesetup'); |
|||
upgrade_init_javascript(); |
|||
|
|||
$PAGE->navbar->add($strdatabasesetup); |
|||
$PAGE->set_title($strinstallation.' - Moodle '.$CFG->target_release); |
|||
$PAGE->set_heading($strinstallation); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
echo $output->header(); |
|||
|
|||
if (!$DB->setup_is_unicodedb()) { |
|||
if (!$DB->change_db_encoding()) { |
|||
// If could not convert successfully, throw error, and prevent installation |
|||
print_error('unicoderequired', 'admin'); |
|||
} |
|||
} |
|||
|
|||
install_core($version, true); |
|||
} |
|||
|
|||
|
|||
// Check version of Moodle code on disk compared with database |
|||
// and upgrade if possible. |
|||
|
|||
if (!$cache) { |
|||
// Do not try to do anything fancy in non-cached mode, |
|||
// this prevents themes from fetching data from non-existent tables. |
|||
$PAGE->set_pagelayout('maintenance'); |
|||
$PAGE->set_popup_notification_allowed(false); |
|||
} |
|||
|
|||
$stradministration = get_string('administration'); |
|||
$PAGE->set_context(context_system::instance()); |
|||
|
|||
if (empty($CFG->version)) { |
|||
print_error('missingconfigversion', 'debug'); |
|||
} |
|||
|
|||
// Detect config cache inconsistency, this happens when you switch branches on dev servers. |
|||
if ($CFG->version != $DB->get_field('config', 'value', array('name'=>'version'))) { |
|||
purge_all_caches(); |
|||
redirect(new moodle_url($PAGE->url), 'Config cache inconsistency detected, resetting caches...'); |
|||
} |
|||
|
|||
if (!$cache and $version > $CFG->version) { // upgrade |
|||
|
|||
$PAGE->set_url(new moodle_url($PAGE->url, array( |
|||
'confirmupgrade' => $confirmupgrade, |
|||
'confirmrelease' => $confirmrelease, |
|||
'confirmplugincheck' => $confirmplugins, |
|||
))); |
|||
|
|||
check_upgrade_key($upgradekeyhash); |
|||
|
|||
// Warning about upgrading a test site. |
|||
$testsite = false; |
|||
if (defined('BEHAT_SITE_RUNNING')) { |
|||
$testsite = 'behat'; |
|||
} |
|||
|
|||
if (isset($CFG->themerev)) { |
|||
// Store the themerev to restore after purging caches. |
|||
$themerev = $CFG->themerev; |
|||
} |
|||
|
|||
// We purge all of MUC's caches here. |
|||
// Caches are disabled for upgrade by CACHE_DISABLE_ALL so we must set the first arg to true. |
|||
// This ensures a real config object is loaded and the stores will be purged. |
|||
// This is the only way we can purge custom caches such as memcache or APC. |
|||
// Note: all other calls to caches will still used the disabled API. |
|||
cache_helper::purge_all(true); |
|||
// We then purge the regular caches. |
|||
purge_all_caches(); |
|||
|
|||
if (isset($themerev)) { |
|||
// Restore the themerev |
|||
set_config('themerev', $themerev); |
|||
} |
|||
|
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
|
|||
if (upgrade_stale_php_files_present()) { |
|||
$PAGE->set_title($stradministration); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
echo $output->upgrade_stale_php_files_page(); |
|||
die(); |
|||
} |
|||
|
|||
if (empty($confirmupgrade)) { |
|||
$a = new stdClass(); |
|||
$a->oldversion = "$CFG->release (".sprintf('%.2f', $CFG->version).")"; |
|||
$a->newversion = "$release (".sprintf('%.2f', $version).")"; |
|||
$strdatabasechecking = get_string('databasechecking', '', $a); |
|||
|
|||
$PAGE->set_title($stradministration); |
|||
$PAGE->set_heading($strdatabasechecking); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
echo $output->upgrade_confirm_page($a->newversion, $maturity, $testsite); |
|||
die(); |
|||
|
|||
} else if (empty($confirmrelease)){ |
|||
require_once($CFG->libdir.'/environmentlib.php'); |
|||
list($envstatus, $environment_results) = check_moodle_environment($release, ENV_SELECT_RELEASE); |
|||
$strcurrentrelease = get_string('currentrelease'); |
|||
|
|||
$PAGE->navbar->add($strcurrentrelease); |
|||
$PAGE->set_title($strcurrentrelease); |
|||
$PAGE->set_heading($strcurrentrelease); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
echo $output->upgrade_environment_page($release, $envstatus, $environment_results); |
|||
die(); |
|||
|
|||
} else if (empty($confirmplugins)) { |
|||
$strplugincheck = get_string('plugincheck'); |
|||
|
|||
$PAGE->navbar->add($strplugincheck); |
|||
$PAGE->set_title($strplugincheck); |
|||
$PAGE->set_heading($strplugincheck); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
$pluginman = core_plugin_manager::instance(); |
|||
|
|||
// Check for available updates. |
|||
if ($fetchupdates) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$updateschecker = \core\update\checker::instance(); |
|||
if ($updateschecker->enabled()) { |
|||
$updateschecker->fetch(); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Cancel all plugin installations. |
|||
if ($abortinstallx) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$abortables = $pluginman->list_cancellable_installations(); |
|||
if ($abortables) { |
|||
if ($confirmabortinstall) { |
|||
foreach ($abortables as $plugin) { |
|||
$pluginman->cancel_plugin_installation($plugin->component); |
|||
} |
|||
redirect($PAGE->url); |
|||
} else { |
|||
$continue = new moodle_url($PAGE->url, array('abortinstallx' => $abortinstallx, 'confirmabortinstall' => 1)); |
|||
echo $output->upgrade_confirm_abort_install_page($abortables, $continue); |
|||
die(); |
|||
} |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Cancel single plugin installation. |
|||
if ($abortinstall) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
if ($confirmabortinstall) { |
|||
$pluginman->cancel_plugin_installation($abortinstall); |
|||
redirect($PAGE->url); |
|||
} else { |
|||
$continue = new moodle_url($PAGE->url, array('abortinstall' => $abortinstall, 'confirmabortinstall' => 1)); |
|||
$abortable = $pluginman->get_plugin_info($abortinstall); |
|||
if ($pluginman->can_cancel_plugin_installation($abortable)) { |
|||
echo $output->upgrade_confirm_abort_install_page(array($abortable), $continue); |
|||
die(); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
} |
|||
|
|||
// Cancel all plugins upgrades (that is, restore archived versions). |
|||
if ($abortupgradex) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$restorable = $pluginman->list_restorable_archives(); |
|||
if ($restorable) { |
|||
upgrade_install_plugins($restorable, $confirmabortupgrade, |
|||
get_string('cancelupgradehead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('abortupgradex' => 1, 'confirmabortupgrade' => 1)) |
|||
); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Cancel single plugin upgrade (that is, install the archived version). |
|||
if ($abortupgrade) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$restorable = $pluginman->list_restorable_archives(); |
|||
if (isset($restorable[$abortupgrade])) { |
|||
$restorable = array($restorable[$abortupgrade]); |
|||
upgrade_install_plugins($restorable, $confirmabortupgrade, |
|||
get_string('cancelupgradehead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('abortupgrade' => $abortupgrade, 'confirmabortupgrade' => 1)) |
|||
); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Install all available missing dependencies. |
|||
if ($installdepx) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$installable = $pluginman->filter_installable($pluginman->missing_dependencies(true)); |
|||
upgrade_install_plugins($installable, $confirminstalldep, |
|||
get_string('dependencyinstallhead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('installdepx' => 1, 'confirminstalldep' => 1)) |
|||
); |
|||
} |
|||
|
|||
// Install single available missing dependency. |
|||
if ($installdep) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$installable = $pluginman->filter_installable($pluginman->missing_dependencies(true)); |
|||
if (!empty($installable[$installdep])) { |
|||
$installable = array($installable[$installdep]); |
|||
upgrade_install_plugins($installable, $confirminstalldep, |
|||
get_string('dependencyinstallhead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('installdep' => $installdep, 'confirminstalldep' => 1)) |
|||
); |
|||
} |
|||
} |
|||
|
|||
// Install all available updates. |
|||
if ($installupdatex) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
$installable = $pluginman->filter_installable($pluginman->available_updates()); |
|||
upgrade_install_plugins($installable, $confirminstallupdate, |
|||
get_string('updateavailableinstallallhead', 'core_admin'), |
|||
new moodle_url($PAGE->url, array('installupdatex' => 1, 'confirminstallupdate' => 1)) |
|||
); |
|||
} |
|||
|
|||
// Install single available update. |
|||
if ($installupdate and $installupdateversion) { |
|||
// No sesskey support guaranteed here, because sessions might not work yet. |
|||
if ($pluginman->is_remote_plugin_installable($installupdate, $installupdateversion)) { |
|||
$installable = array($pluginman->get_remote_plugin_info($installupdate, $installupdateversion, true)); |
|||
upgrade_install_plugins($installable, $confirminstallupdate, |
|||
get_string('updateavailableinstallallhead', 'core_admin'), |
|||
new moodle_url($PAGE->url, array('installupdate' => $installupdate, |
|||
'installupdateversion' => $installupdateversion, 'confirminstallupdate' => 1) |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
echo $output->upgrade_plugin_check_page(core_plugin_manager::instance(), \core\update\checker::instance(), |
|||
$version, $showallplugins, $PAGE->url, new moodle_url($PAGE->url, array('confirmplugincheck' => 1))); |
|||
die(); |
|||
|
|||
} else { |
|||
// Always verify plugin dependencies! |
|||
$failed = array(); |
|||
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { |
|||
echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url); |
|||
die(); |
|||
} |
|||
unset($failed); |
|||
|
|||
// Launch main upgrade. |
|||
upgrade_core($version, true); |
|||
} |
|||
} else if ($version < $CFG->version) { |
|||
// better stop here, we can not continue with plugin upgrades or anything else |
|||
throw new moodle_exception('downgradedcore', 'error', new moodle_url('/admin/')); |
|||
} |
|||
|
|||
// Updated human-readable release version if necessary |
|||
if (!$cache and $release <> $CFG->release) { // Update the release version |
|||
set_config('release', $release); |
|||
} |
|||
|
|||
if (!$cache and $branch <> $CFG->branch) { // Update the branch |
|||
set_config('branch', $branch); |
|||
} |
|||
|
|||
if (!$cache and moodle_needs_upgrading()) { |
|||
|
|||
$PAGE->set_url(new moodle_url($PAGE->url, array('confirmplugincheck' => $confirmplugins))); |
|||
|
|||
check_upgrade_key($upgradekeyhash); |
|||
|
|||
if (!$PAGE->headerprinted) { |
|||
// means core upgrade or installation was not already done |
|||
|
|||
$pluginman = core_plugin_manager::instance(); |
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
|
|||
if (!$confirmplugins) { |
|||
$strplugincheck = get_string('plugincheck'); |
|||
|
|||
$PAGE->navbar->add($strplugincheck); |
|||
$PAGE->set_title($strplugincheck); |
|||
$PAGE->set_heading($strplugincheck); |
|||
$PAGE->set_cacheable(false); |
|||
|
|||
// Check for available updates. |
|||
if ($fetchupdates) { |
|||
require_sesskey(); |
|||
$updateschecker = \core\update\checker::instance(); |
|||
if ($updateschecker->enabled()) { |
|||
$updateschecker->fetch(); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Cancel all plugin installations. |
|||
if ($abortinstallx) { |
|||
require_sesskey(); |
|||
$abortables = $pluginman->list_cancellable_installations(); |
|||
if ($abortables) { |
|||
if ($confirmabortinstall) { |
|||
foreach ($abortables as $plugin) { |
|||
$pluginman->cancel_plugin_installation($plugin->component); |
|||
} |
|||
redirect($PAGE->url); |
|||
} else { |
|||
$continue = new moodle_url($PAGE->url, array('abortinstallx' => $abortinstallx, |
|||
'confirmabortinstall' => 1)); |
|||
echo $output->upgrade_confirm_abort_install_page($abortables, $continue); |
|||
die(); |
|||
} |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Cancel single plugin installation. |
|||
if ($abortinstall) { |
|||
require_sesskey(); |
|||
if ($confirmabortinstall) { |
|||
$pluginman->cancel_plugin_installation($abortinstall); |
|||
redirect($PAGE->url); |
|||
} else { |
|||
$continue = new moodle_url($PAGE->url, array('abortinstall' => $abortinstall, 'confirmabortinstall' => 1)); |
|||
$abortable = $pluginman->get_plugin_info($abortinstall); |
|||
if ($pluginman->can_cancel_plugin_installation($abortable)) { |
|||
echo $output->upgrade_confirm_abort_install_page(array($abortable), $continue); |
|||
die(); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
} |
|||
|
|||
// Cancel all plugins upgrades (that is, restore archived versions). |
|||
if ($abortupgradex) { |
|||
require_sesskey(); |
|||
$restorable = $pluginman->list_restorable_archives(); |
|||
if ($restorable) { |
|||
upgrade_install_plugins($restorable, $confirmabortupgrade, |
|||
get_string('cancelupgradehead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('abortupgradex' => 1, 'confirmabortupgrade' => 1)) |
|||
); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Cancel single plugin upgrade (that is, install the archived version). |
|||
if ($abortupgrade) { |
|||
require_sesskey(); |
|||
$restorable = $pluginman->list_restorable_archives(); |
|||
if (isset($restorable[$abortupgrade])) { |
|||
$restorable = array($restorable[$abortupgrade]); |
|||
upgrade_install_plugins($restorable, $confirmabortupgrade, |
|||
get_string('cancelupgradehead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('abortupgrade' => $abortupgrade, 'confirmabortupgrade' => 1)) |
|||
); |
|||
} |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
// Install all available missing dependencies. |
|||
if ($installdepx) { |
|||
require_sesskey(); |
|||
$installable = $pluginman->filter_installable($pluginman->missing_dependencies(true)); |
|||
upgrade_install_plugins($installable, $confirminstalldep, |
|||
get_string('dependencyinstallhead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('installdepx' => 1, 'confirminstalldep' => 1)) |
|||
); |
|||
} |
|||
|
|||
// Install single available missing dependency. |
|||
if ($installdep) { |
|||
require_sesskey(); |
|||
$installable = $pluginman->filter_installable($pluginman->missing_dependencies(true)); |
|||
if (!empty($installable[$installdep])) { |
|||
$installable = array($installable[$installdep]); |
|||
upgrade_install_plugins($installable, $confirminstalldep, |
|||
get_string('dependencyinstallhead', 'core_plugin'), |
|||
new moodle_url($PAGE->url, array('installdep' => $installdep, 'confirminstalldep' => 1)) |
|||
); |
|||
} |
|||
} |
|||
|
|||
// Install all available updates. |
|||
if ($installupdatex) { |
|||
require_sesskey(); |
|||
$installable = $pluginman->filter_installable($pluginman->available_updates()); |
|||
upgrade_install_plugins($installable, $confirminstallupdate, |
|||
get_string('updateavailableinstallallhead', 'core_admin'), |
|||
new moodle_url($PAGE->url, array('installupdatex' => 1, 'confirminstallupdate' => 1)) |
|||
); |
|||
} |
|||
|
|||
// Install single available update. |
|||
if ($installupdate and $installupdateversion) { |
|||
require_sesskey(); |
|||
if ($pluginman->is_remote_plugin_installable($installupdate, $installupdateversion)) { |
|||
$installable = array($pluginman->get_remote_plugin_info($installupdate, $installupdateversion, true)); |
|||
upgrade_install_plugins($installable, $confirminstallupdate, |
|||
get_string('updateavailableinstallallhead', 'core_admin'), |
|||
new moodle_url($PAGE->url, array('installupdate' => $installupdate, |
|||
'installupdateversion' => $installupdateversion, 'confirminstallupdate' => 1) |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
// Show plugins info. |
|||
echo $output->upgrade_plugin_check_page($pluginman, \core\update\checker::instance(), |
|||
$version, $showallplugins, |
|||
new moodle_url($PAGE->url), |
|||
new moodle_url($PAGE->url, array('confirmplugincheck' => 1, 'cache' => 0))); |
|||
die(); |
|||
} |
|||
|
|||
// Make sure plugin dependencies are always checked. |
|||
$failed = array(); |
|||
if (!$pluginman->all_plugins_ok($version, $failed)) { |
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url); |
|||
die(); |
|||
} |
|||
unset($failed); |
|||
} |
|||
|
|||
// install/upgrade all plugins and other parts |
|||
upgrade_noncore(true); |
|||
} |
|||
|
|||
// If this is the first install, indicate that this site is fully configured |
|||
// except the admin password |
|||
if (during_initial_install()) { |
|||
set_config('rolesactive', 1); // after this, during_initial_install will return false. |
|||
set_config('adminsetuppending', 1); |
|||
set_config('registrationpending', 1); // Remind to register site after all other setup is finished. |
|||
// we need this redirect to setup proper session |
|||
upgrade_finished("index.php?sessionstarted=1&lang=$CFG->lang"); |
|||
} |
|||
|
|||
// make sure admin user is created - this is the last step because we need |
|||
// session to be working properly in order to edit admin account |
|||
if (!empty($CFG->adminsetuppending)) { |
|||
$sessionstarted = optional_param('sessionstarted', 0, PARAM_BOOL); |
|||
if (!$sessionstarted) { |
|||
redirect("index.php?sessionstarted=1&lang=$CFG->lang"); |
|||
} else { |
|||
$sessionverify = optional_param('sessionverify', 0, PARAM_BOOL); |
|||
if (!$sessionverify) { |
|||
$SESSION->sessionverify = 1; |
|||
redirect("index.php?sessionstarted=1&sessionverify=1&lang=$CFG->lang"); |
|||
} else { |
|||
if (empty($SESSION->sessionverify)) { |
|||
print_error('installsessionerror', 'admin', "index.php?sessionstarted=1&lang=$CFG->lang"); |
|||
} |
|||
unset($SESSION->sessionverify); |
|||
} |
|||
} |
|||
|
|||
// Cleanup SESSION to make sure other code does not complain in the future. |
|||
unset($SESSION->has_timed_out); |
|||
unset($SESSION->wantsurl); |
|||
|
|||
// at this stage there can be only one admin unless more were added by install - users may change username, so do not rely on that |
|||
$adminids = explode(',', $CFG->siteadmins); |
|||
$adminuser = get_complete_user_data('id', reset($adminids)); |
|||
|
|||
if ($adminuser->password === 'adminsetuppending') { |
|||
// prevent installation hijacking |
|||
if ($adminuser->lastip !== getremoteaddr()) { |
|||
print_error('installhijacked', 'admin'); |
|||
} |
|||
// login user and let him set password and admin details |
|||
$adminuser->newadminuser = 1; |
|||
complete_user_login($adminuser); |
|||
redirect("$CFG->wwwroot/user/editadvanced.php?id=$adminuser->id"); // Edit thyself |
|||
|
|||
} else { |
|||
unset_config('adminsetuppending'); |
|||
} |
|||
|
|||
} else { |
|||
// just make sure upgrade logging is properly terminated |
|||
upgrade_finished('upgradesettings.php'); |
|||
} |
|||
|
|||
if (has_capability('moodle/site:config', context_system::instance())) { |
|||
if ($fetchupdates) { |
|||
require_sesskey(); |
|||
$updateschecker = \core\update\checker::instance(); |
|||
if ($updateschecker->enabled()) { |
|||
$updateschecker->fetch(); |
|||
} |
|||
redirect(new moodle_url('/admin/index.php', array('cache' => 0))); |
|||
} |
|||
} |
|||
|
|||
// Now we can be sure everything was upgraded and caches work fine, |
|||
// redirect if necessary to make sure caching is enabled. |
|||
if (!$cache) { |
|||
redirect(new moodle_url('/admin/index.php', array('cache' => 1))); |
|||
} |
|||
|
|||
// Check for valid admin user - no guest autologin |
|||
require_login(0, false); |
|||
if (isguestuser()) { |
|||
// Login as real user! |
|||
$SESSION->wantsurl = (string)new moodle_url('/admin/index.php'); |
|||
redirect(get_login_url()); |
|||
} |
|||
$context = context_system::instance(); |
|||
|
|||
if (!has_capability('moodle/site:config', $context)) { |
|||
// Do not throw exception display an empty page with administration menu if visible for current user. |
|||
$PAGE->set_title($SITE->fullname); |
|||
$PAGE->set_heading($SITE->fullname); |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} |
|||
|
|||
// check that site is properly customized |
|||
$site = get_site(); |
|||
if (empty($site->shortname)) { |
|||
// probably new installation - lets return to frontpage after this step |
|||
// remove settings that we want uninitialised |
|||
unset_config('registerauth'); |
|||
unset_config('timezone'); // Force admin to select timezone! |
|||
redirect('upgradesettings.php?return=site'); |
|||
} |
|||
|
|||
// setup critical warnings before printing admin tree block |
|||
$insecuredataroot = is_dataroot_insecure(true); |
|||
$SESSION->admin_critical_warning = ($insecuredataroot==INSECURE_DATAROOT_ERROR); |
|||
|
|||
$adminroot = admin_get_root(); |
|||
|
|||
// Check if there are any new admin settings which have still yet to be set |
|||
if (any_new_admin_settings($adminroot)){ |
|||
redirect('upgradesettings.php'); |
|||
} |
|||
|
|||
// Return to original page that started the plugin uninstallation if necessary. |
|||
if (isset($SESSION->pluginuninstallreturn)) { |
|||
$return = $SESSION->pluginuninstallreturn; |
|||
unset($SESSION->pluginuninstallreturn); |
|||
if ($return) { |
|||
redirect($return); |
|||
} |
|||
} |
|||
|
|||
// If site registration needs updating, redirect. |
|||
\core\hub\registration::registration_reminder('/admin/index.php'); |
|||
|
|||
// Everything should now be set up, and the user is an admin |
|||
|
|||
// Print default admin page with notifications. |
|||
$errorsdisplayed = defined('WARN_DISPLAY_ERRORS_ENABLED'); |
|||
|
|||
$lastcron = get_config('tool_task', 'lastcronstart'); |
|||
$cronoverdue = ($lastcron < time() - 3600 * 24); |
|||
$lastcroninterval = get_config('tool_task', 'lastcroninterval'); |
|||
$expectedfrequency = $CFG->expectedcronfrequency ?? 200; |
|||
$croninfrequent = !$cronoverdue && ($lastcroninterval > $expectedfrequency || $lastcron < time() - $expectedfrequency); |
|||
$dbproblems = $DB->diagnose(); |
|||
$maintenancemode = !empty($CFG->maintenance_enabled); |
|||
|
|||
// Available updates for Moodle core. |
|||
$updateschecker = \core\update\checker::instance(); |
|||
$availableupdates = array(); |
|||
$availableupdatesfetch = null; |
|||
|
|||
if ($updateschecker->enabled()) { |
|||
// Only compute the update information when it is going to be displayed to the user. |
|||
$availableupdates['core'] = $updateschecker->get_update_info('core', |
|||
array('minmaturity' => $CFG->updateminmaturity, 'notifybuilds' => $CFG->updatenotifybuilds)); |
|||
|
|||
// Available updates for contributed plugins |
|||
$pluginman = core_plugin_manager::instance(); |
|||
foreach ($pluginman->get_plugins() as $plugintype => $plugintypeinstances) { |
|||
foreach ($plugintypeinstances as $pluginname => $plugininfo) { |
|||
$pluginavailableupdates = $plugininfo->available_updates(); |
|||
if (!empty($pluginavailableupdates)) { |
|||
foreach ($pluginavailableupdates as $pluginavailableupdate) { |
|||
if (!isset($availableupdates[$plugintype.'_'.$pluginname])) { |
|||
$availableupdates[$plugintype.'_'.$pluginname] = array(); |
|||
} |
|||
$availableupdates[$plugintype.'_'.$pluginname][] = $pluginavailableupdate; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// The timestamp of the most recent check for available updates |
|||
$availableupdatesfetch = $updateschecker->get_last_timefetched(); |
|||
} |
|||
|
|||
$buggyiconvnomb = (!function_exists('mb_convert_encoding') and @iconv('UTF-8', 'UTF-8//IGNORE', '100'.chr(130).'€') !== '100€'); |
|||
//check if the site is registered on Moodle.org |
|||
$registered = \core\hub\registration::is_registered(); |
|||
// Check if there are any cache warnings. |
|||
$cachewarnings = cache_helper::warnings(); |
|||
// Check if there are events 1 API handlers. |
|||
$eventshandlers = $DB->get_records_sql('SELECT DISTINCT component FROM {events_handlers}'); |
|||
$themedesignermode = !empty($CFG->themedesignermode); |
|||
$mobileconfigured = !empty($CFG->enablemobilewebservice); |
|||
$invalidforgottenpasswordurl = !empty($CFG->forgottenpasswordurl) && empty(clean_param($CFG->forgottenpasswordurl, PARAM_URL)); |
|||
|
|||
// Check if a directory with development libraries exists. |
|||
if (empty($CFG->disabledevlibdirscheck) && (is_dir($CFG->dirroot.'/vendor') || is_dir($CFG->dirroot.'/node_modules'))) { |
|||
$devlibdir = true; |
|||
} else { |
|||
$devlibdir = false; |
|||
} |
|||
// Check if the site is being foced onto ssl. |
|||
$overridetossl = !empty($CFG->overridetossl); |
|||
|
|||
admin_externalpage_setup('adminnotifications'); |
|||
|
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
|
|||
echo $output->admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed, $cronoverdue, $dbproblems, |
|||
$maintenancemode, $availableupdates, $availableupdatesfetch, $buggyiconvnomb, |
|||
$registered, $cachewarnings, $eventshandlers, $themedesignermode, $devlibdir, |
|||
$mobileconfigured, $overridetossl, $invalidforgottenpasswordurl, $croninfrequent); |
@ -0,0 +1,124 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This file contains functions used by the admin pages |
|||
* |
|||
* @since Moodle 2.1 |
|||
* @package admin |
|||
* @copyright 2011 Andrew Davis |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
/** |
|||
* Return a list of page types |
|||
* @param string $pagetype current page type |
|||
* @param stdClass $parentcontext Block's parent context |
|||
* @param stdClass $currentcontext Current context of block |
|||
*/ |
|||
function admin_page_type_list($pagetype, $parentcontext, $currentcontext) { |
|||
$array = array( |
|||
'admin-*' => get_string('page-admin-x', 'pagetype'), |
|||
$pagetype => get_string('page-admin-current', 'pagetype') |
|||
); |
|||
return $array; |
|||
} |
|||
|
|||
/** |
|||
* File serving. |
|||
* |
|||
* @param stdClass $course The course object. |
|||
* @param stdClass $cm The cm object. |
|||
* @param context $context The context object. |
|||
* @param string $filearea The file area. |
|||
* @param array $args List of arguments. |
|||
* @param bool $forcedownload Whether or not to force the download of the file. |
|||
* @param array $options Array of options. |
|||
* @return void|false |
|||
*/ |
|||
function core_admin_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) { |
|||
global $CFG; |
|||
|
|||
if (in_array($filearea, ['logo', 'logocompact'])) { |
|||
$size = array_shift($args); // The path hides the size. |
|||
$itemid = clean_param(array_shift($args), PARAM_INT); |
|||
$filename = clean_param(array_shift($args), PARAM_FILE); |
|||
$themerev = theme_get_revision(); |
|||
if ($themerev <= 0) { |
|||
// Normalise to 0 as -1 doesn't place well with paths. |
|||
$themerev = 0; |
|||
} |
|||
|
|||
// Extract the requested width and height. |
|||
$maxwidth = 0; |
|||
$maxheight = 0; |
|||
if (preg_match('/^\d+x\d+$/', $size)) { |
|||
list($maxwidth, $maxheight) = explode('x', $size); |
|||
$maxwidth = clean_param($maxwidth, PARAM_INT); |
|||
$maxheight = clean_param($maxheight, PARAM_INT); |
|||
} |
|||
|
|||
$lifetime = 0; |
|||
if ($itemid > 0 && $themerev == $itemid) { |
|||
// The itemid is $CFG->themerev, when 0 or less no caching. Also no caching when they don't match. |
|||
$lifetime = DAYSECS * 60; |
|||
} |
|||
|
|||
// Anyone, including guests and non-logged in users, can view the logos. |
|||
$options = ['cacheability' => 'public']; |
|||
|
|||
// Check if we've got a cached file to return. When lifetime is 0 then we don't want to cached one. |
|||
$candidate = $CFG->localcachedir . "/core_admin/$themerev/$filearea/{$maxwidth}x{$maxheight}/$filename"; |
|||
if (file_exists($candidate) && $lifetime > 0) { |
|||
send_file($candidate, $filename, $lifetime, 0, false, false, '', false, $options); |
|||
} |
|||
|
|||
// Find the original file. |
|||
$fs = get_file_storage(); |
|||
$filepath = "/{$context->id}/core_admin/{$filearea}/0/{$filename}"; |
|||
if (!$file = $fs->get_file_by_hash(sha1($filepath))) { |
|||
send_file_not_found(); |
|||
} |
|||
|
|||
// No need for resizing, but if the file should be cached we save it so we can serve it fast next time. |
|||
if (empty($maxwidth) && empty($maxheight)) { |
|||
if ($lifetime) { |
|||
file_safe_save_content($file->get_content(), $candidate); |
|||
} |
|||
send_stored_file($file, $lifetime, 0, false, $options); |
|||
} |
|||
|
|||
// Proceed with the resizing. |
|||
$filedata = $file->resize_image($maxwidth, $maxheight); |
|||
if (!$filedata) { |
|||
send_file_not_found(); |
|||
} |
|||
|
|||
// If we don't want to cached the file, serve now and quit. |
|||
if (!$lifetime) { |
|||
send_content_uncached($filedata, $filename); |
|||
} |
|||
|
|||
// Save, serve and quit. |
|||
file_safe_save_content($filedata, $candidate); |
|||
send_file($candidate, $filename, $lifetime, 0, false, false, '', false, $options); |
|||
} |
|||
|
|||
send_file_not_found(); |
|||
} |
@ -0,0 +1,57 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows admin to configure licenses. |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/licenselib.php'); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', context_system::instance()); |
|||
|
|||
$returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=managelicenses"; |
|||
|
|||
$action = optional_param('action', '', PARAM_ALPHANUMEXT); |
|||
$license = optional_param('license', '', PARAM_SAFEDIR); |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////// |
|||
// process actions |
|||
|
|||
if (!confirm_sesskey()) { |
|||
redirect($returnurl); |
|||
} |
|||
|
|||
$return = true; |
|||
switch ($action) { |
|||
case 'disable': |
|||
license_manager::disable($license); |
|||
break; |
|||
|
|||
case 'enable': |
|||
license_manager::enable($license); |
|||
break; |
|||
|
|||
default: |
|||
break; |
|||
} |
|||
|
|||
if ($return) { |
|||
redirect ($returnurl); |
|||
} |
@ -0,0 +1,78 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Provides an overview of installed local plugins |
|||
* |
|||
* Displays the list of found local plugins, their version (if found) and |
|||
* a link to delete the local plugin. |
|||
* |
|||
* @see http://docs.moodle.org/dev/Local_customisation |
|||
* @package admin |
|||
* @copyright 2010 David Mudrak <david.mudrak@gmail.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
admin_externalpage_setup('managelocalplugins'); |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('localplugins')); |
|||
|
|||
/// Print the table of all installed local plugins |
|||
|
|||
$table = new flexible_table('localplugins_administration_table'); |
|||
$table->define_columns(array('name', 'version', 'uninstall')); |
|||
$table->define_headers(array(get_string('plugin'), get_string('version'), get_string('uninstallplugin', 'core_admin'))); |
|||
$table->define_baseurl($PAGE->url); |
|||
$table->set_attribute('id', 'localplugins'); |
|||
$table->set_attribute('class', 'admintable generaltable'); |
|||
$table->setup(); |
|||
|
|||
$plugins = array(); |
|||
foreach (core_component::get_plugin_list('local') as $plugin => $plugindir) { |
|||
if (get_string_manager()->string_exists('pluginname', 'local_' . $plugin)) { |
|||
$strpluginname = get_string('pluginname', 'local_' . $plugin); |
|||
} else { |
|||
$strpluginname = $plugin; |
|||
} |
|||
$plugins[$plugin] = $strpluginname; |
|||
} |
|||
core_collator::asort($plugins); |
|||
|
|||
foreach ($plugins as $plugin => $name) { |
|||
$uninstall = ''; |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('local_'.$plugin, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, get_string('uninstallplugin', 'core_admin')); |
|||
} |
|||
|
|||
$version = get_config('local_' . $plugin); |
|||
if (!empty($version->version)) { |
|||
$version = $version->version; |
|||
} else { |
|||
$version = '?'; |
|||
} |
|||
|
|||
$table->add_data(array($name, $version, $uninstall)); |
|||
} |
|||
|
|||
$table->print_html(); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,96 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This file is used to display a categories sub categories, external pages, and settings. |
|||
* |
|||
* @package admin |
|||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once("{$CFG->libdir}/adminlib.php"); |
|||
|
|||
$contextid = required_param('id', PARAM_INT); |
|||
$confirm = optional_param('confirm', null, PARAM_INT); |
|||
$returnurl = optional_param('returnurl', null, PARAM_LOCALURL); |
|||
|
|||
$PAGE->set_url('/admin/lock.php', ['id' => $contextid]); |
|||
|
|||
list($context, $course, $cm) = get_context_info_array($contextid); |
|||
|
|||
$parentcontext = $context->get_parent_context(); |
|||
if ($parentcontext && !empty($parentcontext->locked)) { |
|||
// Can't make changes to a context whose parent is locked. |
|||
throw new \coding_exception('Not sure how you got here'); |
|||
} |
|||
|
|||
if ($course) { |
|||
$isfrontpage = ($course->id == SITEID); |
|||
} else { |
|||
$isfrontpage = false; |
|||
$course = $SITE; |
|||
} |
|||
|
|||
require_login($course, false, $cm); |
|||
require_capability('moodle/site:managecontextlocks', $context); |
|||
|
|||
$PAGE->set_pagelayout('admin'); |
|||
$PAGE->navigation->clear_cache(); |
|||
|
|||
$a = (object) [ |
|||
'contextname' => $context->get_context_name(), |
|||
]; |
|||
|
|||
if (null !== $confirm && confirm_sesskey()) { |
|||
$context->set_locked(!empty($confirm)); |
|||
|
|||
if ($context->locked) { |
|||
$lockmessage = get_string('managecontextlocklocked', 'admin', $a); |
|||
} else { |
|||
$lockmessage = get_string('managecontextlockunlocked', 'admin', $a); |
|||
} |
|||
|
|||
if (empty($returnurl)) { |
|||
$returnurl = $context->get_url(); |
|||
} else { |
|||
$returnurl = new moodle_url($returnurl); |
|||
} |
|||
redirect($returnurl, $lockmessage); |
|||
} |
|||
|
|||
$heading = get_string('managecontextlock', 'admin'); |
|||
$PAGE->set_title($heading); |
|||
$PAGE->set_heading($heading); |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
if ($context->locked) { |
|||
$confirmstring = get_string('confirmcontextunlock', 'admin', $a); |
|||
$target = 0; |
|||
} else { |
|||
$confirmstring = get_string('confirmcontextlock', 'admin', $a); |
|||
$target = 1; |
|||
} |
|||
|
|||
$confirmurl = new \moodle_url($PAGE->url, ['confirm' => $target]); |
|||
if (!empty($returnurl)) { |
|||
$confirmurl->param('returnurl', $returnurl); |
|||
} |
|||
|
|||
echo $OUTPUT->confirm($confirmstring, $confirmurl, $context->get_url()); |
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,77 @@ |
|||
#!/usr/bin/php |
|||
<?php |
|||
/* |
|||
* Utility to debug mailouts - will save the content of emails to a |
|||
* logfile instead of sending them out. Use it as a sendmail |
|||
* "stand-in" when testing mailouts. |
|||
* |
|||
* It is not Moodle specific - use it anywhere by setting the php |
|||
* "sendmail_path" setting to this file with a logfile parameter. |
|||
* |
|||
* - Set in php.ini (not settable in config.php): |
|||
* sendmail_path=/path-to-moodle/admin/mailout-debugger.php'); |
|||
* Or from the commandline |
|||
* php -d sendmail_path='/path-to-moodle/admin/mailout-debugger.php' /path/to/cron.php |
|||
* |
|||
* - Create a file in admin called mailout-debugger.enable |
|||
* (this is a security check to prevent execution in prod environments) |
|||
* touch /path/to/moodle/admin/mailout-debugger.enable |
|||
* |
|||
* - Mark as executable: chmod ugo+rx mailout-debugger.php |
|||
* |
|||
* - Run your admin/cron.php |
|||
* |
|||
* - Read /tmp/moodle-mailout.log |
|||
* |
|||
* |
|||
* This script will create logfiles in /tmp/ or in $TMPDIR if set. |
|||
* On windows, use php -r 'print sys_get_temp_dir()' to see where the file is saved. |
|||
*/ |
|||
|
|||
// Security check. |
|||
if (!file_exists(__DIR__.'/mailout-debugger.enable')) { |
|||
mdie("Disabled."); |
|||
} |
|||
$tmpdir=sys_get_temp_dir(); // default |
|||
|
|||
if (isset($_SERVER['REMOTE_ADDR'])) { |
|||
mdie("should not be called from web server!"); |
|||
} |
|||
|
|||
if (isset($_ENV['TMPDIR']) && is_dir($_ENV['TMPDIR'])) { |
|||
$tmpdir = $_ENV['TMPDIR']; |
|||
} |
|||
|
|||
$tmpfile = $tmpdir . '/moodle-mailout.log'; |
|||
$fh = fopen($tmpfile, 'a+', false) |
|||
or mdie("Error openning $tmpfile on append\n"); |
|||
fwrite($fh, "==== ".strftime("%a %b %e %H:%M:%S %Y", time())." ====\n"); |
|||
fwrite($fh, "==== Commandline: " . implode(' ',$argv) . "\n"); |
|||
|
|||
$stdin = fopen('php://stdin', 'r'); |
|||
|
|||
while ($line = fgets($stdin)) { |
|||
fwrite($fh, $line); |
|||
} |
|||
fwrite($fh, "\n"); |
|||
fclose($fh); |
|||
fclose($stdin); |
|||
|
|||
/** |
|||
* Print an error to STDOUT and exit with a non-zero code. For commandline scripts. |
|||
* Default errorcode is 1. |
|||
* |
|||
* Very useful for perl-like error-handling: |
|||
* |
|||
* do_something() or mdie("Something went wrong"); |
|||
* |
|||
* @param string $msg Error message |
|||
* @param integer $errorcode Error code to emit |
|||
* |
|||
*/ |
|||
function mdie($msg='', $errorcode=1) { |
|||
trigger_error($msg); |
|||
exit($errorcode); |
|||
} |
|||
|
|||
|
@ -0,0 +1,79 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Enrol config manipulation script. |
|||
* |
|||
* @package core |
|||
* @subpackage media |
|||
* @copyright 2016 Marina Glancy |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
define('NO_OUTPUT_BUFFERING', true); |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$action = required_param('action', PARAM_ALPHANUMEXT); |
|||
$media = required_param('media', PARAM_PLUGIN); |
|||
$confirm = optional_param('confirm', 0, PARAM_BOOL); |
|||
|
|||
$PAGE->set_url('/admin/media.php'); |
|||
$PAGE->set_context(context_system::instance()); |
|||
|
|||
require_login(); |
|||
require_capability('moodle/site:config', context_system::instance()); |
|||
require_sesskey(); |
|||
|
|||
$plugins = core_plugin_manager::instance()->get_plugins_of_type('media'); |
|||
$sortorder = array_values(\core\plugininfo\media::get_enabled_plugins()); |
|||
|
|||
$return = new moodle_url('/admin/settings.php', array('section' => 'managemediaplayers')); |
|||
|
|||
if (!array_key_exists($media, $plugins)) { |
|||
redirect($return); |
|||
} |
|||
|
|||
switch ($action) { |
|||
case 'disable': |
|||
$plugins[$media]->set_enabled(false); |
|||
break; |
|||
|
|||
case 'enable': |
|||
$plugins[$media]->set_enabled(true); |
|||
break; |
|||
|
|||
case 'up': |
|||
if (($pos = array_search($media, $sortorder)) > 0) { |
|||
$tmp = $sortorder[$pos - 1]; |
|||
$sortorder[$pos - 1] = $sortorder[$pos]; |
|||
$sortorder[$pos] = $tmp; |
|||
\core\plugininfo\media::set_enabled_plugins($sortorder); |
|||
} |
|||
break; |
|||
|
|||
case 'down': |
|||
if ((($pos = array_search($media, $sortorder)) !== false) && ($pos < count($sortorder) - 1)) { |
|||
$tmp = $sortorder[$pos + 1]; |
|||
$sortorder[$pos + 1] = $sortorder[$pos]; |
|||
$sortorder[$pos] = $tmp; |
|||
\core\plugininfo\media::set_enabled_plugins($sortorder); |
|||
} |
|||
break; |
|||
} |
|||
|
|||
redirect($return); |
@ -0,0 +1,125 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Message outputs configuration page |
|||
* |
|||
* @package message |
|||
* @copyright 2011 Lancaster University Network Services Limited |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->dirroot . '/message/lib.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
// This is an admin page. |
|||
admin_externalpage_setup('managemessageoutputs'); |
|||
|
|||
// Fetch processors. |
|||
$allprocessors = get_message_processors(); |
|||
$processors = array_filter($allprocessors, function($processor) { |
|||
return $processor->enabled; |
|||
}); |
|||
// Fetch message providers. |
|||
$providers = get_message_providers(); |
|||
// Fetch the manage message outputs interface. |
|||
$preferences = get_message_output_default_preferences(); |
|||
|
|||
if (($form = data_submitted()) && confirm_sesskey()) { |
|||
$preferences = array(); |
|||
// Prepare default message outputs settings. |
|||
foreach ($providers as $provider) { |
|||
$componentproviderbase = $provider->component.'_'.$provider->name; |
|||
$disableprovidersetting = $componentproviderbase.'_disable'; |
|||
$providerdisabled = false; |
|||
if (!isset($form->$disableprovidersetting)) { |
|||
$providerdisabled = true; |
|||
$preferences[$disableprovidersetting] = 1; |
|||
} else { |
|||
$preferences[$disableprovidersetting] = 0; |
|||
} |
|||
|
|||
foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) { |
|||
$value = null; |
|||
$componentprovidersetting = $componentproviderbase.'_'.$setting; |
|||
if ($setting == 'permitted') { |
|||
// If we deal with permitted select element, we need to create individual |
|||
// setting for each possible processor. Note that this block will |
|||
// always be processed first after entring parental foreach iteration |
|||
// so we can change form values on this stage. |
|||
foreach ($processors as $processor) { |
|||
$value = ''; |
|||
if (isset($form->{$componentprovidersetting}[$processor->name])) { |
|||
$value = $form->{$componentprovidersetting}[$processor->name]; |
|||
} |
|||
// Ensure that loggedin loggedoff options are set correctly for this permission. |
|||
if (($value == 'disallowed') || $providerdisabled) { |
|||
// It might be better to unset them, but I can't figure out why that cause error. |
|||
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 0; |
|||
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 0; |
|||
} else if ($value == 'forced') { |
|||
$form->{$componentproviderbase.'_loggedin'}[$processor->name] = 1; |
|||
$form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1; |
|||
} |
|||
// Record the site preference. |
|||
$preferences[$processor->name.'_provider_'.$componentprovidersetting] = $value; |
|||
} |
|||
} else if (array_key_exists($componentprovidersetting, $form)) { |
|||
// We must be processing loggedin or loggedoff checkboxes. Store |
|||
// defained comma-separated processors as setting value. |
|||
// Using array_filter eliminates elements set to 0 above. |
|||
$value = join(',', array_keys(array_filter($form->{$componentprovidersetting}))); |
|||
if (empty($value)) { |
|||
$value = null; |
|||
} |
|||
} |
|||
if ($setting != 'permitted') { |
|||
// We have already recoded site preferences for 'permitted' type. |
|||
$preferences['message_provider_'.$componentprovidersetting] = $value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Update database. |
|||
$transaction = $DB->start_delegated_transaction(); |
|||
|
|||
// Save processors enabled/disabled status. |
|||
foreach ($allprocessors as $processor) { |
|||
$enabled = isset($form->{$processor->name}); |
|||
\core_message\api::update_processor_status($processor, $enabled); |
|||
} |
|||
|
|||
foreach ($preferences as $name => $value) { |
|||
set_config($name, $value, 'message'); |
|||
} |
|||
$transaction->allow_commit(); |
|||
|
|||
core_plugin_manager::reset_caches(); |
|||
|
|||
$url = new moodle_url('message.php'); |
|||
redirect($url); |
|||
} |
|||
|
|||
// Page settings |
|||
$PAGE->set_context(context_system::instance()); |
|||
$PAGE->requires->js_init_call('M.core_message.init_defaultoutputs'); |
|||
|
|||
$renderer = $PAGE->get_renderer('core', 'message'); |
|||
|
|||
// Display the page. |
|||
echo $OUTPUT->header(); |
|||
echo $renderer->manage_messageoutput_settings($allprocessors, $processors, $providers, $preferences); |
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,235 @@ |
|||
<?php |
|||
|
|||
// Allows the admin to control user logins from remote moodles. |
|||
|
|||
require_once(__DIR__ . '/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
include_once($CFG->dirroot.'/mnet/lib.php'); |
|||
|
|||
$sort = optional_param('sort', 'username', PARAM_ALPHA); |
|||
$dir = optional_param('dir', 'ASC', PARAM_ALPHA); |
|||
$page = optional_param('page', 0, PARAM_INT); |
|||
$perpage = optional_param('perpage', 30, PARAM_INT); |
|||
$action = trim(strtolower(optional_param('action', '', PARAM_ALPHA))); |
|||
|
|||
admin_externalpage_setup('ssoaccesscontrol'); |
|||
|
|||
if (!extension_loaded('openssl')) { |
|||
print_error('requiresopenssl', 'mnet'); |
|||
} |
|||
|
|||
$sitecontext = context_system::instance(); |
|||
$sesskey = sesskey(); |
|||
$formerror = array(); |
|||
|
|||
// grab the mnet hosts and remove the localhost |
|||
$mnethosts = $DB->get_records_menu('mnet_host', array(), 'name', 'id, name'); |
|||
if (array_key_exists($CFG->mnet_localhost_id, $mnethosts)) { |
|||
unset($mnethosts[$CFG->mnet_localhost_id]); |
|||
} |
|||
|
|||
|
|||
|
|||
// process actions |
|||
if (!empty($action) and confirm_sesskey()) { |
|||
|
|||
// boot if insufficient permission |
|||
if (!has_capability('moodle/user:delete', $sitecontext)) { |
|||
print_error('nomodifyacl','mnet'); |
|||
} |
|||
|
|||
// fetch the record in question |
|||
$id = required_param('id', PARAM_INT); |
|||
if (!$idrec = $DB->get_record('mnet_sso_access_control', array('id'=>$id))) { |
|||
print_error('recordnoexists','mnet', "$CFG->wwwroot/$CFG->admin/mnet/access_control.php"); |
|||
} |
|||
|
|||
switch ($action) { |
|||
|
|||
case "delete": |
|||
$DB->delete_records('mnet_sso_access_control', array('id'=>$id)); |
|||
redirect('access_control.php', get_string('deleteuserrecord', 'mnet', array('user'=>$idrec->username, 'host'=>$mnethosts[$idrec->mnet_host_id]))); |
|||
break; |
|||
|
|||
case "acl": |
|||
|
|||
// require the access parameter, and it must be 'allow' or 'deny' |
|||
$accessctrl = trim(strtolower(required_param('accessctrl', PARAM_ALPHA))); |
|||
if ($accessctrl != 'allow' and $accessctrl != 'deny') { |
|||
print_error('invalidaccessparam', 'mnet', "$CFG->wwwroot/$CFG->admin/mnet/access_control.php"); |
|||
} |
|||
|
|||
if (mnet_update_sso_access_control($idrec->username, $idrec->mnet_host_id, $accessctrl)) { |
|||
if ($accessctrl == 'allow') { |
|||
redirect('access_control.php', get_string('ssl_acl_allow','mnet', array('user' => $idrec->username, |
|||
'host' => $mnethosts[$idrec->mnet_host_id]))); |
|||
} else if ($accessctrl == 'deny') { |
|||
redirect('access_control.php', get_string('ssl_acl_deny','mnet', array('user' => $idrec->username, |
|||
'host' => $mnethosts[$idrec->mnet_host_id]))); |
|||
} |
|||
} |
|||
break; |
|||
|
|||
default: |
|||
print_error('invalidactionparam', 'mnet', "$CFG->wwwroot/$CFG->admin/mnet/access_control.php"); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
// process the form results |
|||
if ($form = data_submitted() and confirm_sesskey()) { |
|||
|
|||
// check permissions and verify form input |
|||
if (!has_capability('moodle/user:delete', $sitecontext)) { |
|||
print_error('nomodifyacl','mnet', "$CFG->wwwroot/$CFG->admin/mnet/access_control.php"); |
|||
} |
|||
if (empty($form->username)) { |
|||
$formerror['username'] = get_string('enterausername','mnet'); |
|||
} |
|||
if (empty($form->mnet_host_id)) { |
|||
$formerror['mnet_host_id'] = get_string('selectahost','mnet'); |
|||
} |
|||
if (empty($form->accessctrl)) { |
|||
$formerror['accessctrl'] = get_string('selectaccesslevel','mnet'); ; |
|||
} |
|||
|
|||
// process if there are no errors |
|||
if (count($formerror) == 0) { |
|||
|
|||
// username can be a comma separated list |
|||
$usernames = explode(',', $form->username); |
|||
|
|||
foreach ($usernames as $username) { |
|||
$username = trim(core_text::strtolower($username)); |
|||
if (!empty($username)) { |
|||
if (mnet_update_sso_access_control($username, $form->mnet_host_id, $form->accessctrl)) { |
|||
if ($form->accessctrl == 'allow') { |
|||
redirect('access_control.php', get_string('ssl_acl_allow','mnet', array('user'=>$username, 'host'=>$mnethosts[$form->mnet_host_id]))); |
|||
} elseif ($form->accessctrl == 'deny') { |
|||
redirect('access_control.php', get_string('ssl_acl_deny','mnet', array('user'=>$username, 'host'=>$mnethosts[$form->mnet_host_id]))); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
exit; |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
// Explain |
|||
echo $OUTPUT->box(get_string('ssoacldescr','mnet')); |
|||
// Are the needed bits enabled? |
|||
$warn = ''; |
|||
if (empty($CFG->mnet_dispatcher_mode) || $CFG->mnet_dispatcher_mode !== 'strict') { |
|||
$warn = '<p>' . get_string('mnetdisabled','mnet') .'</p>'; |
|||
} |
|||
|
|||
if (!is_enabled_auth('mnet')) { |
|||
$warn .= '<p>' . get_string('authmnetdisabled','mnet').'</p>'; |
|||
} |
|||
|
|||
if (!empty($warn)) { |
|||
$warn = '<p>' . get_string('ssoaclneeds','mnet').'</p>' . $warn; |
|||
echo $OUTPUT->box($warn); |
|||
} |
|||
// output the ACL table |
|||
$columns = array("username", "mnet_host_id", "access", "delete"); |
|||
$headings = array(); |
|||
$string = array('username' => get_string('username'), |
|||
'mnet_host_id' => get_string('remotehost', 'mnet'), |
|||
'access' => get_string('accesslevel', 'mnet'), |
|||
'delete' => get_string('delete')); |
|||
foreach ($columns as $column) { |
|||
if ($sort != $column) { |
|||
$columnicon = ""; |
|||
$columndir = "ASC"; |
|||
} else { |
|||
$columndir = $dir == "ASC" ? "DESC" : "ASC"; |
|||
$columnicon = $dir == "ASC" ? "down" : "up"; |
|||
$columnicon = " " . $OUTPUT->pix_icon('t/' . $columnicon, get_string('sort')); |
|||
} |
|||
$headings[$column] = "<a href=\"?sort=$column&dir=$columndir&\">".$string[$column]."</a>$columnicon"; |
|||
} |
|||
$headings['delete'] = ''; |
|||
$acl = $DB->get_records('mnet_sso_access_control', null, "$sort $dir", '*'); //, $page * $perpage, $perpage); |
|||
$aclcount = $DB->count_records('mnet_sso_access_control'); |
|||
|
|||
if (!$acl) { |
|||
echo $OUTPUT->heading(get_string('noaclentries','mnet')); |
|||
$table = NULL; |
|||
} else { |
|||
$table = new html_table(); |
|||
$table->head = $headings; |
|||
$table->align = array('left', 'left', 'center'); |
|||
$table->width = "95%"; |
|||
foreach ($acl as $aclrecord) { |
|||
if ($aclrecord->accessctrl == 'allow') { |
|||
$accesscolumn = get_string('allow', 'mnet') |
|||
. " (<a href=\"?id={$aclrecord->id}&action=acl&accessctrl=deny&sesskey=".sesskey()."\">" |
|||
. get_string('deny', 'mnet') . "</a>)"; |
|||
} else { |
|||
$accesscolumn = get_string('deny', 'mnet') |
|||
. " (<a href=\"?id={$aclrecord->id}&action=acl&accessctrl=allow&sesskey=".sesskey()."\">" |
|||
. get_string('allow', 'mnet') . "</a>)"; |
|||
} |
|||
$deletecolumn = "<a href=\"?id={$aclrecord->id}&action=delete&sesskey=".sesskey()."\">" |
|||
. get_string('delete') . "</a>"; |
|||
$table->data[] = array (s($aclrecord->username), $aclrecord->mnet_host_id, $accesscolumn, $deletecolumn); |
|||
} |
|||
} |
|||
|
|||
if (!empty($table)) { |
|||
echo html_writer::table($table); |
|||
echo '<p> </p>'; |
|||
$baseurl = new moodle_url('/admin/mnet/access_control.php', array('sort' => $sort, 'dir' => $dir, 'perpage' => $perpage)); |
|||
echo $OUTPUT->paging_bar($aclcount, $page, $perpage, $baseurl); |
|||
} |
|||
|
|||
|
|||
|
|||
// output the add form |
|||
echo $OUTPUT->box_start(); |
|||
|
|||
?> |
|||
<div class="mnetaddtoaclform"> |
|||
<form id="mnetaddtoacl" method="post"> |
|||
<input type="hidden" name="sesskey" value="<?php echo $sesskey; ?>" /> |
|||
<?php |
|||
|
|||
// enter a username |
|||
echo get_string('username') . ":\n"; |
|||
if (!empty($formerror['username'])) { |
|||
echo '<span class="error"> * </span>'; |
|||
} |
|||
echo html_writer::label(get_string('username'), 'menuusername', false, array('class' => 'accesshide')); |
|||
echo '<input id="menuusername" type="text" name="username" size="20" maxlength="100" />'; |
|||
|
|||
// choose a remote host |
|||
echo " " . html_writer::label(get_string('remotehost', 'mnet'), 'menumnet_host_id') . ":\n"; |
|||
if (!empty($formerror['mnet_host_id'])) { |
|||
echo '<span class="error"> * </span>'; |
|||
} |
|||
echo html_writer::select($mnethosts, 'mnet_host_id'); |
|||
|
|||
// choose an access level |
|||
echo " " . html_writer::label(get_string('accesslevel', 'mnet'), 'menuaccessctrl') . ":\n"; |
|||
if (!empty($formerror['accessctrl'])) { |
|||
echo '<span class="error"> * </span>'; |
|||
} |
|||
$accessmenu['allow'] = get_string('allow', 'mnet'); |
|||
$accessmenu['deny'] = get_string('deny', 'mnet'); |
|||
echo html_writer::select($accessmenu, 'accessctrl'); |
|||
|
|||
// submit button |
|||
echo '<input type="submit" value="' . get_string('addtoacl', 'mnet') . '" />'; |
|||
echo "</form></div>\n"; |
|||
|
|||
// print errors |
|||
foreach ($formerror as $error) { |
|||
echo "<br><span class=\"error\">$error<span>"; |
|||
} |
|||
|
|||
echo $OUTPUT->box_end(); |
|||
echo $OUTPUT->footer(); |
@ -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/>. |
|||
|
|||
|
|||
/** |
|||
* Page to allow the administrator to delete networked hosts, with a confirm message |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2007 Donal McMullan |
|||
* @copyright 2007 Martin Langhoff |
|||
* @copyright 2010 Penny Leach |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$step = optional_param('step', 'verify', PARAM_ALPHA); |
|||
$hostid = required_param('hostid', PARAM_INT); |
|||
|
|||
|
|||
|
|||
$context = context_system::instance(); |
|||
|
|||
$mnet = get_mnet_environment(); |
|||
|
|||
$PAGE->set_url('/admin/mnet/delete.php'); |
|||
admin_externalpage_setup('mnetpeer' . $hostid); |
|||
|
|||
require_sesskey(); |
|||
|
|||
$mnet_peer = new mnet_peer(); |
|||
$mnet_peer->set_id($hostid); |
|||
|
|||
if ('verify' == $step) { |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('deleteaserver', 'mnet')); |
|||
if ($live_users = $mnet_peer->count_live_sessions() > 0) { |
|||
echo $OUTPUT->notification(get_string('usersareonline', 'mnet', $live_users)); |
|||
} |
|||
$yesurl = new moodle_url('/admin/mnet/delete.php', array('hostid' => $mnet_peer->id, 'step' => 'delete')); |
|||
$nourl = new moodle_url('/admin/mnet/peers.php'); |
|||
echo $OUTPUT->confirm(get_string('reallydeleteserver', 'mnet') . ': ' . $mnet_peer->name, $yesurl, $nourl); |
|||
echo $OUTPUT->footer(); |
|||
} elseif ('delete' == $step) { |
|||
$mnet_peer->delete(); |
|||
redirect(new moodle_url('/admin/mnet/peers.php'), get_string('hostdeleted', 'mnet'), 5); |
|||
} |
@ -0,0 +1,131 @@ |
|||
<?php |
|||
|
|||
// Allows the admin to configure mnet stuff |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
include_once($CFG->dirroot.'/mnet/lib.php'); |
|||
|
|||
admin_externalpage_setup('net'); |
|||
|
|||
$context = context_system::instance(); |
|||
|
|||
|
|||
$site = get_site(); |
|||
$mnet = get_mnet_environment(); |
|||
|
|||
if (!extension_loaded('openssl')) { |
|||
echo $OUTPUT->header(); |
|||
set_config('mnet_dispatcher_mode', 'off'); |
|||
print_error('requiresopenssl', 'mnet'); |
|||
} |
|||
|
|||
if (!function_exists('curl_init') ) { |
|||
echo $OUTPUT->header(); |
|||
set_config('mnet_dispatcher_mode', 'off'); |
|||
print_error('nocurl', 'mnet'); |
|||
} |
|||
|
|||
if (!isset($CFG->mnet_dispatcher_mode)) { |
|||
set_config('mnet_dispatcher_mode', 'off'); |
|||
} |
|||
|
|||
/// If data submitted, process and store |
|||
if (($form = data_submitted()) && confirm_sesskey()) { |
|||
if (!empty($form->submit) && $form->submit == get_string('savechanges')) { |
|||
if (in_array($form->mode, array("off", "strict", "dangerous"))) { |
|||
if (set_config('mnet_dispatcher_mode', $form->mode)) { |
|||
redirect('index.php', get_string('changessaved')); |
|||
} else { |
|||
print_error('invalidaction', '', 'index.php'); |
|||
} |
|||
} |
|||
} elseif (!empty($form->submit) && $form->submit == get_string('delete')) { |
|||
$mnet->get_private_key(); |
|||
$SESSION->mnet_confirm_delete_key = md5(sha1($mnet->keypair['keypair_PEM'])).':'.time(); |
|||
|
|||
$formcontinue = new single_button(new moodle_url('index.php', array('confirm' => md5($mnet->public_key))), get_string('yes')); |
|||
$formcancel = new single_button(new moodle_url('index.php', array()), get_string('no')); |
|||
echo $OUTPUT->confirm(get_string("deletekeycheck", "mnet"), $formcontinue, $formcancel); |
|||
exit; |
|||
} else { |
|||
// We're deleting |
|||
|
|||
|
|||
if (!isset($SESSION->mnet_confirm_delete_key)) { |
|||
// fail - you're being attacked? |
|||
} |
|||
|
|||
$key = ''; |
|||
$time = ''; |
|||
@list($key, $time) = explode(':',$SESSION->mnet_confirm_delete_key); |
|||
$mnet->get_private_key(); |
|||
|
|||
if($time < time() - 60) { |
|||
// fail - you're out of time. |
|||
print_error ('deleteoutoftime', 'mnet', 'index.php'); |
|||
exit; |
|||
} |
|||
|
|||
if ($key != md5(sha1($mnet->keypair['keypair_PEM']))) { |
|||
// fail - you're being attacked? |
|||
print_error ('deletewrongkeyvalue', 'mnet', 'index.php'); |
|||
exit; |
|||
} |
|||
|
|||
$mnet->replace_keys(); |
|||
redirect('index.php', get_string('keydeleted','mnet')); |
|||
exit; |
|||
} |
|||
} |
|||
$hosts = $DB->get_records_select('mnet_host', "id <> ? AND deleted = 0", array($CFG->mnet_localhost_id), 'wwwroot ASC'); |
|||
|
|||
echo $OUTPUT->header(); |
|||
?> |
|||
<form method="post" action="index.php"> |
|||
<table align="center" width="635" class="generaltable" border="0" cellpadding="5" cellspacing="0"> |
|||
<tr> |
|||
<td class="generalboxcontent"> |
|||
<table cellpadding="9" cellspacing="0" > |
|||
<tr valign="top"> |
|||
<td colspan="2" class="header"><?php print_string('aboutyourhost', 'mnet'); ?></td> |
|||
</tr> |
|||
<tr valign="top"> |
|||
<td align="right"><?php print_string('publickey', 'mnet'); ?>:</td> |
|||
<td><pre><?php echo $mnet->public_key; ?></pre></td> |
|||
</tr> |
|||
<tr valign="top"> |
|||
<td align="right"><?php print_string('expires', 'mnet'); ?>:</td> |
|||
<td><?php echo userdate($mnet->public_key_expires); ?></td> |
|||
</tr> |
|||
</table> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
</form> |
|||
<form method="post" action="index.php"> |
|||
<table align="center" width="635" class="generaltable" border="0" cellpadding="5" cellspacing="0"> |
|||
<tr> |
|||
<td class="generalboxcontent"> |
|||
<table cellpadding="9" cellspacing="0" > |
|||
<tr valign="top"> |
|||
<td colspan="2" class="header"><?php print_string('expireyourkey', 'mnet'); ?></td> |
|||
</tr> |
|||
<tr valign="top"> |
|||
<td colspan="2"><?php print_string('expireyourkeyexplain', 'mnet'); ?></td> |
|||
</tr> |
|||
<tr valign="top"> |
|||
<td align="left" width="10" nowrap="nowrap"><?php print_string('expireyourkey', 'mnet'); ?></td> |
|||
<td align="left"><input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" /> |
|||
<input type="hidden" name="deleteKey" value="" /> |
|||
<input type="submit" name="submit" value="<?php print_string('delete'); ?>" /> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
</form> |
|||
|
|||
<?php |
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,191 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This file contains two forms for adding/editing mnet hosts, used by peers.php |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2010 Penny Leach |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
require_once($CFG->libdir . '/formslib.php'); |
|||
|
|||
/** |
|||
* The very basic first step add new host form - just wwwroot & application |
|||
* The second form is loaded up with the information from this one. |
|||
*/ |
|||
class mnet_simple_host_form extends moodleform { |
|||
function definition() { |
|||
global $DB; |
|||
|
|||
$mform = $this->_form; |
|||
|
|||
$mform->addElement('text', 'wwwroot', get_string('hostname', 'mnet'), array('maxlength' => 255, 'size' => 50)); |
|||
$mform->setType('wwwroot', PARAM_URL); |
|||
$mform->addRule('wwwroot', null, 'required', null, 'client'); |
|||
$mform->addRule('wwwroot', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); |
|||
|
|||
$mform->addElement('select', 'applicationid', get_string('applicationtype', 'mnet'), |
|||
$DB->get_records_menu('mnet_application', array(), 'id,display_name')); |
|||
$mform->addRule('applicationid', null, 'required', null, 'client'); |
|||
|
|||
$this->add_action_buttons(false, get_string('addhost', 'mnet')); |
|||
} |
|||
|
|||
function validation($data, $files) { |
|||
global $DB; |
|||
|
|||
$wwwroot = $data['wwwroot']; |
|||
// ensure the wwwroot starts with a http or https prefix |
|||
if (strtolower(substr($wwwroot, 0, 4)) != 'http') { |
|||
$wwwroot = 'http://'.$wwwroot; |
|||
} |
|||
if ($host = $DB->get_record('mnet_host', array('wwwroot' => $wwwroot))) { |
|||
global $CFG; |
|||
return array('wwwroot' => get_string('hostexists', 'mnet', |
|||
new moodle_url('/admin/mnet/peers.php', array('hostid' => $host->id)))); |
|||
} |
|||
return array(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* The second step of the form - reviewing the host details |
|||
* This is also the same form that is used for editing an existing host |
|||
*/ |
|||
class mnet_review_host_form extends moodleform { |
|||
function definition() { |
|||
global $OUTPUT; |
|||
|
|||
$mform = $this->_form; |
|||
$mnet_peer = $this->_customdata['peer']; |
|||
|
|||
$mform->addElement('hidden', 'last_connect_time'); |
|||
$mform->setType('last_connect_time', PARAM_INT); |
|||
$mform->addElement('hidden', 'id'); |
|||
$mform->setType('id', PARAM_INT); |
|||
$mform->addElement('hidden', 'applicationid'); |
|||
$mform->setType('applicationid', PARAM_INT); |
|||
$mform->addElement('hidden', 'oldpublickey'); |
|||
$mform->setType('oldpublickey', PARAM_PEM); |
|||
|
|||
$mform->addElement('text', 'name', get_string('site'), array('maxlength' => 80, 'size' => 50)); |
|||
$mform->setType('name', PARAM_NOTAGS); |
|||
$mform->addRule('name', get_string('maximumchars', '', 80), 'maxlength', 80, 'client'); |
|||
|
|||
$mform->addElement('text', 'wwwroot', get_string('hostname', 'mnet'), array('maxlength' => 255, 'size' => 50)); |
|||
$mform->setType('wwwroot', PARAM_URL); |
|||
$mform->addRule('wwwroot', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); |
|||
|
|||
$options = array( |
|||
mnet_peer::SSL_NONE => get_string('none'), |
|||
mnet_peer::SSL_HOST => get_string('verifyhostonly', 'core_mnet'), |
|||
mnet_peer::SSL_HOST_AND_PEER => get_string('verifyhostandpeer', 'core_mnet') |
|||
); |
|||
$mform->addElement('select', 'sslverification', get_string('sslverification', 'core_mnet'), $options); |
|||
$mform->setDefault('sslverification', mnet_peer::SSL_HOST_AND_PEER); |
|||
$mform->addHelpButton('sslverification', 'sslverification', 'core_mnet'); |
|||
|
|||
$themes = array('' => get_string('forceno')); |
|||
foreach (array_keys(core_component::get_plugin_list('theme')) as $themename) { |
|||
$themes[$themename] = get_string('pluginname', 'theme_'.$themename); |
|||
} |
|||
$mform->addElement('select', 'theme', get_string('forcetheme'), $themes); |
|||
|
|||
$mform->addElement('textarea', 'public_key', get_string('publickey', 'mnet'), array('rows' => 17, 'cols' => 100, 'class' => 'smalltext')); |
|||
$mform->setType('public_key', PARAM_PEM); |
|||
$mform->addRule('public_key', get_string('required'), 'required'); |
|||
|
|||
// finished with form controls, now the static informational stuff |
|||
if ($mnet_peer && !empty($mnet_peer->bootstrapped)) { |
|||
$expires = ''; |
|||
if ($mnet_peer->public_key_expires < time()) { |
|||
$expires = get_string('expired', 'mnet') . ' '; |
|||
} |
|||
$expires .= userdate($mnet_peer->public_key_expires); |
|||
$mform->addElement('static', 'validuntil', get_string('expires', 'mnet'), $expires); |
|||
|
|||
$lastconnect = ''; |
|||
if ($mnet_peer->last_connect_time == 0) { |
|||
$lastconnect = get_string('never', 'mnet'); |
|||
} else { |
|||
$lastconnect = date('H:i:s d/m/Y',$mnet_peer->last_connect_time); |
|||
} |
|||
|
|||
$mform->addElement('static', 'lastconnect', get_string('last_connect_time', 'mnet'), $lastconnect); |
|||
$mform->addElement('static', 'ipaddress', get_string('ipaddress', 'mnet'), $mnet_peer->ip_address); |
|||
|
|||
if (isset($mnet_peer->currentkey)) { // key being published is not the same as our records |
|||
$currentkeystr = '<b>' . get_string('keymismatch', 'mnet') . '</b><br /><br /> ' . $OUTPUT->box('<pre>' . $mnet_peer->currentkey . '</pre>'); |
|||
$mform->addElement('static', 'keymismatch', get_string('currentkey', 'mnet'), $currentkeystr); |
|||
} |
|||
|
|||
$credstr = ''; |
|||
if ($credentials = $mnet_peer->check_credentials($mnet_peer->public_key)) { |
|||
foreach($credentials['subject'] as $key => $credential) { |
|||
if (is_scalar($credential)) { |
|||
$credstr .= str_pad($key, 16, " ", STR_PAD_LEFT).': '.$credential."\n"; |
|||
} else { |
|||
$credstr .= str_pad($key, 16, " ", STR_PAD_LEFT).': '.var_export($credential,1)."\n"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
$mform->addElement('static', 'certdetails', get_string('certdetails', 'mnet'), |
|||
$OUTPUT->box('<pre>' . $credstr . '</pre>', 'generalbox certdetails')); |
|||
} |
|||
|
|||
if ($mnet_peer && !empty($mnet_peer->deleted)) { |
|||
$radioarray = array(); |
|||
$radioarray[] = $mform->createElement('static', 'deletedinfo', '', |
|||
$OUTPUT->container(get_string('deletedhostinfo', 'mnet'), 'deletedhostinfo')); |
|||
$radioarray[] = $mform->createElement('radio', 'deleted', '', get_string('yes'), 1); |
|||
$radioarray[] = $mform->createElement('radio', 'deleted', '', get_string('no'), 0); |
|||
$mform->addGroup($radioarray, 'radioar', get_string('deleted'), array(' ', ' '), false); |
|||
} else { |
|||
$mform->addElement('hidden', 'deleted'); |
|||
$mform->setType('deleted', PARAM_BOOL); |
|||
} |
|||
|
|||
// finished with static stuff, print save button |
|||
$this->add_action_buttons(false); |
|||
} |
|||
|
|||
function validation($data, $files) { |
|||
$errors = array(); |
|||
if ($data['oldpublickey'] == $data['public_key']) { |
|||
return; |
|||
} |
|||
$mnet_peer = new mnet_peer(); // idiotic api |
|||
$mnet_peer->wwwroot = $data['wwwroot']; // just hard-set this rather than bootstrap the object |
|||
if (empty($data['public_key'])) { |
|||
$errors['public_key'] = get_string('publickeyrequired', 'mnet'); |
|||
} else if (!$credentials = $mnet_peer->check_credentials($data['public_key'])) { |
|||
$errmsg = ''; |
|||
foreach ($mnet_peer->error as $err) { |
|||
$errmsg .= $err['code'] . ': ' . $err['text'].'<br />'; |
|||
} |
|||
$errors['public_key'] = get_string('invalidpubkey', 'mnet', $errmsg); |
|||
} |
|||
unset($mnet_peer); |
|||
return $errors; |
|||
} |
|||
} |
@ -0,0 +1,277 @@ |
|||
<?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/>. |
|||
|
|||
|
|||
/** |
|||
* Page to allow the administrator to configure networked hosts, and add new ones |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2007 Donal McMullan |
|||
* @copyright 2007 Martin Langhoff |
|||
* @copyright 2010 Penny Leach |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->dirroot.'/mnet/lib.php'); |
|||
require_once($CFG->dirroot.'/'.$CFG->admin.'/mnet/peer_forms.php'); |
|||
|
|||
|
|||
/// Initialize variables. |
|||
$hostid = optional_param('hostid', 0, PARAM_INT); |
|||
$updra = optional_param('updateregisterall', 0, PARAM_INT); |
|||
|
|||
// first process the register all hosts setting if required |
|||
if (!empty($updra)) { |
|||
set_config('mnet_register_allhosts', optional_param('registerallhosts', 0, PARAM_INT)); |
|||
redirect(new moodle_url('/admin/mnet/peers.php'), get_string('changessaved')); |
|||
} |
|||
|
|||
$adminsection = 'mnetpeers'; |
|||
if ($hostid && $DB->get_field('mnet_host', 'deleted', array('id' => $hostid)) != 1) { |
|||
$adminsection = 'mnetpeer' . $hostid; |
|||
} |
|||
|
|||
$PAGE->set_url('/admin/mnet/peers.php'); |
|||
admin_externalpage_setup($adminsection); |
|||
|
|||
if (!extension_loaded('openssl')) { |
|||
print_error('requiresopenssl', 'mnet'); |
|||
} |
|||
|
|||
if (!function_exists('curl_init') ) { |
|||
print_error('nocurl', 'mnet'); |
|||
} |
|||
|
|||
if (!function_exists('xmlrpc_encode_request')) { |
|||
print_error('xmlrpc-missing', 'mnet'); |
|||
} |
|||
|
|||
if (!isset($CFG->mnet_dispatcher_mode)) { |
|||
set_config('mnet_dispatcher_mode', 'off'); |
|||
} |
|||
|
|||
$mnet_peer = new mnet_peer(); |
|||
$simpleform = new mnet_simple_host_form(); // the one that goes on the bottom of the main page |
|||
$reviewform = null; // set up later in different code branches, so mnet_peer can be passed to the constructor |
|||
|
|||
// if the first form has been submitted, bootstrap the peer and load up the review form |
|||
if ($formdata = $simpleform->get_data()) { |
|||
// ensure we remove trailing slashes |
|||
$formdata->wwwroot = trim($formdata->wwwroot); |
|||
$formdata->wwwroot = rtrim($formdata->wwwroot, '/'); |
|||
|
|||
// ensure the wwwroot starts with a http or https prefix |
|||
if (strtolower(substr($formdata->wwwroot, 0, 4)) != 'http') { |
|||
$formdata->wwwroot = 'http://'.$formdata->wwwroot; |
|||
} |
|||
|
|||
$mnet_peer->set_applicationid($formdata->applicationid); |
|||
$application = $DB->get_field('mnet_application', 'name', array('id'=>$formdata->applicationid)); |
|||
$mnet_peer->bootstrap($formdata->wwwroot, null, $application); |
|||
// bootstrap the second form straight with the data from the first form |
|||
$reviewform = new mnet_review_host_form(null, array('peer' => $mnet_peer)); // the second step (also the edit host form) |
|||
$formdata->oldpublickey = $mnet_peer->public_key; // set this so we can confirm on form post without having to recreate the mnet_peer object |
|||
$reviewform->set_data($mnet_peer); |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->box_start(); |
|||
$reviewform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} else if ($simpleform->is_submitted()) { // validation failed |
|||
$noreviewform = true; |
|||
} |
|||
|
|||
// editing a host - load up the review form |
|||
if (!empty($hostid)) { |
|||
// TODO print a nice little heading |
|||
$mnet_peer->set_id($hostid); |
|||
echo $OUTPUT->header(); |
|||
$currenttab = 'mnetdetails'; |
|||
require_once($CFG->dirroot . '/' . $CFG->admin . '/mnet/tabs.php'); |
|||
|
|||
if ($hostid != $CFG->mnet_all_hosts_id) { |
|||
$mnet_peer->currentkey = mnet_get_public_key($mnet_peer->wwwroot, $mnet_peer->application); |
|||
if ($mnet_peer->currentkey == $mnet_peer->public_key) { |
|||
unset($mnet_peer->currentkey); |
|||
} else { |
|||
error_log($mnet_peer->currentkey); |
|||
error_log($mnet_peer->public_key); |
|||
error_log(md5($mnet_peer->currentkey)); |
|||
error_log(md5($mnet_peer->public_key)); |
|||
} |
|||
$credentials = $mnet_peer->check_credentials($mnet_peer->public_key); |
|||
$reviewform = new mnet_review_host_form(null, array('peer' => $mnet_peer)); // the second step (also the edit host form) |
|||
$mnet_peer->oldpublickey = $mnet_peer->public_key; // set this so we can confirm on form post without having to recreate the mnet_peer object |
|||
$reviewform->set_data((object)$mnet_peer); |
|||
echo $OUTPUT->box_start(); |
|||
$reviewform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
} else { |
|||
// no options for allhosts host - just let the tabs display and print a notification |
|||
echo $OUTPUT->notification(get_string('allhosts_no_options', 'mnet')); |
|||
} |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} |
|||
|
|||
// either we're in the second step of setting up a new host |
|||
// or editing an existing host |
|||
// try our best to set up the mnet_peer object to pass to the form definition |
|||
// unless validation on simpleform failed, in which case fall through. |
|||
if (empty($noreviewform) && $id = optional_param('id', 0, PARAM_INT)) { |
|||
// we're editing an existing one, so set up the tabs |
|||
$currenttab = 'mnetdetails'; |
|||
$mnet_peer->set_id($id); |
|||
require_once($CFG->dirroot . '/' . $CFG->admin . '/mnet/tabs.php'); |
|||
} else if (empty($noreviewform) && ($wwwroot = optional_param('wwwroot', '', PARAM_URL)) && ($applicationid = optional_param('applicationid', 0, PARAM_INT))) { |
|||
$application = $DB->get_field('mnet_application', 'name', array('id'=>$applicationid)); |
|||
$mnet_peer->bootstrap($wwwroot, null, $application); |
|||
} |
|||
$reviewform = new mnet_review_host_form(null, array('peer' => $mnet_peer)); |
|||
if ($formdata = $reviewform->get_data()) { |
|||
|
|||
$mnet_peer->set_applicationid($formdata->applicationid); |
|||
$application = $DB->get_field('mnet_application', 'name', array('id'=>$formdata->applicationid)); |
|||
$mnet_peer->bootstrap($formdata->wwwroot, null, $application); |
|||
|
|||
if (!empty($formdata->name) && $formdata->name != $mnet_peer->name) { |
|||
$mnet_peer->set_name($formdata->name); |
|||
} |
|||
|
|||
if (empty($formdata->theme)) { |
|||
$mnet_peer->force_theme = 0; |
|||
$mnet_peer->theme = null; |
|||
} else { |
|||
$mnet_peer->force_theme = 1; |
|||
$mnet_peer->theme = $formdata->theme; |
|||
} |
|||
|
|||
$mnet_peer->deleted = $formdata->deleted; |
|||
$mnet_peer->public_key = $formdata->public_key; |
|||
$credentials = $mnet_peer->check_credentials($mnet_peer->public_key); |
|||
$mnet_peer->public_key_expires = $credentials['validTo_time_t']; |
|||
$mnet_peer->sslverification = $formdata->sslverification; |
|||
|
|||
if ($mnet_peer->commit()) { |
|||
redirect(new moodle_url('/admin/mnet/peers.php', array('hostid' => $mnet_peer->id)), get_string('changessaved')); |
|||
} else { |
|||
print_error('invalidaction', 'error', 'index.php'); |
|||
} |
|||
} else if ($reviewform->is_submitted()) { // submitted, but errors |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->box_start(); |
|||
$reviewform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} |
|||
|
|||
|
|||
// normal flow - just display all hosts with links |
|||
echo $OUTPUT->header(); |
|||
$hosts = mnet_get_hosts(true); |
|||
|
|||
// print the table to display the register all hosts setting |
|||
$table = new html_table(); |
|||
$table->head = array(get_string('registerallhosts', 'mnet')); |
|||
|
|||
$registerrow = ''; |
|||
$registerstr = ''; |
|||
$registerurl = new moodle_url('/admin/mnet/peers.php', array('updateregisterall' => 1)); |
|||
if (!empty($CFG->mnet_register_allhosts)) { |
|||
$registerrow = get_string('registerhostson', 'mnet'); |
|||
$registerurl->param('registerallhosts', 0); |
|||
$registerstr = get_string('turnitoff', 'mnet'); |
|||
} else { |
|||
$registerrow = get_string('registerhostsoff', 'mnet'); |
|||
$registerurl->param('registerallhosts', 1); |
|||
$registerstr = get_string('turniton', 'mnet'); |
|||
} |
|||
$registerrow .= $OUTPUT->single_button($registerurl, $registerstr); |
|||
|
|||
// simple table with two rows of a single cell |
|||
$table->data = array( |
|||
array( |
|||
get_string('registerallhostsexplain', 'mnet'), |
|||
), |
|||
array( |
|||
$registerrow |
|||
), |
|||
); |
|||
echo html_writer::table($table); |
|||
|
|||
// print the list of all hosts, with little action links and buttons |
|||
$table = new html_table(); |
|||
$table->head = array( |
|||
get_string('site'), |
|||
get_string('system', 'mnet'), |
|||
get_string('last_connect_time', 'mnet'), |
|||
'', |
|||
); |
|||
$table->wrap = array('nowrap', 'nowrap', 'nowrap', 'nowrap'); |
|||
$baseurl = new moodle_url('/admin/mnet/peers.php'); |
|||
$deleted = array(); |
|||
foreach($hosts as $host) { |
|||
$hosturl = new moodle_url($baseurl, array('hostid' => $host->id)); |
|||
if (trim($host->name) === '') { |
|||
// should not happen but... |
|||
$host->name = '???'; |
|||
} |
|||
// process all hosts first since it's the easiest |
|||
if ($host->id == $CFG->mnet_all_hosts_id) { |
|||
$table->data[] = array(html_writer::link($hosturl, get_string('allhosts', 'core_mnet')), '*', '', ''); |
|||
continue; |
|||
} |
|||
|
|||
// populate the list of deleted hosts |
|||
if ($host->deleted) { |
|||
$deleted[] = html_writer::link($hosturl, $host->name); |
|||
continue; |
|||
} |
|||
|
|||
if ($host->last_connect_time == 0) { |
|||
$last_connect = get_string('never'); |
|||
} else { |
|||
$last_connect = userdate($host->last_connect_time, get_string('strftimedatetime', 'core_langconfig')); |
|||
} |
|||
$table->data[] = array( |
|||
html_writer::link($hosturl, $host->name), |
|||
html_writer::link($host->wwwroot, $host->wwwroot), |
|||
$last_connect, |
|||
$OUTPUT->single_button(new moodle_url('/admin/mnet/delete.php', array('hostid' => $host->id)), get_string('delete')) |
|||
); |
|||
} |
|||
echo html_writer::table($table); |
|||
|
|||
if ($deleted) { |
|||
echo $OUTPUT->box(get_string('deletedhosts', 'core_mnet', join(', ', $deleted)), 'deletedhosts'); |
|||
} |
|||
|
|||
// finally, print the initial form to add a new host |
|||
echo $OUTPUT->box_start(); |
|||
echo $OUTPUT->heading(get_string('addnewhost', 'mnet'), 3); |
|||
$simpleform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
|
|||
// done |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
|
@ -0,0 +1,89 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows the admin to configure a list of profile fields that are sent/recieved |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2010 onwards Penny Leach <penny@liip.ch> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->dirroot . '/' . $CFG->admin .'/mnet/profilefields_form.php'); |
|||
$mnet = get_mnet_environment(); |
|||
|
|||
$hostid = required_param('hostid', PARAM_INT); |
|||
$mnet_peer = new mnet_peer(); |
|||
$mnet_peer->set_id($hostid); |
|||
|
|||
admin_externalpage_setup('mnetpeers'); |
|||
$form = new mnet_profile_form(null, array('hostid' => $hostid)); |
|||
|
|||
if ($data = $form->get_data()) { |
|||
if (!isset($data->importdefault)) { |
|||
$data->importdefault = 0; |
|||
} |
|||
if (!isset($data->exportdefault)) { |
|||
$data->exportdefault = 0; |
|||
} |
|||
if (!isset($data->importfields)) { |
|||
$data->importfields = array(); |
|||
} |
|||
if (!isset($data->exportfields)) { |
|||
$data->exportfields = array(); |
|||
} |
|||
set_config('host' . $hostid . 'importdefault', $data->importdefault, 'mnet'); |
|||
set_config('host' . $hostid . 'importfields', implode(',', $data->importfields), 'mnet'); |
|||
set_config('host' . $hostid . 'exportdefault', $data->exportdefault, 'mnet'); |
|||
set_config('host' . $hostid . 'exportfields', implode(',', $data->exportfields), 'mnet'); |
|||
|
|||
redirect(new moodle_url('/admin/mnet/peers.php'), get_string('changessaved')); |
|||
} elseif ($form->is_cancelled()) { |
|||
redirect(new moodle_url('/admin/mnet/peers.php', array('hostid' => $hostid))); |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
$currenttab = 'mnetprofilefields'; |
|||
require_once('tabs.php'); |
|||
|
|||
echo $OUTPUT->heading(get_string('peerprofilefielddesc', 'mnet'), 4); |
|||
|
|||
$data = new Stdclass; |
|||
$data->importdefault = get_config('mnet', 'host' . $hostid . 'importdefault'); |
|||
$data->exportdefault = get_config('mnet', 'host' . $hostid . 'exportdefault'); |
|||
$data->importfields = get_config('mnet', 'host' . $hostid . 'importfields'); |
|||
$data->exportfields = get_config('mnet', 'host' . $hostid . 'exportfields'); |
|||
|
|||
if ($data->importfields === false) { |
|||
$data->importdefault = true; |
|||
} else { |
|||
$data->importfields = explode(',', $data->importfields); |
|||
} |
|||
if ($data->exportfields === false) { |
|||
$data->exportdefault = true; |
|||
} else { |
|||
$data->exportfields = explode(',', $data->exportfields); |
|||
} |
|||
|
|||
$form->set_data($data); |
|||
$form->display(); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,75 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows the admin to configure a list of profile fields that are sent/recieved |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2010 onwards Penny Leach <penny@liip.ch> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
if (!defined('MOODLE_INTERNAL')) { |
|||
die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page |
|||
} |
|||
|
|||
require_once($CFG->libdir . '/formslib.php'); |
|||
|
|||
/** |
|||
* small form to allow the administrator to configure (override) which profile fields are sent/imported over mnet |
|||
*/ |
|||
class mnet_profile_form extends moodleform { |
|||
|
|||
function definition() { |
|||
global $CFG; |
|||
$mform =& $this->_form; |
|||
|
|||
$mnetprofileimportfields = ''; |
|||
if (isset($CFG->mnetprofileimportfields)) { |
|||
$mnetprofileimportfields = str_replace(',', ', ', $CFG->mnetprofileimportfields); |
|||
} |
|||
|
|||
$mnetprofileexportfields = ''; |
|||
if (isset($CFG->mnetprofileexportfields)) { |
|||
$mnetprofileexportfields = str_replace(',', ', ', $CFG->mnetprofileexportfields); |
|||
} |
|||
|
|||
$mform->addElement('hidden', 'hostid', $this->_customdata['hostid']); |
|||
$mform->setType('hostid', PARAM_INT); |
|||
|
|||
$fields = mnet_profile_field_options(); |
|||
|
|||
// Fields to import ---------------------------------------------------- |
|||
$mform->addElement('header', 'import', get_string('importfields', 'mnet')); |
|||
|
|||
$select = $mform->addElement('select', 'importfields', get_string('importfields', 'mnet'), $fields['optional']); |
|||
$select->setMultiple(true); |
|||
|
|||
$mform->addElement('checkbox', 'importdefault', get_string('leavedefault', 'mnet'), $mnetprofileimportfields); |
|||
|
|||
// Fields to export ---------------------------------------------------- |
|||
$mform->addElement('header', 'export', get_string('exportfields', 'mnet')); |
|||
|
|||
$select = $mform->addElement('select', 'exportfields', get_string('exportfields', 'mnet'), $fields['optional']); |
|||
$select->setMultiple(true); |
|||
|
|||
$mform->addElement('checkbox', 'exportdefault', get_string('leavedefault', 'mnet'), $mnetprofileexportfields); |
|||
|
|||
$this->add_action_buttons(); |
|||
} |
|||
} |
@ -0,0 +1,89 @@ |
|||
<?php |
|||
|
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
|
|||
/** |
|||
* This page is for configuring which services are published/subscribed on a host |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2010 Penny Leach |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->dirroot . '/' . $CFG->admin . '/mnet/services_form.php'); |
|||
$mnet = get_mnet_environment(); |
|||
|
|||
admin_externalpage_setup('mnetpeers'); |
|||
|
|||
|
|||
$hostid = required_param('hostid', PARAM_INT); |
|||
|
|||
$mnet_peer = new mnet_peer(); |
|||
$mnet_peer->set_id($hostid); |
|||
|
|||
$mform = new mnet_services_form(null, array('peer' => $mnet_peer)); |
|||
if ($formdata = $mform->get_data()) { |
|||
if (!isset($formdata->publish)) { |
|||
$formdata->publish = array(); |
|||
} |
|||
if (!isset($formdata->subscribe)) { |
|||
$formdata->subscribe = array(); |
|||
} |
|||
foreach($formdata->exists as $key => $value) { |
|||
$host2service = $DB->get_record('mnet_host2service', array('hostid'=>$hostid, 'serviceid'=>$key)); |
|||
$publish = (array_key_exists($key, $formdata->publish)) ? $formdata->publish[$key] : 0; |
|||
$subscribe = (array_key_exists($key, $formdata->subscribe)) ? $formdata->subscribe[$key] : 0; |
|||
|
|||
if ($publish != 1 && $subscribe != 1) { |
|||
if (false == $host2service) { |
|||
// We don't have or need a record - do nothing! |
|||
} else { |
|||
// We don't need the record - delete it |
|||
$DB->delete_records('mnet_host2service', array('hostid' => $hostid, 'serviceid'=>$key)); |
|||
} |
|||
} elseif (false == $host2service && ($publish == 1 || $subscribe == 1)) { |
|||
$host2service = new stdClass(); |
|||
$host2service->hostid = $hostid; |
|||
$host2service->serviceid = $key; |
|||
|
|||
$host2service->publish = $publish; |
|||
$host2service->subscribe = $subscribe; |
|||
|
|||
$host2service->id = $DB->insert_record('mnet_host2service', $host2service); |
|||
} elseif ($host2service->publish != $publish || $host2service->subscribe != $subscribe) { |
|||
$host2service->publish = $publish; |
|||
$host2service->subscribe = $subscribe; |
|||
$DB->update_record('mnet_host2service', $host2service); |
|||
} |
|||
} |
|||
$redirecturl = new moodle_url('/admin/mnet/services.php?hostid=' . $hostid); |
|||
redirect($redirecturl, get_string('changessaved')); |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
$currenttab = 'mnetservices'; |
|||
require_once($CFG->dirroot . '/' . $CFG->admin . '/mnet/tabs.php'); |
|||
echo $OUTPUT->box_start(); |
|||
$s = mnet_get_service_info($mnet_peer, false); // basic data only |
|||
$mform->set_data($s); |
|||
$mform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,77 @@ |
|||
<?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 form for configuring which services are subscribed and published on a host |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2010 Penny Leach |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
if (!defined('MOODLE_INTERNAL')) { |
|||
die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page |
|||
} |
|||
|
|||
require_once($CFG->libdir . '/formslib.php'); |
|||
|
|||
class mnet_services_form extends moodleform { |
|||
|
|||
function definition() { |
|||
$mform =& $this->_form; |
|||
$mnet_peer =& $this->_customdata['peer']; |
|||
$myservices = mnet_get_service_info($mnet_peer); |
|||
|
|||
$mform->addElement('hidden', 'hostid', $mnet_peer->id); |
|||
$mform->setType('hostid', PARAM_INT); |
|||
|
|||
$count = 0; |
|||
foreach ($myservices as $name => $versions) { |
|||
$version = current($versions); |
|||
$langmodule = |
|||
($version['plugintype'] == 'mod' |
|||
? '' |
|||
: ($version['plugintype'] . '_')) |
|||
. $version['pluginname']; // TODO there should be a moodle-wide way to do this |
|||
|
|||
if ($count > 0) { |
|||
$mform->addElement('html', '<hr />'); |
|||
} |
|||
$mform->addElement('html', '<h3>' . get_string($name.'_name', $langmodule , $mnet_peer->name) . '</h3>' . get_string($name.'_description', $langmodule, $mnet_peer->name)); |
|||
|
|||
$mform->addElement('hidden', 'exists[' . $version['serviceid'] . ']', 1); |
|||
// Temporary fix until MDL-38885 gets integrated. |
|||
$mform->setType('exists', PARAM_BOOL); |
|||
|
|||
$pubstr = get_string('publish','mnet'); |
|||
if (!empty($version['hostsubscribes'])) { |
|||
$pubstr .= ' <a class="notifysuccess" title="'.s(get_string('issubscribed','mnet', $mnet_peer->name)).'">√</a> '; |
|||
} |
|||
$mform->addElement('advcheckbox', 'publish[' . $version['serviceid'] . ']', $pubstr); |
|||
|
|||
$substr = get_string('subscribe','mnet'); |
|||
if (!empty($version['hostpublishes'])) { |
|||
$substr .= ' <a class="notifysuccess" title="'.s(get_string('ispublished','mnet', $mnet_peer->name)).'">√</a> '; |
|||
} |
|||
$mform->addElement('advcheckbox', 'subscribe[' . $version['serviceid']. ']', $substr); |
|||
$count++; |
|||
} |
|||
$this->add_action_buttons(); |
|||
} |
|||
} |
@ -0,0 +1,47 @@ |
|||
<?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/>. |
|||
|
|||
|
|||
/** |
|||
* Tabs to be included on the pages for configuring a single host |
|||
* $mnet_peer object must be set and bootstrapped |
|||
* $currenttab string must be set |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @copyright 2007 Donal McMullan |
|||
* @copyright 2007 Martin Langhoff |
|||
* @copyright 2010 Penny Leach |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
if (!defined('MOODLE_INTERNAL')) { |
|||
die('Direct access to this script is forbidden.'); // It must be included from a Moodle page |
|||
} |
|||
|
|||
$strmnetservices = get_string('mnetservices', 'mnet'); |
|||
$strmnetedithost = get_string('reviewhostdetails', 'mnet'); |
|||
|
|||
$tabs = array(); |
|||
if (isset($mnet_peer->id) && $mnet_peer->id > 0) { |
|||
$tabs[] = new tabobject('mnetdetails', 'peers.php?step=update&hostid='.$mnet_peer->id, $strmnetedithost, $strmnetedithost, false); |
|||
$tabs[] = new tabobject('mnetservices', 'services.php?hostid='.$mnet_peer->id, $strmnetservices, $strmnetservices, false); |
|||
$tabs[] = new tabobject('mnetprofilefields', 'profilefields.php?hostid=' . $mnet_peer->id, get_string('profilefields', 'mnet'), get_string('profilefields', 'mnet'), false); |
|||
} else { |
|||
$tabs[] = new tabobject('mnetdetails', '#', $strmnetedithost, $strmnetedithost, false); |
|||
} |
|||
print_tabs(array($tabs), $currenttab); |
@ -0,0 +1,227 @@ |
|||
<?php |
|||
/** |
|||
* A service browser for remote Moodles |
|||
* |
|||
* This script 'remotely' executes the reflection methods on a remote Moodle, |
|||
* and publishes the details of the available services |
|||
* |
|||
* @package core |
|||
* @subpackage mnet |
|||
* @author Donal McMullan donal@catalyst.net.nz |
|||
* @version 0.0.1 |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License |
|||
* @package mnet |
|||
*/ |
|||
require(__DIR__.'/../../config.php'); |
|||
require_once $CFG->dirroot.'/mnet/xmlrpc/client.php'; |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
include_once($CFG->dirroot.'/mnet/lib.php'); |
|||
|
|||
if ($CFG->mnet_dispatcher_mode === 'off') { |
|||
print_error('mnetdisabled', 'mnet'); |
|||
} |
|||
|
|||
admin_externalpage_setup('mnettestclient'); |
|||
|
|||
error_reporting(DEBUG_ALL); |
|||
|
|||
echo $OUTPUT->header(); |
|||
if (!extension_loaded('openssl')) { |
|||
print_error('requiresopenssl', 'mnet', '', NULL, true); |
|||
} |
|||
|
|||
// optional drilling down parameters |
|||
$hostid = optional_param('hostid', 0, PARAM_INT); |
|||
$servicename = optional_param('servicename', '', PARAM_SAFEDIR); |
|||
$methodid = optional_param('method', 0, PARAM_INT); |
|||
|
|||
$hosts = $DB->get_records('mnet_host'); |
|||
$moodleapplicationid = $DB->get_field('mnet_application', 'id', array('name' => 'moodle')); |
|||
|
|||
$url = new moodle_url('/admin/mnet/testclient.php'); |
|||
$PAGE->set_url($url); |
|||
|
|||
echo $OUTPUT->heading(get_string('hostlist', 'mnet')); |
|||
foreach ($hosts as $id => $host) { |
|||
if (empty($host->wwwroot) || $host->wwwroot == $CFG->wwwroot) { |
|||
continue; |
|||
} |
|||
$newurl = new moodle_url($url, array('hostid' => $host->id)); |
|||
echo '<p>' . html_writer::link($newurl, $host->wwwroot) . '</p>'; |
|||
} |
|||
|
|||
if (!empty($hostid) && array_key_exists($hostid, $hosts)) { |
|||
$host = $hosts[$hostid]; |
|||
if ($host->applicationid != $moodleapplicationid) { |
|||
echo $OUTPUT->notification(get_string('notmoodleapplication', 'mnet')); |
|||
} |
|||
$mnet_peer = new mnet_peer(); |
|||
$mnet_peer->set_wwwroot($host->wwwroot); |
|||
|
|||
$mnet_request = new mnet_xmlrpc_client(); |
|||
|
|||
$mnet_request->set_method('system/listServices'); |
|||
$mnet_request->send($mnet_peer); |
|||
|
|||
$services = $mnet_request->response; |
|||
$yesno = array('No', 'Yes'); |
|||
$servicenames = array(); |
|||
|
|||
echo $OUTPUT->heading(get_string('servicesavailableonhost', 'mnet', $host->wwwroot)); |
|||
|
|||
if (!empty($mnet_request->error)) { |
|||
echo $OUTPUT->heading(get_string('error'), 3); |
|||
echo html_writer::alist($mnet_request->error); |
|||
$services = array(); |
|||
} |
|||
|
|||
$table = new html_table(); |
|||
$table->head = array( |
|||
get_string('serviceid', 'mnet'), |
|||
get_string('service', 'mnet'), |
|||
get_string('version', 'mnet'), |
|||
get_string('theypublish', 'mnet'), |
|||
get_string('theysubscribe', 'mnet'), |
|||
get_string('options', 'mnet'), |
|||
); |
|||
$table->data = array(); |
|||
|
|||
$yesno = array(get_string('no'), get_string('yes')); |
|||
|
|||
// this query is horrible and has to be remapped afterwards, because of the non-uniqueness |
|||
// of the remoterep service (it has two plugins so far that use it) |
|||
// it's possible to get a unique list back using a subquery with LIMIT but that would break oracle |
|||
// so it's best to just do this small query and then remap the results afterwards |
|||
$sql = ' |
|||
SELECT DISTINCT |
|||
' . $DB->sql_concat('r.plugintype', "'_'", 'r.pluginname', "'_'", 's.name') . ' AS uniqueid, |
|||
s.name, |
|||
r.plugintype, |
|||
r.pluginname |
|||
FROM |
|||
{mnet_service} s |
|||
JOIN {mnet_remote_service2rpc} s2r ON s2r.serviceid = s.id |
|||
JOIN {mnet_remote_rpc} r ON r.id = s2r.rpcid'; |
|||
|
|||
$serviceinfo = array(); |
|||
|
|||
foreach ($DB->get_records_sql($sql) as $result) { |
|||
$serviceinfo[$result->name] = $result->plugintype . '_' . $result->pluginname; |
|||
} |
|||
|
|||
foreach ($services as $id => $servicedata) { |
|||
if (array_key_exists($servicedata['name'], $serviceinfo)) { |
|||
$service = $serviceinfo[$servicedata['name']]; |
|||
$servicedata['humanname'] = get_string($servicedata['name'].'_name', $service); |
|||
} else { |
|||
$servicedata['humanname'] = get_string('unknown', 'mnet'); |
|||
} |
|||
$newurl = new moodle_url($url, array('hostid' => $host->id, 'servicename' => $servicedata['name'])); |
|||
$table->data[] = array( |
|||
$servicedata['name'], |
|||
$servicedata['humanname'], |
|||
$servicedata['apiversion'], |
|||
$yesno[$servicedata['publish']], |
|||
$yesno[$servicedata['subscribe']], |
|||
html_writer::link($newurl, get_string('listservices', 'mnet')) |
|||
); |
|||
|
|||
} |
|||
echo html_writer::table($table); |
|||
|
|||
|
|||
$mnet_request = new mnet_xmlrpc_client(); |
|||
$mnet_request->set_method('system/listMethods'); |
|||
if (isset($servicename) && array_key_exists($servicename, $serviceinfo)) { |
|||
echo $OUTPUT->heading(get_string('methodsavailableonhostinservice', 'mnet', (object)array('host' => $host->wwwroot, 'service' => $servicename))); |
|||
$service = $serviceinfo[$servicename]; |
|||
$mnet_request->add_param($servicename, 'string'); |
|||
} else { |
|||
echo $OUTPUT->heading(get_string('methodsavailableonhost', 'mnet', $host->wwwroot)); |
|||
} |
|||
|
|||
$mnet_request->send($mnet_peer); |
|||
$methods = $mnet_request->response; |
|||
|
|||
if (!empty($mnet_request->error)) { |
|||
echo $OUTPUT->heading(get_string('error'), 3); |
|||
echo html_writer::alist($mnet_request->error); |
|||
$methods = array(); |
|||
} |
|||
|
|||
$table = new html_table(); |
|||
$table->head = array( |
|||
get_string('method', 'mnet'), |
|||
get_string('options', 'mnet'), |
|||
); |
|||
$table->data = array(); |
|||
|
|||
foreach ($methods as $id => $method) { |
|||
$params = array('hostid' => $host->id, 'method' => $id+1); |
|||
if (isset($servicename)) { |
|||
$params['servicename'] = $servicename; |
|||
} |
|||
$newurl = new moodle_url($url, $params); |
|||
$table->data[] = array( |
|||
$method, |
|||
html_writer::link($newurl, get_string('inspect', 'mnet')) |
|||
); |
|||
} |
|||
echo html_writer::table($table); |
|||
|
|||
if (isset($methodid) && array_key_exists($methodid-1, $methods)) { |
|||
$method = $methods[$methodid-1]; |
|||
|
|||
$mnet_request = new mnet_xmlrpc_client(); |
|||
$mnet_request->set_method('system/methodSignature'); |
|||
$mnet_request->add_param($method, 'string'); |
|||
$mnet_request->send($mnet_peer); |
|||
$signature = $mnet_request->response; |
|||
|
|||
echo $OUTPUT->heading(get_string('methodsignature', 'mnet', $method)); |
|||
|
|||
if (!empty($mnet_request->error)) { |
|||
echo $OUTPUT->heading(get_string('error'), 3); |
|||
echo html_writer::alist($mnet_request->error); |
|||
$signature = array(); |
|||
} |
|||
|
|||
$table = new html_table(); |
|||
$table->head = array( |
|||
get_string('position', 'mnet'), |
|||
get_string('name', 'mnet'), |
|||
get_string('type', 'mnet'), |
|||
get_string('description', 'mnet'), |
|||
); |
|||
$table->data = array(); |
|||
|
|||
$params = $signature['parameters']; |
|||
foreach ($params as $pos => $details) { |
|||
$table->data[] = array( |
|||
$pos, |
|||
$details['name'], |
|||
$details['type'], |
|||
$details['description'], |
|||
); |
|||
} |
|||
$table->data[] = array( |
|||
get_string('returnvalue', 'mnet'), |
|||
'', |
|||
$signature['return']['type'], |
|||
$signature['return']['description'] |
|||
); |
|||
|
|||
echo html_writer::table($table); |
|||
|
|||
$mnet_request->set_method('system/methodHelp'); |
|||
$mnet_request->add_param($method, 'string'); |
|||
$mnet_request->send($mnet_peer); |
|||
$help = $mnet_request->response; |
|||
|
|||
echo $OUTPUT->heading(get_string('methodhelp', 'mnet', $method)); |
|||
echo(str_replace('\n', '<br />',$help)); |
|||
} |
|||
} |
|||
|
|||
echo $OUTPUT->footer(); |
|||
?> |
@ -0,0 +1,68 @@ |
|||
<?php |
|||
echo $OUTPUT->header(); |
|||
?> |
|||
<div id="trustedhosts"><!-- See theme/standard/styles_layout.css #trustedhosts .generaltable for rules --> |
|||
<table cellspacing="0" cellpadding="5" class="generaltable generalbox" > |
|||
<tr> |
|||
<th class="header c0" colspan="2"><?php print_string('trustedhosts', 'mnet'); ?></th> |
|||
</tr> |
|||
<tr> |
|||
<td class="cell c1" colspan="2"><?php print_string('trustedhostsexplain', 'mnet'); ?></td> |
|||
</tr> |
|||
<tr> |
|||
<td class="cell c1" colspan="2"> |
|||
<form method="post" action="trustedhosts.php"> |
|||
<div> |
|||
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" /> |
|||
<textarea name="hostlist" cols="40" rows="20"><?php echo $trusted_hosts; ?></textarea><br /> |
|||
<input type="submit" value="<?php print_string('savechanges'); ?>" /> |
|||
</div> |
|||
</form> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
<table cellspacing="0" cellpadding="5" class="generaltable generalbox" > |
|||
<tr> |
|||
<th class="header c0" colspan="2"><?php print_string('testtrustedhosts', 'mnet'); ?></th> |
|||
</tr> |
|||
<?php |
|||
if (!empty($test_ip_address)){ |
|||
?> |
|||
<tr> |
|||
<td class="cell c1" colspan="2"> |
|||
<?php |
|||
if ($in_range) { |
|||
print_string('is_in_range', 'mnet', $test_ip_address); |
|||
echo '<br />'; |
|||
print_string('validated_by', 'mnet', $validated_by); |
|||
} else { |
|||
print_string('not_in_range', 'mnet', $test_ip_address); |
|||
} |
|||
?> |
|||
</td> |
|||
</tr> |
|||
<?php |
|||
} else { |
|||
?> |
|||
<tr> |
|||
<td class="cell c1" colspan="2"><?php print_string('testtrustedhostsexplain', 'mnet'); ?></td> |
|||
</tr> |
|||
<?php |
|||
} |
|||
?> |
|||
<tr> |
|||
<td class="cell c1" colspan="2"> |
|||
<form method="get" action="trustedhosts.php"> |
|||
<div> |
|||
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" /> |
|||
<input type="text" name="testipaddress" value="<?php echo $test_ip_address; ?>" /> |
|||
<input type="submit" value="<?php print_string('go'); ?>" /> |
|||
</div> |
|||
</form> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
</div> |
|||
<?php |
|||
echo $OUTPUT->footer(); |
|||
?> |
@ -0,0 +1,59 @@ |
|||
<?php |
|||
// Allows the admin to configure services for remote hosts |
|||
|
|||
require(__DIR__.'/../../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
include_once($CFG->dirroot.'/mnet/lib.php'); |
|||
|
|||
admin_externalpage_setup('trustedhosts'); |
|||
|
|||
|
|||
if (!extension_loaded('openssl')) { |
|||
echo $OUTPUT->header(); |
|||
print_error('requiresopenssl', 'mnet', '', NULL, true); |
|||
} |
|||
|
|||
$site = get_site(); |
|||
|
|||
$trusted_hosts = '';//array(); |
|||
$old_trusted_hosts = get_config('mnet', 'mnet_trusted_hosts'); |
|||
if (!empty($old_trusted_hosts)) { |
|||
$old_trusted_hosts = explode(',', $old_trusted_hosts); |
|||
} else { |
|||
$old_trusted_hosts = array(); |
|||
} |
|||
|
|||
$test_ip_address = optional_param('testipaddress', NULL, PARAM_HOST); |
|||
$in_range = false; |
|||
if (!empty($test_ip_address)) { |
|||
foreach($old_trusted_hosts as $host) { |
|||
if (address_in_subnet($test_ip_address, $host)) { |
|||
$in_range = true; |
|||
$validated_by = $host; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// If data submitted, process and store |
|||
if (($form = data_submitted()) && confirm_sesskey()) { |
|||
$hostlist = preg_split("/[\s,]+/", $form->hostlist); |
|||
foreach($hostlist as $host) { |
|||
list($address, $mask) = explode('/', $host.'/'); |
|||
if (empty($address)) continue; |
|||
if (strlen($mask) == 0) $mask = 32; |
|||
$trusted_hosts .= trim($address).'/'.trim($mask)."\n"; |
|||
unset($address, $mask); |
|||
} |
|||
set_config('mnet_trusted_hosts', str_replace("\n", ',', $trusted_hosts), 'mnet'); |
|||
} elseif (!empty($old_trusted_hosts)) { |
|||
foreach($old_trusted_hosts as $host) { |
|||
list($address, $mask) = explode('/', $host.'/'); |
|||
if (empty($address)) continue; |
|||
if (strlen($mask) == 0) $mask = 32; |
|||
$trusted_hosts .= trim($address).'/'.trim($mask)."\n"; |
|||
unset($address, $mask); |
|||
} |
|||
} |
|||
|
|||
include('./trustedhosts.html'); |
@ -0,0 +1,165 @@ |
|||
<?php |
|||
// Allows the admin to manage activity modules |
|||
|
|||
require_once('../config.php'); |
|||
require_once('../course/lib.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
// defines |
|||
define('MODULE_TABLE','module_administration_table'); |
|||
|
|||
admin_externalpage_setup('managemodules'); |
|||
|
|||
$show = optional_param('show', '', PARAM_PLUGIN); |
|||
$hide = optional_param('hide', '', PARAM_PLUGIN); |
|||
|
|||
|
|||
/// Print headings |
|||
|
|||
$stractivities = get_string("activities"); |
|||
$struninstall = get_string('uninstallplugin', 'core_admin'); |
|||
$strversion = get_string("version"); |
|||
$strhide = get_string("hide"); |
|||
$strshow = get_string("show"); |
|||
$strsettings = get_string("settings"); |
|||
$stractivities = get_string("activities"); |
|||
$stractivitymodule = get_string("activitymodule"); |
|||
$strshowmodulecourse = get_string('showmodulecourse'); |
|||
|
|||
/// If data submitted, then process and store. |
|||
|
|||
if (!empty($hide) and confirm_sesskey()) { |
|||
if (!$module = $DB->get_record("modules", array("name"=>$hide))) { |
|||
print_error('moduledoesnotexist', 'error'); |
|||
} |
|||
$DB->set_field("modules", "visible", "0", array("id"=>$module->id)); // Hide main module |
|||
// Remember the visibility status in visibleold |
|||
// and hide... |
|||
$sql = "UPDATE {course_modules} |
|||
SET visibleold=visible, visible=0 |
|||
WHERE module=?"; |
|||
$DB->execute($sql, array($module->id)); |
|||
// Increment course.cacherev for courses where we just made something invisible. |
|||
// This will force cache rebuilding on the next request. |
|||
increment_revision_number('course', 'cacherev', |
|||
"id IN (SELECT DISTINCT course |
|||
FROM {course_modules} |
|||
WHERE visibleold=1 AND module=?)", |
|||
array($module->id)); |
|||
core_plugin_manager::reset_caches(); |
|||
admin_get_root(true, false); // settings not required - only pages |
|||
} |
|||
|
|||
if (!empty($show) and confirm_sesskey()) { |
|||
if (!$module = $DB->get_record("modules", array("name"=>$show))) { |
|||
print_error('moduledoesnotexist', 'error'); |
|||
} |
|||
$DB->set_field("modules", "visible", "1", array("id"=>$module->id)); // Show main module |
|||
$DB->set_field('course_modules', 'visible', '1', array('visibleold'=>1, 'module'=>$module->id)); // Get the previous saved visible state for the course module. |
|||
// Increment course.cacherev for courses where we just made something visible. |
|||
// This will force cache rebuilding on the next request. |
|||
increment_revision_number('course', 'cacherev', |
|||
"id IN (SELECT DISTINCT course |
|||
FROM {course_modules} |
|||
WHERE visible=1 AND module=?)", |
|||
array($module->id)); |
|||
core_plugin_manager::reset_caches(); |
|||
admin_get_root(true, false); // settings not required - only pages |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading($stractivities); |
|||
|
|||
/// Get and sort the existing modules |
|||
|
|||
if (!$modules = $DB->get_records('modules', array(), 'name ASC')) { |
|||
print_error('moduledoesnotexist', 'error'); |
|||
} |
|||
|
|||
/// Print the table of all modules |
|||
// construct the flexible table ready to display |
|||
$table = new flexible_table(MODULE_TABLE); |
|||
$table->define_columns(array('name', 'instances', 'version', 'hideshow', 'uninstall', 'settings')); |
|||
$table->define_headers(array($stractivitymodule, $stractivities, $strversion, "$strhide/$strshow", $strsettings, $struninstall)); |
|||
$table->define_baseurl($CFG->wwwroot.'/'.$CFG->admin.'/modules.php'); |
|||
$table->set_attribute('id', 'modules'); |
|||
$table->set_attribute('class', 'admintable generaltable'); |
|||
$table->setup(); |
|||
|
|||
$pluginmanager = core_plugin_manager::instance(); |
|||
|
|||
foreach ($modules as $module) { |
|||
$plugininfo = $pluginmanager->get_plugin_info('mod_'.$module->name); |
|||
$status = $plugininfo->get_status(); |
|||
|
|||
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) { |
|||
$strmodulename = '<span class="notifyproblem">'.$module->name.' ('.get_string('missingfromdisk').')</span>'; |
|||
$missing = true; |
|||
} else { |
|||
// took out hspace="\10\", because it does not validate. don't know what to replace with. |
|||
$icon = "<img src=\"" . $OUTPUT->image_url('icon', $module->name) . "\" class=\"icon\" alt=\"\" />"; |
|||
$strmodulename = $icon.' '.get_string('modulename', $module->name); |
|||
$missing = false; |
|||
} |
|||
|
|||
$uninstall = ''; |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('mod_'.$module->name, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $struninstall); |
|||
} |
|||
|
|||
if (file_exists("$CFG->dirroot/mod/$module->name/settings.php") || |
|||
file_exists("$CFG->dirroot/mod/$module->name/settingstree.php")) { |
|||
$settings = "<a href=\"settings.php?section=modsetting$module->name\">$strsettings</a>"; |
|||
} else { |
|||
$settings = ""; |
|||
} |
|||
|
|||
try { |
|||
$count = $DB->count_records_select($module->name, "course<>0"); |
|||
} catch (dml_exception $e) { |
|||
$count = -1; |
|||
} |
|||
if ($count>0) { |
|||
$countlink = "<a href=\"{$CFG->wwwroot}/course/search.php?modulelist=$module->name" . |
|||
"&sesskey=".sesskey()."\" title=\"$strshowmodulecourse\">$count</a>"; |
|||
} else if ($count < 0) { |
|||
$countlink = get_string('error'); |
|||
} else { |
|||
$countlink = "$count"; |
|||
} |
|||
|
|||
if ($missing) { |
|||
$visible = ''; |
|||
$class = ''; |
|||
} else if ($module->visible) { |
|||
$visible = "<a href=\"modules.php?hide=$module->name&sesskey=".sesskey()."\" title=\"$strhide\">". |
|||
$OUTPUT->pix_icon('t/hide', $strhide) . '</a>'; |
|||
$class = ''; |
|||
} else { |
|||
$visible = "<a href=\"modules.php?show=$module->name&sesskey=".sesskey()."\" title=\"$strshow\">". |
|||
$OUTPUT->pix_icon('t/show', $strshow) . '</a>'; |
|||
$class = 'dimmed_text'; |
|||
} |
|||
if ($module->name == "forum") { |
|||
$uninstall = ""; |
|||
$visible = ""; |
|||
$class = ""; |
|||
} |
|||
$version = get_config('mod_'.$module->name, 'version'); |
|||
|
|||
$table->add_data(array( |
|||
$strmodulename, |
|||
$countlink, |
|||
$version, |
|||
$visible, |
|||
$settings, |
|||
$uninstall, |
|||
), $class); |
|||
} |
|||
|
|||
$table->print_html(); |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
|
@ -0,0 +1,57 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* An oauth2 redirection endpoint which can be used for an application: |
|||
* http://tools.ietf.org/html/draft-ietf-oauth-v2-26#section-3.1.2 |
|||
* |
|||
* This is used because some oauth servers will not allow a redirect urls |
|||
* with get params (like repository callback) and that needs to be called |
|||
* using the state param. |
|||
* |
|||
* @package core |
|||
* @copyright 2012 Dan Poltawski |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
|
|||
$error = optional_param('error', '', PARAM_RAW); |
|||
if ($error) { |
|||
$message = optional_param('error_description', '', PARAM_RAW); |
|||
if ($message) { |
|||
print_error($message); |
|||
} else { |
|||
print_error($error); |
|||
} |
|||
die(); |
|||
} |
|||
|
|||
// The authorization code generated by the authorization server. |
|||
$code = required_param('code', PARAM_RAW); |
|||
// The state parameter we've given (used in moodle as a redirect url). |
|||
$state = required_param('state', PARAM_LOCALURL); |
|||
|
|||
$redirecturl = new moodle_url($state); |
|||
$params = $redirecturl->params(); |
|||
|
|||
if (isset($params['sesskey']) and confirm_sesskey($params['sesskey'])) { |
|||
$redirecturl->param('oauth2code', $code); |
|||
redirect($redirecturl); |
|||
} else { |
|||
print_error('invalidsesskey'); |
|||
} |
@ -0,0 +1,33 @@ |
|||
<?php |
|||
// phpinfo.php - shows phpinfo for the current server |
|||
|
|||
require_once("../config.php"); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
admin_externalpage_setup('phpinfo'); |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
echo '<div class="phpinfo text-ltr">'; |
|||
|
|||
ob_start(); |
|||
phpinfo(INFO_GENERAL + INFO_CONFIGURATION + INFO_MODULES + INFO_VARIABLES); |
|||
$html = ob_get_contents(); |
|||
ob_end_clean(); |
|||
|
|||
/// Delete styles from output |
|||
$html = preg_replace('#(\n?<style[^>]*?>.*?</style[^>]*?>)|(\n?<style[^>]*?/>)#is', '', $html); |
|||
$html = preg_replace('#(\n?<head[^>]*?>.*?</head[^>]*?>)|(\n?<head[^>]*?/>)#is', '', $html); |
|||
/// Delete DOCTYPE from output |
|||
$html = preg_replace('/<!DOCTYPE html PUBLIC.*?>/is', '', $html); |
|||
/// Delete body and html tags |
|||
$html = preg_replace('/<html.*?>.*?<body.*?>/is', '', $html); |
|||
$html = preg_replace('/<\/body><\/html>/is', '', $html); |
|||
|
|||
echo $html; |
|||
|
|||
echo '</div>'; |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
|
@ -0,0 +1,86 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Provides an overview of installed plagiarism plugins |
|||
* |
|||
* Displays the list of found plagiarism plugins, their version (if found) and |
|||
* a link to uninstall the plagiarism plugin. |
|||
* |
|||
* @see http://docs.moodle.org/dev/Plagiarism_API |
|||
* @package admin |
|||
* @copyright 2012 Dan Marsden <dan@danmarsden.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
|
|||
admin_externalpage_setup('manageplagiarismplugins'); |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
// Print the table of all installed plagiarism plugins. |
|||
|
|||
$txt = get_strings(array('settings', 'name', 'version')); |
|||
$txt->uninstall = get_string('uninstallplugin', 'core_admin'); |
|||
|
|||
$plagiarismplugins = core_component::get_plugin_list('plagiarism'); |
|||
if (empty($plagiarismplugins)) { |
|||
echo $OUTPUT->notification(get_string('nopluginsinstalled', 'plagiarism')); |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} |
|||
|
|||
echo $OUTPUT->heading(get_string('availableplugins', 'plagiarism'), 3, 'main'); |
|||
echo $OUTPUT->box_start('generalbox authsui'); |
|||
|
|||
$table = new html_table(); |
|||
$table->head = array($txt->name, $txt->version, $txt->uninstall, $txt->settings); |
|||
$table->colclasses = array('mdl-left', 'mdl-align', 'mdl-align', 'mdl-align'); |
|||
$table->data = array(); |
|||
$table->attributes['class'] = 'manageplagiarismtable generaltable'; |
|||
|
|||
// Iterate through auth plugins and add to the display table. |
|||
$authcount = count($plagiarismplugins); |
|||
foreach ($plagiarismplugins as $plugin => $dir) { |
|||
if (file_exists($dir.'/settings.php')) { |
|||
$displayname = "<span>".get_string($plugin, 'plagiarism_'.$plugin)."</span>"; |
|||
// Settings link. |
|||
$url = new moodle_url("/plagiarism/$plugin/settings.php"); |
|||
$settings = html_writer::link($url, $txt->settings); |
|||
// Get version. |
|||
$version = get_config('plagiarism_' . $plugin); |
|||
if (!empty($version->version)) { |
|||
$version = $version->version; |
|||
} else { |
|||
$version = '?'; |
|||
} |
|||
// uninstall link. |
|||
$uninstall = ''; |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('plagiarism_'.$plugin, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $txt->uninstall); |
|||
} |
|||
$table->data[] = array($displayname, $version, $uninstall, $settings); |
|||
} |
|||
} |
|||
echo html_writer::table($table); |
|||
echo get_string('configplagiarismplugins', 'plagiarism'); |
|||
echo $OUTPUT->box_end(); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,216 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* UI for general plugins management |
|||
* |
|||
* @package core |
|||
* @subpackage admin |
|||
* @copyright 2011 David Mudrak <david@moodle.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
require_once($CFG->libdir . '/filelib.php'); |
|||
|
|||
$fetchupdates = optional_param('fetchupdates', false, PARAM_BOOL); // Check for available plugins updates. |
|||
$updatesonly = optional_param('updatesonly', false, PARAM_BOOL); // Show updateable plugins only. |
|||
$contribonly = optional_param('contribonly', false, PARAM_BOOL); // Show additional plugins only. |
|||
$uninstall = optional_param('uninstall', '', PARAM_COMPONENT); // Uninstall the plugin. |
|||
$delete = optional_param('delete', '', PARAM_COMPONENT); // Delete the plugin folder after it is uninstalled. |
|||
$confirmed = optional_param('confirm', false, PARAM_BOOL); // Confirm the uninstall/delete action. |
|||
$return = optional_param('return', 'overview', PARAM_ALPHA); // Where to return after uninstall. |
|||
$installupdate = optional_param('installupdate', null, PARAM_COMPONENT); // Install given available update. |
|||
$installupdateversion = optional_param('installupdateversion', null, PARAM_INT); // Version of the available update to install. |
|||
$installupdatex = optional_param('installupdatex', false, PARAM_BOOL); // Install all available plugin updates. |
|||
$confirminstallupdate = optional_param('confirminstallupdate', false, PARAM_BOOL); // Available update(s) install confirmed? |
|||
|
|||
// NOTE: do not use admin_externalpage_setup() here because it loads |
|||
// full admin tree which is not possible during uninstallation. |
|||
|
|||
require_login(); |
|||
$syscontext = context_system::instance(); |
|||
require_capability('moodle/site:config', $syscontext); |
|||
|
|||
// URL params we want to maintain on redirects. |
|||
$pageparams = array('updatesonly' => $updatesonly, 'contribonly' => $contribonly); |
|||
$pageurl = new moodle_url('/admin/plugins.php', $pageparams); |
|||
|
|||
$pluginman = core_plugin_manager::instance(); |
|||
|
|||
if ($uninstall) { |
|||
require_sesskey(); |
|||
|
|||
if (!$confirmed) { |
|||
admin_externalpage_setup('pluginsoverview', '', $pageparams); |
|||
} else { |
|||
$PAGE->set_url($pageurl); |
|||
$PAGE->set_context($syscontext); |
|||
$PAGE->set_pagelayout('maintenance'); |
|||
$PAGE->set_popup_notification_allowed(false); |
|||
} |
|||
|
|||
/** @var core_admin_renderer $output */ |
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
|
|||
$pluginfo = $pluginman->get_plugin_info($uninstall); |
|||
|
|||
// Make sure we know the plugin. |
|||
if (is_null($pluginfo)) { |
|||
throw new moodle_exception('err_uninstalling_unknown_plugin', 'core_plugin', '', array('plugin' => $uninstall), |
|||
'core_plugin_manager::get_plugin_info() returned null for the plugin to be uninstalled'); |
|||
} |
|||
|
|||
$pluginname = $pluginman->plugin_name($pluginfo->component); |
|||
$PAGE->set_title($pluginname); |
|||
$PAGE->navbar->add(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); |
|||
|
|||
if (!$pluginman->can_uninstall_plugin($pluginfo->component)) { |
|||
throw new moodle_exception('err_cannot_uninstall_plugin', 'core_plugin', '', |
|||
array('plugin' => $pluginfo->component), |
|||
'core_plugin_manager::can_uninstall_plugin() returned false'); |
|||
} |
|||
|
|||
if (!$confirmed) { |
|||
$continueurl = new moodle_url($PAGE->url, array('uninstall' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1, 'return'=>$return)); |
|||
$cancelurl = $pluginfo->get_return_url_after_uninstall($return); |
|||
echo $output->plugin_uninstall_confirm_page($pluginman, $pluginfo, $continueurl, $cancelurl); |
|||
exit(); |
|||
|
|||
} else { |
|||
$SESSION->pluginuninstallreturn = $pluginfo->get_return_url_after_uninstall($return); |
|||
$progress = new progress_trace_buffer(new text_progress_trace(), false); |
|||
$pluginman->uninstall_plugin($pluginfo->component, $progress); |
|||
$progress->finished(); |
|||
|
|||
if ($pluginman->is_plugin_folder_removable($pluginfo->component)) { |
|||
$continueurl = new moodle_url($PAGE->url, array('delete' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1)); |
|||
echo $output->plugin_uninstall_results_removable_page($pluginman, $pluginfo, $progress, $continueurl); |
|||
// Reset op code caches. |
|||
if (function_exists('opcache_reset')) { |
|||
opcache_reset(); |
|||
} |
|||
exit(); |
|||
|
|||
} else { |
|||
echo $output->plugin_uninstall_results_page($pluginman, $pluginfo, $progress); |
|||
// Reset op code caches. |
|||
if (function_exists('opcache_reset')) { |
|||
opcache_reset(); |
|||
} |
|||
exit(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($delete and $confirmed) { |
|||
require_sesskey(); |
|||
|
|||
$PAGE->set_url($pageurl); |
|||
$PAGE->set_context($syscontext); |
|||
$PAGE->set_pagelayout('maintenance'); |
|||
$PAGE->set_popup_notification_allowed(false); |
|||
|
|||
/** @var core_admin_renderer $output */ |
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
|
|||
$pluginfo = $pluginman->get_plugin_info($delete); |
|||
|
|||
// Make sure we know the plugin. |
|||
if (is_null($pluginfo)) { |
|||
throw new moodle_exception('err_removing_unknown_plugin', 'core_plugin', '', array('plugin' => $delete), |
|||
'core_plugin_manager::get_plugin_info() returned null for the plugin to be deleted'); |
|||
} |
|||
|
|||
$pluginname = $pluginman->plugin_name($pluginfo->component); |
|||
$PAGE->set_title($pluginname); |
|||
$PAGE->navbar->add(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); |
|||
|
|||
// Make sure it is not installed. |
|||
if (!is_null($pluginfo->versiondb)) { |
|||
throw new moodle_exception('err_removing_installed_plugin', 'core_plugin', '', |
|||
array('plugin' => $pluginfo->component, 'versiondb' => $pluginfo->versiondb), |
|||
'core_plugin_manager::get_plugin_info() returned not-null versiondb for the plugin to be deleted'); |
|||
} |
|||
|
|||
// Make sure the folder is within Moodle installation tree. |
|||
if (strpos($pluginfo->rootdir, $CFG->dirroot) !== 0) { |
|||
throw new moodle_exception('err_unexpected_plugin_rootdir', 'core_plugin', '', |
|||
array('plugin' => $pluginfo->component, 'rootdir' => $pluginfo->rootdir, 'dirroot' => $CFG->dirroot), |
|||
'plugin root folder not in the moodle dirroot'); |
|||
} |
|||
|
|||
// So long, and thanks for all the bugs. |
|||
$pluginman->remove_plugin_folder($pluginfo); |
|||
|
|||
// We need to execute upgrade to make sure everything including caches is up to date. |
|||
redirect(new moodle_url('/admin/index.php')); |
|||
} |
|||
|
|||
// Install all avilable updates. |
|||
if ($installupdatex) { |
|||
require_once($CFG->libdir.'/upgradelib.php'); |
|||
require_sesskey(); |
|||
|
|||
$PAGE->set_url($pageurl); |
|||
$PAGE->set_context($syscontext); |
|||
$PAGE->set_pagelayout('maintenance'); |
|||
$PAGE->set_popup_notification_allowed(false); |
|||
|
|||
$installable = $pluginman->filter_installable($pluginman->available_updates()); |
|||
upgrade_install_plugins($installable, $confirminstallupdate, |
|||
get_string('updateavailableinstallallhead', 'core_admin'), |
|||
new moodle_url($PAGE->url, array('installupdatex' => 1, 'confirminstallupdate' => 1)) |
|||
); |
|||
} |
|||
|
|||
// Install single available update. |
|||
if ($installupdate and $installupdateversion) { |
|||
require_once($CFG->libdir.'/upgradelib.php'); |
|||
require_sesskey(); |
|||
|
|||
$PAGE->set_url($pageurl); |
|||
$PAGE->set_context($syscontext); |
|||
$PAGE->set_pagelayout('maintenance'); |
|||
$PAGE->set_popup_notification_allowed(false); |
|||
|
|||
if ($pluginman->is_remote_plugin_installable($installupdate, $installupdateversion)) { |
|||
$installable = array($pluginman->get_remote_plugin_info($installupdate, $installupdateversion, true)); |
|||
upgrade_install_plugins($installable, $confirminstallupdate, |
|||
get_string('updateavailableinstallallhead', 'core_admin'), |
|||
new moodle_url($PAGE->url, array('installupdate' => $installupdate, |
|||
'installupdateversion' => $installupdateversion, 'confirminstallupdate' => 1) |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
admin_externalpage_setup('pluginsoverview', '', $pageparams); |
|||
|
|||
/** @var core_admin_renderer $output */ |
|||
$output = $PAGE->get_renderer('core', 'admin'); |
|||
|
|||
$checker = \core\update\checker::instance(); |
|||
|
|||
if ($fetchupdates) { |
|||
require_sesskey(); |
|||
$checker->fetch(); |
|||
redirect($PAGE->url); |
|||
} |
|||
|
|||
echo $output->plugin_management_page($pluginman, $checker, $pageparams); |
@ -0,0 +1,249 @@ |
|||
<?php |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir . '/portfoliolib.php'); |
|||
require_once($CFG->libdir . '/portfolio/forms.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$portfolio = optional_param('pf', '', PARAM_ALPHANUMEXT); |
|||
$action = optional_param('action', '', PARAM_ALPHA); |
|||
$sure = optional_param('sure', '', PARAM_ALPHA); |
|||
|
|||
$display = true; // fall through to normal display |
|||
|
|||
$pagename = 'manageportfolios'; |
|||
|
|||
if ($action == 'edit') { |
|||
$pagename = 'portfoliosettings' . $portfolio; |
|||
} else if ($action == 'delete') { |
|||
$pagename = 'portfoliodelete'; |
|||
} else if (($action == 'newon') || ($action == 'newoff')) { |
|||
$pagename = 'portfolionew'; |
|||
} |
|||
|
|||
// Need to remember this for form |
|||
$formaction = $action; |
|||
|
|||
// Check what visibility to show the new repository |
|||
if ($action == 'newon') { |
|||
$action = 'new'; |
|||
$visible = 1; |
|||
} else if ($action == 'newoff') { |
|||
$action = 'new'; |
|||
$visible = 0; |
|||
} |
|||
|
|||
admin_externalpage_setup($pagename); |
|||
|
|||
$baseurl = "$CFG->wwwroot/$CFG->admin/portfolio.php"; |
|||
$sesskeyurl = "$CFG->wwwroot/$CFG->admin/portfolio.php?sesskey=" . sesskey(); |
|||
$configstr = get_string('manageportfolios', 'portfolio'); |
|||
|
|||
$return = true; // direct back to the main page |
|||
|
|||
/** |
|||
* Helper function that generates a moodle_url object |
|||
* relevant to the portfolio |
|||
*/ |
|||
function portfolio_action_url($portfolio) { |
|||
global $baseurl; |
|||
return new moodle_url($baseurl, array('sesskey'=>sesskey(), 'pf'=>$portfolio)); |
|||
} |
|||
|
|||
if (($action == 'edit') || ($action == 'new')) { |
|||
if (($action == 'edit')) { |
|||
$instance = portfolio_instance($portfolio); |
|||
$plugin = $instance->get('plugin'); |
|||
|
|||
// Since visible is being passed to form |
|||
// and used to set the value when a new |
|||
// instance is created - we must also |
|||
// place the currently visibility into the |
|||
// form as well |
|||
$visible = $instance->get('visible'); |
|||
} else { |
|||
$instance = null; |
|||
$plugin = $portfolio; |
|||
} |
|||
|
|||
$PAGE->set_pagetype('admin-portfolio-' . $plugin); |
|||
|
|||
// Display the edit form for this instance |
|||
$mform = new portfolio_admin_form('', array('plugin' => $plugin, 'instance' => $instance, 'portfolio' => $portfolio, 'action' => $formaction, 'visible' => $visible)); |
|||
// End setup, begin output |
|||
if ($mform->is_cancelled()){ |
|||
redirect($baseurl); |
|||
exit; |
|||
} else if (($fromform = $mform->get_data()) && (confirm_sesskey())) { |
|||
// Unset whatever doesn't belong in fromform |
|||
foreach (array('pf', 'action', 'plugin', 'sesskey', 'submitbutton') as $key) { |
|||
unset($fromform->{$key}); |
|||
} |
|||
// This branch is where you process validated data. |
|||
if ($action == 'edit') { |
|||
$instance->set_config((array)$fromform); |
|||
$instance->save(); |
|||
} else { |
|||
portfolio_static_function($plugin, 'create_instance', $plugin, $fromform->name, $fromform); |
|||
} |
|||
core_plugin_manager::reset_caches(); |
|||
$savedstr = get_string('instancesaved', 'portfolio'); |
|||
redirect($baseurl, $savedstr, 1); |
|||
exit; |
|||
} else { |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('configplugin', 'portfolio')); |
|||
echo $OUTPUT->box_start(); |
|||
$mform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
$return = false; |
|||
} |
|||
} else if (($action == 'hide') || ($action == 'show')) { |
|||
require_sesskey(); |
|||
|
|||
$instance = portfolio_instance($portfolio); |
|||
$current = $instance->get('visible'); |
|||
if (empty($current) && $instance->instance_sanity_check()) { |
|||
print_error('cannotsetvisible', 'portfolio', $baseurl); |
|||
} |
|||
|
|||
if ($action == 'show') { |
|||
$visible = 1; |
|||
} else { |
|||
$visible = 0; |
|||
} |
|||
|
|||
$instance->set('visible', $visible); |
|||
$instance->save(); |
|||
core_plugin_manager::reset_caches(); |
|||
$return = true; |
|||
} else if ($action == 'delete') { |
|||
$instance = portfolio_instance($portfolio); |
|||
if ($sure) { |
|||
if (!confirm_sesskey()) { |
|||
print_error('confirmsesskeybad', '', $baseurl); |
|||
} |
|||
if ($instance->delete()) { |
|||
$deletedstr = get_string('instancedeleted', 'portfolio'); |
|||
redirect($baseurl, $deletedstr, 1); |
|||
} else { |
|||
print_error('instancenotdeleted', 'portfolio', $baseurl); |
|||
} |
|||
exit; |
|||
} else { |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->confirm(get_string('sure', 'portfolio', $instance->get('name')), $sesskeyurl . '&pf='.$portfolio.'&action=delete&sure=yes', $baseurl); |
|||
$return = false; |
|||
} |
|||
} else { |
|||
// If page is loaded directly |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('manageportfolios', 'portfolio')); |
|||
|
|||
// Get strings that are used |
|||
$strshow = get_string('on', 'portfolio'); |
|||
$strhide = get_string('off', 'portfolio'); |
|||
$strdelete = get_string('disabledinstance', 'portfolio'); |
|||
$strsettings = get_string('settings'); |
|||
|
|||
$actionchoicesforexisting = array( |
|||
'show' => $strshow, |
|||
'hide' => $strhide, |
|||
'delete' => $strdelete |
|||
); |
|||
|
|||
$actionchoicesfornew = array( |
|||
'newon' => $strshow, |
|||
'newoff' => $strhide, |
|||
'delete' => $strdelete |
|||
); |
|||
|
|||
$output = $OUTPUT->box_start('generalbox'); |
|||
|
|||
$plugins = core_component::get_plugin_list('portfolio'); |
|||
$plugins = array_keys($plugins); |
|||
$instances = portfolio_instances(false, false); |
|||
$usedplugins = array(); |
|||
|
|||
// to avoid notifications being sent out while admin is editing the page |
|||
define('ADMIN_EDITING_PORTFOLIO', true); |
|||
|
|||
$insane = portfolio_plugin_sanity_check($plugins); |
|||
$insaneinstances = portfolio_instance_sanity_check($instances); |
|||
|
|||
$table = new html_table(); |
|||
$table->head = array(get_string('plugin', 'portfolio'), '', ''); |
|||
$table->data = array(); |
|||
|
|||
foreach ($instances as $i) { |
|||
$settings = '<a href="' . $sesskeyurl . '&action=edit&pf=' . $i->get('id') . '">' . $strsettings .'</a>'; |
|||
// Set some commonly used variables |
|||
$pluginid = $i->get('id'); |
|||
$plugin = $i->get('plugin'); |
|||
$pluginname = $i->get('name'); |
|||
|
|||
// Check if the instance is misconfigured |
|||
if (array_key_exists($plugin, $insane) || array_key_exists($pluginid, $insaneinstances)) { |
|||
if (!empty($insane[$plugin])) { |
|||
$information = $insane[$plugin]; |
|||
} else if (!empty($insaneinstances[$pluginid])) { |
|||
$information = $insaneinstances[$pluginid]; |
|||
} |
|||
$table->data[] = array($pluginname, $strdelete . " " . $OUTPUT->help_icon($information, 'portfolio_' . $plugin), $settings); |
|||
} else { |
|||
if ($i->get('visible')) { |
|||
$currentaction = 'show'; |
|||
} else { |
|||
$currentaction = 'hide'; |
|||
} |
|||
$select = new single_select(portfolio_action_url($pluginid, 'pf'), 'action', $actionchoicesforexisting, $currentaction, null, 'applyto' . $pluginid); |
|||
$select->set_label(get_string('action'), array('class' => 'accesshide')); |
|||
$table->data[] = array($pluginname, $OUTPUT->render($select), $settings); |
|||
} |
|||
if (!in_array($plugin, $usedplugins)) { |
|||
$usedplugins[] = $plugin; |
|||
} |
|||
} |
|||
|
|||
// Create insane plugin array |
|||
$insaneplugins = array(); |
|||
if (!empty($plugins)) { |
|||
foreach ($plugins as $p) { |
|||
// Check if it can not have multiple instances and has already been used |
|||
if (!portfolio_static_function($p, 'allows_multiple_instances') && in_array($p, $usedplugins)) { |
|||
continue; |
|||
} |
|||
|
|||
// Check if it is misconfigured - if so store in array then display later |
|||
if (array_key_exists($p, $insane)) { |
|||
$insaneplugins[] = $p; |
|||
} else { |
|||
$select = new single_select(portfolio_action_url($p, 'pf'), 'action', $actionchoicesfornew, 'delete', null, 'applyto' . $p); |
|||
$select->set_label(get_string('action'), array('class' => 'accesshide')); |
|||
$table->data[] = array(portfolio_static_function($p, 'get_name'), $OUTPUT->render($select), ''); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Loop through all the insane plugins |
|||
if (!empty($insaneplugins)) { |
|||
foreach ($insaneplugins as $p) { |
|||
$table->data[] = array(portfolio_static_function($p, 'get_name'), $strdelete . " " . $OUTPUT->help_icon($insane[$p], 'portfolio_' . $p), ''); |
|||
} |
|||
} |
|||
|
|||
$output .= html_writer::table($table); |
|||
|
|||
$output .= $OUTPUT->box_end(); |
|||
|
|||
echo $output; |
|||
$return = false; |
|||
} |
|||
|
|||
if ($return) { |
|||
// Redirect to base |
|||
redirect($baseurl); |
|||
} |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
@ -0,0 +1,80 @@ |
|||
#!/usr/bin/php -f |
|||
<?php |
|||
|
|||
//error_reporting(0); |
|||
//ini_set('display_errors',0); |
|||
require_once(__DIR__ . '/../config.php'); |
|||
$tmp = explode('@',$_ENV['RECIPIENT']); |
|||
$address = $tmp[0]; |
|||
|
|||
// BOUNCE EMAILS TO NOREPLY |
|||
if ($_ENV['RECIPIENT'] == $CFG->noreplyaddress) { |
|||
$user = new stdClass(); |
|||
$user->email = $_ENV['SENDER']; |
|||
|
|||
if (!validate_email($user->email)) { |
|||
die(); |
|||
} |
|||
|
|||
$site = get_site(); |
|||
$subject = get_string('noreplybouncesubject','moodle',format_string($site->fullname)); |
|||
$body = get_string('noreplybouncemessage','moodle',format_string($site->fullname))."\n\n"; |
|||
|
|||
$fd = fopen('php://stdin','r'); |
|||
if ($fd) { |
|||
while(!feof($fd)) { |
|||
$body .= fgets($fd); |
|||
} |
|||
fclose($fd); |
|||
} |
|||
|
|||
$user->id = 0; // to prevent anything annoying happening |
|||
|
|||
$from->firstname = null; |
|||
$from->lastname = null; |
|||
$from->email = '<>'; |
|||
$from->maildisplay = true; |
|||
|
|||
email_to_user($user,$from,$subject,$body); |
|||
die (); |
|||
} |
|||
/// ALL OTHER PROCESSING |
|||
// we need to split up the address |
|||
$prefix = substr($address,0,4); |
|||
$mod = substr($address,4,2); |
|||
$modargs = substr($address,6,-16); |
|||
$hash = substr($address,-16); |
|||
|
|||
if (substr(md5($prefix.$mod.$modargs.$CFG->siteidentifier),0,16) != $hash) { |
|||
die("HASH DIDN'T MATCH!\n"); |
|||
} |
|||
list(,$modid) = unpack('C',base64_decode($mod.'==')); |
|||
|
|||
if ($modid == '0') { // special |
|||
$modname = 'moodle'; |
|||
} |
|||
else { |
|||
$modname = $DB->get_field("modules", "name", array("id"=>$modid)); |
|||
include_once('mod/'.$modname.'/lib.php'); |
|||
} |
|||
$function = $modname.'_process_email'; |
|||
|
|||
if (!function_exists($function)) { |
|||
die(); |
|||
} |
|||
$fd = fopen('php://stdin','r'); |
|||
if (!$fd) { |
|||
exit(); |
|||
} |
|||
|
|||
while(!feof($fd)) { |
|||
$body .= fgets($fd); |
|||
} |
|||
|
|||
$function($modargs,$body); |
|||
|
|||
fclose($fd); |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,69 @@ |
|||
<?php |
|||
// This file is part of Moodle - http://moodle.org/ |
|||
// |
|||
// Moodle is free software: you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation, either version 3 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// Moodle is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
/** |
|||
* This script triggers a full purging of system caches, |
|||
* this is useful mostly for developers who did not disable the caching. |
|||
* |
|||
* @package core |
|||
* @copyright 2010 Petr Skoda {@link http://skodak.org} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once('../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
|
|||
$confirm = optional_param('confirm', 0, PARAM_BOOL); |
|||
$returnurl = optional_param('returnurl', '/admin/purgecaches.php', PARAM_LOCALURL); |
|||
$returnurl = new moodle_url($returnurl); |
|||
|
|||
admin_externalpage_setup('purgecaches'); |
|||
|
|||
$form = new core_admin\form\purge_caches(null, ['returnurl' => $returnurl]); |
|||
|
|||
// If we have got here as a confirmed aciton, do it. |
|||
if ($data = $form->get_data()) { |
|||
|
|||
// Valid request. Purge, and redirect the user back to where they came from. |
|||
$selected = $data->purgeselectedoptions; |
|||
purge_caches($selected); |
|||
|
|||
if (isset($data->all)) { |
|||
$message = get_string('purgecachesfinished', 'admin'); |
|||
} else { |
|||
$message = get_string('purgeselectedcachesfinished', 'admin'); |
|||
} |
|||
|
|||
} else if ($confirm && confirm_sesskey()) { |
|||
purge_caches(); |
|||
$message = get_string('purgecachesfinished', 'admin'); |
|||
} |
|||
|
|||
if (isset($message)) { |
|||
redirect($returnurl, $message); |
|||
} |
|||
|
|||
// Otherwise, show a form to actually purge the caches. |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('purgecachespage', 'admin')); |
|||
|
|||
echo $OUTPUT->box_start('generalbox', 'notice'); |
|||
echo html_writer::tag('p', get_string('purgecachesconfirm', 'admin')); |
|||
echo $form->render(); |
|||
echo $OUTPUT->box_end(); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,241 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows the admin to manage question behaviours. |
|||
* |
|||
* @package moodlecore |
|||
* @subpackage questionengine |
|||
* @copyright 2011 The Open University |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir . '/questionlib.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
require_once($CFG->libdir . '/tablelib.php'); |
|||
|
|||
// Check permissions. |
|||
require_login(); |
|||
$systemcontext = context_system::instance(); |
|||
require_capability('moodle/question:config', $systemcontext); |
|||
|
|||
admin_externalpage_setup('manageqbehaviours'); |
|||
$thispageurl = new moodle_url('/admin/qbehaviours.php'); |
|||
|
|||
$behaviours = core_component::get_plugin_list('qbehaviour'); |
|||
$pluginmanager = core_plugin_manager::instance(); |
|||
|
|||
// Get some data we will need - question counts and which types are needed. |
|||
$counts = $DB->get_records_sql_menu(" |
|||
SELECT behaviour, COUNT(1) |
|||
FROM {question_attempts} GROUP BY behaviour"); |
|||
$needed = array(); |
|||
$archetypal = array(); |
|||
foreach ($behaviours as $behaviour => $notused) { |
|||
if (!array_key_exists($behaviour, $counts)) { |
|||
$counts[$behaviour] = 0; |
|||
} |
|||
$needed[$behaviour] = ($counts[$behaviour] > 0) || |
|||
$pluginmanager->other_plugins_that_require('qbehaviour_' . $behaviour); |
|||
$archetypal[$behaviour] = question_engine::is_behaviour_archetypal($behaviour); |
|||
} |
|||
foreach ($counts as $behaviour => $count) { |
|||
if (!array_key_exists($behaviour, $behaviours)) { |
|||
$counts['missing'] += $count; |
|||
} |
|||
} |
|||
$needed['missing'] = true; |
|||
|
|||
// Work of the correct sort order. |
|||
$config = get_config('question'); |
|||
$sortedbehaviours = array(); |
|||
foreach ($behaviours as $behaviour => $notused) { |
|||
$sortedbehaviours[$behaviour] = question_engine::get_behaviour_name($behaviour); |
|||
} |
|||
if (!empty($config->behavioursortorder)) { |
|||
$sortedbehaviours = question_engine::sort_behaviours($sortedbehaviours, |
|||
$config->behavioursortorder, ''); |
|||
} |
|||
|
|||
if (!empty($config->disabledbehaviours)) { |
|||
$disabledbehaviours = explode(',', $config->disabledbehaviours); |
|||
} else { |
|||
$disabledbehaviours = array(); |
|||
} |
|||
|
|||
// Process actions ============================================================ |
|||
|
|||
// Disable. |
|||
if (($disable = optional_param('disable', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($behaviours[$disable])) { |
|||
print_error('unknownbehaviour', 'question', $thispageurl, $disable); |
|||
} |
|||
|
|||
if (array_search($disable, $disabledbehaviours) === false) { |
|||
$disabledbehaviours[] = $disable; |
|||
set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question'); |
|||
} |
|||
core_plugin_manager::reset_caches(); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// Enable. |
|||
if (($enable = optional_param('enable', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($behaviours[$enable])) { |
|||
print_error('unknownbehaviour', 'question', $thispageurl, $enable); |
|||
} |
|||
|
|||
if (!$archetypal[$enable]) { |
|||
print_error('cannotenablebehaviour', 'question', $thispageurl, $enable); |
|||
} |
|||
|
|||
if (($key = array_search($enable, $disabledbehaviours)) !== false) { |
|||
unset($disabledbehaviours[$key]); |
|||
set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question'); |
|||
} |
|||
core_plugin_manager::reset_caches(); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// Move up in order. |
|||
if (($up = optional_param('up', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($behaviours[$up])) { |
|||
print_error('unknownbehaviour', 'question', $thispageurl, $up); |
|||
} |
|||
|
|||
// This function works fine for behaviours, as well as qtypes. |
|||
$neworder = question_reorder_qtypes($sortedbehaviours, $up, -1); |
|||
set_config('behavioursortorder', implode(',', $neworder), 'question'); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// Move down in order. |
|||
if (($down = optional_param('down', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($behaviours[$down])) { |
|||
print_error('unknownbehaviour', 'question', $thispageurl, $down); |
|||
} |
|||
|
|||
// This function works fine for behaviours, as well as qtypes. |
|||
$neworder = question_reorder_qtypes($sortedbehaviours, $down, +1); |
|||
set_config('behavioursortorder', implode(',', $neworder), 'question'); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// End of process actions ================================================== |
|||
|
|||
// Print the page heading. |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('manageqbehaviours', 'admin')); |
|||
|
|||
// Set up the table. |
|||
$table = new flexible_table('qbehaviouradmintable'); |
|||
$table->define_baseurl($thispageurl); |
|||
$table->define_columns(array('behaviour', 'numqas', 'version', 'requires', |
|||
'available', 'uninstall')); |
|||
$table->define_headers(array(get_string('behaviour', 'question'), get_string('numqas', 'question'), |
|||
get_string('version'), get_string('requires', 'admin'), |
|||
get_string('availableq', 'question'), get_string('uninstallplugin', 'core_admin'))); |
|||
$table->set_attribute('id', 'qbehaviours'); |
|||
$table->set_attribute('class', 'generaltable admintable'); |
|||
$table->setup(); |
|||
|
|||
// Add a row for each question type. |
|||
foreach ($sortedbehaviours as $behaviour => $behaviourname) { |
|||
$row = array(); |
|||
|
|||
// Question icon and name. |
|||
$row[] = $behaviourname; |
|||
|
|||
// Count |
|||
$row[] = $counts[$behaviour]; |
|||
|
|||
// Question version number. |
|||
$version = get_config('qbehaviour_' . $behaviour, 'version'); |
|||
if ($version) { |
|||
$row[] = $version; |
|||
} else { |
|||
$row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'disabled')); |
|||
} |
|||
|
|||
// Other question types required by this one. |
|||
$plugin = $pluginmanager->get_plugin_info('qbehaviour_' . $behaviour); |
|||
$required = $plugin->get_other_required_plugins(); |
|||
if (!empty($required)) { |
|||
$strrequired = array(); |
|||
foreach ($required as $component => $notused) { |
|||
$strrequired[] = $pluginmanager->plugin_name($component); |
|||
} |
|||
$row[] = implode(', ', $strrequired); |
|||
} else { |
|||
$row[] = ''; |
|||
} |
|||
|
|||
// Are people allowed to select this behaviour? |
|||
$rowclass = ''; |
|||
if ($archetypal[$behaviour]) { |
|||
$enabled = array_search($behaviour, $disabledbehaviours) === false; |
|||
$icons = question_behaviour_enable_disable_icons($behaviour, $enabled); |
|||
if (!$enabled) { |
|||
$rowclass = 'dimmed_text'; |
|||
} |
|||
} else { |
|||
$icons = $OUTPUT->spacer(array('class' => 'iconsmall')); |
|||
} |
|||
|
|||
// Move icons. |
|||
$icons .= question_behaviour_icon_html('up', $behaviour, 't/up', get_string('up'), null); |
|||
$icons .= question_behaviour_icon_html('down', $behaviour, 't/down', get_string('down'), null); |
|||
$row[] = $icons; |
|||
|
|||
// Delete link, if available. |
|||
if ($needed[$behaviour]) { |
|||
$row[] = ''; |
|||
} else { |
|||
$uninstallurl = core_plugin_manager::instance()->get_uninstall_url('qbehaviour_'.$behaviour, 'manage'); |
|||
if ($uninstallurl) { |
|||
$row[] = html_writer::link($uninstallurl, get_string('uninstallplugin', 'core_admin'), |
|||
array('title' => get_string('uninstallbehaviour', 'question'))); |
|||
} |
|||
} |
|||
|
|||
$table->add_data($row, $rowclass); |
|||
} |
|||
|
|||
$table->finish_output(); |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
function question_behaviour_enable_disable_icons($behaviour, $enabled) { |
|||
if ($enabled) { |
|||
return question_behaviour_icon_html('disable', $behaviour, 't/hide', |
|||
get_string('enabled', 'question'), get_string('disable')); |
|||
} else { |
|||
return question_behaviour_icon_html('enable', $behaviour, 't/show', |
|||
get_string('disabled', 'question'), get_string('enable')); |
|||
} |
|||
} |
|||
|
|||
function question_behaviour_icon_html($action, $behaviour, $icon, $alt, $tip) { |
|||
global $OUTPUT; |
|||
return $OUTPUT->action_icon(new moodle_url('/admin/qbehaviours.php', |
|||
array($action => $behaviour, 'sesskey' => sesskey())), |
|||
new pix_icon($icon, $alt, 'moodle', array('title' => '', 'class' => 'iconsmall')), |
|||
null, array('title' => $tip)); |
|||
} |
|||
|
@ -0,0 +1,254 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Allows the admin to manage question types. |
|||
* |
|||
* @package moodlecore |
|||
* @subpackage questionbank |
|||
* @copyright 2008 Tim Hunt |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir . '/questionlib.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
require_once($CFG->libdir . '/tablelib.php'); |
|||
|
|||
// Check permissions. |
|||
$systemcontext = context_system::instance(); |
|||
require_capability('moodle/question:config', $systemcontext); |
|||
$canviewreports = has_capability('report/questioninstances:view', $systemcontext); |
|||
|
|||
admin_externalpage_setup('manageqtypes'); |
|||
$thispageurl = new moodle_url('/admin/qtypes.php'); |
|||
|
|||
$qtypes = question_bank::get_all_qtypes(); |
|||
$pluginmanager = core_plugin_manager::instance(); |
|||
|
|||
// Get some data we will need - question counts and which types are needed. |
|||
$counts = $DB->get_records_sql(" |
|||
SELECT qtype, COUNT(1) as numquestions, SUM(hidden) as numhidden |
|||
FROM {question} GROUP BY qtype", array()); |
|||
$needed = array(); |
|||
foreach ($qtypes as $qtypename => $qtype) { |
|||
if (!isset($counts[$qtypename])) { |
|||
$counts[$qtypename] = new stdClass; |
|||
$counts[$qtypename]->numquestions = 0; |
|||
$counts[$qtypename]->numhidden = 0; |
|||
} |
|||
$needed[$qtypename] = $counts[$qtypename]->numquestions > 0 || |
|||
$pluginmanager->other_plugins_that_require($qtype->plugin_name()); |
|||
$counts[$qtypename]->numquestions -= $counts[$qtypename]->numhidden; |
|||
} |
|||
$needed['missingtype'] = true; // The system needs the missing question type. |
|||
foreach ($counts as $qtypename => $count) { |
|||
if (!isset($qtypes[$qtypename])) { |
|||
$counts['missingtype']->numquestions += $count->numquestions - $count->numhidden; |
|||
$counts['missingtype']->numhidden += $count->numhidden; |
|||
} |
|||
} |
|||
|
|||
// Work of the correct sort order. |
|||
$config = get_config('question'); |
|||
$sortedqtypes = array(); |
|||
foreach ($qtypes as $qtypename => $qtype) { |
|||
$sortedqtypes[$qtypename] = $qtype->local_name(); |
|||
} |
|||
$sortedqtypes = question_bank::sort_qtype_array($sortedqtypes, $config); |
|||
|
|||
// Process actions ============================================================ |
|||
|
|||
// Disable. |
|||
if (($disable = optional_param('disable', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($qtypes[$disable])) { |
|||
print_error('unknownquestiontype', 'question', $thispageurl, $disable); |
|||
} |
|||
|
|||
set_config($disable . '_disabled', 1, 'question'); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// Enable. |
|||
if (($enable = optional_param('enable', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($qtypes[$enable])) { |
|||
print_error('unknownquestiontype', 'question', $thispageurl, $enable); |
|||
} |
|||
|
|||
if (!$qtypes[$enable]->menu_name()) { |
|||
print_error('cannotenable', 'question', $thispageurl, $enable); |
|||
} |
|||
|
|||
unset_config($enable . '_disabled', 'question'); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// Move up in order. |
|||
if (($up = optional_param('up', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($qtypes[$up])) { |
|||
print_error('unknownquestiontype', 'question', $thispageurl, $up); |
|||
} |
|||
|
|||
$neworder = question_reorder_qtypes($sortedqtypes, $up, -1); |
|||
question_save_qtype_order($neworder, $config); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// Move down in order. |
|||
if (($down = optional_param('down', '', PARAM_PLUGIN)) && confirm_sesskey()) { |
|||
if (!isset($qtypes[$down])) { |
|||
print_error('unknownquestiontype', 'question', $thispageurl, $down); |
|||
} |
|||
|
|||
$neworder = question_reorder_qtypes($sortedqtypes, $down, +1); |
|||
question_save_qtype_order($neworder, $config); |
|||
redirect($thispageurl); |
|||
} |
|||
|
|||
// End of process actions ================================================== |
|||
|
|||
// Print the page heading. |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('manageqtypes', 'admin')); |
|||
|
|||
// Set up the table. |
|||
$table = new flexible_table('qtypeadmintable'); |
|||
$table->define_baseurl($thispageurl); |
|||
$table->define_columns(array('questiontype', 'numquestions', 'version', 'requires', |
|||
'availableto', 'uninstall', 'settings')); |
|||
$table->define_headers(array(get_string('questiontype', 'question'), get_string('numquestions', 'question'), |
|||
get_string('version'), get_string('requires', 'admin'), get_string('availableq', 'question'), |
|||
get_string('settings'), get_string('uninstallplugin', 'core_admin'))); |
|||
$table->set_attribute('id', 'qtypes'); |
|||
$table->set_attribute('class', 'admintable generaltable'); |
|||
$table->setup(); |
|||
|
|||
// Add a row for each question type. |
|||
$createabletypes = question_bank::get_creatable_qtypes(); |
|||
foreach ($sortedqtypes as $qtypename => $localname) { |
|||
$qtype = $qtypes[$qtypename]; |
|||
$row = array(); |
|||
|
|||
// Question icon and name. |
|||
$fakequestion = new stdClass; |
|||
$fakequestion->qtype = $qtypename; |
|||
$icon = print_question_icon($fakequestion, true); |
|||
$row[] = $icon . ' ' . $localname; |
|||
|
|||
// Number of questions of this type. |
|||
if ($counts[$qtypename]->numquestions + $counts[$qtypename]->numhidden > 0) { |
|||
if ($counts[$qtypename]->numhidden > 0) { |
|||
$strcount = get_string('numquestionsandhidden', 'question', $counts[$qtypename]); |
|||
} else { |
|||
$strcount = $counts[$qtypename]->numquestions; |
|||
} |
|||
if ($canviewreports) { |
|||
$row[] = html_writer::link(new moodle_url('/report/questioninstances/index.php', |
|||
array('qtype' => $qtypename)), $strcount, array('title' => get_string('showdetails', 'admin'))); |
|||
} else { |
|||
$strcount; |
|||
} |
|||
} else { |
|||
$row[] = 0; |
|||
} |
|||
|
|||
// Question version number. |
|||
$version = get_config('qtype_' . $qtypename, 'version'); |
|||
if ($version) { |
|||
$row[] = $version; |
|||
} else { |
|||
$row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'disabled')); |
|||
} |
|||
|
|||
// Other question types required by this one. |
|||
$plugin = $pluginmanager->get_plugin_info($qtype->plugin_name()); |
|||
$requiredtypes = $plugin->get_other_required_plugins(); |
|||
$strtypes = array(); |
|||
if (!empty($requiredtypes)) { |
|||
foreach ($requiredtypes as $required => $notused) { |
|||
$strtypes[] = $pluginmanager->plugin_name($required); |
|||
} |
|||
$row[] = implode(', ', $strtypes); |
|||
} else { |
|||
$row[] = ''; |
|||
} |
|||
|
|||
// Are people allowed to create new questions of this type? |
|||
$rowclass = ''; |
|||
if ($qtype->menu_name()) { |
|||
$createable = isset($createabletypes[$qtypename]); |
|||
$icons = question_types_enable_disable_icons($qtypename, $createable); |
|||
if (!$createable) { |
|||
$rowclass = 'dimmed_text'; |
|||
} |
|||
} else { |
|||
$icons = $OUTPUT->spacer(); |
|||
} |
|||
|
|||
// Move icons. |
|||
$icons .= question_type_icon_html('up', $qtypename, 't/up', get_string('up'), ''); |
|||
$icons .= question_type_icon_html('down', $qtypename, 't/down', get_string('down'), ''); |
|||
$row[] = $icons; |
|||
|
|||
// Settings link, if available. |
|||
$settings = admin_get_root()->locate('qtypesetting' . $qtypename); |
|||
if ($settings instanceof admin_externalpage) { |
|||
$row[] = html_writer::link($settings->url, get_string('settings')); |
|||
} else if ($settings instanceof admin_settingpage) { |
|||
$row[] = html_writer::link(new moodle_url('/admin/settings.php', |
|||
array('section' => 'qtypesetting' . $qtypename)), get_string('settings')); |
|||
} else { |
|||
$row[] = ''; |
|||
} |
|||
|
|||
// Uninstall link, if available. |
|||
if ($needed[$qtypename]) { |
|||
$row[] = ''; |
|||
} else { |
|||
$uninstallurl = core_plugin_manager::instance()->get_uninstall_url('qtype_'.$qtypename, 'manage'); |
|||
if ($uninstallurl) { |
|||
$row[] = html_writer::link($uninstallurl, get_string('uninstallplugin', 'core_admin'), |
|||
array('title' => get_string('uninstallqtype', 'question'))); |
|||
} |
|||
} |
|||
|
|||
$table->add_data($row, $rowclass); |
|||
} |
|||
|
|||
$table->finish_output(); |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
function question_types_enable_disable_icons($qtypename, $createable) { |
|||
if ($createable) { |
|||
return question_type_icon_html('disable', $qtypename, 't/hide', |
|||
get_string('enabled', 'question'), get_string('disable')); |
|||
} else { |
|||
return question_type_icon_html('enable', $qtypename, 't/show', |
|||
get_string('disabled', 'question'), get_string('enable')); |
|||
} |
|||
} |
|||
|
|||
function question_type_icon_html($action, $qtypename, $icon, $alt, $tip) { |
|||
global $OUTPUT; |
|||
return $OUTPUT->action_icon(new moodle_url('/admin/qtypes.php', |
|||
array($action => $qtypename, 'sesskey' => sesskey())), |
|||
new pix_icon($icon, $alt, 'moodle', array('title' => '', 'class' => 'iconsmall')), |
|||
null, array('title' => $tip)); |
|||
} |
|||
|
@ -0,0 +1,84 @@ |
|||
<?php |
|||
|
|||
/////////////////////////////////////////////////////////////////////////// |
|||
// // |
|||
// This file is part of Moodle - http://moodle.org/ // |
|||
// Moodle - Modular Object-Oriented Dynamic Learning Environment // |
|||
// // |
|||
// 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/>. // |
|||
// // |
|||
/////////////////////////////////////////////////////////////////////////// |
|||
|
|||
/** |
|||
* @package moodle |
|||
* @subpackage registration |
|||
* @author Jerome Mouneyrac <jerome@mouneyrac.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL |
|||
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* |
|||
* The administrator is redirect to this page from the hub to confirm that the |
|||
* site has been registered. It is an administration page. The administrator |
|||
* should be using the same browser during all the registration process. |
|||
* This page save the token that the hub gave us, in order to call the hub |
|||
* directory later by web service. |
|||
*/ |
|||
|
|||
require('../../config.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$newtoken = optional_param('newtoken', '', PARAM_ALPHANUM); |
|||
$url = optional_param('url', '', PARAM_URL); |
|||
$hubname = optional_param('hubname', '', PARAM_TEXT); |
|||
$token = optional_param('token', '', PARAM_TEXT); |
|||
$error = optional_param('error', '', PARAM_ALPHANUM); |
|||
|
|||
admin_externalpage_setup('registrationmoodleorg'); |
|||
|
|||
if ($url !== HUB_MOODLEORGHUBURL) { |
|||
// Allow other plugins to confirm registration on hubs other than moodle.net . Plugins implementing this |
|||
// callback need to redirect or exit. See https://docs.moodle.org/en/Hub_registration . |
|||
$callbacks = get_plugins_with_function('hub_registration'); |
|||
foreach ($callbacks as $plugintype => $plugins) { |
|||
foreach ($plugins as $plugin => $callback) { |
|||
$callback('confirm'); |
|||
} |
|||
} |
|||
throw new moodle_exception('errorotherhubsnotsupported', 'hub'); |
|||
} |
|||
|
|||
if (!empty($error) and $error == 'urlalreadyexist') { |
|||
throw new moodle_exception('urlalreadyregistered', 'hub', |
|||
$CFG->wwwroot . '/' . $CFG->admin . '/registration/index.php'); |
|||
} |
|||
|
|||
//check that we are waiting a confirmation from this hub, and check that the token is correct |
|||
core\hub\registration::confirm_registration($token, $newtoken, $hubname); |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('registrationconfirmed', 'hub'), 3, 'main'); |
|||
|
|||
// Display notification message. |
|||
echo $OUTPUT->notification(get_string('registrationconfirmedon', 'hub'), 'notifysuccess'); |
|||
|
|||
// Display continue button. |
|||
$returnurl = !empty($SESSION->registrationredirect) ? clean_param($SESSION->registrationredirect, PARAM_LOCALURL) : null; |
|||
unset($SESSION->registrationredirect); |
|||
$continueurl = new moodle_url($returnurl ?: '/admin/registration/index.php'); |
|||
$continuebutton = $OUTPUT->render(new single_button($continueurl, get_string('continue'))); |
|||
$continuebutton = html_writer::tag('div', $continuebutton, array('class' => 'mdl-align')); |
|||
echo $continuebutton; |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
|
@ -0,0 +1,36 @@ |
|||
<?php |
|||
|
|||
/////////////////////////////////////////////////////////////////////////// |
|||
// // |
|||
// This file is part of Moodle - http://moodle.org/ // |
|||
// Moodle - Modular Object-Oriented Dynamic Learning Environment // |
|||
// // |
|||
// 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/>. // |
|||
// // |
|||
/////////////////////////////////////////////////////////////////////////// |
|||
|
|||
/** |
|||
* @package moodle |
|||
* @subpackage registration |
|||
* @author Jerome Mouneyrac <jerome@mouneyrac.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL |
|||
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* |
|||
* The forms needed by registration pages. |
|||
*/ |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
|||
|
|||
debugging('Support for alternative hubs has been removed from Moodle in 3.4. For communication with moodle.net ' . |
|||
'see lib/classes/hub/ .', DEBUG_DEVELOPER); |
@ -0,0 +1,126 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* @package moodle |
|||
* @subpackage registration |
|||
* @author Jerome Mouneyrac <jerome@mouneyrac.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL |
|||
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* |
|||
* This page displays the site registration form for Moodle.net. |
|||
* It handles redirection to the hub to continue the registration workflow process. |
|||
* It also handles update operation by web service. |
|||
*/ |
|||
|
|||
require_once('../../config.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
admin_externalpage_setup('registrationmoodleorg'); |
|||
|
|||
$unregistration = optional_param('unregistration', 0, PARAM_INT); |
|||
|
|||
if ($unregistration && \core\hub\registration::is_registered()) { |
|||
$siteunregistrationform = new \core\hub\site_unregistration_form(); |
|||
|
|||
if ($siteunregistrationform->is_cancelled()) { |
|||
redirect(new moodle_url('/admin/registration/index.php')); |
|||
} else if ($data = $siteunregistrationform->get_data()) { |
|||
\core\hub\registration::unregister($data->unpublishalladvertisedcourses, |
|||
$data->unpublishalluploadedcourses); |
|||
if (!\core\hub\registration::is_registered()) { |
|||
redirect(new moodle_url('/admin/registration/index.php')); |
|||
} |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('unregisterfrom', 'hub', 'Moodle.net'), 3, 'main'); |
|||
$siteunregistrationform->display(); |
|||
echo $OUTPUT->footer(); |
|||
exit; |
|||
} |
|||
|
|||
$isinitialregistration = \core\hub\registration::show_after_install(true); |
|||
if (!$returnurl = optional_param('returnurl', null, PARAM_LOCALURL)) { |
|||
$returnurl = $isinitialregistration ? '/admin/index.php' : '/admin/registration/index.php'; |
|||
} |
|||
|
|||
$siteregistrationform = new \core\hub\site_registration_form(); |
|||
$siteregistrationform->set_data(['returnurl' => $returnurl]); |
|||
if ($fromform = $siteregistrationform->get_data()) { |
|||
|
|||
// Save the settings. |
|||
\core\hub\registration::save_site_info($fromform); |
|||
|
|||
if (\core\hub\registration::is_registered()) { |
|||
if (\core\hub\registration::update_manual()) { |
|||
redirect(new moodle_url($returnurl)); |
|||
} |
|||
redirect(new moodle_url('/admin/registration/index.php', ['returnurl' => $returnurl])); |
|||
} else { |
|||
\core\hub\registration::register($returnurl); |
|||
// This method will redirect away. |
|||
} |
|||
|
|||
} |
|||
|
|||
// OUTPUT SECTION. |
|||
|
|||
echo $OUTPUT->header(); |
|||
|
|||
// Current status of registration on Moodle.net. |
|||
|
|||
$notificationtype = \core\output\notification::NOTIFY_ERROR; |
|||
if (\core\hub\registration::is_registered()) { |
|||
$lastupdated = \core\hub\registration::get_last_updated(); |
|||
if ($lastupdated == 0) { |
|||
$registrationmessage = get_string('pleaserefreshregistrationunknown', 'admin'); |
|||
} else if (\core\hub\registration::get_new_registration_fields()) { |
|||
$registrationmessage = get_string('pleaserefreshregistrationnewdata', 'admin'); |
|||
} else { |
|||
$lastupdated = userdate($lastupdated, get_string('strftimedate', 'langconfig')); |
|||
$registrationmessage = get_string('pleaserefreshregistration', 'admin', $lastupdated); |
|||
$notificationtype = \core\output\notification::NOTIFY_INFO; |
|||
} |
|||
echo $OUTPUT->notification($registrationmessage, $notificationtype); |
|||
} else if (!$isinitialregistration) { |
|||
$registrationmessage = get_string('registrationwarning', 'admin'); |
|||
echo $OUTPUT->notification($registrationmessage, $notificationtype); |
|||
} |
|||
|
|||
// Heading. |
|||
if (\core\hub\registration::is_registered()) { |
|||
echo $OUTPUT->heading(get_string('updatesite', 'hub', 'Moodle.net')); |
|||
} else if ($isinitialregistration) { |
|||
echo $OUTPUT->heading(get_string('completeregistration', 'hub')); |
|||
} else { |
|||
echo $OUTPUT->heading(get_string('registerwithmoodleorg', 'admin')); |
|||
} |
|||
|
|||
$renderer = $PAGE->get_renderer('core', 'admin'); |
|||
echo $renderer->moodleorg_registration_message(); |
|||
|
|||
$siteregistrationform->display(); |
|||
|
|||
if (\core\hub\registration::is_registered()) { |
|||
// Unregister link. |
|||
$unregisterhuburl = new moodle_url("/admin/registration/index.php", ['unregistration' => 1]); |
|||
echo html_writer::div(html_writer::link($unregisterhuburl, get_string('unregister', 'hub')), 'unregister'); |
|||
} else if ($isinitialregistration) { |
|||
echo html_writer::div(html_writer::link(new moodle_url($returnurl), get_string('skipregistration', 'hub')), 'skipregistration'); |
|||
} |
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,17 @@ |
|||
<?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/>. |
|||
|
|||
defined('MOODLE_INTERNAL') || die(); |
@ -0,0 +1,38 @@ |
|||
<?php |
|||
|
|||
/////////////////////////////////////////////////////////////////////////// |
|||
// // |
|||
// This file is part of Moodle - http://moodle.org/ // |
|||
// Moodle - Modular Object-Oriented Dynamic Learning Environment // |
|||
// // |
|||
// 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/>. // |
|||
// // |
|||
/////////////////////////////////////////////////////////////////////////// |
|||
|
|||
/** |
|||
* @package moodle |
|||
* @subpackage registration |
|||
* @author Jerome Mouneyrac <jerome@mouneyrac.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL |
|||
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* |
|||
* This page displays the site registration form for Moodle.org/MOOCH or for a different hub. |
|||
* It handles redirection to the hub to continue the registration workflow process. |
|||
* It also handles update operation by web service. |
|||
*/ |
|||
|
|||
|
|||
require_once('../../config.php'); |
|||
|
|||
redirect(new moodle_url('/admin/registration/index.php')); |
@ -0,0 +1,72 @@ |
|||
<?php |
|||
|
|||
/////////////////////////////////////////////////////////////////////////// |
|||
// // |
|||
// This file is part of Moodle - http://moodle.org/ // |
|||
// Moodle - Modular Object-Oriented Dynamic Learning Environment // |
|||
// // |
|||
// 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/>. // |
|||
// // |
|||
/////////////////////////////////////////////////////////////////////////// |
|||
|
|||
/** |
|||
* @package moodle |
|||
* @subpackage registration |
|||
* @author Jerome Mouneyrac <jerome@mouneyrac.com> |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL |
|||
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com |
|||
* |
|||
* The administrator is redirect to this page from the hub to renew a registration |
|||
* process because |
|||
*/ |
|||
|
|||
require('../../config.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$url = optional_param('url', '', PARAM_URL); |
|||
$token = optional_param('token', '', PARAM_TEXT); |
|||
|
|||
admin_externalpage_setup('registrationmoodleorg'); |
|||
|
|||
if ($url !== HUB_MOODLEORGHUBURL) { |
|||
// Allow other plugins to renew registration on hubs other than moodle.net . Plugins implementing this |
|||
// callback need to redirect or exit. See https://docs.moodle.org/en/Hub_registration . |
|||
$callbacks = get_plugins_with_function('hub_registration'); |
|||
foreach ($callbacks as $plugintype => $plugins) { |
|||
foreach ($plugins as $plugin => $callback) { |
|||
$callback('renew'); |
|||
} |
|||
} |
|||
throw new moodle_exception('errorotherhubsnotsupported', 'hub'); |
|||
} |
|||
|
|||
// Check that we are waiting a confirmation from this hub, and check that the token is correct. |
|||
\core\hub\registration::reset_site_identifier($token); |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('renewregistration', 'hub'), 3, 'main'); |
|||
$hublink = html_writer::tag('a', 'Moodle.net', array('href' => HUB_MOODLEORGHUBURL)); |
|||
|
|||
$deletedregmsg = get_string('previousregistrationdeleted', 'hub', $hublink); |
|||
|
|||
$button = new single_button(new moodle_url('/admin/registration/index.php'), |
|||
get_string('restartregistration', 'hub')); |
|||
$button->class = 'restartregbutton'; |
|||
|
|||
echo html_writer::tag('div', $deletedregmsg . $OUTPUT->render($button), |
|||
array('class' => 'mdl-align')); |
|||
|
|||
echo $OUTPUT->footer(); |
|||
|
|||
|
File diff suppressed because it is too large
@ -0,0 +1,120 @@ |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Provides an overview of installed reports |
|||
* |
|||
* Displays the list of found reports, their version (if found) and |
|||
* a link to uninstall the report. |
|||
* |
|||
* The code is based on admin/localplugins.php by David Mudrak. |
|||
* |
|||
* @package admin |
|||
* @copyright 2011 Petr Skoda {@link http://skodak.org} |
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
|||
*/ |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->libdir.'/adminlib.php'); |
|||
require_once($CFG->libdir.'/tablelib.php'); |
|||
|
|||
admin_externalpage_setup('managereports'); |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('reports')); |
|||
|
|||
/// Print the table of all installed report plugins |
|||
|
|||
$struninstall = get_string('uninstallplugin', 'core_admin'); |
|||
|
|||
$table = new flexible_table('reportplugins_administration_table'); |
|||
$table->define_columns(array('name', 'logstoressupported', 'version', 'uninstall')); |
|||
$table->define_headers(array(get_string('plugin'), get_string('logstoressupported', 'admin'), get_string('version'), |
|||
$struninstall)); |
|||
$table->define_baseurl($PAGE->url); |
|||
$table->set_attribute('id', 'reportplugins'); |
|||
$table->set_attribute('class', 'admintable generaltable'); |
|||
$table->setup(); |
|||
|
|||
$plugins = array(); |
|||
$availableplugins = core_component::get_plugin_list('report'); |
|||
foreach ($availableplugins as $plugin => $plugindir) { |
|||
if (get_string_manager()->string_exists('pluginname', 'report_' . $plugin)) { |
|||
$strpluginname = get_string('pluginname', 'report_' . $plugin); |
|||
} else { |
|||
$strpluginname = $plugin; |
|||
} |
|||
$plugins[$plugin] = $strpluginname; |
|||
} |
|||
core_collator::asort($plugins); |
|||
|
|||
$like = $DB->sql_like('plugin', '?', true, true, false, '|'); |
|||
$params = array('report|_%'); |
|||
$installed = $DB->get_records_select('config_plugins', "$like AND name = 'version'", $params); |
|||
$versions = array(); |
|||
foreach ($installed as $config) { |
|||
$name = preg_replace('/^report_/', '', $config->plugin); |
|||
$versions[$name] = $config->value; |
|||
if (!isset($plugins[$name])) { |
|||
$plugins[$name] = $name; |
|||
} |
|||
} |
|||
|
|||
$logmanager = get_log_manager(); |
|||
|
|||
foreach ($plugins as $plugin => $name) { |
|||
$uninstall = ''; |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('report_'.$plugin, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $struninstall); |
|||
} |
|||
|
|||
$stores = array(); |
|||
if (isset($availableplugins[$plugin])) { |
|||
$stores = $logmanager->get_supported_logstores('report_' . $plugin); |
|||
} |
|||
if ($stores === false) { |
|||
$supportedstores = get_string('logstorenotrequired', 'admin'); |
|||
} else if (!empty($stores)) { |
|||
$supportedstores = implode(', ', $stores); |
|||
} else { |
|||
$supportedstores = get_string('nosupportedlogstore', 'admin');; |
|||
} |
|||
|
|||
if (!isset($versions[$plugin])) { |
|||
if (file_exists("$CFG->dirroot/report/$plugin/version.php")) { |
|||
// not installed yet |
|||
$version = '?'; |
|||
} else { |
|||
// no version info available |
|||
$version = '-'; |
|||
} |
|||
} else { |
|||
$version = $versions[$plugin]; |
|||
if (file_exists("$CFG->dirroot/report/$plugin")) { |
|||
$version = $versions[$plugin]; |
|||
} else { |
|||
// somebody removed plugin without uninstall |
|||
$name = '<span class="notifyproblem">'.$name.' ('.get_string('missingfromdisk').')</span>'; |
|||
$version = $versions[$plugin]; |
|||
} |
|||
} |
|||
|
|||
$table->add_data(array($name, $supportedstores, $version, $uninstall)); |
|||
} |
|||
|
|||
$table->print_html(); |
|||
|
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,426 @@ |
|||
<?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/>. |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->dirroot . '/repository/lib.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
$repository = optional_param('repos', '', PARAM_ALPHANUMEXT); |
|||
$action = optional_param('action', '', PARAM_ALPHANUMEXT); |
|||
$sure = optional_param('sure', '', PARAM_ALPHA); |
|||
$downloadcontents = optional_param('downloadcontents', false, PARAM_BOOL); |
|||
|
|||
$display = true; // fall through to normal display |
|||
|
|||
$pagename = 'managerepositories'; |
|||
|
|||
if ($action == 'edit') { |
|||
$pagename = 'repositorysettings' . $repository; |
|||
} else if ($action == 'delete') { |
|||
$pagename = 'repositorydelete'; |
|||
} else if (($action == 'newon') || ($action == 'newoff')) { |
|||
$pagename = 'repositorynew'; |
|||
} |
|||
|
|||
// Need to remember this for form |
|||
$formaction = $action; |
|||
|
|||
// Check what visibility to show the new repository |
|||
if ($action == 'newon') { |
|||
$action = 'new'; |
|||
$visible = true; |
|||
} else if ($action == 'newoff') { |
|||
$action = 'new'; |
|||
$visible = false; |
|||
} |
|||
|
|||
admin_externalpage_setup($pagename); |
|||
|
|||
$sesskeyurl = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php?sesskey=' . sesskey(); |
|||
$baseurl = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php'; |
|||
|
|||
$configstr = get_string('manage', 'repository'); |
|||
|
|||
$return = true; |
|||
|
|||
if (!empty($action)) { |
|||
require_sesskey(); |
|||
} |
|||
|
|||
/** |
|||
* Helper function that generates a moodle_url object |
|||
* relevant to the repository |
|||
*/ |
|||
function repository_action_url($repository) { |
|||
global $baseurl; |
|||
return new moodle_url($baseurl, array('sesskey'=>sesskey(), 'repos'=>$repository)); |
|||
} |
|||
|
|||
if (($action == 'edit') || ($action == 'new')) { |
|||
$pluginname = ''; |
|||
if ($action == 'edit') { |
|||
$repositorytype = repository::get_type_by_typename($repository); |
|||
$classname = 'repository_' . $repositorytype->get_typename(); |
|||
$configs = call_user_func(array($classname, 'get_type_option_names')); |
|||
$plugin = $repositorytype->get_typename(); |
|||
// looking for instance to edit plugin name |
|||
$instanceoptions = call_user_func(array($classname, 'get_instance_option_names')); |
|||
if (empty($instanceoptions)) { |
|||
$params = array(); |
|||
$params['type'] = $plugin; |
|||
$instances = repository::get_instances($params); |
|||
if ($instance = array_pop($instances)) { |
|||
// use the one form db record |
|||
$pluginname = $instance->instance->name; |
|||
} |
|||
} |
|||
|
|||
} else { |
|||
$repositorytype = null; |
|||
$plugin = $repository; |
|||
$typeid = $repository; |
|||
} |
|||
$PAGE->set_pagetype('admin-repository-' . $plugin); |
|||
// display the edit form for this instance |
|||
$mform = new repository_type_form('', array('pluginname'=>$pluginname, 'plugin' => $plugin, 'instance' => $repositorytype, 'action' => $formaction)); |
|||
$fromform = $mform->get_data(); |
|||
|
|||
//detect if we create a new type without config (in this case if don't want to display a setting page during creation) |
|||
$nosettings = false; |
|||
if ($action == 'new') { |
|||
$adminconfignames = repository::static_function($repository, 'get_type_option_names'); |
|||
$nosettings = empty($adminconfignames); |
|||
} |
|||
// end setup, begin output |
|||
|
|||
if ($mform->is_cancelled()){ |
|||
redirect($baseurl); |
|||
} else if (!empty($fromform) || $nosettings) { |
|||
require_sesskey(); |
|||
if ($action == 'edit') { |
|||
$settings = array(); |
|||
foreach($configs as $config) { |
|||
if (!empty($fromform->$config)) { |
|||
$settings[$config] = $fromform->$config; |
|||
} else { |
|||
// if the config name is not appear in $fromform |
|||
// empty this config value |
|||
$settings[$config] = ''; |
|||
} |
|||
} |
|||
$instanceoptionnames = repository::static_function($repository, 'get_instance_option_names'); |
|||
if (!empty($instanceoptionnames)) { |
|||
if (array_key_exists('enablecourseinstances', $fromform)) { |
|||
$settings['enablecourseinstances'] = $fromform->enablecourseinstances; |
|||
} |
|||
else { |
|||
$settings['enablecourseinstances'] = 0; |
|||
} |
|||
if (array_key_exists('enableuserinstances', $fromform)) { |
|||
$settings['enableuserinstances'] = $fromform->enableuserinstances; |
|||
} |
|||
else { |
|||
$settings['enableuserinstances'] = 0; |
|||
} |
|||
} |
|||
$success = $repositorytype->update_options($settings); |
|||
} else { |
|||
$type = new repository_type($plugin, (array)$fromform, $visible); |
|||
$success = true; |
|||
if (!$repoid = $type->create()) { |
|||
$success = false; |
|||
} |
|||
$data = data_submitted(); |
|||
} |
|||
if ($success) { |
|||
// configs saved |
|||
core_plugin_manager::reset_caches(); |
|||
redirect($baseurl); |
|||
} else { |
|||
print_error('instancenotsaved', 'repository', $baseurl); |
|||
} |
|||
exit; |
|||
} else { |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('configplugin', 'repository_'.$plugin)); |
|||
$displaysettingform = true; |
|||
if ($action == 'edit') { |
|||
$typeoptionnames = repository::static_function($repository, 'get_type_option_names'); |
|||
$instanceoptionnames = repository::static_function($repository, 'get_instance_option_names'); |
|||
if (empty($typeoptionnames) && empty($instanceoptionnames)) { |
|||
$displaysettingform = false; |
|||
} |
|||
} |
|||
if ($displaysettingform){ |
|||
$OUTPUT->box_start(); |
|||
$mform->display(); |
|||
$OUTPUT->box_end(); |
|||
} |
|||
$return = false; |
|||
|
|||
// Display instances list and creation form |
|||
if ($action == 'edit') { |
|||
$instanceoptionnames = repository::static_function($repository, 'get_instance_option_names'); |
|||
if (!empty($instanceoptionnames)) { |
|||
repository::display_instances_list(context_system::instance(), $repository); |
|||
} |
|||
} |
|||
} |
|||
} else if ($action == 'show') { |
|||
if (!confirm_sesskey()) { |
|||
print_error('confirmsesskeybad', '', $baseurl); |
|||
} |
|||
$repositorytype = repository::get_type_by_typename($repository); |
|||
if (empty($repositorytype)) { |
|||
print_error('invalidplugin', 'repository', '', $repository); |
|||
} |
|||
$repositorytype->update_visibility(true); |
|||
core_plugin_manager::reset_caches(); |
|||
$return = true; |
|||
} else if ($action == 'hide') { |
|||
if (!confirm_sesskey()) { |
|||
print_error('confirmsesskeybad', '', $baseurl); |
|||
} |
|||
$repositorytype = repository::get_type_by_typename($repository); |
|||
if (empty($repositorytype)) { |
|||
print_error('invalidplugin', 'repository', '', $repository); |
|||
} |
|||
$repositorytype->update_visibility(false); |
|||
core_plugin_manager::reset_caches(); |
|||
$return = true; |
|||
} else if ($action == 'delete') { |
|||
$repositorytype = repository::get_type_by_typename($repository); |
|||
if ($sure) { |
|||
$PAGE->set_pagetype('admin-repository-' . $repository); |
|||
if (!confirm_sesskey()) { |
|||
print_error('confirmsesskeybad', '', $baseurl); |
|||
} |
|||
|
|||
if ($repositorytype->delete($downloadcontents)) { |
|||
core_plugin_manager::reset_caches(); |
|||
redirect($baseurl); |
|||
} else { |
|||
print_error('instancenotdeleted', 'repository', $baseurl); |
|||
} |
|||
exit; |
|||
} else { |
|||
echo $OUTPUT->header(); |
|||
|
|||
$message = get_string('confirmremove', 'repository', $repositorytype->get_readablename()); |
|||
|
|||
$output = $OUTPUT->box_start('generalbox', 'notice'); |
|||
$output .= html_writer::tag('p', $message); |
|||
|
|||
$removeurl = new moodle_url($sesskeyurl); |
|||
$removeurl->params(array( |
|||
'action' =>'delete', |
|||
'repos' => $repository, |
|||
'sure' => 'yes', |
|||
)); |
|||
|
|||
$removeanddownloadurl = new moodle_url($sesskeyurl); |
|||
$removeanddownloadurl->params(array( |
|||
'action' =>'delete', |
|||
'repos'=> $repository, |
|||
'sure' => 'yes', |
|||
'downloadcontents' => 1, |
|||
)); |
|||
|
|||
$output .= $OUTPUT->single_button($removeurl, get_string('continueuninstall', 'repository')); |
|||
$output .= $OUTPUT->single_button($removeanddownloadurl, get_string('continueuninstallanddownload', 'repository')); |
|||
$output .= $OUTPUT->single_button($baseurl, get_string('cancel')); |
|||
$output .= $OUTPUT->box_end(); |
|||
|
|||
echo $output; |
|||
|
|||
$return = false; |
|||
} |
|||
} else if ($action == 'moveup') { |
|||
$repositorytype = repository::get_type_by_typename($repository); |
|||
$repositorytype->move_order('up'); |
|||
} else if ($action == 'movedown') { |
|||
$repositorytype = repository::get_type_by_typename($repository); |
|||
$repositorytype->move_order('down'); |
|||
} else { |
|||
// If page is loaded directly |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('manage', 'repository')); |
|||
|
|||
// Get strings that are used |
|||
$strshow = get_string('on', 'repository'); |
|||
$strhide = get_string('off', 'repository'); |
|||
$strdelete = get_string('disabled', 'repository'); |
|||
$struninstall = get_string('uninstallplugin', 'core_admin'); |
|||
|
|||
$actionchoicesforexisting = array( |
|||
'show' => $strshow, |
|||
'hide' => $strhide, |
|||
'delete' => $strdelete |
|||
); |
|||
|
|||
$actionchoicesfornew = array( |
|||
'newon' => $strshow, |
|||
'newoff' => $strhide, |
|||
'delete' => $strdelete |
|||
); |
|||
|
|||
$output = ''; |
|||
$output .= $OUTPUT->box_start('generalbox'); |
|||
|
|||
// Set strings that are used multiple times |
|||
$settingsstr = get_string('settings'); |
|||
$disablestr = get_string('disable'); |
|||
|
|||
// Table to list plug-ins |
|||
$table = new html_table(); |
|||
$table->head = array(get_string('name'), get_string('isactive', 'repository'), get_string('order'), $settingsstr, $struninstall); |
|||
|
|||
$table->colclasses = array('leftalign', 'centeralign', 'centeralign', 'centeralign', 'centeralign', 'centeralign'); |
|||
$table->id = 'repositoriessetting'; |
|||
$table->data = array(); |
|||
$table->attributes['class'] = 'admintable generaltable'; |
|||
|
|||
// Get list of used plug-ins |
|||
$repositorytypes = repository::get_types(); |
|||
// Array to store plugins being used |
|||
$alreadyplugins = array(); |
|||
if (!empty($repositorytypes)) { |
|||
$totalrepositorytypes = count($repositorytypes); |
|||
$updowncount = 1; |
|||
foreach ($repositorytypes as $i) { |
|||
$settings = ''; |
|||
$typename = $i->get_typename(); |
|||
// Display edit link only if you can config the type or if it has multiple instances (e.g. has instance config) |
|||
$typeoptionnames = repository::static_function($typename, 'get_type_option_names'); |
|||
$instanceoptionnames = repository::static_function($typename, 'get_instance_option_names'); |
|||
|
|||
if (!empty($typeoptionnames) || !empty($instanceoptionnames)) { |
|||
// Calculate number of instances in order to display them for the Moodle administrator |
|||
if (!empty($instanceoptionnames)) { |
|||
$params = array(); |
|||
$params['context'] = array(context_system::instance()); |
|||
$params['onlyvisible'] = false; |
|||
$params['type'] = $typename; |
|||
$admininstancenumber = count(repository::static_function($typename, 'get_instances', $params)); |
|||
// site instances |
|||
$admininstancenumbertext = get_string('instancesforsite', 'repository', $admininstancenumber); |
|||
$params['context'] = array(); |
|||
$instances = repository::static_function($typename, 'get_instances', $params); |
|||
$courseinstances = array(); |
|||
$userinstances = array(); |
|||
|
|||
foreach ($instances as $instance) { |
|||
$repocontext = context::instance_by_id($instance->instance->contextid); |
|||
if ($repocontext->contextlevel == CONTEXT_COURSE) { |
|||
$courseinstances[] = $instance; |
|||
} else if ($repocontext->contextlevel == CONTEXT_USER) { |
|||
$userinstances[] = $instance; |
|||
} |
|||
} |
|||
// course instances |
|||
$instancenumber = count($courseinstances); |
|||
$courseinstancenumbertext = get_string('instancesforcourses', 'repository', $instancenumber); |
|||
|
|||
// user private instances |
|||
$instancenumber = count($userinstances); |
|||
$userinstancenumbertext = get_string('instancesforusers', 'repository', $instancenumber); |
|||
} else { |
|||
$admininstancenumbertext = ""; |
|||
$courseinstancenumbertext = ""; |
|||
$userinstancenumbertext = ""; |
|||
} |
|||
|
|||
$settings .= '<a href="' . $sesskeyurl . '&action=edit&repos=' . $typename . '">' . $settingsstr .'</a>'; |
|||
|
|||
$settings .= $OUTPUT->container_start('mdl-left'); |
|||
$settings .= '<br/>'; |
|||
$settings .= $admininstancenumbertext; |
|||
$settings .= '<br/>'; |
|||
$settings .= $courseinstancenumbertext; |
|||
$settings .= '<br/>'; |
|||
$settings .= $userinstancenumbertext; |
|||
$settings .= $OUTPUT->container_end(); |
|||
} |
|||
// Get the current visibility |
|||
if ($i->get_visible()) { |
|||
$currentaction = 'show'; |
|||
} else { |
|||
$currentaction = 'hide'; |
|||
} |
|||
|
|||
$select = new single_select(repository_action_url($typename, 'repos'), 'action', $actionchoicesforexisting, $currentaction, null, 'applyto' . basename($typename)); |
|||
$select->set_label(get_string('action'), array('class' => 'accesshide')); |
|||
// Display up/down link |
|||
$updown = ''; |
|||
$spacer = $OUTPUT->spacer(array('height'=>15, 'width'=>15)); // should be done with CSS instead |
|||
|
|||
if ($updowncount > 1) { |
|||
$updown .= "<a href=\"$sesskeyurl&action=moveup&repos=".$typename."\">"; |
|||
$updown .= $OUTPUT->pix_icon('t/up', get_string('moveup')) . "</a> "; |
|||
} |
|||
else { |
|||
$updown .= $spacer; |
|||
} |
|||
if ($updowncount < $totalrepositorytypes) { |
|||
$updown .= "<a href=\"$sesskeyurl&action=movedown&repos=".$typename."\">"; |
|||
$updown .= $OUTPUT->pix_icon('t/down', get_string('movedown')) . "</a> "; |
|||
} |
|||
else { |
|||
$updown .= $spacer; |
|||
} |
|||
|
|||
$updowncount++; |
|||
|
|||
$uninstall = ''; |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('repository_' . $typename, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $struninstall); |
|||
} |
|||
|
|||
$table->data[] = array($i->get_readablename(), $OUTPUT->render($select), $updown, $settings, $uninstall); |
|||
|
|||
if (!in_array($typename, $alreadyplugins)) { |
|||
$alreadyplugins[] = $typename; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Get all the plugins that exist on disk |
|||
$plugins = core_component::get_plugin_list('repository'); |
|||
if (!empty($plugins)) { |
|||
foreach ($plugins as $plugin => $dir) { |
|||
// Check that it has not already been listed |
|||
if (!in_array($plugin, $alreadyplugins)) { |
|||
$select = new single_select(repository_action_url($plugin, 'repos'), 'action', $actionchoicesfornew, 'delete', null, 'applyto' . basename($plugin)); |
|||
$select->set_label(get_string('action'), array('class' => 'accesshide')); |
|||
$uninstall = ''; |
|||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('repository_' . $plugin, 'manage')) { |
|||
$uninstall = html_writer::link($uninstallurl, $struninstall); |
|||
} |
|||
$table->data[] = array(get_string('pluginname', 'repository_'.$plugin), $OUTPUT->render($select), '', '', $uninstall); |
|||
} |
|||
} |
|||
} |
|||
|
|||
$output .= html_writer::table($table); |
|||
$output .= $OUTPUT->box_end(); |
|||
print $output; |
|||
$return = false; |
|||
} |
|||
|
|||
if ($return) { |
|||
redirect($baseurl); |
|||
} |
|||
echo $OUTPUT->footer(); |
@ -0,0 +1,167 @@ |
|||
<?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/>. |
|||
|
|||
require_once(__DIR__ . '/../config.php'); |
|||
require_once($CFG->dirroot . '/repository/lib.php'); |
|||
require_once($CFG->libdir . '/adminlib.php'); |
|||
|
|||
require_sesskey(); |
|||
|
|||
// id of repository |
|||
$edit = optional_param('edit', 0, PARAM_INT); |
|||
$new = optional_param('new', '', PARAM_PLUGIN); |
|||
$hide = optional_param('hide', 0, PARAM_INT); |
|||
$delete = optional_param('delete', 0, PARAM_INT); |
|||
$sure = optional_param('sure', '', PARAM_ALPHA); |
|||
$type = optional_param('type', '', PARAM_PLUGIN); |
|||
$downloadcontents = optional_param('downloadcontents', false, PARAM_BOOL); |
|||
|
|||
$context = context_system::instance(); |
|||
|
|||
$pagename = 'repositorycontroller'; |
|||
|
|||
if ($edit){ |
|||
$pagename = 'repositoryinstanceedit'; |
|||
} else if ($delete) { |
|||
$pagename = 'repositorydelete'; |
|||
} else if ($new) { |
|||
$pagename = 'repositoryinstancenew'; |
|||
} |
|||
|
|||
admin_externalpage_setup($pagename, '', null, new moodle_url('/admin/repositoryinstance.php')); |
|||
|
|||
$baseurl = new moodle_url("/$CFG->admin/repositoryinstance.php", array('sesskey'=>sesskey())); |
|||
|
|||
$parenturl = new moodle_url("/$CFG->admin/repository.php", array( |
|||
'sesskey'=>sesskey(), |
|||
'action'=>'edit', |
|||
)); |
|||
|
|||
if ($new) { |
|||
$parenturl->param('repos', $new); |
|||
} else { |
|||
$parenturl->param('repos', $type); |
|||
} |
|||
|
|||
$return = true; |
|||
|
|||
if (!empty($edit) || !empty($new)) { |
|||
if (!empty($edit)) { |
|||
$instance = repository::get_instance($edit); |
|||
if (!$instance->can_be_edited_by_user()) { |
|||
throw new repository_exception('nopermissiontoaccess', 'repository'); |
|||
} |
|||
$instancetype = repository::get_type_by_id($instance->options['typeid']); |
|||
$classname = 'repository_' . $instancetype->get_typename(); |
|||
$configs = $instance->get_instance_option_names(); |
|||
$plugin = $instancetype->get_typename(); |
|||
$typeid = $instance->options['typeid']; |
|||
} else { |
|||
$plugin = $new; |
|||
$typeid = null; |
|||
$instance = null; |
|||
} |
|||
|
|||
// display the edit form for this instance |
|||
$mform = new repository_instance_form('', array('plugin' => $plugin, 'typeid' => $typeid, 'instance' => $instance, 'contextid' => $context->id)); |
|||
// end setup, begin output |
|||
|
|||
if ($mform->is_cancelled()){ |
|||
redirect($parenturl); |
|||
exit; |
|||
} else if ($fromform = $mform->get_data()){ |
|||
if ($edit) { |
|||
$settings = array(); |
|||
$settings['name'] = $fromform->name; |
|||
if (!$instance->readonly) { |
|||
foreach($configs as $config) { |
|||
if (isset($fromform->$config)) { |
|||
$settings[$config] = $fromform->$config; |
|||
} else { |
|||
$settings[$config] = null; |
|||
} |
|||
} |
|||
} |
|||
$success = $instance->set_option($settings); |
|||
} else { |
|||
$success = repository::static_function($plugin, 'create', $plugin, 0, $context, $fromform); |
|||
$data = data_submitted(); |
|||
} |
|||
if ($success) { |
|||
core_plugin_manager::reset_caches(); |
|||
redirect($parenturl); |
|||
} else { |
|||
print_error('instancenotsaved', 'repository', $parenturl); |
|||
} |
|||
exit; |
|||
} else { |
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->heading(get_string('configplugin', 'repository_'.$plugin)); |
|||
echo $OUTPUT->box_start(); |
|||
$mform->display(); |
|||
echo $OUTPUT->box_end(); |
|||
$return = false; |
|||
} |
|||
} else if (!empty($hide)) { |
|||
$instance = repository::get_type_by_typename($hide); |
|||
$instance->hide(); |
|||
core_plugin_manager::reset_caches(); |
|||
$return = true; |
|||
} else if (!empty($delete)) { |
|||
$instance = repository::get_instance($delete); |
|||
if ($instance->readonly) { |
|||
// If you try to delete an instance set as readonly, display an error message. |
|||
throw new repository_exception('readonlyinstance', 'repository'); |
|||
} else if (!$instance->can_be_edited_by_user()) { |
|||
throw new repository_exception('nopermissiontoaccess', 'repository'); |
|||
} |
|||
if ($sure) { |
|||
if ($instance->delete($downloadcontents)) { |
|||
$deletedstr = get_string('instancedeleted', 'repository'); |
|||
core_plugin_manager::reset_caches(); |
|||
redirect($parenturl, $deletedstr, 3); |
|||
} else { |
|||
print_error('instancenotdeleted', 'repository', $parenturl); |
|||
} |
|||
exit; |
|||
} |
|||
|
|||
echo $OUTPUT->header(); |
|||
echo $OUTPUT->box_start('generalbox', 'notice'); |
|||
$continueurl = new moodle_url($baseurl, array( |
|||
'type' => $type, |
|||
'delete' => $delete, |
|||
'sure' => 'yes', |
|||
)); |
|||
$continueanddownloadurl = new moodle_url($continueurl, array( |
|||
'downloadcontents' => 1 |
|||
)); |
|||
$message = get_string('confirmdelete', 'repository', $instance->name); |
|||
echo html_writer::tag('p', $message); |
|||
|
|||
echo $OUTPUT->single_button($continueurl, get_string('continueuninstall', 'repository')); |
|||
echo $OUTPUT->single_button($continueanddownloadurl, get_string('continueuninstallanddownload', 'repository')); |
|||
echo $OUTPUT->single_button($parenturl, get_string('cancel')); |
|||
|
|||
echo $OUTPUT->box_end(); |
|||
|
|||
$return = false; |
|||
} |
|||
|
|||
if (!empty($return)) { |
|||
redirect($parenturl); |
|||
} |
|||
echo $OUTPUT->footer(); |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue