Compare commits

..

718 Commits

Author SHA1 Message Date
moodler 65d75e1ba0 Bumping version for 1.8.9 release. Thinking we might have to go to x.x.10 for the first time with this branch! 2009-05-15 09:40:59 +00:00
skodak 5592bd1276 MDL-19194 fixed regression - recursive cretion of dirs on win32 works again; backported from MOODLE_19_STABLE 2009-05-15 07:23:07 +00:00
fmarier 8461061743 Fix typo 2009-05-15 03:37:37 +00:00
moodlerobot c7d59ba103 Updated the 18 build version to 20090515 2009-05-15 00:40:34 +00:00
moodlerobot 01194e5659 Automatic installer.php lang files by installer_builder (20090515) 2009-05-15 00:37:49 +00:00
moodlerobot 3b2fbd7f2a Updated the 18 build version to 20090514 2009-05-14 00:40:10 +00:00
moodlerobot 804b2c9b2a Automatic installer.php lang files by installer_builder (20090514) 2009-05-14 00:37:37 +00:00
moodlerobot 7199229e75 Updated the 18 build version to 20090513 2009-05-13 00:38:03 +00:00
stronk7 e02f1a7a5a MDL-19161 - DB 2.0 reqs. Updated to fulfil 2.0 Roadmap ; backported from HEAD 2009-05-12 09:30:40 +00:00
nicolasconnault 0b547d9d9f MDL-8605 New script (web and CLI) for restoring user profile pictures that failed to move to the new folder during upgrade. 2009-05-12 07:46:44 +00:00
nicolasconnault ca49f636b6 file fixuserpix.php was added on branch MOODLE_18_STABLE on 2009-05-12 07:46:44 +0000 2009-05-12 07:46:08 +00:00
moodlerobot a1c6b65182 Updated the 18 build version to 20090512 2009-05-12 00:38:52 +00:00
fmarier 41c92ff555 MDL-19156: auth/fc: clarifying the licensing terms as per author's email 2009-05-11 23:37:37 +00:00
moodlerobot c02629eacc Updated the 18 build version to 20090511 2009-05-11 00:38:01 +00:00
moodlerobot 43a630cee5 Updated the 18 build version to 20090510 2009-05-10 00:38:11 +00:00
moodlerobot 506ebce3b5 Automatic installer.php lang files by installer_builder (20090510) 2009-05-10 00:35:36 +00:00
fmarier 66705bc9e6 MDL-19117 clarification to the license 2009-05-09 04:32:56 +00:00
moodlerobot c2014af3f8 Updated the 18 build version to 20090509 2009-05-09 00:39:04 +00:00
skodak e7b5ef8566 MDL-18311 fixed magic quotes trouble when moving courses; backported from MOODLE_19_STABLE 2009-05-08 21:06:15 +00:00
skodak 47cac9922a MDL-18744 cas fix, credit goes to Thibault Le Meur 2009-05-08 07:55:01 +00:00
moodlerobot 77d6c3e061 Updated the 18 build version to 20090508 2009-05-08 00:38:03 +00:00
gbateson ffe7588d45 when searhcing for urls of next quiz, remove requirement for navigation buttons to have class="NavButton" 2009-05-07 23:01:19 +00:00
skodak 7171099926 MDL-2307 fixing unzip regression, sorry 2009-05-07 16:45:07 +00:00
skodak ff933bfa8f MDL-2307 fixing unzip regression, sorry 2009-05-07 16:44:48 +00:00
ericmerrill 6939b5c1a4 MDL-19092 Fixed the user login view, which was incomplete and broken on some browsers 2009-05-07 12:21:20 +00:00
skodak b5469f78cb MDL-2307 improved file name cleanup during unzip; backported from MOODLE-19_STABLE 2009-05-07 10:48:28 +00:00
nicolasconnault 8cc0d4ef93 MDL-10201 Wrapping label text in a span instead of div, and giving it a class so that it can be found by hide/show AJAX code. Backported from MOODLE_19_STABLE 2009-05-07 09:49:38 +00:00
fmarier 7e6369972d MDL-19096 include a copy of the GPL 2009-05-07 03:04:47 +00:00
fmarier 2c81d559bd file COPYING.txt was added on branch MOODLE_18_STABLE on 2009-05-07 03:04:47 +0000 2009-05-07 03:03:25 +00:00
moodlerobot 11e09e01aa Updated the 18 build version to 20090507 2009-05-07 00:37:41 +00:00
stronk7 4d2cf40ef9 MDL-14463 search/order - comments cleanup + make it cross-db + delete unused column from query ; backported from HEAD 2009-05-06 17:26:34 +00:00
stronk7 bee3f66eb0 MDL-18243, MDL-16961 data module filter - make it cross-db by using sql_compare_text() 2009-05-06 15:54:04 +00:00
stronk7 42a7f43ee2 MDL-18058 glossary rates - secured ; backported from HEAD 2009-05-06 09:33:06 +00:00
skodak 604ecf1515 MDL-2307, MDL-18415 - improved unzipping - now properly removing forbidden chars and symlinks; backported from MOODLE_19_STABLE 2009-05-06 08:49:31 +00:00
moodlerobot e7dd9cd247 Updated the 18 build version to 20090506 2009-05-06 00:39:33 +00:00
moodlerobot e32fa5fdb1 Automatic installer.php lang files by installer_builder (20090506) 2009-05-06 00:36:35 +00:00
moodlerobot 50689ece08 Updated the 18 build version to 20090505 2009-05-05 00:39:25 +00:00
nicolasconnault 9ea5a54685 MDL-10201 Back-ported from MOODLE_19_STABLE 2009-05-04 11:52:51 +00:00
moodlerobot 1c0cdbf585 Updated the 18 build version to 20090504 2009-05-04 00:40:29 +00:00
moodlerobot 1119468291 Updated the 18 build version to 20090503 2009-05-03 00:40:55 +00:00
moodlerobot ee8c88d560 Updated the 18 build version to 20090502 2009-05-02 00:39:43 +00:00
moodlerobot a746558c7b Updated the 18 build version to 20090501 2009-05-01 00:40:22 +00:00
moodlerobot 044410476a Updated the 18 build version to 20090430 2009-04-30 00:38:46 +00:00
moodlerobot c9e3c4eb64 Updated the 18 build version to 20090429 2009-04-29 00:41:21 +00:00
moodlerobot ce51dc43bd Updated the 18 build version to 20090428 2009-04-28 00:43:53 +00:00
moodlerobot 567952799e Updated the 18 build version to 20090427 2009-04-27 00:37:37 +00:00
moodlerobot abec7edecb Updated the 18 build version to 20090426 2009-04-26 00:37:32 +00:00
stronk7 21fc085746 MDL-18940 meta description in main page - render multilang summary properly. Backported from 19_STABLE 2009-04-25 21:19:47 +00:00
moodlerobot e1413627d5 Updated the 18 build version to 20090425 2009-04-25 00:36:44 +00:00
moodlerobot 7e94839b54 Updated the 18 build version to 20090424 2009-04-24 00:37:23 +00:00
moodlerobot f695451963 Updated the 18 build version to 20090423 2009-04-23 00:39:34 +00:00
moodlerobot 2e83ee535a Updated the 18 build version to 20090422 2009-04-22 00:47:16 +00:00
moodlerobot 0612a16255 Updated the 18 build version to 20090421 2009-04-21 00:38:50 +00:00
stronk7 bdcc2476cf MDL-18893 TeX filter - fine tune "def" commands + add some more commands to blacklist (from Kopete).
Thanks to Mauno Korpelainen and Steve Mayer. Backported from 19_STABLE
2009-04-20 21:29:07 +00:00
moodlerobot 3f6ce53dea Updated the 18 build version to 20090420 2009-04-20 00:35:15 +00:00
gbateson 30ca2004f6 MDL-18880: only insert media players for swf URLs if $CFG->filter_mediaplugin_enable_swf is set 2009-04-19 23:51:09 +00:00
moodlerobot 094593edb4 Updated the 18 build version to 20090419 2009-04-19 00:35:39 +00:00
moodlerobot 950d680645 Updated the 18 build version to 20090418 2009-04-18 00:36:15 +00:00
gbateson 2cc212c4fd MDL-17426: removing superflous link to "Selecting a report" 2009-04-17 02:24:03 +00:00
gbateson 2da979b64d MDL-18883: fix setting of absolute urls for images in subfolders of course files 2009-04-17 01:44:37 +00:00
moodlerobot eb80e65d98 Updated the 18 build version to 20090417 2009-04-17 00:37:47 +00:00
moodlerobot 1917283bb5 Updated the 18 build version to 20090416 2009-04-16 00:37:08 +00:00
moodlerobot 36e5204979 Automatic installer.php lang files by installer_builder (20090416) 2009-04-16 00:34:27 +00:00
moodlerobot 3fce89ce50 Updated the 18 build version to 20090415 2009-04-15 00:40:08 +00:00
moodlerobot a7e3612d84 Automatic installer.php lang files by installer_builder (20090415) 2009-04-15 00:36:27 +00:00
moodlerobot cff71947e6 Updated the 18 build version to 20090414 2009-04-14 00:46:09 +00:00
moodlerobot 87511275ad Updated the 18 build version to 20090413 2009-04-13 00:45:19 +00:00
moodlerobot 46736d842a Updated the 18 build version to 20090412 2009-04-12 01:06:14 +00:00
moodlerobot 3d27822071 Updated the 18 build version to 20090411 2009-04-11 00:37:20 +00:00
moodlerobot d73dc24f17 Automatic installer.php lang files by installer_builder (20090411) 2009-04-11 00:32:51 +00:00
moodlerobot 32ace66be6 Updated the 18 build version to 20090410 2009-04-10 00:35:59 +00:00
moodlerobot 28d3cd6e8e Updated the 18 build version to 20090409 2009-04-09 00:35:57 +00:00
moodlerobot 58ae23893b Automatic installer.php lang files by installer_builder (20090409) 2009-04-09 00:33:22 +00:00
moodlerobot d319920857 Updated the 18 build version to 20090408 2009-04-08 00:36:23 +00:00
moodlerobot 76254c0477 Automatic installer.php lang files by installer_builder (20090408) 2009-04-08 00:33:11 +00:00
moodlerobot 3be9343138 Updated the 18 build version to 20090407 2009-04-07 00:37:20 +00:00
dongsheng c917b1a105 "MDL-6926, fix php notice and replace double quote with single quote to reduce memory usage, thanks, Anthony" 2009-04-06 06:12:29 +00:00
moodlerobot a028e77e30 Updated the 18 build version to 20090406 2009-04-06 00:36:47 +00:00
skodak 08369b8511 MDL-18384 better symlink support, do not recurse symlinks when deleting - patch by Matt Oquist, thanks; backported from MOODLE_19_STABLE 2009-04-05 20:56:22 +00:00
skodak 1aa4084b07 MDL-18771 fixed db quoting; backported from MOODLE_19_STABLE 2009-04-05 20:26:50 +00:00
moodlerobot 5e8a3df88e Updated the 18 build version to 20090405 2009-04-05 00:35:55 +00:00
moodlerobot ba45bd83d8 Updated the 18 build version to 20090404 2009-04-04 00:33:17 +00:00
moodlerobot e71850acb6 Updated the 18 build version to 20090403 2009-04-03 00:36:23 +00:00
moodlerobot be508b4cf8 Automatic installer.php lang files by installer_builder (20090403) 2009-04-03 00:33:35 +00:00
fmarier 9b72cbf773 html2text: MDL-17542 switch to a GPL-compatible html2text library 2009-04-02 23:14:58 +00:00
moodlerobot 0cd4cd2961 Updated the 18 build version to 20090402 2009-04-02 00:35:06 +00:00
moodlerobot eaaed6e6f4 Automatic installer.php lang files by installer_builder (20090402) 2009-04-02 00:32:36 +00:00
moodlerobot ffcbae6150 Updated the 18 build version to 20090401 2009-04-01 00:35:40 +00:00
skodak cc9bf1486e MDL-18552 different TeX trouble fix; backported from HEAD 2009-03-31 12:20:55 +00:00
skodak 17b2352193 file lib.php was added on branch MOODLE_18_STABLE on 2009-03-31 12:20:57 +0000 2009-03-31 10:03:10 +00:00
moodlerobot b877ae6d21 Updated the 18 build version to 20090331 2009-03-31 00:38:17 +00:00
gbateson e45cfdec20 when search for media players, remove requirment for <object> tag to contain a space, and make closing </A> tag lowercase 2009-03-30 07:11:51 +00:00
moodlerobot b4e1433d38 Updated the 18 build version to 20090330 2009-03-30 00:43:02 +00:00
moodlerobot 8885e891f0 Updated the 18 build version to 20090329 2009-03-29 00:38:28 +00:00
moodlerobot f66815e06a Updated the 18 build version to 20090328 2009-03-27 23:35:32 +00:00
moodlerobot 8058ca4fb2 Automatic installer.php lang files by installer_builder (20090328) 2009-03-27 23:33:01 +00:00
fmarier 7d6b6b1a16 mod/resource: MDL-18691 allow custom resource types to specify their name in their own lang directory
Before this change, the full name of the resource type had to be stored in the "resource" namespace (for example in /mod/resource/lang/en_utf8/resource.php).

Now it can be put in the "resource_foo" namespace:

e.g. in /mod/resource/type/foo/lang/en_utf8/resource_foo.php:

<?php
  $string['resourcetypefoo'] = 'Link to a Foo Bar document';
?>
2009-03-27 03:27:19 +00:00
moodlerobot a0b1f3342b Updated the 18 build version to 20090327 2009-03-26 23:36:34 +00:00
stronk7 13000c1379 MDL-18552 TeX filter - add string ; backported from HEAD 2009-03-26 21:37:58 +00:00
stronk7 899ccfe26f MDL-18552 TeX filter - blacklist unsecure commands + protect texdebug ; backported from HEAD 2009-03-26 19:19:46 +00:00
moodlerobot 2a04f622fb Updated the 18 build version to 20090326 2009-03-25 23:35:18 +00:00
poltawski 8fe8df969e lib/email_to_user MDL-10384 Recipeint names broken
When emailcharset is not utf8 the charset conversion was breaking
recipient/replyto names

thanks to Tatsuya Shirai
backported from MOODLE_19_STABLE
2009-03-25 09:17:26 +00:00
moodlerobot 32bf9c271e Updated the 18 build version to 20090325 2009-03-24 23:34:51 +00:00
moodlerobot 3dc9d883ab Updated the 18 build version to 20090324 2009-03-23 23:35:10 +00:00
tjhunt d5c0dec1cd quiz: MDL-18635 log every single hit to mod/quiz/attempts.php
I don't know why the quiz only logged every 10 minutes. No other part of Moodle worked like that. However, it has always been like that and I did not have a good reason to change it until now.

What was a problem becuase it made it harder to catch people doing a primitive DOS attack against the server by hitting Reload repeatedly.
2009-03-23 01:59:24 +00:00
moodlerobot 103965d609 Updated the 18 build version to 20090323 2009-03-22 23:43:12 +00:00
moodlerobot b6feb2ab78 Automatic installer.php lang files by installer_builder (20090323) 2009-03-22 23:38:47 +00:00
moodlerobot 49f9224222 Updated the 18 build version to 20090322 2009-03-21 23:39:26 +00:00
moodlerobot ea4c27489e Updated the 18 build version to 20090321 2009-03-20 23:43:05 +00:00
moodlerobot 82891a2810 Updated the 18 build version to 20090320 2009-03-19 23:35:54 +00:00
moodlerobot c82c86d3ea Automatic installer.php lang files by installer_builder (20090320) 2009-03-19 23:33:16 +00:00
moodlerobot 8227e923fd Updated the 18 build version to 20090319 2009-03-18 23:36:30 +00:00
danmarsden 44ac2f4d89 MDL-18564 choice - fix grammar - thanks to Ray Lawrence for the report merged from HEAD 2009-03-18 23:05:56 +00:00
moodlerobot cbe97e2692 Updated the 18 build version to 20090318 2009-03-17 23:39:59 +00:00
moodlerobot fa748dcdd1 Automatic installer.php lang files by installer_builder (20090318) 2009-03-17 23:35:34 +00:00
moodlerobot 1c79d89a7e Updated the 18 build version to 20090317 2009-03-16 23:36:20 +00:00
stronk7 65e428397d MDL-18576 timezones - info updated to tzdata2009c ; backported from HEAD 2009-03-16 17:56:20 +00:00
tjhunt d20f688bbb qtypes: MDL-18559 questions showing penalty information when they shouldn't.
We had a !== when it should have been !=, and our constants were defined as strings not ints. This problem has been there since forever, but no one had noticed before. Thanks to Alan Trick for finally spotting it!
2009-03-16 01:53:05 +00:00
moodlerobot cf3ea39a4f Updated the 18 build version to 20090316 2009-03-15 23:34:04 +00:00
skodak 57317806b9 MDL-18265 fixed regression in menu field - discovered and patched by Vlas Voloshin, thanks!; merged from MOODLE_19_STABLE 2009-03-15 13:45:57 +00:00
moodlerobot ccbe95b8cd Updated the 18 build version to 20090315 2009-03-14 23:38:31 +00:00
moodlerobot 4efcefd50f Automatic installer.php lang files by installer_builder (20090315) 2009-03-14 23:35:54 +00:00
moodlerobot 2c52512f16 Updated the 18 build version to 20090314 2009-03-13 23:34:29 +00:00
moodlerobot e5fab0d257 Updated the 18 build version to 20090313 2009-03-12 23:35:12 +00:00
moodlerobot 394b4069b1 Updated the 18 build version to 20090312 2009-03-11 23:35:29 +00:00
danmarsden b3f87b6b1a MDL-18460 - SCORM Report - remove duplicated header - thanks Vlas Voloshin for the report. - merged from HEAD 2009-03-11 01:19:35 +00:00
moodlerobot e2b00e8ac1 Updated the 18 build version to 20090311 2009-03-10 23:34:54 +00:00
moodlerobot 5eb7c5195b Automatic installer.php lang files by installer_builder (20090311) 2009-03-10 23:32:08 +00:00
moodlerobot 2d7baa2ab2 Updated the 18 build version to 20090310 2009-03-09 23:35:22 +00:00
moodlerobot 7906cb1617 Automatic installer.php lang files by installer_builder (20090310) 2009-03-09 23:32:53 +00:00
moodlerobot 58b6781967 Updated the 18 build version to 20090309 2009-03-08 23:40:28 +00:00
moodlerobot 2832c32c6b Updated the 18 build version to 20090308 2009-03-07 23:38:16 +00:00
skodak 79feabdc54 MDL-18265 fixed regressions by hardfreeze security workaround - defaults were overriding locked values - backported from HEAD 2009-03-07 21:02:38 +00:00
moodlerobot 87a2d989ba Updated the 18 build version to 20090307 2009-03-06 23:33:45 +00:00
moodlerobot 77974be16f Updated the 18 build version to 20090306 2009-03-05 23:39:44 +00:00
moodlerobot 98cf5b5527 Automatic installer.php lang files by installer_builder (20090306) 2009-03-05 23:37:11 +00:00
moodlerobot 8630b7b8fa Updated the 18 build version to 20090305 2009-03-04 23:38:37 +00:00
moodlerobot 1b398350cf Automatic installer.php lang files by installer_builder (20090305) 2009-03-04 23:36:04 +00:00
moodlerobot 9aac0bdfb1 Updated the 18 build version to 20090304 2009-03-03 23:36:39 +00:00
moodlerobot f5a117e6ec Automatic installer.php lang files by installer_builder (20090304) 2009-03-03 23:33:53 +00:00
moodlerobot 997d166f7b Updated the 18 build version to 20090303 2009-03-02 23:34:38 +00:00
piers 306e9a5057 MDL-18412 - fixed incorrect config var name. thanks Anthony. backport 1.8. 2009-03-02 23:23:19 +00:00
moodlerobot 1473dd77c3 Updated the 18 build version to 20090302 2009-03-01 23:35:12 +00:00
moodlerobot 0e370c6489 Updated the 18 build version to 20090301 2009-02-28 23:39:09 +00:00
moodlerobot 1d24da74e8 Updated the 18 build version to 20090228 2009-02-27 23:34:17 +00:00
moodlerobot 286df7a18c Updated the 18 build version to 20090227 2009-02-26 23:34:06 +00:00
piers a7e39a4f82 MDL-18148 - AICC compliance fixes from Martin Holden. backport 1.8. 2009-02-26 16:39:40 +00:00
moodlerobot d5fa0471c5 Updated the 18 build version to 20090226 2009-02-25 23:36:02 +00:00
moodlerobot 71524486db Automatic installer.php lang files by installer_builder (20090226) 2009-02-25 23:33:38 +00:00
piers 10b7c5f95c MDL-18212 - switch to addslashes_js - thanks Tim. Backport 1.8. 2009-02-25 23:13:53 +00:00
skodak 45890b7eb4 MDL-18365 fixed quoting 2009-02-25 22:26:24 +00:00
moodlerobot 28693deac8 Updated the 18 build version to 20090225 2009-02-24 23:34:54 +00:00
moodlerobot 73ec97c06b Automatic installer.php lang files by installer_builder (20090225) 2009-02-24 23:32:08 +00:00
moodlerobot d3d3cb86d6 Updated the 18 build version to 20090224 2009-02-23 23:34:14 +00:00
skodak e68b133d62 MDL-18348 CVE-2007-3215 2009-02-23 07:46:50 +00:00
moodlerobot 0a779261c8 Updated the 18 build version to 20090223 2009-02-22 23:34:18 +00:00
moodlerobot b2fbd411d9 Updated the 18 build version to 20090222 2009-02-21 23:33:58 +00:00
moodlerobot 0b18091590 Updated the 18 build version to 20090221 2009-02-20 23:34:02 +00:00
moodlerobot f5a764a35c Automatic installer.php lang files by installer_builder (20090221) 2009-02-20 23:31:37 +00:00
dongsheng 5c18bc078d "MDL-18223, add a language string for spamcleaner" 2009-02-20 08:31:43 +00:00
dongsheng f2a19d7601 "MDL-18223, backport spamcleaner to moodle 1.8" 2009-02-20 07:38:53 +00:00
moodlerobot 58e3d68846 Updated the 18 build version to 20090220 2009-02-19 23:34:21 +00:00
moodlerobot c93c4acefe Automatic installer.php lang files by installer_builder (20090220) 2009-02-19 23:31:46 +00:00
skodak 82175fb502 MDL-18039 fixed footer docs link; backported from HEAD 2009-02-19 07:33:30 +00:00
skodak bb04106c41 MDL-18274 fixed lang string, thanks Helen; backported from HEAD 2009-02-19 07:22:08 +00:00
moodlerobot f7e96073b4 Updated the 18 build version to 20090219 2009-02-18 23:34:28 +00:00
moodlerobot 17e070e261 Automatic installer.php lang files by installer_builder (20090219) 2009-02-18 23:31:55 +00:00
stronk7 9d4222bb7f MDL-18302 filterlib - fixed rebuild of nested ignoretags ; backported from HEAD 2009-02-18 11:04:35 +00:00
moodlerobot d2f4b686fd Updated the 18 build version to 20090218 2009-02-17 23:34:50 +00:00
moodlerobot bb66bc469c Automatic installer.php lang files by installer_builder (20090218) 2009-02-17 23:32:05 +00:00
moodlerobot 527b1d3474 Updated the 18 build version to 20090217 2009-02-16 23:33:54 +00:00
moodlerobot 15f4610a57 Updated the 18 build version to 20090216 2009-02-15 23:33:55 +00:00
skodak e613a1aacb MDL-18258 fixed legacy type and improved risky default course role hints; backported from HEAD 2009-02-15 18:45:42 +00:00
skodak 0ea8ab74a2 MDL-18039 xhtml strict fixes 2009-02-15 17:40:42 +00:00
skodak 66fbfc95b7 MDL-18039 bacporting security overview report to 1.8.x 2009-02-15 17:28:55 +00:00
iarenaza b74316986b Cache LDAP connections: MDL-18130 Properly handle open LDAP connections.
Both CAS and LDAP auth plugins open new connections to the LDAP server
to get the user account details. While this is the desired behaviour
for regular logins (we probably don't have an already open connection
to the LDAP server), this is a ressource hog when we are doing user
synchronization, as the closed connections remain in the TCP_WAIT
state for a while before the server can reuse them. If we are syncing
a lot of users, we can make the server run out of available TCP
ressources.

So we cache the connection the first time we establish it and return
the same connection handle everytime, unless we've closed all the
'open' connections, or the auth object is destroyed.

In addition to that, there were a few missing calls to ldap_close().
2009-02-15 15:33:21 +00:00
moodlerobot a33b386e79 Updated the 18 build version to 20090215 2009-02-14 23:32:54 +00:00
stronk7 d3d4056087 MDL-9796 install - delete dataroot's env info (shouldn't exist) to force check against released one 2009-02-14 11:03:42 +00:00
moodlerobot ac04258a92 Updated the 18 build version to 20090214 2009-02-13 23:33:45 +00:00
stronk7 6326668d2b MDL-9796 upgrade & env - delete dataroot's environmetal info to force check against released one 2009-02-13 15:45:05 +00:00
stronk7 168bbfa435 MDL-18227 - Ignoring all non numeric rates. 2009-02-13 11:02:12 +00:00
moodlerobot 5aa35fd087 Updated the 18 build version to 20090213 2009-02-12 23:33:57 +00:00
moodlerobot 4f810e39ad Automatic installer.php lang files by installer_builder (20090213) 2009-02-12 23:31:35 +00:00
moodlerobot 66d48264d0 Updated the 18 build version to 20090212 2009-02-12 00:36:17 +00:00
moodlerobot 2a5c20e237 Automatic installer.php lang files by installer_builder (20090212) 2009-02-12 00:31:46 +00:00
moodlerobot c99691f2de Updated the 18 build version to 20090211 2009-02-11 00:16:19 +00:00
moodlerobot 97f4847f35 Updated the 18 build version to 20090210 2009-02-09 23:43:20 +00:00
moodlerobot 5ae1e401db Updated the 18 build version to 20090209 2009-02-08 23:35:48 +00:00
moodlerobot 3e1bc1a46e Automatic installer.php lang files by installer_builder (20090209) 2009-02-08 23:33:41 +00:00
skodak ee756bc391 MDL-9796 fixed error array when environment file broken; merged from MOODLE_19_STABLE 2009-02-08 21:34:24 +00:00
moodlerobot d36f86fc03 Updated the 18 build version to 20090208 2009-02-07 23:39:28 +00:00
stronk7 a69f581c04 MDL-18165 filterlib - Use one exclusive separator, instead of "." (dot) to avoid saved tags to match with phrases being processed ; backported from HEAD 2009-02-07 01:01:06 +00:00
moodlerobot 4fb64b5080 Updated the 18 build version to 20090207 2009-02-06 23:38:29 +00:00
jerome 0719032352 mp3 flash player MDL-7549 MP3 flash player now plays the end of the mp3 file 2009-02-06 07:22:34 +00:00
jerome 143432338d mnet MDL-10935 fix unicode character when the remote site send the course name for updating enrolment, merged from 19 2009-02-06 00:40:50 +00:00
moodlerobot b000fba3c1 Updated the 18 build version to 20090206 2009-02-05 23:40:38 +00:00
moodlerobot 21cd910eb5 Automatic installer.php lang files by installer_builder (20090206) 2009-02-05 23:37:06 +00:00
stronk7 13ea07e24c MDL-10583 course format - some more uses of the get_section_name() added ; backported from HEAD 2009-02-05 13:42:18 +00:00
stronk7 c65318bd3c MDL-10583 course format - discovered the get_section_name() that performs the fallback harcoded in previous commit. Backported from HEAD 2009-02-05 13:31:42 +00:00
stronk7 97ac6f03aa MDL-10583 course format - allow course formats to specify their section name ; backported from HEAD 2009-02-05 13:14:20 +00:00
moodlerobot 1092a6d6c1 Updated the 18 build version to 20090205 2009-02-05 00:36:36 +00:00
piers d104b078a4 MDL-17832 - consistent adding and removing of slashes for track data. backport 1.8. 2009-02-04 19:01:43 +00:00
piers 40ab2ed04b MDL-18023 - add type check to check against default to avoid 0 error. backport 1.8. 2009-02-04 18:43:00 +00:00
stronk7 f75507dadb MDL-8848 restore section summaries - now restored if target course have them empty ; backported from 19_STABLE 2009-02-04 17:24:08 +00:00
stronk7 0462087db7 MDL-18129 blog_print_entry() - avoid double format_text() ; backported from HEAD 2009-02-04 16:42:44 +00:00
tjhunt 7731eb7005 quiz overview report: MDL-18122 stray AS kills Oracle
Thanks to Adolfo Muñoz Aguilar for finding and fixing this.
2009-02-04 06:54:30 +00:00
moodlerobot 0bc4b09a66 Updated the 18 build version to 20090204 2009-02-03 23:44:14 +00:00
moodlerobot 23a7afd437 Automatic installer.php lang files by installer_builder (20090204) 2009-02-03 23:37:07 +00:00
moodlerobot 3a3045381d Updated the 18 build version to 20090203 2009-02-02 23:45:04 +00:00
Francois Marier 5cb48efd23 Fix CVS-git drift (old .sql files) 2009-02-01 23:45:11 +00:00
moodlerobot c006a6305f Updated the 18 build version to 20090202 2009-02-01 23:45:11 +00:00
moodlerobot 818f68c0b8 Automatic installer.php lang files by installer_builder (20090202) 2009-02-01 23:38:09 +00:00
skodak 985d26e786 MDL-10275 backporting gd environment test 2009-02-01 16:27:56 +00:00
moodlerobot 2e7e59534c Updated the 18 build version to 20090201 2009-01-31 23:48:25 +00:00
moodlerobot 831e05b5a3 Automatic installer.php lang files by installer_builder (20090201) 2009-01-31 23:41:10 +00:00
moodlerobot 20821341eb Updated the 18 build version to 20090131 2009-01-30 23:49:14 +00:00
moodlerobot 0e8aa76a78 Automatic installer.php lang files by installer_builder (20090131) 2009-01-30 23:42:09 +00:00
moodlerobot 9f546911c2 Updated the 18 build version to 20090130 2009-01-29 23:44:53 +00:00
moodlerobot fac0662c6a Updated the 18 build version to 20090129 2009-01-28 23:47:16 +00:00
stronk7 6ea03ceca0 MDL-18073 environment - enforce PHP 5.2.8 req for Moodle 2.0 ; merged from 17_STABLE 2009-01-28 23:41:52 +00:00
piers c97c2b4ae9 MDL-17821 - fix incorrect data validation regexs for 2004. thanks Peter Chamberlin. backport to 1.8. fix typing error on patch. 2009-01-28 19:24:54 +00:00
piers bec2148597 MDL-17821 - fix incorrect data validation regexs for 2004. thanks Peter Chamberlin. backport to 1.8. 2009-01-28 19:23:38 +00:00
moodlerobot aeb1e82ae5 Bumped post release 2009-01-28 09:21:00 +00:00
moodler 500fa33277 Bumped to 1.8.8 release 2009-01-28 07:56:53 +00:00
moodlerobot b703522d82 Updated the 18 build version to 20090128 2009-01-27 23:55:37 +00:00
stronk7 b18525e3d4 MDL-17365 forum rate - fix error message. 2009-01-27 18:06:25 +00:00
stronk7 461ca1b47e MDL-17365 forum rate - validate rating against scale values. Backported from HEAD 2009-01-27 17:55:35 +00:00
gbateson 96ff52548d MDL-17679: implement course reset for HotPot module (thanks to Albert Gasset) 2009-01-27 08:29:55 +00:00
moodlerobot a951a3a7cc Updated the 18 build version to 20090127 2009-01-26 23:56:11 +00:00
moodlerobot 66fea43d40 Automatic installer.php lang files by installer_builder (20090127) 2009-01-26 23:49:01 +00:00
moodlerobot b0f7cd073d Updated the 18 build version to 20090126 2009-01-25 23:55:13 +00:00
moodlerobot 7293bce7d7 Updated the 18 build version to 20090125 2009-01-24 23:56:37 +00:00
moodlerobot 7fd4f2f030 Updated the 18 build version to 20090124 2009-01-23 23:55:45 +00:00
moodlerobot 4393d509c0 Automatic installer.php lang files by installer_builder (20090124) 2009-01-23 23:49:03 +00:00
moodlerobot 251cc9e515 Updated the 18 build version to 20090123 2009-01-22 23:56:52 +00:00
moodlerobot 40c0a21f4e Automatic installer.php lang files by installer_builder (20090123) 2009-01-22 23:50:02 +00:00
poltawski c615c8b9b5 calendar:export MDL-17203 prevent disclosing of sensitive information
For more robust solution, please upgrade to 19_STABLE or later
2009-01-22 10:11:09 +00:00
moodlerobot 54f356203f Updated the 18 build version to 20090122 2009-01-21 23:57:25 +00:00
moodlerobot d83cdd1609 Automatic installer.php lang files by installer_builder (20090122) 2009-01-21 23:50:38 +00:00
moodlerobot 56aaef4dbf Updated the 18 build version to 20090121 2009-01-20 23:55:36 +00:00
moodlerobot b0e8c9d07c Automatic installer.php lang files by installer_builder (20090121) 2009-01-20 23:48:32 +00:00
moodlerobot 060a865087 Updated the 18 build version to 20090120 2009-01-19 23:55:16 +00:00
moodlerobot 3d36b7246f Automatic installer.php lang files by installer_builder (20090120) 2009-01-19 23:48:10 +00:00
moodlerobot 9b246f1366 Updated the 18 build version to 20090119 2009-01-18 23:53:09 +00:00
moodlerobot 02ae9049cf Automatic installer.php lang files by installer_builder (20090119) 2009-01-18 23:46:10 +00:00
moodlerobot 16d9e060b0 Updated the 18 build version to 20090118 2009-01-18 00:04:06 +00:00
moodlerobot c2e702dff9 Automatic installer.php lang files by installer_builder (20090118) 2009-01-17 23:56:32 +00:00
moodlerobot 94fe495c71 Updated the 18 build version to 20090117 2009-01-17 00:07:34 +00:00
moodlerobot b7fb958d30 Automatic installer.php lang files by installer_builder (20090117) 2009-01-17 00:00:00 +00:00
moodlerobot e8782e1a01 Updated the 18 build version to 20090116 2009-01-16 03:41:06 +00:00
moodlerobot 229ae9efc9 Automatic installer.php lang files by installer_builder (20090116) 2009-01-16 03:31:26 +00:00
dongsheng ee5719014c "MDL-6926, force language in forum module" 2009-01-14 04:53:44 +00:00
moodlerobot 73d0da2e76 Updated the 18 build version to 20090114 2009-01-13 23:59:19 +00:00
wildgirl acb51756b2 embedding files in a frame: MDL-10021 small rewording of help file 2009-01-13 10:20:30 +00:00
moodlerobot 3a37bc3182 Updated the 18 build version to 20090113 2009-01-13 00:02:07 +00:00
peterbulmer bae9a29ec2 MDL-10498: Apostrophe / Quote in username or email breaks profile update
Author: Aaron Barnes <aaronb@catalyst.net.nz>
2009-01-12 02:02:06 +00:00
moodlerobot b8164f8b9e Updated the 18 build version to 20090112 2009-01-11 23:55:57 +00:00
moodlerobot 53c84c37c7 Updated the 18 build version to 20090111 2009-01-11 00:08:38 +00:00
moodlerobot 9a73229511 Updated the 18 build version to 20090110 2009-01-09 23:56:26 +00:00
moodlerobot 7e6e79a1a8 Automatic installer.php lang files by installer_builder (20090110) 2009-01-09 23:49:32 +00:00
moodlerobot 544a530e19 Updated the 18 build version to 20090109 2009-01-08 23:57:58 +00:00
moodlerobot bc3a9fff93 Automatic installer.php lang files by installer_builder (20090109) 2009-01-08 23:50:33 +00:00
jerome 1c081ac632 resource: MDL-10021 upload file resource: change "keep navigation visible" into a select box. Choice are now: No - Yes, with frame - Yes, without frame 2009-01-08 02:55:03 +00:00
jerome e2c9778fe7 database: MDL-16999 move the warning message from the environment check page to a normal upgrade page 2009-01-08 01:09:46 +00:00
moodlerobot 0ae4106150 Updated the 18 build version to 20090108 2009-01-08 00:06:03 +00:00
skodak f4ac741224 MDL-17799 proper log url sanitisation - big thanks to Full Name hacker ;-) backported from HEAD 2009-01-07 23:02:01 +00:00
moodlerobot 6909a0e410 Updated the 18 build version to 20090107 2009-01-06 23:57:11 +00:00
skodak ccd99f576a MDL-17789 prevent potential XSS problems through PHP_SELF; backported from HEAD 2009-01-06 13:10:00 +00:00
moodlerobot 581b14ecb7 Updated the 18 build version to 20090106 2009-01-05 23:56:11 +00:00
moodlerobot 3b386129c2 Automatic installer.php lang files by installer_builder (20090106) 2009-01-05 23:48:43 +00:00
moodlerobot 5e9fe46559 Updated the 18 build version to 20090105 2009-01-04 23:55:09 +00:00
moodlerobot 12acacebcd Updated the 18 build version to 20090104 2009-01-03 23:57:55 +00:00
moodlerobot a0eeecc7fb Updated the 18 build version to 20090103 2009-01-03 00:01:13 +00:00
moodlerobot 28ca97e6a7 Automatic installer.php lang files by installer_builder (20090103) 2009-01-02 23:53:24 +00:00
skodak af65bb7957 MDL-17772 fixed guest access; backported from MOODLE_19_STABLE 2009-01-02 21:08:24 +00:00
stronk7 f49b1e379b MDL-12922 restore roll dates - prevent wrong rolls to 0 happening to teachers. Backported from HEAD 2009-01-02 18:00:43 +00:00
moodlerobot d9933413df Updated the 18 build version to 20090102 2009-01-01 23:58:35 +00:00
moodlerobot c9f6ccb2a0 Automatic installer.php lang files by installer_builder (20090102) 2009-01-01 23:50:16 +00:00
skodak 3eb24a6e69 MDL-17758 fixed hardcoded /admin/ links 2009-01-01 14:36:49 +00:00
moodlerobot 31f4ca3c15 Updated the 18 build version to 20090101 2008-12-31 23:55:50 +00:00
moodlerobot 4fb49dda67 Updated the 18 build version to 20081231 2008-12-31 00:01:29 +00:00
moodlerobot 5673c270ff Updated the 18 build version to 20081230 2008-12-29 23:57:35 +00:00
skodak a6bac1a193 MDL-17682 added default value for city field; backported from HEAD 2008-12-29 21:47:59 +00:00
moodlerobot 6338f9cac1 Updated the 18 build version to 20081229 2008-12-28 23:57:50 +00:00
moodlerobot 00e89cf2b7 Updated the 18 build version to 20081228 2008-12-27 23:56:48 +00:00
moodlerobot 6c0db78af0 Updated the 18 build version to 20081227 2008-12-26 23:58:32 +00:00
moodlerobot a428f715d7 Automatic installer.php lang files by installer_builder (20081227) 2008-12-26 23:51:07 +00:00
arborrow e20ea4cde6 MDL-17741 - typo $tableparam 2008-12-26 23:14:39 +00:00
arborrow 4acd575cad MDL-17741 - typo $tableparam 2008-12-26 20:46:40 +00:00
iarenaza bb53eb49a8 auth/ldap: MDL-9405 sync_users() can create duplicated users
If we are using auth_ldap_sync_users.php to synchronize our users, and we
have a database which is case-sensitive when doing comparisons (Postgres and
Oracle at least), and any of our users has the vale of the username attribute
in mixed-case (like 'John Smith'), we get duplicated users.

This is because we don't make sure the username attribute value is 'lowercased'
after we retrive it from the LDAP server and before we insert it into the
database.
2008-12-26 15:57:55 +00:00
moodlerobot 2c0c202e55 Updated the 18 build version to 20081226 2008-12-25 23:55:02 +00:00
moodlerobot 98e60173a9 Updated the 18 build version to 20081225 2008-12-24 23:56:27 +00:00
moodlerobot 0bba3204fd Updated the 18 build version to 20081224 2008-12-23 23:56:33 +00:00
moodlerobot 94d30966ac Automatic installer.php lang files by installer_builder (20081224) 2008-12-23 23:49:18 +00:00
moodlerobot 1eb458f54d Updated the 18 build version to 20081223 2008-12-22 23:54:28 +00:00
moodlerobot 84885b9bda Updated the 18 build version to 20081222 2008-12-21 23:52:48 +00:00
moodlerobot cc3919d0bc Automatic installer.php lang files by installer_builder (20081222) 2008-12-21 16:53:21 +00:00
stronk7 e4387c5776 Adding kk_utf8 to installer langs. Backported from HEAD. 2008-12-21 16:04:48 +00:00
stronk7 dac1b1cae2 file installer.php was added on branch MOODLE_18_STABLE on 2008-12-21 16:04:48 +0000 2008-12-21 16:02:16 +00:00
gbateson 3d9e194de6 MDL-6467 add "swf" and "flv" to the list of files for which relative urls are converted to absolute urls 2008-12-21 01:47:06 +00:00
moodlerobot 5935cf5e66 Updated the 18 build version to 20081221 2008-12-20 23:57:55 +00:00
moodlerobot bc7f2e4944 Updated the 18 build version to 20081220 2008-12-19 23:54:30 +00:00
moodlerobot d3b195eed6 Updated the 18 build version to 20081219 2008-12-18 23:55:29 +00:00
moodlerobot 286ef9f6ac Updated the 18 build version to 20081218 2008-12-17 23:57:01 +00:00
moodlerobot d364e38b6a Automatic installer.php lang files by installer_builder (20081218) 2008-12-17 23:49:29 +00:00
moodlerobot f9318e82f9 Updated the 18 build version to 20081217 2008-12-17 00:37:47 +00:00
moodlerobot ed87f95535 Updated the 18 build version to 20081216 2008-12-15 23:54:10 +00:00
moodlerobot 9392abebd4 Automatic installer.php lang files by installer_builder (20081216) 2008-12-15 23:47:26 +00:00
tjhunt 1e3d1148a3 Flatfile enrolment: MDL-11418 SQL error. Thanks to Patrick Pollet.
I don't know exactly how this works, but it looks like a good fix to me, so committing.
2008-12-15 02:53:44 +00:00
moodlerobot 3b6165a5d0 Updated the 18 build version to 20081215 2008-12-14 23:53:38 +00:00
moodlerobot d48a52d6b4 Automatic installer.php lang files by installer_builder (20081215) 2008-12-14 23:47:06 +00:00
moodlerobot 546eb4274c Updated the 18 build version to 20081214 2008-12-13 23:52:55 +00:00
moodlerobot 75d816bc7e Updated the 18 build version to 20081213 2008-12-12 23:54:19 +00:00
moodlerobot 8befb03723 Automatic installer.php lang files by installer_builder (20081213) 2008-12-12 23:47:44 +00:00
tjhunt a1f5200104 match qtype: MDL-17326 backup and restore problems
* The shuffleanswers options was not backed up or restored.

* Responses were not properly recoded on restore.
2008-12-12 06:45:19 +00:00
tjhunt d8301555cd matching qtype: MDL-17496 With filterall and multilang, the contents of the dropdowns was not being properly filtered
This was caused becuse the solution to MDL-9005 was not quite right.
2008-12-12 04:39:18 +00:00
tjhunt 4914c939c6 numerical and shortanswer question types: problems with compare_responses and test_response.
MDL-15315 The previous fix for this issue with wildcard answers in the item analysis report caused the following two regressions. This patch fixes it properly.

MDL-17247 This is basiclly pointing out the weridness in the previous fix and gave some useful clues as to a proper solution. Thanks Oleg.

MDL-17610 This was a report of a problem with each attempt builds on last, with a shortanswer question, where the sutdent's response contains a '.

Also, lots of unit tests to try to ensure the new code is right.
2008-12-12 03:48:26 +00:00
moodlerobot 2d3921b478 Updated the 18 build version to 20081212 2008-12-11 23:53:58 +00:00
moodlerobot e4f3c89ef6 Automatic installer.php lang files by installer_builder (20081212) 2008-12-11 23:47:15 +00:00
moodlerobot b92200dbc4 Updated the 18 build version to 20081211 2008-12-10 23:54:52 +00:00
tjhunt 3d0f39ea96 truefalse qtype: MDL-12027 remove spurious alt attribute from truefalse qtype radio buttons. 2008-12-10 00:54:38 +00:00
moodlerobot 05e2f6577b Updated the 18 build version to 20081210 2008-12-09 23:54:49 +00:00
piers 80b4f1e8d2 MDL-17572 - remove php short tags. backport to 1.8. 2008-12-09 22:04:48 +00:00
moodlerobot 5e229d0e1b Updated the 18 build version to 20081209 2008-12-08 23:54:08 +00:00
exe-cutor 0a53e4b12c Added Shibboleth 2.x fix 2008-12-08 10:53:00 +00:00
skodak dcb74f68c7 MDL-17368 removing unused html area spell checker - we have our own implementation; backported from MOODLE_19_STABLE 2008-12-08 00:13:03 +00:00
moodlerobot 69bac29715 Updated the 18 build version to 20081208 2008-12-07 23:54:05 +00:00
moodlerobot b3f225c67d Automatic installer.php lang files by installer_builder (20081208) 2008-12-07 23:47:16 +00:00
stronk7 4ebc71d941 MDL-17545 activity names filter: Improve handling when name contains htmlentities() chars. Backported from HEAD. 2008-12-07 19:00:44 +00:00
stronk7 e31d919deb MDL-17518 resource names filter: Improve handling when name contains htmlentities() chars. Backported from HEAD 2008-12-07 18:48:15 +00:00
moodlerobot 11c82f1398 Updated the 18 build version to 20081207 2008-12-06 23:53:35 +00:00
moodlerobot 16bff0af46 Updated the 18 build version to 20081206 2008-12-05 23:53:45 +00:00
moodlerobot 13f7a01401 Automatic installer.php lang files by installer_builder (20081206) 2008-12-05 23:47:00 +00:00
tjhunt 713324b8c4 quiz settings: MDL-16781 Avoid concatenating and calling strtolower on language strings. 2008-12-05 04:20:13 +00:00
moodlerobot 3208d06283 Updated the 18 build version to 20081205 2008-12-04 23:53:50 +00:00
moodlerobot b12910d6f0 Automatic installer.php lang files by installer_builder (20081205) 2008-12-04 23:47:11 +00:00
pichetp a2816b7447 MDL-17524 Merging from HEAD
Deleting a calculated question delete datasetdefinitions shared by other question
2008-12-04 16:44:29 +00:00
moodlerobot 538c7feb3f Updated the 18 build version to 20081204 2008-12-03 18:39:02 +00:00
moodlerobot 8623f5d34f Automatic installer.php lang files by installer_builder (20081204) 2008-12-03 18:25:45 +00:00
ericmerrill bc738a326f weblib: MDL-16293: background-color attribute stripped from html. Adding 'background-color' attribute to $ALLOWED_PROTOCOLS array so kses doesn't drop it. 2008-12-03 16:51:22 +00:00
skodak 2235d76688 MDL-17392 - mailstop typo - credit goes to Daniel Neis, thanks; backported from MOODLE_19_STABLE 2008-12-01 22:41:53 +00:00
danmarsden 81bd4c1d1a MDL-17115 - no point in waiting for SCORM API to load when we know JS is disabled. merged from HEAD 2008-11-28 06:50:34 +00:00
ikawhero 2ca60d4f84 MDL-17434 Full URLs for enrol/unenrol links 2008-11-28 06:27:39 +00:00
moodlerobot e0cd8349ff Updated the 18 build version to 20081128 2008-11-28 02:00:35 +00:00
tjhunt 8b28857e69 fix notices: MDL-15974 Some systems that were upgraded have nullable columns, leading to notices
A new install has NOT NULL DEFAULT 0.
2008-11-27 05:07:36 +00:00
tjhunt 4baced6731 quiz item analysis report: MDL-13427 <br> tags in the headers of some columns. 2008-11-27 04:48:05 +00:00
tjhunt f5661d4525 quiz overview report: MDL-17235 SQL error was breaking 'Show all students' in quizzes with feedback.
Thanks to Juan Leyva for finding the problem and suggesting the fix.
2008-11-27 04:11:45 +00:00
moodlerobot 1285f57c2e Updated the 18 build version to 20081127 2008-11-27 02:06:55 +00:00
moodlerobot e21b71f60a Updated the 18 build version to 20081126 2008-11-26 02:06:45 +00:00
moodlerobot c2678149c1 Automatic installer.php lang files by installer_builder (20081126) 2008-11-26 01:51:52 +00:00
jerome fd0da9afbb database: MDL-16999 update 'Required Entries' warning message, merged from 19 2008-11-25 02:48:15 +00:00
moodlerobot 150d7176ca Updated the 18 build version to 20081125 2008-11-25 02:03:30 +00:00
moodlerobot 6a55040085 Updated the 18 build version to 20081124 2008-11-24 02:03:00 +00:00
moodlerobot c6ee79ca86 Updated the 18 build version to 20081123 2008-11-23 01:56:45 +00:00
moodlerobot 0b50c5356f Automatic installer.php lang files by installer_builder (20081123) 2008-11-23 01:43:31 +00:00
moodlerobot 8a254e7138 Updated the 18 build version to 20081122 2008-11-22 02:09:12 +00:00
moodlerobot be6ca627f5 Automatic installer.php lang files by installer_builder (20081122) 2008-11-22 01:56:00 +00:00
jerome e9a84e1016 database: MDL-16999 fix "Required Entries" and "Required Entries before viewing" settings. Display a warning message during upgrade process if the fields were set previously (partially merged from 1.9) 2008-11-21 07:11:01 +00:00
moodlerobot 2601887ca9 Updated the 18 build version to 20081121 2008-11-21 02:16:00 +00:00
moodlerobot 8ee39d43a8 Updated the 18 build version to 20081120 2008-11-20 02:04:52 +00:00
skodak f07e38fbca MDL-17236 html block: proper cleanup of html; backported from HEAD 2008-11-19 16:47:36 +00:00
skodak 64954387a6 MDL-17274 security: register globals not supported- now we are preventing upgrades and installs too; backported from HEAD 2008-11-19 09:48:38 +00:00
moodlerobot 0d14cbbe2b Updated the 18 build version to 20081119 2008-11-19 02:14:04 +00:00
moodlerobot 7662ce86ea Automatic installer.php lang files by installer_builder (20081119) 2008-11-19 02:00:02 +00:00
skodak c69e659c45 MDL-17143 $CFG->profilesforenrolledusersonly does not belong into advanced user edit form - it was removing description if user had only create user cap 2008-11-18 21:40:42 +00:00
skodak da7fac00ea MDL-17143 fixed use of $userid in definition_after_data() - problem in 1.8.x is that the definition_after_data() is called 2x ;-) 2008-11-18 21:32:50 +00:00
moodlerobot 4a762cb514 Updated the 18 build version to 20081118 2008-11-18 01:58:01 +00:00
moodlerobot 3e0b46f9dc Automatic installer.php lang files by installer_builder (20081118) 2008-11-18 01:45:24 +00:00
moodlerobot 52f18993ad Updated the 18 build version to 20081117 2008-11-17 02:11:36 +00:00
stronk7 c5d843ede8 MDL-17227 forum: seekey-ize forum prune (split). Backported from HEAD 2008-11-16 22:47:54 +00:00
moodlerobot e51a39cf34 Updated the 18 build version to 20081116 2008-11-16 01:54:53 +00:00
iarenaza 55e92195ba file resources: MDL-14541 Object tag embedding PDF's and nested Flash objects does not work reliably
Merged from MOODLE_19_STABLE.

Credit goes to David Boyer for reporting and suggesting the fix for PDF files,
and Jon Witts & Mauno Korpelainen for proving a way to reproduce the Flash
issue and tips to fix it.
2008-11-15 12:31:29 +00:00
pichetp c589f054b4 MDL-17104 better delete of unused sub questions, merge from HEAD 2008-11-15 10:17:51 +00:00
moodlerobot 79c5abb5d2 Updated the 18 build version to 20081115 2008-11-15 01:59:13 +00:00
moodlerobot 5253457317 Automatic installer.php lang files by installer_builder (20081115) 2008-11-15 01:44:34 +00:00
stronk7 871ba32077 MDL-17227 forum: add sesskey to post/discussion deletion. Backported from HEAD 2008-11-14 08:53:41 +00:00
moodlerobot 3511770629 Updated the 18 build version to 20081114 2008-11-14 02:04:42 +00:00
moodlerobot 386c21b708 Automatic installer.php lang files by installer_builder (20081114) 2008-11-14 01:51:45 +00:00
piers b9aa74c7f5 MDL-16949 - fix wrong addition of times in SCORM API, thanks Xabi Martin. backport 1.8. 2008-11-14 00:10:10 +00:00
wildgirl 537172328a profilesforenrolledusersonly setting: MDL-17143 lang string rewording 2008-11-13 11:33:27 +00:00
moodlerobot f4f0229152 Updated the 18 build version to 20081113 2008-11-13 02:00:33 +00:00
moodlerobot d01506b312 Automatic installer.php lang files by installer_builder (20081113) 2008-11-13 01:48:19 +00:00
dongsheng 8b26c8fb4e "MDL-17143, bump version to set new profilesforenrolledusersonly setting" 2008-11-12 02:24:27 +00:00
dongsheng 7e62718e7c MDL-17143
don't display the user description at all when user isn't enrolled in any courses, backported to 1.8
2008-11-12 02:21:54 +00:00
moodlerobot 61f34d4260 Updated the 18 build version to 20081112 2008-11-12 02:15:37 +00:00
moodlerobot d7743238e5 Automatic installer.php lang files by installer_builder (20081112) 2008-11-12 02:01:54 +00:00
moodlerobot 838069d4fc Updated the 18 build version to 20081111 2008-11-11 02:10:56 +00:00
moodlerobot 11a61fa8eb Automatic installer.php lang files by installer_builder (20081111) 2008-11-11 01:58:17 +00:00
moodlerobot 81e31feeeb Updated the 18 build version to 20081110 2008-11-10 01:59:02 +00:00
moodlerobot 6c68f8a4a8 Updated the 18 build version to 20081109 2008-11-09 01:59:48 +00:00
moodlerobot a59f281522 Updated the 18 build version to 20081108 2008-11-08 01:58:18 +00:00
moodler d60e730bbb auth/cas MDL-17121 Upgraded to latest version which is LGPL 2008-11-07 02:00:27 +00:00
moodlerobot f5a5d102ca Updated the 18 build version to 20081107 2008-11-07 01:58:15 +00:00
moodlerobot 32b8a389a1 Updated the 18 build version to 20081106 2008-11-06 02:23:46 +00:00
danmarsden cc09c0d071 MDL-17071 fix misleading text - it's removing enrolments not assignments - merged from HEAD 2008-11-05 07:15:36 +00:00
moodlerobot 797f4e9f89 Updated the 18 build version to 20081105 2008-11-05 02:23:53 +00:00
jerome e06c28f04a MDL-10021: display iframe when the resource is on another domain, merged from 19 2008-11-04 05:15:55 +00:00
jerome 5a3288003e MDL-10021: fix xhtml/javascript 2008-11-04 02:23:27 +00:00
moodlerobot 1f3d624490 Updated the 18 build version to 20081104 2008-11-04 02:11:17 +00:00
moodlerobot 1e01c44eea Automatic installer.php lang files by installer_builder (20081104) 2008-11-04 01:56:14 +00:00
skodak 897065d9dd MDL-17110 snoopy: imported new version 1.2.4; backported from HEAD 2008-11-03 07:57:27 +00:00
moodlerobot 562c7feb2d Updated the 18 build version to 20081103 2008-11-03 01:53:53 +00:00
moodlerobot ce1648f481 Updated the 18 build version to 20081102 2008-11-02 01:49:51 +00:00
moodlerobot dd513e0b70 Automatic installer.php lang files by installer_builder (20081102) 2008-11-02 01:38:25 +00:00
skodak 913d8d935c MDL-17027: protect user profile images if $CFG->forcelogin enabled; merged from MOODLE_19_STABLE 2008-11-01 22:49:23 +00:00
skodak 43f0cd8eae MDL-17065 user: profile images of deleted users are not accessible anymore; merged from MOODLE_19_STABLE 2008-11-01 22:47:53 +00:00
moodlerobot a6475bc27e Updated the 18 build version to 20081101 2008-11-01 01:48:02 +00:00
piers 516ca02e7e MDL-7068 - SCORM 2004 compliance - fix mod/scorm to handle core data elements correctly - now passes test DMI. backport 1.8. 2008-10-31 23:05:46 +00:00
jerome 58208f5511 MDL-10021: change frame into object tag when display a Link Resource with navigation bar, merged from 19 2008-10-31 06:00:35 +00:00
moodlerobot f95efc39a5 Updated the 18 build version to 20081031 2008-10-31 02:13:20 +00:00
danmarsden a82fa6146a MDL-17050 excorising $_POST - thanks to mikec for patch merged from HEAD 2008-10-31 00:57:34 +00:00
gbateson 062b672983 MDL-16300: small fix to handle case when no users with hotpot attempts are found 2008-10-30 07:22:26 +00:00
gbateson 87ca8583aa MDL-16300: use cache to minimize use of get_users_by_capability() 2008-10-30 07:13:11 +00:00
gbateson a4b1ac3b0d use "md5key" as secondary key on hotpot_strings table; allow for non-unique secondary keys on hotpot tables (can happen on hotpot_strings) 2008-10-30 06:22:30 +00:00
peterbulmer 735f76f0f4 MDL-15942 catch one more instance of mnet update needing secure commit
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 04:10:16 +00:00
peterbulmer cd6eda7ea8 MDL-17038 bugfixes
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 04:09:04 +00:00
peterbulmer 48fd1cf621 MDL-17038 - truncate overlength varchar fields before attempting to insert
Signed-off-by: Peter Bulmer <peter.bulmer@catalyst.net.nz>


Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 04:08:24 +00:00
peterbulmer c5caa7199d MDL-17038 formatting correction
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 04:07:38 +00:00
peterbulmer 8f3f4373dd MDL-17038 Change to use sensible variable names
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 04:07:14 +00:00
peterbulmer edf57f60fc MDL-17038 - refine query to limit size of returned data.
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 04:06:46 +00:00
moodlerobot 8f1f4924b1 Updated the 18 build version to 20081030 2008-10-30 01:56:31 +00:00
piers 054ff00c61 MDL-17052 - remove use of $_POST. backport to 1.8. 2008-10-29 16:16:51 +00:00
moodlerobot 6e5cdb10d4 Updated the 18 build version to 20081029 2008-10-29 01:54:22 +00:00
moodlerobot 80c6222023 Updated the 18 build version to 20081028 2008-10-28 01:56:19 +00:00
moodlerobot 65c1d6dde0 Updated the 18 build version to 20081027 2008-10-27 01:49:22 +00:00
moodlerobot 92aad49de4 Automatic installer.php lang files by installer_builder (20081027) 2008-10-27 01:36:15 +00:00
moodlerobot bd524b5471 Updated the 18 build version to 20081026 2008-10-26 01:45:30 +00:00
moodlerobot a1a7801540 Updated the 18 build version to 20081025 2008-10-25 01:54:38 +00:00
tjhunt c72e019be4 moodlelib iprange checks: MDL-16986 If the user makes a mistake and types something like 172.16.1.143/148, with something greater than 32 after the slash, treat it as /32. 2008-10-24 02:53:40 +00:00
moodlerobot 74c810d36c Updated the 18 build version to 20081024 2008-10-24 01:59:44 +00:00
moodlerobot da52163058 Updated the 18 build version to 20081023 2008-10-23 02:08:13 +00:00
fmarier e92cdcdbd9 moodlelib/welcome message: MDL-16947 use the userid that was passed in for the profile URL 2008-10-22 02:40:14 +00:00
moodlerobot a0e7eaaa11 Updated the 18 build version to 20081022 2008-10-22 02:01:09 +00:00
stronk7 8435575b16 Bumped to 1.8.7+ (before weekly build) 2008-10-21 23:06:20 +00:00
moodlerobot 73caeda7a2 Updated the 18 build version to 20081021 2008-10-21 01:54:52 +00:00
moodlerobot aad356e1ab Updated the 18 build version to 20081020 2008-10-19 22:32:49 +00:00
skodak 4999b4216e MDL-16925 mod/forum - fixed blank page after posting - credit goes to Martin 2008-10-19 08:38:24 +00:00
moodlerobot 4485ad9fe3 Updated the 18 build version to 20081019 2008-10-19 01:49:23 +00:00
moodlerobot f62ff28387 Automatic installer.php lang files by installer_builder (20081019) 2008-10-19 01:37:07 +00:00
stronk7 272a1af077 Adding correct Office 2007 mime types. MDL-15987 ; backported from HEAD 2008-10-17 18:07:57 +00:00
moodlerobot 6d3cdc95c3 Updated the 18 build version to 20081018 2008-10-17 17:00:40 +00:00
moodlerobot 2064c7c223 Updated the 18 build version to 20081017 2008-10-17 01:57:57 +00:00
skodak d893d6ebf0 MDL-16903 mod/forum: undefined course context when forum subscription not allowed; merged from MOODLE_19_STABLE 2008-10-16 20:46:12 +00:00
nicolasconnault 5ef153b5b4 MDL-8074 Language strings for 1.8 2008-10-16 14:31:15 +00:00
nicolasconnault 19486aae82 MDL-16898 Extending include_path 2008-10-16 11:17:04 +00:00
moodlerobot 782acecf7d Updated the 18 build version to 20081016 2008-10-16 02:05:31 +00:00
moodler 498b0ade38 Bump for 1.8.7 release 2008-10-15 07:30:25 +00:00
moodlerobot 6885225a8e Updated the 18 build version to 20081015 2008-10-15 02:07:27 +00:00
piers 1846d0a2c2 MDL-16810 - fix typo on function name. thanks to Jason Hardin. Backport to 1.8. 2008-10-14 04:43:25 +00:00
moodlerobot f9c6edc8da Updated the 18 build version to 20081014 2008-10-14 02:06:58 +00:00
skodak d19db94df3 MDL-16839 forms: workaround for problematic hard frozen values; merged from MOODLE_19_STABLE 2008-10-13 19:40:47 +00:00
nicolasconnault 9330f3e1fa MDL-16780 Fixing require_once problem 2008-10-13 12:23:56 +00:00
nicolasconnault 8a30c5bec2 MDL-16780 Adding missing file 2008-10-13 12:09:44 +00:00
jamiesensei e073353ff2 MDL-16842 "Adding group of elements in function lib/formslib.php/repeat_elements() not working correctly" Fixed using fullclone instead of clone now. Merged from 1.9 stable. 2008-10-13 11:53:37 +00:00
moodlerobot b7e6e7a119 Updated the 18 build version to 20081013 2008-10-13 02:02:37 +00:00
moodlerobot 13733eb075 Automatic installer.php lang files by installer_builder (20081013) 2008-10-13 01:43:46 +00:00
moodlerobot 99b8fb5541 Updated the 18 build version to 20081012 2008-10-12 01:54:27 +00:00
moodlerobot 6ac660f4ac Updated the 18 build version to 20081011 2008-10-11 01:59:17 +00:00
moodlerobot 63dcec6662 Updated the 18 build version to 20081010 2008-10-10 02:04:39 +00:00
poltawski efdcc40927 MDL-16434 fix typo in class name "generalbox"
thanks to Joseph Rézeau
2008-10-09 10:56:05 +00:00
moodlerobot 8a6afdde27 Updated the 18 build version to 20081009 2008-10-09 02:01:46 +00:00
moodlerobot 0fece2d628 Automatic installer.php lang files by installer_builder (20081009) 2008-10-09 01:46:06 +00:00
moodlerobot e0734f6277 Updated the 18 build version to 20081008 2008-10-08 02:07:35 +00:00
scyrma 2e3a3337b1 Forum/MDL-14558: Prevent users from subscribing or getting subscribed to forums where subscriptions are not allowed. 2008-10-07 08:11:46 +00:00
scyrma ebf0aeec86 Lesson/MDL-13311: make it possible to have a short answer question using 0 as answer. (backport) 2008-10-07 05:18:08 +00:00
moodlerobot e875530645 Updated the 18 build version to 20081007 2008-10-07 01:52:40 +00:00
moodlerobot b475fec548 Updated the 18 build version to 20081006 2008-10-06 01:50:03 +00:00
moodlerobot 7eb7ca6786 Updated the 18 build version to 20081005 2008-10-05 01:47:12 +00:00
moodlerobot ef62ec7c66 Automatic installer.php lang files by installer_builder (20081005) 2008-10-05 01:34:46 +00:00
moodlerobot 06b9f960de Updated the 18 build version to 20081004 2008-10-04 01:49:12 +00:00
nicolasconnault 1992b70a32 MDL-16780 Backport from MOODLE_19_STABLE 2008-10-03 07:27:37 +00:00
nicolasconnault 7eb43d9d01 file XML.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:39 +0000 2008-10-03 07:13:17 +00:00
nicolasconnault f8b6fda2a7 file Urlencoded.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:39 +0000 2008-10-03 07:13:17 +00:00
nicolasconnault 5bb3fdc73d file PHP.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:39 +0000 2008-10-03 07:13:17 +00:00
nicolasconnault 93a4a32e2e file Null.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:39 +0000 2008-10-03 07:13:17 +00:00
nicolasconnault 7a38e689f2 file Error.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:40 +0000 2008-10-03 07:13:17 +00:00
nicolasconnault 5ba0a8b71e file Server.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:38 +0000 2008-10-03 07:13:16 +00:00
nicolasconnault 1e3f87b91e file Response.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:38 +0000 2008-10-03 07:13:16 +00:00
nicolasconnault b17cc53447 file JSON.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:39 +0000 2008-10-03 07:13:16 +00:00
nicolasconnault cf7f20fc54 file JSON.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:38 +0000 2008-10-03 07:13:16 +00:00
nicolasconnault 365b745202 file Helper.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:37 +0000 2008-10-03 07:13:16 +00:00
nicolasconnault db8d52b560 file Debug.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:38 +0000 2008-10-03 07:13:16 +00:00
nicolasconnault 602572d131 file Action.php was added on branch MOODLE_18_STABLE on 2008-10-03 07:27:38 +0000 2008-10-03 07:13:16 +00:00
moodlerobot 71186e4168 Updated the 18 build version to 20081003 2008-10-03 01:49:10 +00:00
nicolasconnault 627e2cb6f5 MDL-16768 Added php version-dependent function definitions so that we can use json_encode() and json_decode() no matter what PHP version the server is running. 2008-10-02 07:54:17 +00:00
moodlerobot 0b75065449 Updated the 18 build version to 20081002 2008-10-02 01:58:05 +00:00
moodlerobot 63bcf21fbf Updated the 18 build version to 20081001 2008-10-01 01:58:39 +00:00
moodlerobot fc5e568fbf Updated the 18 build version to 20080930 2008-09-30 01:49:32 +00:00
stronk7 5194a4f938 Fix link to wiki in breadcrumb. Credit goes to Clif Kussmaul. MDL-16331 2008-09-29 22:35:19 +00:00
stronk7 82e0a886c2 Improve DOM detection (due to conficts with old DOM-XML). MDL-15637 ; backported from 19_STABLE 2008-09-29 17:11:21 +00:00
moodlerobot e57069e318 Updated the 18 build version to 20080929 2008-09-29 01:47:39 +00:00
tjhunt c26c206276 MDL-16720 The edit icon in the quiz preview screen pops up the edit form in a window that is too small 2008-09-28 08:59:43 +00:00
moodlerobot 8a16c85e8c Updated the 18 build version to 20080928 2008-09-28 01:51:05 +00:00
moodlerobot bdb0e3e233 Automatic installer.php lang files by installer_builder (20080928) 2008-09-28 01:38:33 +00:00
stronk7 97f4bb9fde Backporting MDL-16715 to 18_STABLE (new transid codes). Credit goes to Ethem Elvice. 2008-09-27 17:35:39 +00:00
moodlerobot 02d0084a51 Updated the 18 build version to 20080927 2008-09-27 01:51:03 +00:00
stronk7 5af25dd922 Cleaning wiki recent activity URLs. MDL-15896 ; backported from 19_STABLE 2008-09-26 09:38:32 +00:00
moodlerobot 665ba7679d Updated the 18 build version to 20080926 2008-09-26 02:01:58 +00:00
piers 0b32c364a1 MDL-7068 - SCORM 2004 compliance. Handle cmi.interactions hydration (scorm 1.2 to as well). Backport to 1.8 - rerun compliance test. 2008-09-26 00:37:10 +00:00
stronk7 e041c56184 Protect message settings with sesskey. MDL-16688 ; backported from 19_STABLE 2008-09-25 22:36:18 +00:00
peterbulmer dbc804de90 MDL-16560 - correct bogus function call
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-09-25 10:01:54 +00:00
moodlerobot 07715b2c5e Updated the 18 build version to 20080925 2008-09-25 01:51:50 +00:00
moodlerobot 04a3e8b1f0 Automatic installer.php lang files by installer_builder (20080925) 2008-09-25 01:39:40 +00:00
danmarsden ab9cba84ae MDL-16599 - tidy up error message to be make more sense to the user. merged from HEAD 2008-09-24 07:04:10 +00:00
moodlerobot f374ad64d1 Updated the 18 build version to 20080924 2008-09-24 01:56:04 +00:00
moodlerobot 435c0a785b Automatic installer.php lang files by installer_builder (20080924) 2008-09-24 01:42:43 +00:00
moodlerobot e5c825ab8a Updated the 18 build version to 20080923 2008-09-23 01:53:47 +00:00
moodlerobot c4c28a7468 Updated the 18 build version to 20080922 2008-09-22 01:43:53 +00:00
moodlerobot abf7d22073 Automatic installer.php lang files by installer_builder (20080922) 2008-09-22 01:31:45 +00:00
pichetp 48f1234896 Merge from 1.9 as HEAD is different
MDL-16427 implement the '*' convention as for other questiontypes
MDL-15358 negative data and MDL-16427 handling 0
MDL-15233 tolerance
2008-09-21 03:15:40 +00:00
moodlerobot defb0f64f0 Updated the 18 build version to 20080921 2008-09-21 01:45:05 +00:00
moodlerobot f2f07143e3 Automatic installer.php lang files by installer_builder (20080921) 2008-09-21 01:33:39 +00:00
pichetp 0759221a5e MDL-15233 merge from 1.9 2008-09-20 14:55:38 +00:00
pichetp 3744e9ef24 Merge from 1.9 as HEAD is different
MDL-16427 implement the '*' convention as for other questiontypes
MDL-15358 negative data and MDL-16427 handling 0
2008-09-20 14:42:19 +00:00
pichetp 0455e362ae MDL-15358 negative data between () and MDL-14979 - Remove the obsolete quizfile.php
merge from 1.9 as this file is no more in HEAD
2008-09-20 14:30:05 +00:00
moodlerobot c5f0168382 Updated the 18 build version to 20080920 2008-09-20 01:50:23 +00:00
nicolasconnault cc980ff6e5 MDL-16556 Applied Mark Nielsen's patch 2008-09-19 05:42:47 +00:00
moodlerobot 65dc989055 Updated the 18 build version to 20080919 2008-09-19 01:49:53 +00:00
pichetp 38d739257d MDL-16427 changing $answer=='*' to $answer ==='*' 2008-09-18 14:48:11 +00:00
moodlerobot 2c16f768ed Updated the 18 build version to 20080918 2008-09-18 02:02:50 +00:00
piers 254dfd1f0f MDL-7097 - API debug. Add ability to manually poke the SCORM API for 1.2 and 2004. backport 1.8. 2008-09-17 02:13:32 +00:00
moodlerobot d944e872b7 Updated the 18 build version to 20080917 2008-09-17 01:53:47 +00:00
moodler 1e1e2438c6 MDL-12563 Fixed RSS dates so that they are always GMT 2008-09-16 08:58:17 +00:00
moodlerobot 32579e3d1c Updated the 18 build version to 20080916 2008-09-16 02:03:38 +00:00
stronk7 ed16449ba6 Re-introducing colons in page names + cleaning tabs output. MDL-15896 ; backported from HEAD 2008-09-15 16:25:03 +00:00
moodlerobot 0c6b31f211 Updated the 18 build version to 20080915 2008-09-15 01:56:25 +00:00
moodlerobot 867ab98575 Updated the 18 build version to 20080914 2008-09-14 01:50:27 +00:00
moodlerobot b4de8efe5d Updated the 18 build version to 20080913 2008-09-13 01:48:33 +00:00
mudrd8mz ea9700180d Pre-select default country in signup form. Backported from HEAD 2008-09-12 15:39:43 +00:00
moodlerobot 8e07f16724 Updated the 18 build version to 20080912 2008-09-12 02:03:20 +00:00
moodlerobot aa54c77cf7 Updated the 18 build version to 20080911 2008-09-11 02:09:05 +00:00
moodlerobot 02875a7622 Updated the 18 build version to 20080910 2008-09-10 02:01:34 +00:00
moodlerobot c6c934b578 Updated the 18 build version to 20080909 2008-09-09 01:57:56 +00:00
piers f0e870d0cf MDL-11734 - cmi.comments_from_learner not read - write. revamp the handling of array style elements. Backport to 1.8. 2008-09-08 20:08:17 +00:00
stronk7 c54c59e7d8 Added missing join condition. Credit goes to Colin Chambers. MDL-16385 ; backported from HEAD 2008-09-08 14:29:01 +00:00
moodlerobot 32af0dbef2 Updated the 18 build version to 20080908 2008-09-08 01:53:00 +00:00
piers 3da1e9c5f4 MDL-16299 - Javascript error during scorm player load. SCOID should not be populated - TOC figures this out. Backport to 1.8. 2008-09-08 00:35:54 +00:00
peterbulmer 206c91a1c4 MDL-14488 - start sql query with unique field - credit David Monllaó 2008-09-07 06:06:40 +00:00
peterbulmer 44bba1e66c MDL-16301 - address issue. 2008-09-07 05:26:25 +00:00
moodlerobot 62d6eb1f83 Updated the 18 build version to 20080907 2008-09-07 01:50:28 +00:00
moodlerobot c1dfbdaea4 Updated the 18 build version to 20080906 2008-09-06 01:46:25 +00:00
moodlerobot f38b8c88bf Updated the 18 build version to 20080905 2008-09-05 01:57:20 +00:00
moodlerobot 6e8e2bb04c Updated the 18 build version to 20080904 2008-09-04 01:50:15 +00:00
moodlerobot 988e9b0f64 Updated the 18 build version to 20080903 2008-09-03 01:53:34 +00:00
piers 7d80c9a0fe MDL-16299 - Javascript error during scorm player load. Ensure SCOID is always populated. Backport 1.8. 2008-09-03 00:43:02 +00:00
moodlerobot 619c19d863 Updated the 18 build version to 20080902 2008-09-02 01:53:33 +00:00
moodlerobot 13eef19b99 Automatic installer.php lang files by installer_builder (20080902) 2008-09-02 01:38:00 +00:00
tjhunt 50a8e2b90c MDL-15655 - address_in_subnet does not work on 64 bit architectures. Also, we found some other issues with this funtion while diagnosing the problem. 2008-09-01 04:18:03 +00:00
moodlerobot ddf17a0c4e Updated the 18 build version to 20080901 2008-09-01 01:48:22 +00:00
skodak d84da076cc MDL-15580 fixed several problems in 18 groups upgrade - removing duplicates in groups_members and fixing handling of $result; this does not fix already upgraded sites, sorry 2008-08-31 19:59:57 +00:00
moodlerobot c8b5ebc8e3 Updated the 18 build version to 20080831 2008-08-31 01:46:05 +00:00
moodlerobot d749b452d3 Updated the 18 build version to 20080830 2008-08-30 01:53:24 +00:00
peterbulmer ef1720eb6f MDL-16264 Make mnet courses affect course_list block
If a user has mnet courses, these should affect block display in the same way as local courses do.
2008-08-29 04:28:40 +00:00
piers b95a25b7a8 MDL-14492 - Provide feedback to user about redirect delay in loadsco.php. Add sanity checking for scorm_resize() as it tries to set -ve heights if user specifies a small area. Thanks francois. backport 1.8. 2008-08-29 04:14:34 +00:00
moodlerobot ec53ceed49 Updated the 18 build version to 20080829 2008-08-29 01:51:03 +00:00
moodlerobot c157c72d4c Automatic installer.php lang files by installer_builder (20080829) 2008-08-29 01:38:34 +00:00
tjhunt 3835cc29f3 MDL-16243 Implement a health-centre check that the question categories are arranged properly in tree structures. 2008-08-28 05:06:26 +00:00
moodlerobot aa44e74ce3 Updated the 18 build version to 20080828 2008-08-28 01:56:32 +00:00
tjhunt 9300321849 MDL-8475 - Better handling of blank answer - further changes to make it even more robust. Also, make the same changes to the shortanswer question type that were already made to the numerical question type. 2008-08-28 01:46:26 +00:00
moodlerobot 64511f27aa Automatic installer.php lang files by installer_builder (20080828) 2008-08-28 01:41:30 +00:00
piers 522e4ab8c3 MDL-4746 - Course 01 of the ADL SCORM 1.2 test suite fails on point 4. only set browsed status if the SCO hasn't set a status. Backport 1.8. 2008-08-27 23:30:05 +00:00
danmarsden 0ad6f487be MDL-16137 - clear scorm directory if it already exists 2008-08-27 22:36:00 +00:00
danmarsden 255b8281b6 MDL-10767 - set values of checkboxes correctly merged from HEAD 2008-08-27 22:15:06 +00:00
jerome d5e89c7964 MDL-16043: manage case when administrator set enrol_remotecoursefield or enrol_remoteuserfield in UPPERCASE, merged from 19 2008-08-27 07:06:57 +00:00
piers 906faa5a1f MDL-4746 - Course 01 of the ADL SCORM 1.2 test suite fails on point 4. gramatical error - thanks Dan. Backport 1.8. 2008-08-27 04:08:55 +00:00
peterbulmer f038db5c7c MDL-15942 - separate data escaped for db insertion from unescaped data 2008-08-27 03:39:21 +00:00
piers fff59beb90 MDL-4746 - Course 01 of the ADL SCORM 1.2 test suite fails on point 4. Fix cmi.comments, and mastery_score checking. Backport to 1.8. 2008-08-27 02:53:27 +00:00
moodlerobot 6e5dfc1b4b Updated the 18 build version to 20080827 2008-08-27 01:50:21 +00:00
piers d448df5a1c MDL-16111 - SCORM grade not updated in Grader Report. Reverse out 1.8 only portion of patch as it break SCORM compliance - regression testing. 2008-08-26 23:32:11 +00:00
moodlerobot 4bfc6cbdfd Updated the 18 build version to 20080826 2008-08-26 01:56:16 +00:00
iarenaza c99f31c86b MDL-16061 Revert incorrect fix for "Remove 'username' from the $moodleattributes array"
The fix is wrong, as it breaks auth_db_sync_users.php and
auth_ldap_sync_users.php at least. No new users are added to Moodle, as the
username is missing from the new user info record.

The fix needs to go into update_user_record() in lib/moodlelib.php to make it
skip the 'username' key, as we really need get_userinfo() to return the
username as part of the user info array.
2008-08-25 22:35:26 +00:00
moodlerobot 89eedbe1cb Updated the 18 build version to 20080825 2008-08-25 01:44:17 +00:00
moodlerobot 60c540f5a6 Automatic installer.php lang files by installer_builder (20080825) 2008-08-25 01:31:52 +00:00
piers 345a24669b MDL-15881 - Probable bug: Not able to update SCORM. Backport 1.8. 2008-08-24 23:04:43 +00:00
piers 87806bd4bc MDL-16111 - SCORM grade not updated in Grader Report. Include grading by learning objects if status is complete. Backport to 1.8. 2008-08-24 21:26:02 +00:00
iarenaza 0d47dafb08 MDL-15799 LDAP - user data mapping doesn't work.
The Right Way(tm) to write a LDAP filter is enclosing it in parentheses (see
RFC 4515/2254).
2008-08-24 20:37:41 +00:00
stronk7 105eb2d512 Prevent some notices at install. MDL-16188 2008-08-24 16:30:01 +00:00
moodlerobot bd68242fb0 Updated the 18 build version to 20080824 2008-08-24 01:44:34 +00:00
moodlerobot bf4dde1e29 Automatic installer.php lang files by installer_builder (20080824) 2008-08-24 01:29:51 +00:00
moodlerobot 2340efe201 Updated the 18 build version to 20080823 2008-08-23 01:43:48 +00:00
moodlerobot aa87f6cb14 Automatic installer.php lang files by installer_builder (20080823) 2008-08-23 01:31:27 +00:00
piers 571709c448 MDL-16111 - SCORM grade not updated in Grader Report. Make sure that lastattempt does not exceed maxattempts. Backport 1.8. 2008-08-22 03:23:13 +00:00
moodlerobot bec23ebe9c Updated the 18 build version to 20080822 2008-08-22 01:49:49 +00:00
piers e88e09a1f1 MDL-13431 - SCORM results not transferring to Gradebook. SCORM API debugging tool - add reference to SCORM, and SCO identifier. backport 1.8. 2008-08-22 01:41:48 +00:00
moodlerobot 12d3294e0a Automatic installer.php lang files by installer_builder (20080822) 2008-08-22 01:36:17 +00:00
mudrd8mz 4ec9d6b07d MDL-14326 Remove all course_modules that remained empty (i.e. with instance==0) after the particular restore process. Backported from MOODLE_19_STABLE 2008-08-21 12:20:49 +00:00
piers dc5f29bf8c MDL-13431 - SCORM results not transferring to Gradebook. SCORM API debugging tool. Backport to 1.8. remove add_to_log. 2008-08-21 08:31:28 +00:00
moodlerobot 0088d8ce7e Updated the 18 build version to 20080821 2008-08-21 01:50:49 +00:00
moodlerobot a90d5b6082 Automatic installer.php lang files by installer_builder (20080821) 2008-08-21 01:36:47 +00:00
piers c9af47a031 MDL-13431 - SCORM results not transferring to Gradebook. SCORM API debugging tool. Backport to 1.8 + XHTML problems that stop the debug from working. 2008-08-21 01:32:10 +00:00
piers f7a197e8fa file debug.js.php was added on branch MOODLE_18_STABLE on 2008-08-21 01:32:11 +0000 2008-08-21 00:36:12 +00:00
piers 623e2d59d1 MDL-13431 - SCORM results not transferring to Gradebook. Add logging mechanism so that launched URI can be traced. Backport 1.8. 2008-08-20 23:33:07 +00:00
piers e0260731dc MDL-15859 [PATCH] Fixes for tests of '' on Oracle. Backport 1.8. 2008-08-20 23:15:21 +00:00
piers 1282d92329 MDL-13431 - SCORM results not transferring to Gradebook. Add logging mechanism so that SCORM API interaction with Moodle can be traced. Backport 1.8. 2008-08-20 22:39:34 +00:00
piers 1fdfed864f MDL-13431 - SCORM results not transferring to Gradebook. Use the correct method for getting the course object. Backport 1.8. 2008-08-20 22:34:34 +00:00
danmarsden 4bf780bf99 MDL-14620 - need to check vars are set before using. - adding check so I can include this form type in SCORM - merged from HEAD 2008-08-20 22:01:06 +00:00
tjhunt 240363ac49 MDL-15654 Incorrect escaping of HTML in the history table on the review quiz attempt page. 2008-08-20 09:46:10 +00:00
tjhunt c68631a272 MDL-15605 Convert question bank consistency checks described in MoodleDocs (http://docs.moodle.org/en/Development:Question_bank_consistency_check) to health centre checks. 2008-08-20 08:53:00 +00:00
tjhunt e5b7520dce MDL-16141 Need an sql_position function to do POSITION(needle IN haystack) on crappy databases. Backported from HEAD. 2008-08-20 08:51:19 +00:00
danmarsden 4b51c3fb2f MDL-16113 add warning to Scorm modedit page if slasharg is disabled. merged from HEAD 2008-08-20 02:30:11 +00:00
moodlerobot d8bfab810c Updated the 18 build version to 20080820 2008-08-20 01:54:15 +00:00
tjhunt 242f42a49f SCORM module XHTML strict fixes. 2008-08-19 06:59:29 +00:00
moodlerobot f2d7523e1d Updated the 18 build version to 20080819 2008-08-19 01:48:57 +00:00
moodlerobot a1b6cb7da4 Automatic installer.php lang files by installer_builder (20080819) 2008-08-19 01:35:06 +00:00
skodak 1f56978e1a MDL-16108 force autocomplete off for unmaskable password fields 2008-08-18 20:20:05 +00:00
moodlerobot 8c4f5bc33f Updated the 18 build version to 20080818 2008-08-18 01:43:42 +00:00
moodlerobot 1f72738c04 Automatic installer.php lang files by installer_builder (20080818) 2008-08-18 01:30:42 +00:00
moodlerobot c6d9053948 Updated the 18 build version to 20080817 2008-08-17 01:40:36 +00:00
moodlerobot 274a1cc850 Automatic installer.php lang files by installer_builder (20080817) 2008-08-17 01:27:04 +00:00
moodlerobot 9165153bd3 Updated the 18 build version to 20080816 2008-08-16 01:49:31 +00:00
pichetp a478b383cd better filtering of null answers MDL-8475 merged from HEAD 2008-08-15 11:26:58 +00:00
iarenaza 4e4955b55e Remove 'username' from the $moodleattributes array.
It doesn't make sense at all (username is not part of the externally mapped
fields) and produces a notice that breaks HTTP headers with debugging enabled.
2008-08-15 11:15:45 +00:00
tjhunt fb7e6a9a0d MDL-16056 - Aiken format should treat input as plain text, and so escape HTML special characters. 2008-08-15 03:13:57 +00:00
moodlerobot 62f0cff4ce Updated the 18 build version to 20080815 2008-08-15 01:46:39 +00:00
piers 4c9c6f0ddb MDL-13904 Scorm structure isn't respected after an update of the package. Incorrectly named table in a delete. backport 1.8. 2008-08-15 01:10:16 +00:00
piers 4bea11eae5 MDL-16055 PHP warning when creating new scorm activity. backport 1.8. 2008-08-15 00:21:40 +00:00
peterbulmer 740972a826 MDL-16021 dont force mnethost restriction forloading user data based on id 2008-08-14 23:48:20 +00:00
pichetp a53b72f516 better validation of null answers MDL-8475 merged from HEAD 2008-08-14 11:54:53 +00:00
jerome 224ac0b90f MDL-16043: ensures cross-db: add lowercase conversion for every database fieldname, merged from 19 2008-08-14 11:34:00 +00:00
jerome f6fd87d97b MDL-15175: ensures cross-db: add a lowercase conversion for the username, merged from 19 2008-08-14 09:53:19 +00:00
tjhunt 7fa260c83c Oops! RISK_DATALOSS did not exist before 1.9. 2008-08-14 02:09:14 +00:00
moodlerobot 877f1e2485 Updated the 18 build version to 20080814 2008-08-14 01:52:00 +00:00
peterbulmer a17912002b MDL-15933 Require jump destination MNET peer to be non-deleted.
Also require landing source MNET peer to be non-deleted.
2008-08-13 23:34:11 +00:00
piers a9aaede659 MDL-13904 Scorm structure isn't respected after an update of the package. This is a large change to the handling of SCORM package update - all SCOes are issued with a new id, and all references to the old ones are deleted. The scorm_scoes_track data is preserved by being reattached to the new SCO ids (unless they have been deleted). backport to 1.8. 2008-08-13 23:20:35 +00:00
piers d2436bf26b MDL-11188 SCORM module does not respect "prerequisites" like it used to. MDL-12342 & signs in CDATA sections are imported as &amp;. This is a rewrite of the prerequisite handling. backport to 1.8. 2008-08-13 22:44:03 +00:00
piers 3fa20034ae MDL-14492 Provide feedback to user about redirect delay in loadsco.php. Add lang text for please wait. backport 1.8. 2008-08-13 22:32:05 +00:00
tjhunt 2e13c2864f MDL-15819 - Review the RISK_XXX flags on all quiz and question capabilites. 2008-08-13 07:06:43 +00:00
jerome 15a9e839f2 MDL-15175: fix sync with external Oracle database merged from 1.9 2008-08-13 06:35:22 +00:00
tjhunt 847bb2fd19 MDL-12797 - Site-wide quiz default time-limit was not working. The default was being used, but the enabled state was not being initialised correctly for the form field. 2008-08-13 03:18:11 +00:00
moodlerobot 6d139a20d6 Updated the 18 build version to 20080813 2008-08-13 01:49:18 +00:00
moodlerobot a262b1c15e Updated the 18 build version to 20080812 2008-08-12 01:53:10 +00:00
moodlerobot 302348cb4d Automatic installer.php lang files by installer_builder (20080812) 2008-08-12 01:40:28 +00:00
moodlerobot d183669cc1 Updated the 18 build version to 20080811 2008-08-11 01:22:32 +00:00
moodlerobot 6c1f6b016d Automatic installer.php lang files by installer_builder (20080811) 2008-08-11 01:10:16 +00:00
piers 983927938a MDL-14492 Provide feedback to user about redirect delay in loadsco.php. backport to 1.8. 2008-08-10 22:37:04 +00:00
moodlerobot 7cfae72475 Updated the 18 build version to 20080810 2008-08-10 01:40:02 +00:00
moodlerobot 5e195c8235 Updated the 18 build version to 20080809 2008-08-09 01:42:56 +00:00
moodlerobot b1fbc8be30 Automatic installer.php lang files by installer_builder (20080809) 2008-08-09 01:30:59 +00:00
moodlerobot f7fa56821d Updated the 18 build version to 20080808 2008-08-08 01:48:23 +00:00
moodlerobot 62b4a55e5c Automatic installer.php lang files by installer_builder (20080808) 2008-08-08 01:35:31 +00:00
stronk7 8fb75b1d7a Backported from HEAD: Complete inline help about smtp hosts. Credit goes to Anthony. MDL-15923 2008-08-07 22:57:56 +00:00
stronk7 c5ade93e96 Adding 'text-decoration' and 'font-family' to allowed protocols. Backported from HEAD. MDL-15963 2008-08-07 22:42:54 +00:00
danmarsden dcbdab7312 MDL-15967 - must use full php tags, not shortags - thanks Urs merged from head 2008-08-07 20:48:33 +00:00
stronk7 933b96a3a8 Fixed copy&paste error. Credit goes to Sergio Rabellino.
http://moodle.org/mod/forum/discuss.php?d=102933 ; backported from HEAD
2008-08-07 17:11:54 +00:00
moodlerobot 490e14d6cc Updated the 18 build version to 20080807 2008-08-07 01:52:23 +00:00
moodlerobot 93f1172f98 Automatic installer.php lang files by installer_builder (20080807) 2008-08-07 01:38:28 +00:00
piers e19a4892a9 MDL-10425 and MDL-12872 Firefox bugs String() handling on replace. enhanced rege xfor CMI data types. MDL-8193 Incorrect handling of quotes in SetValue processing - recoded so that it escapes all values passed from tracks. backport to 1.8. Plus - fixed a back dated problem with determining the next sco in sequence with the navigation buttons. 2008-08-06 23:56:46 +00:00
piers 5f75ca701e MDL-15950 MDL-15640 MDL-15943 - SCORM player.php not inserting footer, Showing SCORM participation report. (thanks Urs Hunkler and Mitsuhiro Yoshida). Warning are displayed in a SCORM activity (thanks Dan). Backport to 1.8. 2008-08-06 05:09:15 +00:00
moodlerobot b5655a6578 Updated the 18 build version to 20080806 2008-08-06 01:52:19 +00:00
moodlerobot 9a825e9082 Automatic installer.php lang files by installer_builder (20080806) 2008-08-06 01:37:13 +00:00
moodlerobot ecca8c346b Updated the 18 build version to 20080805 2008-08-05 01:45:33 +00:00
moodlerobot f057ecd40c Automatic installer.php lang files by installer_builder (20080805) 2008-08-05 01:32:17 +00:00
stronk7 418deec57c Make custom checks BC, so any test about future releases doesn't fail
with error it the file and/or function is missing (highly possible). MDL-15939
2008-08-05 00:19:41 +00:00
stronk7 73254d7861 Backporting environment.xml from HEAD. Should be (and work) the same. 2008-08-04 23:14:48 +00:00
moodlerobot 3f9e92b025 Updated the 18 build version to 20080804 2008-08-04 01:48:41 +00:00
piers 1f3ef341bd MDL-14457 SCORM module creating extra windows when opening module in a new window. Backport to 1.8 (thanks Jo Matthews). 2008-08-03 22:20:20 +00:00
stronk7 c607a0ea03 Allow multiple SMTP hosts or host:port to be defined in $CFG->smtphosts. MDL-15923 ; backport from HEAD 2008-08-03 21:15:35 +00:00
moodlerobot a83cdea8e3 Updated the 18 build version to 20080803 2008-08-03 01:40:20 +00:00
gbateson 6792aa17f6 MDL-15811 fix quotes: width=240" -> width="240" 2008-08-02 21:30:59 +00:00
moodlerobot 63620c1d78 Updated the 18 build version to 20080802 2008-08-02 01:43:47 +00:00
moodlerobot 218ff7fb75 Automatic installer.php lang files by installer_builder (20080802) 2008-08-02 01:31:06 +00:00
skodak 0680a761f7 MDL-15410 Require PHP 5.2.4 instead of 5.2.0 in HEAD because PHP 5.2.0 has many known problems :-( 2008-08-01 10:09:38 +00:00
piers 43d67c7d22 MDL-14902 Missing column 'whatgrade' in prefix_scorm table. Is a DB patch (thanks Hans de Zwart). backport 1.8. 2008-08-01 04:35:38 +00:00
moodlerobot 5b526573d0 Updated the 18 build version to 20080801 2008-08-01 01:45:49 +00:00
piers 8fc7b48708 MDL-15899 JavaScript error In IE7 when opening SCORM content in a new window. Fix spaces in popup name for fussy IE. backported to 1.8. 2008-07-31 22:33:33 +00:00
mchurch c03ace0bdb MDL-15896 - Clean 'page' and 'q' parameters to only allow normal page name characters. 2008-07-31 14:14:05 +00:00
moodlerobot 9c29e6bfc6 Updated the 18 build version to 20080731 2008-07-31 01:56:33 +00:00
moodlerobot 27e053a25a Updated the 18 build version to 20080730 2008-07-30 01:45:19 +00:00
moodlerobot 1d64431c90 Updated the 18 build version to 20080729 2008-07-29 01:45:51 +00:00
piers f02cc7bf03 MDL-9378 New visualisation for SCORM - modify CSS class names to make them more specific. sorry to commit so close to review day, just fixing a regression - 1.8. 2008-07-29 01:27:12 +00:00
piers 8e3391e166 MDL-11892 JavaScript error on SCORM tree list - bapckport to 1.8 for AICC. 2008-07-28 22:46:37 +00:00
moodlerobot 165d5ca1a3 Updated the 18 build version to 20080728 2008-07-28 01:44:18 +00:00
moodlerobot 743fd57f2c Automatic installer.php lang files by installer_builder (20080728) 2008-07-28 01:32:47 +00:00
piers 7527707dd5 MDL-9378 New visualisation for SCORM - back ported to 1.8. 2008-07-28 00:49:22 +00:00
piers 2eedb5babd MDL-11137 Unable to locate API error - add check for empty array from DB interface (ksort complains) - backport to 1.8. 2008-07-27 21:26:07 +00:00
danmarsden fa31cbab04 MDL-15747 typo merged from HEAD 2008-07-27 20:22:59 +00:00
moodlerobot 9ea6e88ff2 Updated the 18 build version to 20080727 2008-07-27 01:40:45 +00:00
moodlerobot a2c075aaac Updated the 18 build version to 20080726 2008-07-26 01:44:02 +00:00
skodak 7387acb1e0 MDL-15823 format_string() improvements; merged from MOODLE_19_STABLE 2008-07-25 22:45:04 +00:00
piers 8e3cb48829 MDL-11137 Unable to locate API error - remove comment code with bad characters. backport to 1.8. 2008-07-25 02:33:10 +00:00
piers 19161949aa MDL-11137 Unable to locate API error - force a sort order on the cmi elements, and ensure correct type comparison when determining whether we have seen this objective id before. affects aicc, 1.2 and 1.3. propagate to 1.8. 2008-07-25 01:58:44 +00:00
moodlerobot 5d3a303539 Updated the 18 build version to 20080725 2008-07-25 01:47:09 +00:00
piers 39a3b2af0f MDL-9077 switch from client to server side validation for reference field as client side not supported for this type (file upload name) - propogate to 1.8. 2008-07-24 01:44:29 +00:00
moodlerobot 5d23030fc8 Updated the 18 build version to 20080724 2008-07-24 01:43:03 +00:00
piers 94446a8d68 MDL-7323 AICC Import does not handle Core_Vendor + remove tabs and ambiguous else - propogated to 1.8. 2008-07-24 01:30:26 +00:00
moodlerobot a9b2d797dc Updated the 18 build version to 20080723 2008-07-23 01:43:38 +00:00
moodlerobot ed7646af01 Automatic installer.php lang files by installer_builder (20080723) 2008-07-23 01:32:04 +00:00
moodlerobot e7dc0e4f15 Updated the 18 build version to 20080722 2008-07-22 01:50:49 +00:00
moodlerobot 95151a7493 Automatic installer.php lang files by installer_builder (20080722) 2008-07-22 01:39:24 +00:00
moodlerobot f6b8d22716 Updated the 18 build version to 20080721 2008-07-21 01:38:20 +00:00
moodlerobot cc518e4615 Automatic installer.php lang files by installer_builder (20080721) 2008-07-21 01:27:00 +00:00
moodlerobot e8b3db0f95 Added autogenerated bn_utf8 installer file. 2008-07-20 21:22:27 +00:00
moodlerobot 9d3e59b7ba file installer.php was added on branch MOODLE_18_STABLE on 2008-07-20 21:22:27 +0000 2008-07-20 21:20:08 +00:00
moodlerobot 7f3981ef41 Updated the 18 build version to 20080720 2008-07-20 01:50:38 +00:00
moodlerobot 4d16e6f650 Updated the 18 build version to 20080719 2008-07-19 01:39:03 +00:00
moodlerobot 6962ab2a64 Automatic installer.php lang files by installer_builder (20080719) 2008-07-19 01:28:06 +00:00
ericmerrill 5fa8b35428 MDL-15697 Added a check form rule limiting post subject and forum name to 255 characters, as limited by the DB 2008-07-18 13:27:04 +00:00
scyrma 6c831d73d3 MDL-4346: limiting the 'defer' clause to one call / fix the missing openpopup() bug in IE. (backport from 1.9) 2008-07-18 07:18:41 +00:00
moodler bfe239f1e6 MDL-6850 Removed apparent-size from du 2008-07-18 06:40:17 +00:00
piers b2c1183316 MDL-11892 Propogate Fixes for 'calls to expand javascript' to SCORM 1.2, and 1.3 code. 2008-07-18 06:28:41 +00:00
moodler 7b518b7227 MDL-15701 Merged fix from 1.9 (Don't show deleted hosts) 2008-07-18 04:05:00 +00:00
moodlerobot 66c041bd00 Updated the 18 build version to 20080718 2008-07-18 01:40:04 +00:00
tjhunt 9db58d015f MDL-15693 - print_question_icon does not cope with missing question types 2008-07-17 12:49:28 +00:00
tjhunt 1be35acd87 MDL-15692 - Quiz attempt paging bar screws up in IE7 when you zoom the page. Normal Moodle paging bar doesn't, so I've changed the HTML the quiz generates to be closer the the output of weblib. Fortunately, this is irrelevant in 2.0. 2008-07-17 12:39:45 +00:00
moodlerobot 34e3e0b732 Updated the 18 build version to 20080717 2008-07-17 01:44:13 +00:00
moodlerobot cede8c8fa3 Updated the 18 build version to 20080716 2008-07-16 01:44:09 +00:00
tjhunt 0df32c07c7 MDL-14413 - Invalid function name - is_image_by_extentsion in QTI export 2008-07-15 09:18:35 +00:00
moodlerobot 390b1cf724 Updated the 18 build version to 20080715 2008-07-15 01:43:55 +00:00
fmarier 4d7928e235 MDL-15614 Add 3 missing PHP error codes to get_file_upload_error()
The get_file_upload_error() function was missing the following error codes:

    UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder.',
    UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk.',
    UPLOAD_ERR_EXTENSION => 'File upload stopped by extension.',

(see http://www.php.net/manual/en/features.file-upload.errors.php)
2008-07-14 02:35:30 +00:00
moodlerobot 32f87cd80f Updated the 18 build version to 20080714 2008-07-14 01:40:49 +00:00
mudrd8mz 1cf107ac7d MDL-15639 Wrong link (missing filename) to the in the 1.8 installer 2008-07-13 19:59:26 +00:00
gbateson c251af9516 improvements to generation of html from xml:
JCloze: set textbox size allowing for minimum gap size setting and longest answer;
JMatch: allow for duplicates and distractors in RHS items;
JQuiz: set textbox size allowing for longest answer, and use textarea if answer longer than 29 chars;
2008-07-13 12:18:42 +00:00
moodlerobot 8005dfec30 Updated the 18 build version to 20080713 2008-07-13 01:38:34 +00:00
moodlerobot c393c9a44c Updated the 18 build version to 20080712 2008-07-12 01:43:42 +00:00
moodlerobot c2697aeeb2 Updated the 18 build version to 20080711 2008-07-11 08:17:51 +00:00
skodak 0283b62467 MDL-13811 email change conf on by default; merged from MOODLE_19_STABLE 2008-07-11 07:51:12 +00:00
moodler 17a0ab80ed MDL-13811 Merged mailstop fix from 1.9 2008-07-11 07:14:44 +00:00
moodler 210a02693d Bumping post 1.8.6 2008-07-11 06:08:18 +00:00
341 changed files with 14601 additions and 9115 deletions
+339
View File
@@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) 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
this service 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 make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. 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.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
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
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the 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 a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE 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.
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
convey 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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision 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, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This 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.
+1 -1
View File
@@ -198,7 +198,7 @@
foreach ($assigns as $assign) {
if ($context = get_context_instance(CONTEXT_COURSE, $assign->courseid)) {
if (role_unassign(0, $assign->id, 0, $context->id)) {
mtrace("Deleted assignment for user $assign->id from course $assign->courseid");
mtrace("removing user $assign->id from course $assign->courseid as they have not accessed the course for over $CFG->longtimenosee days");
}
}
}
+39 -12
View File
@@ -200,6 +200,11 @@
<ON_OK message="questioncwqpfsok" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/customcheckslib.php" function="php_check_register_globals" level="required">
<FEEDBACK>
<ON_CHECK message="globalswarning" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
<MOODLE version="2.0" requires="1.9">
@@ -209,19 +214,20 @@
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mysql" version="4.1.16">
<VENDOR name="mysql" version="5.0.25">
<FEEDBACK>
<ON_ERROR message="mysql416required" />
</FEEDBACK>
<BYPASS function="bypass_mysql416_reqs" message="mysql416bypassed" />
</VENDOR>
<VENDOR name="postgres" version="8.0" />
<VENDOR name="postgres" version="8.3" />
<VENDOR name="mssql" version="9.0" />
<VENDOR name="odbc_mssql" version="9.0" />
<VENDOR name="mssql_n" version="9.0" />
<VENDOR name="oracle" version="9.0" />
<VENDOR name="oracle" version="10.0" />
<VENDOR name="sqlite" version="2.0" />
</DATABASE>
<PHP version="5.2.0" level="required">
<PHP version="5.2.8" level="required">
</PHP>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="optional">
@@ -234,9 +240,9 @@
<ON_CHECK message="mbstringrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="curl" level="optional">
<PHP_EXTENSION name="curl" level="required">
<FEEDBACK>
<ON_CHECK message="curlrecommended" />
<ON_CHECK message="curlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
<PHP_EXTENSION name="openssl" level="optional">
@@ -259,14 +265,35 @@
<ON_ERROR message="ctyperequired" />
</FEEDBACK>
</PHP_EXTENSION>
</PHP_EXTENSIONS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="question/upgrade.php" function="question_check_no_rqp_questions" level="optional">
<PHP_EXTENSION name="zip" level="required">
<FEEDBACK>
<ON_CHECK message="qtyperqpwillberemovedanyway" />
<ON_OK message="qtyperqpwillberemoved" />
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</CUSTOM_CHECK>
</PHP_EXTENSION>
<PHP_EXTENSION name="gd" level="optional">
<FEEDBACK>
<ON_CHECK message="gdrecommended" />
</FEEDBACK>
</PHP_EXTENSION>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="40M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="safe_mode" value="0" level="optional">
<FEEDBACK>
<ON_CHECK message="settingsafemode" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+275
View File
@@ -0,0 +1,275 @@
<?php
require_once('../config.php');
/**
* SCRIPT CONFIGURATION
*/
$starttimer = time()+microtime();
$settings = array();
$settings['verbose'] = false;
$settings['username'] = null;
$settings['password'] = null;
$settings['eolchar'] = '<br />'; // Character used to break lines
// Argument arrays: 0=>short name, 1=>long name
$arguments = array(
array('short'=>'u', 'long'=>'username', 'help' => 'Your moodle username', 'type'=>'STRING', 'default' => ''),
array('short'=>'pw', 'long'=>'password', 'help' => 'Your moodle password', 'type'=>'STRING', 'default' => ''),
array('short'=>'v', 'long' => 'verbose', 'help' => 'Display extra information about the process')
);
// Building the USAGE output of the command line version
if (isset($argv) && isset($argc)) {
$help = "Moodle User Pix Fix. Restores user profile images that were not properly moved during 1.8.2 upgrade to newer versions.\n\n"
. "Usage: {$argv[0]}; [OPTION] ...\n"
. "Options:\n"
. " -h, -?, -help, --help This output\n";
foreach ($arguments as $arg_array) {
$equal = '';
if (!empty($arg_array['type'])) {
$equal = "={$arg_array['type']}";
}
$padding1 = 5 - strlen($arg_array['short']);
$padding2 = 30 - (strlen($arg_array['long']) + strlen($equal));
$paddingstr1 = '';
for ($i = 0; $i < $padding1; $i++) {
$paddingstr1 .= ' ';
}
$paddingstr2 = '';
for ($i = 0; $i < $padding2; $i++) {
$paddingstr2 .= ' ';
}
$help .= " -{$arg_array['short']},$paddingstr1--{$arg_array['long']}$equal$paddingstr2{$arg_array['help']}\n";
}
$help .= "\nEmail nicolasconnault@gmail.com for any suggestions or bug reports.\n";
if ($argc == 1 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
echo $help;
die();
} else {
$settings['eolchar'] = "\n";
$argv = arguments($argv);
$argscount = 0;
foreach ($arguments as $arg_array) {
$value = null;
if (in_array($arg_array['short'], array_keys($argv))) {
$value = $argv[$arg_array['short']];
unset($argv[$arg_array['short']]);
} elseif (in_array($arg_array['long'], array_keys($argv))) {
$value = $argv[$arg_array['long']];
unset($argv[$arg_array['long']]);
}
if (!is_null($value)) {
$settings[$arg_array['long']] = $value;
$argscount++;
}
}
// If some params are left in argv, it means they are not supported
if ($argscount == 0 || count($argv) > 0) {
echo $help;
die();
}
}
}
/**
* SCRIPT SETUP
*/
require_once($CFG->libdir . '/formslib.php');
require_once($CFG->dirroot .'/course/lib.php');
verbose("Loading libraries...");
$systemcontext = get_context_instance(CONTEXT_SYSTEM);
/**
* WEB INTERFACE FORM
*/
class pixfix_form extends moodleform {
function definition() {
global $arguments;
$mform =& $this->_form;
foreach ($arguments as $arg_array) {
$type = 'advcheckbox';
$label = ucfirst(str_replace('-', ' ', $arg_array['long']));
if (!empty($arg_array['type'])) {
$type = 'text';
}
if ($arg_array['long'] == 'password' || $arg_array['long'] == 'username') {
continue;
}
$mform->addElement($type, $arg_array['long'], $label);
if (isset($arg_array['default'])) {
$mform->setDefault($arg_array['long'], $arg_array['default']);
}
}
$this->add_action_buttons(false, 'Restore Images');
}
function definition_after_data() {
}
}
$run_script = true;
$web_interface = false;
// If eolchar is still <br />, load the web interface
if ($settings['eolchar'] == '<br />') {
print_header("User Pix-Fix");
print_heading("User Pix-Fix");
$mform = new pixfix_form();
if ($data = $mform->get_data(false)) {
foreach ($arguments as $arg_array) {
if (!empty($data->{$arg_array['long']})) {
$settings[$arg_array['long']] = $data->{$arg_array['long']};
}
}
} else {
$run_script = false;
}
if (!has_capability('moodle/site:doanything', $systemcontext)) {
// If not logged in, give link to login page for current site
notify("You must be logged in as administrator before using this script.");
require_login();
} else {
$mform->display();
}
$web_interface = true;
}
if ($run_script) {
// User authentication
if (!$web_interface) {
if (empty($settings['username'])) {
echo "You must enter a valid username for a moodle administrator account on this site.{$settings['eolchar']}";
die();
} elseif (empty($settings['password'])) {
echo "You must enter a valid password for a moodle administrator account on this site.{$settings['eolchar']}";
die();
} else {
if (!$user = authenticate_user_login($settings['username'], $settings['password'])) {
echo "Invalid username or password!{$settings['eolchar']}";
die();
}
$USER = complete_user_login($user);
if (!has_capability('moodle/site:doanything', $systemcontext)) {
echo "You do not have administration privileges on this Moodle site. These are required for running the restore script.{$settings['eolchar']}";
die();
}
}
}
// Script code here
// Look for old moodledata/users directory
$oldusersdir = $CFG->dataroot . '/users';
if (!file_exists($oldusersdir)) {
notify('The old directory for user profile images ('.$oldusersdir.') does not exist. Pictures cannot be restored!');
} else {
// Find user profile images that are not yet in the new directory
$folders = get_directory_list($oldusersdir, '', false, true, false);
$restored_count = 0;
foreach ($folders as $userid) {
$olddir = $oldusersdir . '/' . $userid;
$files = get_directory_list($olddir);
if (empty($files)) {
continue;
}
// Create new user directory
if (!$newdir = make_user_directory($userid)) {
// some weird directory - do not stop the upgrade, just ignore it
continue;
}
// Move contents of old directory to new one
if (file_exists($olddir) && file_exists($newdir)) {
$restored = false;
foreach ($files as $file) {
if (!file_exists($newdir . '/' . $file)) {
copy($olddir . '/' . $file, $newdir . '/' . $file);
verbose("Moved $olddir/$file into $newdir/$file");
$restored = true;
}
}
if ($restored) {
$restored_count++;
}
} else {
notify("Could not move the contents of $olddir into $newdir!");
$result = false;
break;
}
}
if ($settings['eolchar'] == '<br />') {
print_box_start('generalbox centerpara');
}
if ($restored_count > 0) {
echo "Successfully restored profile images for $restored_count users!" . $settings['eolchar'];
} else {
echo "Did not find any user profile images in need of restoring." . $settings['eolchar'];
}
if ($settings['eolchar'] == '<br />') {
print_box_end();
}
}
}
if ($settings['eolchar'] == '<br />') {
print_footer();
}
/**
* Converts the standard $argv into an associative array taking var=val arguments into account
* @param array $argv
* @return array $_ARG
*/
function arguments($argv) {
$_ARG = array();
foreach ($argv as $arg) {
if (ereg('--?([^=]+)=(.*)',$arg,$reg)) {
$_ARG[$reg[1]] = $reg[2];
} elseif(ereg('-([a-zA-Z0-9]+)',$arg,$reg)) {
$_ARG[$reg[1]] = 'true';
}
}
return $_ARG;
}
/**
* If verbose is switched on, prints a string terminated by the global eolchar string.
* @param string $string The string to STDOUT
*/
function verbose($string) {
global $settings;
if ($settings['verbose'] && !$settings['quiet']) {
echo $string . $settings['eolchar'];
}
}
?>
+193 -1
View File
@@ -525,11 +525,203 @@ class problem_000011 extends problem_base {
}
return 'Error counter was cleared.';
} else {
return '<p>Session errors can be caused by:<ul><li>unresolved problem in server software (aka random switching of users),</li><li>blocked or modified cookies,</li><li>deleting of active session files.</li></ul></p><p><a href="'.me().'&resetsesserrorcounter=1">Reset counter.</a></p>';
return '<p>Session errors can be caused by:</p><ul>' .
'<li>unresolved problem in server software (aka random switching of users),</li>' .
'<li>blocked or modified cookies,</li>' .
'<li>deleting of active session files.</li>' .
'</ul><p><a href="'.me().'&amp;resetsesserrorcounter=1">Reset counter</a></p>';
}
}
}
class problem_000012 extends problem_base {
function title() {
return 'Random questions data consistency';
}
function exists() {
return record_exists_select('question', "qtype = 'random' AND parent <> id");
}
function severity() {
return SEVERITY_ANNOYANCE;
}
function description() {
return '<p>For random questions, question.parent should equal question.id. ' .
'There are some questions in your database for which this is not true. ' .
'One way that this could have happened is for random questions restored from backup before ' .
'<a href="http://tracker.moodle.org/browse/MDL-5482">MDL-5482</a> was fixed.</p>';
}
function solution() {
global $CFG;
return '<p>Upgrade to Moodle 1.9.1 or later, or manually execute the SQL</p>' .
'<pre>UPDATE ' . $CFG->prefix . 'question SET parent = id WHERE qtype = \'random\' and parent &lt;> id;</pre>';
}
}
class problem_000013 extends problem_base {
function title() {
return 'Multi-answer questions data consistency';
}
function exists() {
global $CFG;
$positionexpr = sql_position(sql_concat("','", "q.id", "','"),
sql_concat("','", "qma.sequence", "','"));
return record_exists_sql("
SELECT * FROM {$CFG->prefix}question q
JOIN {$CFG->prefix}question_multianswer qma ON $positionexpr > 0
WHERE qma.question <> q.parent") ||
record_exists_sql("
SELECT * FROM {$CFG->prefix}question q
JOIN {$CFG->prefix}question parent_q ON parent_q.id = q.parent
WHERE q.category <> parent_q.category");
}
function severity() {
return SEVERITY_ANNOYANCE;
}
function description() {
return '<p>For each sub-question whose id is listed in ' .
'question_multianswer.sequence, its question.parent field should equal ' .
'question_multianswer.question; and each sub-question should be in the same ' .
'category as its parent. There are questions in your database for ' .
'which this is not the case. One way that this could have happened is ' .
'for multi-answer questions restored from backup before ' .
'<a href="http://tracker.moodle.org/browse/MDL-14750">MDL-14750</a> was fixed.</p>';
}
function solution() {
return '<p>Upgrade to Moodle 1.9.1 or later, or manually execute the ' .
'code in question_multianswer_fix_subquestion_parents_and_categories in ' .
'<a href="http://cvs.moodle.org/moodle/question/type/multianswer/db/upgrade.php?revision=1.1.10.2&amp;view=markup">/question/type/multianswer/db/upgrade.php' .
'from the 1.9 stable branch</a>.</p>';
}
}
class problem_000014 extends problem_base {
function title() {
return 'Only multianswer and random questions should be the parent of another question';
}
function exists() {
global $CFG;
return record_exists_sql("
SELECT * FROM {$CFG->prefix}question q
JOIN {$CFG->prefix}question parent_q ON parent_q.id = q.parent
WHERE parent_q.qtype NOT IN ('random', 'multianswer')");
}
function severity() {
return SEVERITY_ANNOYANCE;
}
function description() {
return '<p>You have questions that violate this in your databse. ' .
'You will need to investigate to determine how this happened.</p>';
}
function solution() {
return '<p>It is impossible to give a solution without knowing more about ' .
' how the problem was caused. You may be able to get help from the ' .
'<a href="http://moodle.org/mod/forum/view.php?f=121">Quiz forum</a>.</p>';
}
}
class problem_000017 extends problem_base {
function title() {
return 'Question categories tree structure';
}
function find_problems() {
static $answer = null;
if (is_null($answer)) {
$categories = get_records('question_categories', '', '', 'id');
// Look for missing parents.
$missingparent = array();
foreach ($categories as $category) {
if ($category->parent != 0 && !array_key_exists($category->parent, $categories)) {
$missingparent[$category->id] = $category;
}
}
// Look for loops.
$loops = array();
while (!empty($categories)) {
$current = array_pop($categories);
$thisloop = array($current->id => $current);
while (true) {
if (isset($thisloop[$current->parent])) {
// Loop detected
$loops[$current->id] = $thisloop;
break;
} else if (!isset($categories[$current->parent])) {
// Got to the top level, or a category we already know is OK.
break;
} else {
// Continue following the path.
$current = $categories[$current->parent];
$thisloop[$current->id] = $current;
unset($categories[$current->id]);
}
}
}
$answer = array($missingparent, $loops);
}
return $answer;
}
function exists() {
list($missingparent, $loops) = $this->find_problems();
return !empty($missingparent) || !empty($loops);
}
function severity() {
return SEVERITY_ANNOYANCE;
}
function description() {
list($missingparent, $loops) = $this->find_problems();
$description = '<p>The question categories should be arranged into tree ' .
' structures by the question_categories.parent field. Sometimes ' .
' this tree structure gets messed up.</p>';
if (!empty($missingparent)) {
$description .= '<p>The following categories are missing their parents:</p><ul>';
foreach ($missingparent as $cat) {
$description .= "<li>Category $cat->id: " . s($cat->name) . "</li>\n";
}
$description .= "</ul>\n";
}
if (!empty($loops)) {
$description .= '<p>The following categories form a loop of parents:</p><ul>';
foreach ($loops as $loop) {
$description .= "<li><ul>\n";
foreach ($loop as $cat) {
$description .= "<li>Category $cat->id: " . s($cat->name) . " has parent $cat->parent</li>\n";
}
$description .= "</ul></li>\n";
}
$description .= "</ul>\n";
}
return $description;
}
function solution() {
global $CFG;
list($missingparent, $loops) = $this->find_problems();
$solution = '<p>Consider executing the following SQL queries. These fix ' .
'the problem by moving some categories to the top level.</p>';
if (!empty($missingparent)) {
$solution .= "<pre>UPDATE " . $CFG->prefix . "question_categories\n" .
" SET parent = 0\n" .
" WHERE id IN (" . implode(',', array_keys($missingparent)) . ");</pre>\n";
}
if (!empty($loops)) {
$solution .= "<pre>UPDATE " . $CFG->prefix . "question_categories\n" .
" SET parent = 0\n" .
" WHERE id IN (" . implode(',', array_keys($loops)) . ");</pre>\n";
}
return $solution;
}
}
class problem_00000x extends problem_base {
function title() {
+2 -1
View File
@@ -281,6 +281,7 @@
require_once($CFG->libdir.'/environmentlib.php');
print_heading(get_string('environment', 'admin'));
remove_dir($CFG->dataroot . '/environment'); /// Always delete downloaded env. info to force use of the released one. MDL-9796
if (!check_moodle_environment($release, $environment_results, true)) {
print_box_start('generalbox', 'notice'); // MDL-8330
print_string('langpackwillbeupdated', 'admin');
@@ -426,7 +427,7 @@
upgrade_local_db("$CFG->wwwroot/$CFG->admin/index.php"); // Return here afterwards
/// Check for changes to RPC functions
require_once($CFG->dirroot.'/admin/mnet/adminlib.php');
require_once("$CFG->dirroot/$CFG->admin/mnet/adminlib.php");
upgrade_RPC_functions("$CFG->wwwroot/$CFG->admin/index.php"); // Return here afterwards
+4 -4
View File
@@ -47,7 +47,7 @@ if (!empty($action) and confirm_sesskey()) {
// fetch the record in question
$id = required_param('id', PARAM_INT);
if (!$idrec = get_record('mnet_sso_access_control', 'id', $id)) {
error(get_string('recordnoexists','mnet'), '/admin/mnet/access_control.php');
error(get_string('recordnoexists','mnet'), "/$CFG->admin/mnet/access_control.php");
}
switch ($action) {
@@ -62,7 +62,7 @@ if (!empty($action) and confirm_sesskey()) {
// 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') {
error(get_string('invalidaccessparam', 'mnet') , '/admin/mnet/access_control.php');
error(get_string('invalidaccessparam', 'mnet') , "/$CFG->admin/mnet/access_control.php");
}
if (mnet_update_sso_access_control($idrec->username, $idrec->mnet_host_id, $accessctrl)) {
@@ -75,7 +75,7 @@ if (!empty($action) and confirm_sesskey()) {
break;
default:
print_error('invalidactionparam', 'mnet', '/admin/mnet/access_control.php');
print_error('invalidactionparam', 'mnet', "/$CFG->admin/mnet/access_control.php");
}
}
@@ -86,7 +86,7 @@ if ($form = data_submitted() and confirm_sesskey()) {
// check permissions and verify form input
if (!has_capability('moodle/user:delete', $sitecontext)) {
error(get_string('nomodifyacl','mnet'), '/admin/mnet/access_control.php');
error(get_string('nomodifyacl','mnet'), "/$CFG->admin/mnet/access_control.php");
}
if (empty($form->username)) {
$formerror['username'] = get_string('enterausername','mnet');
+1 -1
View File
@@ -72,7 +72,7 @@ function mnet_get_functions($type, $parentname) {
if (!file_exists($filename)) return false;
if (extension_loaded('tokenizer')) {
include_once $CFG->dirroot.'/admin/mnet/MethodTable.php';
include_once "$CFG->dirroot/$CFG->admin/mnet/MethodTable.php";
$functions = (array)MethodTable::create($filename,false);
}
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
print_header("$site->shortname: $strmnetsettings", "$site->fullname",
'<a href="'.$CFG->wwwroot.'/admin/index.php">'.$stradministration.'</a> -> '.
'<a href="'.$CFG->wwwroot.'/admin/mnet/index.php">'.get_string('mnetsettings', 'mnet').'</a> -> Delete host');
'<a href="'.$CFG->wwwroot.'/'.$CFG->admin.'/index.php">'.$stradministration.'</a> -> '.
'<a href="'.$CFG->wwwroot.'/'.$CFG->admin.'/mnet/index.php">'.get_string('mnetsettings', 'mnet').'</a> -> Delete host');
print_heading(get_string('mnetsettings', 'mnet'));
?>
+1 -1
View File
@@ -38,7 +38,7 @@
" class=\"icon\" alt=\"".get_string("course")."\" />";
foreach ($courses as $course) {
$link = $CFG->wwwroot . '/admin/mnet/enr_course_enrol.php?'
$link = "$CFG->wwwroot/$CFG->admin/mnet/enr_course_enrol.php?"
. "host={$mnethost}&amp;courseid={$course->id}&amp;sesskey={$USER->sesskey}";
echo '<tr>'
. "<td>$icon</td>"
+1 -1
View File
@@ -38,7 +38,7 @@
. '</tr>';
$hosts = $enrolment->list_remote_servers();
foreach ($hosts as $host) {
$coursesurl = "{$CFG->wwwroot}/admin/mnet/enr_courses.php?host={$host->id}&amp;sesskey={$USER->sesskey}";
$coursesurl = "{$CFG->wwwroot}/$CFG->admin/mnet/enr_courses.php?host={$host->id}&amp;sesskey={$USER->sesskey}";
$coursecount = get_field_sql("SELECT count(id) FROM {$CFG->prefix}mnet_enrol_course WHERE hostid={$host->id}");
if (empty($coursecount)) {
$coursecount = '?';
+4 -2
View File
@@ -96,6 +96,7 @@ if (($form = data_submitted()) && confirm_sesskey()) {
if (isset($form->deleted) && ($form->deleted == '0' || $form->deleted == '1')) {
$mnet_peer->deleted = $form->deleted;
$mnet_peer->updateparams->deleted = $form->deleted;
}
if (isset($form->public_key)) {
@@ -106,9 +107,10 @@ if (($form = data_submitted()) && confirm_sesskey()) {
} else {
$oldkey = $mnet_peer->public_key;
$mnet_peer->public_key = $form->public_key;
$mnet_peer->public_key_expires = $mnet_peer->check_common_name($form->public_key);
$mnet_peer->updateparams->public_key = $form->public_key;
$mnet_peer->public_key_expires = $mnet_peer->check_common_name($form->public_key);
$mnet_peer->updateparams->public_key_expires = $mnet_peer->check_common_name($form->public_key);
if ($mnet_peer->public_key_expires == false) {
$mnet_peer->public_key == $oldkey;
$errmsg = '<br />';
foreach ($mnet_peer->error as $err) {
$errmsg .= $err['code'] . ': ' . $err['text'].'<br />';
+123
View File
@@ -0,0 +1,123 @@
<?php //$Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.org //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (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: //
// //
// http://www.gnu.org/copyleft/gpl.html //
// //
///////////////////////////////////////////////////////////////////////////
require_once('../../../config.php');
require_once($CFG->dirroot.'/'.$CFG->admin.'/report/security/lib.php');
require_once($CFG->libdir.'/adminlib.php');
require_login();
$issue = optional_param('issue', '', PARAM_FILE); // show detailed info about one issue only
$issues = report_security_get_issue_list();
// test if issue valid string
if (array_search($issue, $issues, true) === false) {
$issue = '';
}
// we may need a bit more memory and this may take a long time to process
@raise_memory_limit('128M');
@set_time_limit(0);
// Print the header.
$adminroot = admin_get_root();
admin_externalpage_setup('reportsecurity', $adminroot);
admin_externalpage_print_header($adminroot);
print_heading(get_string('reportsecurity', 'report_security'));
while(@ob_end_flush());
@flush();
$strok = '<span class="statusok">'.get_string('statusok', 'report_security').'</span>';
$strinfo = '<span class="statusinfo">'.get_string('statusinfo', 'report_security').'</span>';
$strwarning = '<span class="statuswarning">'.get_string('statuswarning', 'report_security').'</span>';
$strserious = '<span class="statusserious">'.get_string('statusserious', 'report_security').'</span>';
$strcritical = '<span class="statuscritical">'.get_string('statuscritical', 'report_security').'</span>';
$strissue = get_string('issue', 'report_security');
$strstatus = get_string('status', 'report_security');
$strdesc = get_string('description', 'report_security');
$strconfig = get_string('configuration', 'report_security');
$statusarr = array(REPORT_SECURITY_OK => $strok,
REPORT_SECURITY_INFO => $strinfo,
REPORT_SECURITY_WARNING => $strwarning,
REPORT_SECURITY_SERIOUS => $strserious,
REPORT_SECURITY_CRITICAL => $strcritical);
$url = "$CFG->wwwroot/$CFG->admin/report/security/index.php";
if ($issue and ($result = $issue(true))) {
$table = new object();
$table->head = array($strissue, $strstatus, $strdesc, $strconfig);
$table->size = array('30%', '10%', '50%', '10%' );
$table->align = array('left', 'left', 'left', 'left');
$table->width = '90%';
$table->data = array();
// print detail of one issue only
$row = array();
$row[0] = report_security_doc_link($issue, $result->name);
$row[1] = $statusarr[$result->status];
$row[2] = $result->info;
$row[3] = is_null($result->link) ? '&nbsp;' : $result->link;
$CFG->pagepath = "report/security/$issue"; // help link in footer
$table->data[] = $row;
print_table($table);
print_box($result->details, 'generalbox boxwidthnormal boxaligncenter'); // TODO: add proper css
print_continue($url);
} else {
$table = new object();
$table->head = array($strissue, $strstatus, $strdesc);
$table->size = array('30%', '10%', '60%' );
$table->align = array('left', 'left', 'left');
$table->width = '90%';
$table->data = array();
foreach ($issues as $issue) {
$result = $issue(false);
if (!$result) {
// ignore this test
continue;
}
$row = array();
$row[0] = "<a href='$url?issue=$result->issue'>$result->name</a>";
$row[1] = $statusarr[$result->status];
$row[2] = $result->info;
$table->data[] = $row;
}
print_table($table);
}
admin_externalpage_print_footer($adminroot);
+742
View File
@@ -0,0 +1,742 @@
<?php //$Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.org //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (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: //
// //
// http://www.gnu.org/copyleft/gpl.html //
// //
///////////////////////////////////////////////////////////////////////////
require_once("$CFG->libdir/adminlib.php");
define('REPORT_SECURITY_OK', 'ok');
define('REPORT_SECURITY_INFO', 'info');
define('REPORT_SECURITY_WARNING', 'warning');
define('REPORT_SECURITY_SERIOUS', 'serious');
define('REPORT_SECURITY_CRITICAL', 'critical');
function report_security_get_issue_list() {
return array(
'report_security_check_globals',
'report_security_check_unsecuredataroot',
'report_security_check_displayerrors',
'report_security_check_noauth',
'report_security_check_embed',
'report_security_check_mediafilterswf',
'report_security_check_openprofiles',
'report_security_check_google',
'report_security_check_configrw',
'report_security_check_defaultuserrole',
'report_security_check_guestrole',
'report_security_check_defaultcourserole',
'report_security_check_courserole',
);
}
function report_security_doc_link($issue, $name) {
global $CFG;
if (empty($CFG->docroot)) {
return $name;
}
$lang = str_replace('_utf8', '', current_language());
$str = "<a onclick=\"this.target='docspopup'\" href=\"$CFG->docroot/$lang/report/security/$issue\">";
$str .= "<img class=\"iconhelp\" src=\"$CFG->httpswwwroot/pix/docs.gif\" alt=\"\" />$name</a>";
return $str;
}
///=============================================
/// Issue checks
///=============================================
/**
* Verifies register globals PHP setting.
* @param bool $detailed
* @return object result
*/
function report_security_check_globals($detailed=false) {
$result = new object();
$result->issue = 'report_security_check_globals';
$result->name = get_string('check_globals_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = null;
if (ini_get_bool('register_globals')) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_globals_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_globals_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_globals_details', 'report_security');
}
return $result;
}
/**
* Verifies unsupported noauth setting
* @param bool $detailed
* @return object result
*/
function report_security_check_noauth($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_noauth';
$result->name = get_string('check_noauth_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/auth.php\">".get_string('authentication').'</a>';
if (is_enabled_auth('none')) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_noauth_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_noauth_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_noauth_details', 'report_security');
}
return $result;
}
/**
* Verifies sloppy embedding - this should have been removed long ago!!
* @param bool $detailed
* @return object result
*/
function report_security_check_embed($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_embed';
$result->name = get_string('check_embed_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=sitepolicies\">".get_string('sitepolicies', 'admin').'</a>';
if (!empty($CFG->allowobjectembed)) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_embed_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_embed_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_embed_details', 'report_security');
}
return $result;
}
/**
* Verifies sloppy swf embedding - this should have been removed long ago!!
* @param bool $detailed
* @return object result
*/
function report_security_check_mediafilterswf($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_mediafilterswf';
$result->name = get_string('check_mediafilterswf_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/filters.php\">".get_string('filtersettings', 'admin').'</a>';
if (!empty($CFG->textfilters)) {
$activefilters = explode(',', $CFG->textfilters);
} else {
$activefilters = array();
}
if (array_search('filter/mediaplugin', $activefilters) !== false and !empty($CFG->filter_mediaplugin_enable_swf)) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_mediafilterswf_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_mediafilterswf_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_mediafilterswf_details', 'report_security');
}
return $result;
}
/**
* Verifies fatal misconfiguration of dataroot
* @param bool $detailed
* @return object result
*/
function report_security_check_unsecuredataroot($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_unsecuredataroot';
$result->name = get_string('check_unsecuredataroot_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = null;
$insecuredataroot = is_dataroot_insecure();
if ($insecuredataroot) {
$result->status = REPORT_SECURITY_SERIOUS;
$result->info = get_string('check_unsecuredataroot_warning', 'report_security', $CFG->dataroot);
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_unsecuredataroot_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_unsecuredataroot_details', 'report_security');
}
return $result;
}
/**
* Verifies disaplying of errors - problem for lib files and 3rd party code
* because we can not disable debugging in these scripts (they do not include config.php)
* @param bool $detailed
* @return object result
*/
function report_security_check_displayerrors($detailed=false) {
$result = new object();
$result->issue = 'report_security_check_displayerrors';
$result->name = get_string('check_displayerrors_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = null;
if (defined('WARN_DISPLAY_ERRORS_ENABLED')) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_displayerrors_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_displayerrors_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_displayerrors_details', 'report_security');
}
return $result;
}
/**
* Verifies open profiles - originaly open by default, not anymore because spammer abused it a lot
* @param bool $detailed
* @return object result
*/
function report_security_check_openprofiles($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_openprofiles';
$result->name = get_string('check_openprofiles_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=sitepolicies\">".get_string('sitepolicies', 'admin').'</a>';
if (empty($CFG->forcelogin) and empty($CFG->forceloginforprofiles)) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_openprofiles_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_openprofiles_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_openprofiles_details', 'report_security');
}
return $result;
}
/**
* Verifies google access not combined with disabled guest access
* because attackers might gain guest access by modifying browser signature.
* @param bool $detailed
* @return object result
*/
function report_security_check_google($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_google';
$result->name = get_string('check_google_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=sitepolicies\">".get_string('sitepolicies', 'admin').'</a>';
if (empty($CFG->opentogoogle)) {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_google_ok', 'report_security');
} else if (!empty($CFG->guestloginbutton)) {
$result->status = REPORT_SECURITY_INFO;
$result->info = get_string('check_google_info', 'report_security');
} else {
$result->status = REPORT_SECURITY_SERIOUS;
$result->info = get_string('check_google_error', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_google_details', 'report_security');
}
return $result;
}
/**
* Verifies config.php is not writable anymore after installation,
* config files were changed on several outdated server.
* @param bool $detailed
* @return object result
*/
function report_security_check_configrw($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_configrw';
$result->name = get_string('check_configrw_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = null;
if (is_writable($CFG->dirroot.'/config.php')) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_configrw_warning', 'report_security');
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_configrw_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_configrw_details', 'report_security');
}
return $result;
}
/**
* Verifies sanity of default user role.
* @param bool $detailed
* @return object result
*/
function report_security_check_defaultuserrole($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_defaultuserrole';
$result->name = get_string('check_defaultuserrole_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=userpolicies\">".get_string('userpolicies', 'admin').'</a>';;
if (!$default_role = get_record('role', 'id', $CFG->defaultuserroleid)) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_defaultuserrole_notset', 'report_security');
$result->details = $result->info;
return $result;
}
// first test if do anything enabled - that would be really crazy!
$sql = "SELECT COUNT(DISTINCT rc.contextid)
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability = 'moodle/site:doanything'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $default_role->id";
$anythingcount = count_records_sql($sql);
// risky caps - usually very dangerous
$sql = "SELECT COUNT(DISTINCT rc.contextid)
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG))." <> 0
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $default_role->id";
$riskycount = count_records_sql($sql);
// default role can not have view cap in all courses - this would break moodle badly
$viewcap = record_exists('role_capabilities', 'roleid', $default_role->id, 'permission', CAP_ALLOW, 'capability', 'moodle/course:view');
// it may have either no or 'user' legacy type - nothing else, or else it would break during upgrades badly
$legacyok = false;
$sql = "SELECT rc.capability, 1
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability LIKE 'moodle/legacy:%'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $default_role->id";
$legacycaps = get_records_sql($sql);
if (!$legacycaps) {
$legacyok = true;
} else if (count($legacycaps) == 1 and isset($legacycaps['moodle/legacy:user'])) {
$legacyok = true;
}
if ($anythingcount or $riskycount or $viewcap or !$legacyok) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_defaultuserrole_error', 'report_security', format_string($default_role->name));
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_defaultuserrole_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_defaultuserrole_details', 'report_security');
}
return $result;
}
/**
* Verifies sanity of guest role
* @param bool $detailed
* @return object result
*/
function report_security_check_guestrole($detailed=false) {
global $CFG;
$result = new object();
$result->issue = 'report_security_check_guestrole';
$result->name = get_string('check_guestrole_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=userpolicies\">".get_string('userpolicies', 'admin').'</a>';;
if (!$guest_role = get_record('role', 'id', $CFG->guestroleid)) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_guestrole_notset', 'report_security');
$result->details = $result->info;
return $result;
}
// first test if do anything enabled - that would be really crazy!
$sql = "SELECT COUNT(DISTINCT rc.contextid)
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability = 'moodle/site:doanything'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $guest_role->id";
$anythingcount = count_records_sql($sql);
// risky caps - usually very dangerous
$sql = "SELECT COUNT(DISTINCT rc.contextid)
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG))." <> 0
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $guest_role->id";
$riskycount = count_records_sql($sql);
// it may have either no or 'guest' legacy type - nothing else, or else it would break during upgrades badly
$legacyok = false;
$sql = "SELECT rc.capability, 1
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability LIKE 'moodle/legacy:%'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $guest_role->id";
$legacycaps = get_records_sql($sql);
if (!$legacycaps) {
$legacyok = true;
} else if (count($legacycaps) == 1 and isset($legacycaps['moodle/legacy:guest'])) {
$legacyok = true;
}
if ($anythingcount or $riskycount or !$legacyok) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_guestrole_error', 'report_security', format_string($guest_role->name));
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_guestrole_ok', 'report_security');
}
if ($detailed) {
$result->details = get_string('check_guestrole_details', 'report_security');
}
return $result;
}
/**
* Verifies sanity of site default course role.
* @param bool $detailed
* @return object result
*/
function report_security_check_defaultcourserole($detailed=false) {
global $CFG;
$problems = array();
$result = new object();
$result->issue = 'report_security_check_defaultcourserole';
$result->name = get_string('check_defaultcourserole_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=userpolicies\">".get_string('userpolicies', 'admin').'</a>';;
if ($detailed) {
$result->details = get_string('check_defaultcourserole_details', 'report_security');
}
if (!$student_role = get_record('role', 'id', $CFG->defaultcourseroleid)) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_defaultcourserole_notset', 'report_security');
$result->details = get_string('check_defaultcourserole_details', 'report_security');
return $result;
}
// first test if do anything enabled - that would be really crazy!
$sql = "SELECT DISTINCT rc.contextid
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability = 'moodle/site:doanything'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $student_role->id";
if ($anything_contexts = get_records_sql($sql)) {
foreach($anything_contexts as $contextid) {
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$CFG->defaultcourseroleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$CFG->defaultcourseroleid";
}
$problems[] = get_string('check_defaultcourserole_anything', 'report_security', $a);
}
}
// risky caps - usually very dangerous
$sql = "SELECT DISTINCT rc.contextid
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG))." <> 0
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $student_role->id";
if ($riskycontexts = get_records_sql($sql)) {
foreach($riskycontexts as $contextid=>$unused) {
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$CFG->defaultcourseroleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$CFG->defaultcourseroleid";
}
$problems[] = get_string('check_defaultcourserole_risky', 'report_security', $a);
}
}
// course creator or administrator does not make any sense here
$sql = "SELECT rc.capability, 1
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability LIKE 'moodle/legacy:%'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid = $student_role->id";
$legacycaps = get_records_sql($sql);
if (isset($legacycaps['moodle/legacy:coursecreator']) or isset($legacycaps['moodle/legacy:admin'])) {
$problems[] = get_string('check_defaultcourserole_legacy', 'report_security');
}
if ($problems) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_defaultcourserole_error', 'report_security', format_string($student_role->name));
if ($detailed) {
$result->details .= "<ul>";
foreach ($problems as $problem) {
$result->details .= "<li>$problem</li>";
}
$result->details .= "</ul>";
}
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_defaultcourserole_ok', 'report_security');
}
return $result;
}
/**
* Verifies sanity of default roles in courses.
* @param bool $detailed
* @return object result
*/
function report_security_check_courserole($detailed=false) {
global $CFG, $SITE;
$problems = array();
$result = new object();
$result->issue = 'report_security_check_courserole';
$result->name = get_string('check_courserole_name', 'report_security');
$result->info = null;
$result->details = null;
$result->status = null;
$result->link = null;
if ($detailed) {
$result->details = get_string('check_courserole_details', 'report_security');
}
// get list of all student roles selected in courses excluding the default course role
$sql = "SELECT r.*
FROM {$CFG->prefix}role r
JOIN {$CFG->prefix}course c ON c.defaultrole = r.id
WHERE c.id <> $SITE->id AND r.id <> $CFG->defaultcourseroleid";
if (!$student_roles = get_records_sql($sql)) {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_courserole_notyet', 'report_security');
$result->details = get_string('check_courserole_details', 'report_security');
return $result;
}
$roleids = array_keys($student_roles);
$sql = "SELECT DISTINCT rc.roleid
FROM {$CFG->prefix}role_capabilities rc
WHERE (rc.capability = 'moodle/legacy:coursecreator' OR rc.capability = 'moodle/legacy:admin'
OR rc.capability = 'moodle/legacy:teacher' OR rc.capability = 'moodle/legacy:editingteacher')
AND rc.permission = ".CAP_ALLOW."";
$riskyroleids = get_records_sql($sql);
$riskyroleids = array_keys($riskyroleids);
// first test if do anything enabled - that would be really crazy!!!!!!
$inroles = implode(',', $roleids);
$sql = "SELECT rc.roleid, rc.contextid
FROM {$CFG->prefix}role_capabilities rc
WHERE rc.capability = 'moodle/site:doanything'
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid IN ($inroles)
GROUP BY rc.roleid, rc.contextid
ORDER BY rc.roleid, rc.contextid";
$rs = get_recordset_sql($sql);
while ($res = rs_fetch_next_record($rs)) {
$roleid = $res->roleid;
$contextid = $res->contextid;
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$roleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$roleid";
}
$problems[] = get_string('check_courserole_anything', 'report_security', $a);
}
rs_close($rs);
// any XSS legacy cap does not make any sense here!
$inroles = implode(',', $riskyroleids);
$sql = "SELECT DISTINCT c.id, c.shortname
FROM {$CFG->prefix}course c
WHERE c.defaultrole IN ($inroles)
ORDER BY c.sortorder";
if ($courses = get_records_sql($sql)) {
foreach ($courses as $course) {
$a = (object)array('url'=>"$CFG->wwwroot/course/edit.php?id=$course->id", 'shortname'=>$course->shortname);
$problems[] = get_string('check_courserole_riskylegacy', 'report_security', $a);
}
} else {
$course = array();
}
// risky caps in any level for roles not marked as risky yet - usually very dangerous!!
if ($checkroles = array_diff($roleids, $riskyroleids)) {
$inroles = implode(',', $checkroles);
$sql = "SELECT rc.roleid, rc.contextid
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG))." <> 0
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid IN ($inroles)
GROUP BY rc.roleid, rc.contextid
ORDER BY rc.roleid, rc.contextid";
$rs = get_recordset_sql($sql);
while ($res = rs_fetch_next_record($rs)) {
$roleid = $res->roleid;
$contextid = $res->contextid;
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$roleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$roleid";
}
$problems[] = get_string('check_courserole_risky', 'report_security', $a);
}
rs_close($rs);
}
if ($problems) {
$result->status = REPORT_SECURITY_CRITICAL;
$result->info = get_string('check_courserole_error', 'report_security');
if ($detailed) {
$result->details .= "<ul>";
foreach ($problems as $problem) {
$result->details .= "<li>$problem</li>";
}
$result->details .= "</ul>";
}
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_courserole_ok', 'report_security');
}
return $result;
}
+372
View File
@@ -0,0 +1,372 @@
<?php
/**
* Spam Cleaner
*
* Helps an admin to clean up spam in Moodle
*
* @version $Id$
* @authors Dongsheng Cai, Martin Dougiamas, Amr Hourani
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*/
// Configuration
// List of known spammy keywords, please add more here
$autokeywords = array(
"<img",
"fuck",
"casino",
"porn",
"xxx",
"cialis",
"viagra",
"poker",
"warcraft"
);
/////////////////////////////////////////////////////////////////////////////////
require_once('../../../config.php');
require_once($CFG->libdir.'/adminlib.php');
function delete_user($user) {
$updateuser = new object();
$updateuser->id = $user->id;
$updateuser->deleted = 1;
$updateuser->username = addslashes("$user->email.".time());
$updateuser->email = '';
$updateuser->idnumber = '';
$updateuser->timemodified = time();
if (update_record('user', $updateuser)) {
role_unassign(0, $user->id);
return true;
} else {
return false;
}
}
$keyword = optional_param('keyword', '', PARAM_RAW);
$autodetect = optional_param('autodetect', '', PARAM_RAW);
$del = optional_param('del', '', PARAM_RAW);
$delall = optional_param('delall', '', PARAM_RAW);
$ignore = optional_param('ignore', '', PARAM_RAW);
$reset = optional_param('reset', '', PARAM_RAW);
$id = optional_param('id', '', PARAM_INT);
require_login();
$adminroot = admin_get_root();
admin_externalpage_setup('reportspamcleaner', $adminroot);
// Implement some AJAX calls
// Delete one user
if (!empty($del) && confirm_sesskey() && ($id != $USER->id)) {
if (isset($SESSION->users_result[$id])) {
$user = $SESSION->users_result[$id];
if (delete_user($user)) {
unset($SESSION->users_result[$id]);
echo 1;
} else {
echo 0;
}
} else {
echo 0;
}
exit;
}
// Delete lots of users
if (!empty($delall) && confirm_sesskey()) {
if (!empty($SESSION->users_result)) {
foreach ($SESSION->users_result as $userid => $user) {
if ($userid != $USER->id) {
if (delete_user($user)) {
unset($SESSION->users_result[$userid]);
}
}
}
}
echo 1;
exit;
}
if (!empty($ignore)) {
unset($SESSION->users_result[$id]);
echo 1;
exit;
}
admin_externalpage_print_header($adminroot);
// Print headers and things
print_spamcleaner_javascript();
print_box(get_string('spamcleanerintro', 'report_spamcleaner'));
print_box_start(); // The forms section at the top
?>
<div class="mdl-align">
<form method="post" action="index.php">
<div>
<input type="text" name="keyword" id="keyword_el" value="<?php p($keyword) ?>" />
<input type="hidden" name="sesskey" value="<?php echo sesskey();?>" />
<input type="submit" value="<?php echo get_string('spamsearch', 'report_spamcleaner')?>" />
</div>
</form>
<p><?php echo get_string('spameg', 'report_spamcleaner');?></p>
<hr />
<form method="post" action="index.php">
<div>
<input type="submit" name="autodetect" value="<?php echo get_string('spamauto', 'report_spamcleaner');?>" />
</div>
</form>
</div>
<?php
print_box_end();
echo '<div id="result" class="mdl-align">';
// Print list of resulting profiles
if (!empty($keyword)) { // Use the keyword(s) supplied by the user
$keywords = explode(',', $keyword);
foreach ($keywords as $key => $keyword) {
$keywords[$key] = trim($keyword);
}
search_spammers($keywords);
} else if (!empty($autodetect)) { // Use the inbuilt keyword list to detect users
search_spammers($autokeywords);
}
echo '</div>';
/////////////////////////////////////////////////////////////////////////////////
/// Functions
function search_spammers($keywords) {
global $CFG, $USER, $DB;
if (!is_array($keywords)) {
$keywords = array($keywords); // Make it into an array
}
$like = sql_ilike();
$keywordfull = array();
foreach ($keywords as $keyword) {
$keyword = addslashes($keyword); // Just to be safe
$keywordfull[] = " description $like '%$keyword%' ";
$keywordfull2[] = " p.summary $like '%$keyword%' ";
}
$conditions = '( '.implode(' OR ', $keywordfull).' )';
$conditions2 = '( '.implode(' OR ', $keywordfull2).' )';
$sql = "SELECT * FROM {$CFG->prefix}user WHERE deleted = 0 AND id <> {$USER->id} AND $conditions"; // Exclude oneself
$sql2= "SELECT u.*, p.summary FROM {$CFG->prefix}user AS u, {$CFG->prefix}post AS p WHERE $conditions2 AND u.deleted = 0 AND u.id=p.userid AND u.id <> {$USER->id}";
$spamusers_desc = get_recordset_sql($sql);
$spamusers_blog = get_recordset_sql($sql2);
$keywordlist = implode(', ', $keywords);
print_box(get_string('spamresult', 'report_spamcleaner').s($keywordlist)).' ...';
print_user_list(array($spamusers_desc, $spamusers_blog), $keywords);
}
function print_user_list($users_rs, $keywords) {
global $CFG, $SESSION;
// reset session everytime this function is called
$SESSION->users_result = array();
$count = 0;
foreach ($users_rs as $rs) {
while ($user = rs_fetch_next_record($rs)) {
if (!$count) {
echo '<table border="1" width="100%" id="data-grid"><tr><th>&nbsp;</th><th>'.get_string('user','admin').'</th><th>'.get_string('spamdesc', 'report_spamcleaner').'</th><th>'.get_string('spamoperation', 'report_spamcleaner').'</th></tr>';
}
$count++;
filter_user($user, $keywords, $count);
}
}
if (!$count) {
echo get_string('spamcannotfinduser', 'report_spamcleaner');
} else {
echo '</table>';
echo '<div class="mld-align">
<button id="removeall_btn">'.get_string('spamdeleteall', 'report_spamcleaner').'</button>
</div>';
}
}
function filter_user($user, $keywords, $count) {
global $CFG;
$image_search = false;
if (in_array('<img', $keywords)) {
$image_search = true;
}
if (isset($user->summary)) {
$user->description = '<h3>'.get_string('spamfromblog', 'report_spamcleaner').'</h3>'.$user->summary;
unset($user->summary);
}
if (preg_match('#<img.*src=[\"\']('.$CFG->pixpath.')#', $user->description, $matches)
&& $image_search) {
$result = false;
foreach ($keywords as $keyword) {
if (preg_match('#'.$keyword.'#', $user->description)
&& ($keyword != '<img')) {
$result = true;
}
}
if ($result) {
echo print_user_entry($user, $keywords, $count);
} else {
unset($user);
}
} else {
echo print_user_entry($user, $keywords, $count);
}
}
function print_user_entry($user, $keywords, $count) {
global $SESSION, $CFG;
$smalluserobject = new object; // All we need to delete them later
$smalluserobject->id = $user->id;
$smalluserobject->email = $user->email;
$smalluserobject->auth = $user->auth;
$smalluserobject->firstname = $user->firstname;
$smalluserobject->lastname = $user->lastname;
if (empty($SESSION->users_result[$user->id])) {
$SESSION->users_result[$user->id] = $smalluserobject;
$html = '<tr valign="top" id="row-'.$user->id.'" class="result-row">';
$html .= '<td width="10">'.$count.'</td>';
$html .= '<td width="30%" align="left"><a href="'.$CFG->wwwroot."/user/view.php?course=1&amp;id=".$user->id.'" title="'.s($user->username).'">'.fullname($user).'</a>';
$html .= "<ul>";
$profile_set = array('city'=>true, 'country'=>true, 'email'=>true);
foreach ($profile_set as $key=>$value) {
if (isset($user->$key)){
$html .= '<li>'.$user->$key.'</li>';
}
}
$html .= "</ul>";
$html .= '</td>';
foreach ($keywords as $keyword) {
$user->description = highlight($keyword, $user->description);
}
$html .= '<td align="left">'.format_text($user->description, FORMAT_MOODLE).'</td>';
$html .= '<td width="100px" align="center">';
$html .= '<button onclick="del_user(this,'.$user->id.')">'.get_string('deleteuser', 'admin').'</button><br />';
$html .= '<button onclick="ignore_user(this,'.$user->id.')">'.get_string('ignore', 'admin').'</button>';
$html .= '</td>';
$html .= '</tr>';
return $html;
} else {
return null;
}
}
function print_spamcleaner_javascript() {
global $CFG;
$sesskey = sesskey();
?>
<script type="text/javascript" src="<?php echo $CFG->wwwroot;?>/lib/yui/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="<?php echo $CFG->wwwroot;?>/lib/yui/connection/connection-min.js"></script>
<script type="text/javascript">
//<![CDATA[
var row = null;
var delall_cb = {
success: function(o){
var resp = o.responseText;
if(resp){
window.location.href=window.location.href;
}
}
}
function init() {
YAHOO.util.Event.addListener("removeall_btn", "click", function(){
var yes = confirm('<?php echo get_string('spamdeleteallconfirm', 'report_spamcleaner');?>');
if(yes){
var cObj = YAHOO.util.Connect.asyncRequest('POST', '<?php echo me();?>?delall=yes&sesskey=<?php echo $sesskey;?>', delall_cb);
}
});
}
var del_cb = {
success: function(o) {
var resp = o.responseText;
if(row) {
if(resp){
while(row.tagName != 'TR') {
row = row.parentNode;
}
row.parentNode.removeChild(row);
row = null;
} else {
alert('<?php echo get_string('spamcannotdelete', 'report_spamcleaner');?>');
}
}
}
}
var ignore_cb = {
success: function(o){
var resp = o.responseText;
if(row) {
if(resp){
while(row.tagName != 'TR') {
row = row.parentNode;
}
row.parentNode.removeChild(row);
row = null;
}
}
}
}
function del_user(obj, id) {
var yes = confirm('<?php echo get_string('spamdeleteconfirm', 'report_spamcleaner');?>');
if(yes){
row = obj;
var cObj = YAHOO.util.Connect.asyncRequest('POST', '<?php echo me();?>?del=yes&sesskey=<?php echo $sesskey;?>&id='+id, del_cb);
}
}
function ignore_user(obj, id) {
row = obj;
var cObj = YAHOO.util.Connect.asyncRequest('POST', '<?php echo me();?>?ignore=yes&sesskey=<?php echo $sesskey;?>&id='+id, ignore_cb);
}
window.onload = function(){
init();
}
//]]>
</script>
<?php
}
admin_externalpage_print_footer($adminroot);
?>
+5
View File
@@ -0,0 +1,5 @@
<?php
// spam cleaner
$ADMIN->add('reports', new admin_externalpage('reportspamcleaner', get_string('spamcleaner','report_spamcleaner'), "$CFG->wwwroot/$CFG->admin/report/spamcleaner/index.php", 'moodle/site:config'));
+5 -5
View File
@@ -3,19 +3,19 @@
// This file defines settingpages and externalpages under the "mnet" category
$ADMIN->add('mnet', new admin_externalpage('net', get_string('settings', 'mnet'),
$CFG->wwwroot . '/admin/mnet/index.php',
"$CFG->wwwroot/$CFG->admin/mnet/index.php",
'moodle/site:config'));
$ADMIN->add('mnet', new admin_externalpage('mnetpeers', get_string('mnetpeers', 'mnet'),
$CFG->wwwroot . '/admin/mnet/peers.php',
"$CFG->wwwroot/$CFG->admin/mnet/peers.php",
'moodle/site:config'));
$ADMIN->add('mnet', new admin_externalpage('ssoaccesscontrol', get_string('ssoaccesscontrol', 'mnet'),
$CFG->wwwroot . '/admin/mnet/access_control.php',
"$CFG->wwwroot/$CFG->admin/mnet/access_control.php",
'moodle/site:config'));
$ADMIN->add('mnet', new admin_externalpage('mnetenrol', get_string('mnetenrol', 'mnet'),
$CFG->wwwroot . '/admin/mnet/enr_hosts.php',
"$CFG->wwwroot/$CFG->admin/mnet/enr_hosts.php",
'moodle/site:config'));
$ADMIN->add('mnet', new admin_externalpage('trustedhosts', get_string('trustedhosts', 'mnet'),
$CFG->wwwroot . '/admin/mnet/trustedhosts.php',
"$CFG->wwwroot/$CFG->admin/mnet/trustedhosts.php",
'moodle/site:config'));
?>
+3 -1
View File
@@ -33,9 +33,11 @@ $temp->add(new admin_setting_configselect('bloglevel', get_string('bloglevel', '
1 => get_string('personalblogs','blog'),
0 => get_string('disableblogs','blog'))));
$temp->add(new admin_setting_configcheckbox('profilesforenrolledusersonly', get_string('profilesforenrolledusersonly','admin'),get_string('configprofilesforenrolledusersonly', 'admin'),'1'));
$temp->add(new admin_setting_configcheckbox('cronclionly', get_string('cronclionly', 'admin'), get_string('configcronclionly', 'admin'), 0));
$temp->add(new admin_setting_configtext('cronremotepassword', get_string('cronremotepassword', 'admin'), get_string('configcronremotepassword', 'admin'), '', PARAM_RAW));
$temp->add(new admin_setting_configcheckbox('emailchangeconfirmation', get_string('emailchangeconfirmation', 'admin'), get_string('configemailchangeconfirmation', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('emailchangeconfirmation', get_string('emailchangeconfirmation', 'admin'), get_string('configemailchangeconfirmation', 'admin'), 1));
$ADMIN->add('security', $temp);
+1 -1
View File
@@ -17,7 +17,7 @@ $ADMIN->add('server', $temp, 0);
// "email" settingpage
$temp = new admin_settingpage('mail', get_string('mail','admin'));
$temp->add(new admin_setting_configtext('smtphosts', get_string('smtphosts', 'admin'), get_string('configsmtphosts', 'admin'), '', PARAM_HOST));
$temp->add(new admin_setting_configtext('smtphosts', get_string('smtphosts', 'admin'), get_string('configsmtphosts', 'admin'), '', PARAM_RAW));
$temp->add(new admin_setting_configtext('smtpuser', get_string('smtpuser', 'admin'), get_string('configsmtpuser', 'admin'), '', PARAM_NOTAGS));
$temp->add(new admin_setting_configtext('smtppass', get_string('smtppass', 'admin'), get_string('configsmtpuser', 'admin'), '', PARAM_RAW));
$temp->add(new admin_setting_configtext('noreplyaddress', get_string('noreplyaddress', 'admin'), get_string('confignoreplyaddress', 'admin'), 'noreply@' . $_SERVER['HTTP_HOST'], PARAM_NOTAGS));
@@ -84,7 +84,7 @@ class edit_field extends XMLDBAction {
/// Fetch request data
$tableparam = required_param('table', PARAM_CLEAN);
if (!$table =& $structure->getTable($tableparam)) {
$this->errormsg = 'Wrong table specified: ' . $tableparm;
$this->errormsg = 'Wrong table specified: ' . $tableparam;
return false;
}
$fieldparam = required_param('field', PARAM_CLEAN);
@@ -84,7 +84,7 @@ class edit_index extends XMLDBAction {
/// Fetch request data
$tableparam = required_param('table', PARAM_CLEAN);
if (!$table =& $structure->getTable($tableparam)) {
$this->errormsg = 'Wrong table specified: ' . $tableparm;
$this->errormsg = 'Wrong table specified: ' . $tableparam;
return false;
}
$indexparam = required_param('index', PARAM_CLEAN);
@@ -84,7 +84,7 @@ class edit_key extends XMLDBAction {
/// Fetch request data
$tableparam = required_param('table', PARAM_CLEAN);
if (!$table =& $structure->getTable($tableparam)) {
$this->errormsg = 'Wrong table specified: ' . $tableparm;
$this->errormsg = 'Wrong table specified: ' . $tableparam;
return false;
}
$keyparam = required_param('key', PARAM_CLEAN);
@@ -80,7 +80,7 @@ class view_table_sql extends XMLDBAction {
/// Get parameters
$tableparam = required_param('table', PARAM_PATH);
if (!$table =& $structure->getTable($tableparam)) {
$this->errormsg = 'Wrong table specified: ' . $tableparm;
$this->errormsg = 'Wrong table specified: ' . $tableparam;
return false;
}
$generatorparam = optional_param('generator', null, PARAM_ALPHANUM);
File diff suppressed because it is too large Load Diff
+36 -7
View File
@@ -57,8 +57,8 @@ class auth_plugin_cas extends auth_plugin_base {
* @return bool Authentication success or failure.
*/
function user_login ($username, $password) {
$this->connectCAS();
return phpCAS::isAuthenticated();
$this->connectCAS();
return phpCAS::isAuthenticated() && (phpCAS::getUser() == $username);
}
/**
* Returns true if this authentication plugin is 'internal'.
@@ -97,7 +97,7 @@ class auth_plugin_cas extends auth_plugin_base {
return;
}
// Test si cas activé et paramêtres non remplis
// Test si cas activ et paramtres non remplis
if (empty($this->config->hostname)) {
return;
}
@@ -107,7 +107,7 @@ class auth_plugin_cas extends auth_plugin_base {
// Connection to CAS server
$this->connectCAS();
// Gestion de la connection CAS si accès direct d'un ent ou autre
// Gestion de la connection CAS si accs direct d'un ent ou autre
if (phpCAS::checkAuthentication()) {
$frm->username=phpCAS::getUser();
// if (phpCAS::getUser()=='esup9992')
@@ -405,7 +405,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
$result[$key] = $ldapval;
}
}
@ldap_close($ldapconnection);
$this->ldap_close($ldapconnection);
return $result;
}
/**
@@ -435,6 +435,16 @@ if ( !is_object($PHPCAS_CLIENT) ) {
* @return connection result
*/
function ldap_connect($binddn='',$bindpwd='') {
// Cache ldap connections (they are expensive to set up
// and can drain the TCP/IP ressources on the server if we
// are syncing a lot of users (as we try to open a new connection
// to get the user details). This is the least invasive way
// to reuse existing connections without greater code surgery.
if(!empty($this->ldapconnection)) {
$this->ldapconns++;
return $this->ldapconnection;
}
//Select bind password, With empty values use
//ldap_bind_* variables or anonymous bind if ldap_bind_* are empty
if ($binddn == '' and $bindpwd == '') {
@@ -469,6 +479,10 @@ if ( !is_object($PHPCAS_CLIENT) ) {
ldap_set_option($connresult, LDAP_OPT_DEREF, $this->config->opt_deref);
}
if ($bindresult) {
// Set the connection counter so we can call PHP's ldap_close()
// when we call $this->ldap_close() for the last 'open' connection.
$this->ldapconns = 1;
$this->ldapconnection = $connresult;
return $connresult;
}
$debuginfo .= "<br/>Server: '$server' <br/> Connection: '$connresult'<br/> Bind result: '$bindresult'</br>";
@@ -477,6 +491,18 @@ if ( !is_object($PHPCAS_CLIENT) ) {
print_error('auth_ldap_noconnect_all','auth',$this->config->user_type);
return false;
}
/**
* disconnects from a ldap server
*
*/
function ldap_close() {
$this->ldapconns--;
if($this->ldapconns == 0) {
@ldap_close($this->ldapconnection);
unset($this->ldapconnection);
}
}
/**
* retuns user attribute mappings between moodle and ldap
*
@@ -629,7 +655,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
print "Connecting to ldap...\n";
$ldapconnection = $this->ldap_connect();
if (!$ldapconnection) {
@ldap_close($ldapconnection);
$this->ldap_close($ldapconnection);
print get_string('auth_ldap_noconnect','auth',$this->config->host_url);
exit;
}
@@ -878,6 +904,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
} else {
print "No users to be added\n";
}
$this->ldap_close();
return true;
}
/**
@@ -1016,6 +1043,7 @@ if (!empty($this->config->attrcreators)) {
}
}
}
$this->ldap_close();
return $result;
}
/**
@@ -1055,6 +1083,7 @@ if (!empty($this->config->attrcreators)) {
array_push($fresult, ($users[$i][$this->config->user_attribute][0]) );
}
}
$this->ldap_close();
return $fresult;
}
/**
@@ -1123,4 +1152,4 @@ if (!empty($this->config->attrcreators)) {
return $text;
}
}
?>
?>
+2
View File
@@ -173,6 +173,7 @@ class auth_plugin_db extends auth_plugin_base {
if ($rs = $authdb->Execute($sql)) {
if ( $rs->RecordCount() == 1 ) {
$fields_obj = rs_fetch_record($rs);
$fields_obj = (object)array_change_key_case((array)$fields_obj , CASE_LOWER);
foreach ($selectfields as $localname=>$externalname) {
$result[$localname] = $textlib->convert($fields_obj->{$localname}, $this->config->extencoding, 'utf-8');
}
@@ -429,6 +430,7 @@ class auth_plugin_db extends auth_plugin_base {
print_error('auth_dbcantconnect','auth');
} else if ( $rs->RecordCount() ) {
while ($rec = rs_fetch_next_record($rs)) {
$rec = (object)array_change_key_case((array)$rec , CASE_LOWER);
array_push($result, $rec->username);
}
}
+2 -1
View File
@@ -16,7 +16,8 @@
/* */
/* This program is free software. You can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License. */
/* the Free Software Foundation; either version 2 of the License or any */
/* later version. */
/************************************************************************/
/* Author: Torsten Anderson, torsten.anderson@skeria.skelleftea.se
*/
+80 -25
View File
@@ -45,11 +45,36 @@ class auth_plugin_ldap extends auth_plugin_base {
$this->config->{$key} = $value[$this->config->user_type];
}
}
//hack prefix to objectclass
if (empty($this->config->objectclass)) { // Can't send empty filter
$this->config->objectclass='objectClass=*';
} else if (stripos($this->config->objectclass, 'objectClass=') !== 0) {
$this->config->objectclass = 'objectClass='.$this->config->objectclass;
// Hack prefix to objectclass
if (empty($this->config->objectclass)) {
// Can't send empty filter
$this->config->objectclass='(objectClass=*)';
} else if (stripos($this->config->objectclass, 'objectClass=') === 0) {
// Value is 'objectClass=some-string-here', so just add ()
// around the value (filter _must_ have them).
$this->config->objectclass = '('.$this->config->objectclass.')';
} else if (stripos($this->config->objectclass, '(') !== 0) {
// Value is 'some-string-not-starting-with-left-parentheses',
// which is assumed to be the objectClass matching value.
// So build a valid filter with it.
$this->config->objectclass = '(objectClass='.$this->config->objectclass.')';
} else {
// There is an additional possible value
// '(some-string-here)', that can be used to specify any
// valid filter string, to select subsets of users based
// on any criteria. For example, we could select the users
// whose objectClass is 'user' and have the
// 'enabledMoodleUser' attribute, with something like:
//
// (&(objectClass=user)(enabledMoodleUser=1))
//
// This is only used in the functions that deal with the
// whole potential set of users (currently sync_users()
// and get_user_list() only).
//
// In this particular case we don't need to do anything,
// so leave $this->config->objectclass as is.
}
}
@@ -84,19 +109,19 @@ class auth_plugin_ldap extends auth_plugin_base {
//if ldap_user_dn is empty, user does not exist
if (!$ldap_user_dn) {
ldap_close($ldapconnection);
$this->ldap_close();
return false;
}
// Try to bind with current username and password
$ldap_login = @ldap_bind($ldapconnection, $ldap_user_dn, $extpassword);
ldap_close($ldapconnection);
$this->ldap_close();
if ($ldap_login) {
return true;
}
}
else {
@ldap_close($ldapconnection);
$this->ldap_close();
print_error('auth_ldap_noconnect','auth','',$this->config->host_url);
}
return false;
@@ -170,7 +195,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
}
@ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -276,7 +301,7 @@ class auth_plugin_ldap extends auth_plugin_base {
print_error('auth_ldap_unsupportedusertype','auth','',$this->config->user_type);
}
$uadd = ldap_add($ldapconnection, $this->config->user_attribute.'="'.$this->ldap_addslashes($userobject->username).','.$this->config->create_context.'"', $newuser);
ldap_close($ldapconnection);
$this->ldap_close();
return $uadd;
}
@@ -303,7 +328,7 @@ class auth_plugin_ldap extends auth_plugin_base {
$ldapconnection = $this->ldap_connect();
$user_dn = $this->ldap_find_userdn($ldapconnection, $extusername);
$search_attribs = array($this->config->expireattr);
$sr = ldap_read($ldapconnection, $user_dn, 'objectclass=*', $search_attribs);
$sr = ldap_read($ldapconnection, $user_dn, '(objectClass=*)', $search_attribs);
if ($sr) {
$info = $this->ldap_get_entries($ldapconnection, $sr);
if (!empty ($info) and !empty($info[0][$this->config->expireattr][0])) {
@@ -391,7 +416,7 @@ class auth_plugin_ldap extends auth_plugin_base {
$ldapconnection = $this->ldap_connect();
if (!$ldapconnection) {
@ldap_close($ldapconnection);
$this->ldap_close();
print get_string('auth_ldap_noconnect','auth',$this->config->host_url);
exit;
}
@@ -400,7 +425,7 @@ class auth_plugin_ldap extends auth_plugin_base {
//// get user's list from ldap to sql in a scalable fashion
////
// prepare some data we'll need
$filter = "(&(".$this->config->user_attribute."=*)(".$this->config->objectclass."))";
$filter = '(&('.$this->config->user_attribute.'=*)'.$this->config->objectclass.')';
$contexts = explode(";",$this->config->contexts);
@@ -646,6 +671,9 @@ class auth_plugin_ldap extends auth_plugin_base {
$user->confirmed = 1;
$user->auth = 'ldap';
$user->mnethostid = $CFG->mnet_localhost_id;
// get_userinfo_asobj() might have replaced $user->username with the value
// from the LDAP server (which can be mixed-case). Make sure it's lowercase
$user->username = trim(moodle_strtolower($user->username));
if (empty($user->lang)) {
$user->lang = $CFG->lang;
}
@@ -672,6 +700,7 @@ class auth_plugin_ldap extends auth_plugin_base {
} else {
print "No users to be added\n";
}
$this->ldap_close();
return true;
}
@@ -766,7 +795,7 @@ class auth_plugin_ldap extends auth_plugin_base {
error ('auth: ldap user_activate() does not support selected usertype:"'.$this->config->user_type.'" (..yet)');
}
$result = ldap_modify($ldapconnection, $userdn, $newinfo);
ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -791,7 +820,7 @@ class auth_plugin_ldap extends auth_plugin_base {
error ('auth: ldap user_disable() does not support selected usertype (..yet)');
}
$result = ldap_modify($ldapconnection, $userdn, $newinfo);
ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}*/
@@ -976,11 +1005,11 @@ class auth_plugin_ldap extends auth_plugin_base {
}
} else {
error_log("ERROR:No user found in LDAP");
@ldap_close($ldapconnection);
$this->ldap_close();
return false;
}
@ldap_close($ldapconnection);
$this->ldap_close();
return true;
@@ -1042,7 +1071,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
//Update password expiration time, grace logins count
$search_attribs = array($this->config->expireattr, 'passwordExpirationInterval','loginGraceLimit' );
$sr = ldap_read($ldapconnection, $user_dn, 'objectclass=*', $search_attribs);
$sr = ldap_read($ldapconnection, $user_dn, '(objectClass=*)', $search_attribs);
if ($sr) {
$info=$this->ldap_get_entries($ldapconnection, $sr);
$newattrs = array();
@@ -1104,7 +1133,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
@ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -1337,6 +1366,16 @@ class auth_plugin_ldap extends auth_plugin_base {
* @return connection result
*/
function ldap_connect($binddn='',$bindpwd='') {
// Cache ldap connections (they are expensive to set up
// and can drain the TCP/IP ressources on the server if we
// are syncing a lot of users (as we try to open a new connection
// to get the user details). This is the least invasive way
// to reuse existing connections without greater code surgery.
if(!empty($this->ldapconnection)) {
$this->ldapconns++;
return $this->ldapconnection;
}
//Select bind password, With empty values use
//ldap_bind_* variables or anonymous bind if ldap_bind_* are empty
if ($binddn == '' and $bindpwd == '') {
@@ -1383,6 +1422,10 @@ class auth_plugin_ldap extends auth_plugin_base {
}
if ($bindresult) {
// Set the connection counter so we can call PHP's ldap_close()
// when we call $this->ldap_close() for the last 'open' connection.
$this->ldapconns = 1;
$this->ldapconnection = $connresult;
return $connresult;
}
@@ -1394,6 +1437,18 @@ class auth_plugin_ldap extends auth_plugin_base {
return false;
}
/**
* disconnects from a ldap server
*
*/
function ldap_close() {
$this->ldapconns--;
if($this->ldapconns == 0) {
@ldap_close($this->ldapconnection);
unset($this->ldapconnection);
}
}
/**
* retuns dn of username
*
@@ -1481,7 +1536,7 @@ class auth_plugin_ldap extends auth_plugin_base {
$ldapconnection = $this->ldap_connect();
if ($filter=="*") {
$filter = "(&(".$this->config->user_attribute."=*)(".$this->config->objectclass."))";
$filter = '(&('.$this->config->user_attribute.'=*)'.$this->config->objectclass.')';
}
$contexts = explode(";",$this->config->contexts);
@@ -1673,7 +1728,7 @@ class auth_plugin_ldap extends auth_plugin_base {
if (!isset($config->forcechangepassword))
{$config->forcechangepassword = 0; }
if (!isset($config->stdchangepassword))
{$config->forcechangepassword = 0; }
{$config->stdchangepassword = 0; }
if (!isset($config->passtype))
{$config->passtype = 'plaintext'; }
if (!isset($config->changepasswordurl))
@@ -1694,7 +1749,7 @@ class auth_plugin_ldap extends auth_plugin_base {
set_config('bind_dn', $config->bind_dn, 'auth/ldap');
set_config('bind_pw', $config->bind_pw, 'auth/ldap');
set_config('version', $config->version, 'auth/ldap');
set_config('objectclass', $config->objectclass, 'auth/ldap');
set_config('objectclass', trim($config->objectclass), 'auth/ldap');
set_config('memberattribute', $config->memberattribute, 'auth/ldap');
set_config('memberattribute_isdn', $config->memberattribute_isdn, 'auth/ldap');
set_config('creators', $config->creators, 'auth/ldap');
@@ -1761,7 +1816,7 @@ class auth_plugin_ldap extends auth_plugin_base {
// If UF_DONT_EXPIRE_PASSWD flag is set in user's
// userAccountControl attribute, the password doesn't expire.
$sr = ldap_read($ldapconn, $user_dn, 'objectclass=*',
$sr = ldap_read($ldapconn, $user_dn, '(objectClass=*)',
array('userAccountControl'));
if (!$sr) {
error_log("ldap: error getting userAccountControl for $user_dn");
@@ -1807,7 +1862,7 @@ class auth_plugin_ldap extends auth_plugin_base {
// details below).
// ----------------------------------------------------------------
$sr = ldap_read($ldapconn, ROOTDSE, 'objectclass=*',
$sr = ldap_read($ldapconn, ROOTDSE, '(objectClass=*)',
array('defaultNamingContext'));
if (!$sr) {
error_log("ldap: error querying rootDSE for Active Directory");
@@ -1817,7 +1872,7 @@ class auth_plugin_ldap extends auth_plugin_base {
$info = $this->ldap_get_entries($ldapconn, $sr);
$domaindn = $info[0]['defaultNamingContext'][0];
$sr = ldap_read ($ldapconn, $domaindn, 'objectclass=*',
$sr = ldap_read ($ldapconn, $domaindn, '(objectClass=*)',
array('maxPwdAge'));
$info = $this->ldap_get_entries($ldapconn, $sr);
$maxpwdage = $info[0]['maxPwdAge'][0];
+1 -1
View File
@@ -86,7 +86,7 @@ if (!function_exists('ldap_connect')) { // Is php4-ldap really there?
<td align="right"><label for="menuversion"><?php print_string('auth_ldap_version_key','auth') ?></label></td>
<td>
<?php
$varsions = array();
$versions = array();
$versions[2] = '2';
$versions[3] = '3';
choose_from_menu($versions, 'version', $config->version, '');
+76 -52
View File
@@ -244,7 +244,7 @@ class auth_plugin_mnet extends auth_plugin_base {
require_once $CFG->dirroot . '/mnet/xmlrpc/client.php';
// verify the remote host is configured locally before attempting RPC call
if (! $remotehost = get_record('mnet_host', 'wwwroot', $remotewwwroot)) {
if (! $remotehost = get_record('mnet_host', 'wwwroot', $remotewwwroot, 'deleted', 0)) {
error(get_string('notpermittedtoland', 'mnet'));
}
@@ -771,76 +771,76 @@ class auth_plugin_mnet extends auth_plugin_base {
join("\n", $mnet_request->error));
break;
}
$mnethostlogssql = '
SELECT
mhostlogs.remoteid, mhostlogs.time, mhostlogs.userid, mhostlogs.ip,
mhostlogs.course, mhostlogs.module, mhostlogs.cmid, mhostlogs.action,
mhostlogs.url, mhostlogs.info, mhostlogs.username, c.fullname as coursename,
c.modinfo
FROM
(
SELECT
l.id as remoteid, l.time, l.userid, l.ip, l.course, l.module, l.cmid,
l.action, l.url, l.info, u.username
FROM
' . $CFG->prefix . 'user u
INNER JOIN ' . $CFG->prefix . 'log l on l.userid = u.id
WHERE
u.mnethostid = ' . $mnethostid . '
AND l.id > ' . $mnet_request->response['last log id'] . '
ORDER BY remoteid ASC
LIMIT 500
) mhostlogs
INNER JOIN ' . $CFG->prefix . 'course c on c.id = mhostlogs.course
ORDER by mhostlogs.remoteid ASC';
$query = "SELECT
l.id as remoteid,
l.time,
l.userid,
l.ip,
l.course,
l.module,
l.cmid,
l.action,
l.url,
l.info,
c.fullname as coursename,
c.modinfo as modinfo,
u.username
FROM
{$CFG->prefix}user u,
{$CFG->prefix}log l,
{$CFG->prefix}course c
WHERE
l.userid = u.id AND
u.mnethostid = '$mnethostid' AND
l.id > '".$mnet_request->response['last log id']."' AND
c.id = l.course
ORDER BY
remoteid ASC";
$mnethostlogs = get_records_sql($mnethostlogssql);
$results = get_records_sql($query);
if ($mnethostlogs == false) {
continue;
}
if (false == $results) continue;
$processedlogs = array();
$param = array();
foreach($results as $result) {
if (!empty($result->modinfo) && !empty($result->cmid)) {
$modinfo = unserialize($result->modinfo);
unset($result->modinfo);
foreach($mnethostlogs as $hostlog) {
// Extract the name of the relevant module instance from the
// course modinfo if possible.
if (!empty($hostlog->modinfo) && !empty($hostlog->cmid)) {
$modinfo = unserialize($hostlog->modinfo);
unset($hostlog->modinfo);
$modulearray = array();
foreach($modinfo as $module) {
$modulearray[$module->cm] = urldecode($module->name);
}
$result->resource_name = $modulearray[$result->cmid];
$hostlog->resource_name = $modulearray[$hostlog->cmid];
} else {
$result->resource_name = '';
$hostlog->resource_name = '';
}
$param[] = array (
'remoteid' => $result->remoteid,
'time' => $result->time,
'userid' => $result->userid,
'ip' => $result->ip,
'course' => $result->course,
'coursename' => $result->coursename,
'module' => $result->module,
'cmid' => $result->cmid,
'action' => $result->action,
'url' => $result->url,
'info' => $result->info,
'resource_name' => $result->resource_name,
'username' => $result->username
$processedlogs[] = array (
'remoteid' => $hostlog->remoteid,
'time' => $hostlog->time,
'userid' => $hostlog->userid,
'ip' => $hostlog->ip,
'course' => $hostlog->course,
'coursename' => $hostlog->coursename,
'module' => $hostlog->module,
'cmid' => $hostlog->cmid,
'action' => $hostlog->action,
'url' => $hostlog->url,
'info' => $hostlog->info,
'resource_name' => $hostlog->resource_name,
'username' => $hostlog->username
);
}
unset($result);
unset($hostlog);
$mnet_request = new mnet_xmlrpc_client();
$mnet_request->set_method('auth/mnet/auth.php/refresh_log');
// set $token and $useragent parameters
$mnet_request->add_param($param);
$mnet_request->add_param($processedlogs);
if ($mnet_request->send($mnet_peer) === true) {
if ($mnet_request->response['code'] > 0) {
@@ -885,10 +885,12 @@ class auth_plugin_mnet extends auth_plugin_base {
unset($logEntryObj->username);
$logEntryObj = $this->trim_logline($logEntryObj);
$insertok = insert_record('mnet_log', addslashes_object($logEntryObj), false);
if ($insertok) {
$MNET_REMOTE_CLIENT->last_log_id = $logEntryObj->remoteid;
$MNET_REMOTE_CLIENT->updateparams->last_log_id = $logEntryObj->remoteid;
} else {
$returnString .= 'Record with id '.$logEntryObj->remoteid." failed to insert.\n";
}
@@ -1311,9 +1313,12 @@ class auth_plugin_mnet extends auth_plugin_base {
svc.apiversion,
h2s.id as h2s_id
FROM
{$CFG->prefix}mnet_host h,
{$CFG->prefix}mnet_service svc,
{$CFG->prefix}mnet_host2service h2s
WHERE
h.deleted = '0' AND
h.id = h2s.hostid AND
h2s.hostid = '$mnethostid' AND
h2s.serviceid = svc.id AND
svc.name = '$servicename' AND
@@ -1348,6 +1353,25 @@ class auth_plugin_mnet extends auth_plugin_base {
}
}
/**
* Trims a log line from mnet peer to limit each part to a length which can be stored in our DB
*
* @param object $logline The log information to be trimmed
* @return object The passed logline object trimmed to not exceed storable limits
*/
function trim_logline ($logline) {
$limits = array('ip' => 15, 'coursename' => 40, 'module' => 20, 'action' => 40,
'url' => 255);
foreach ($limits as $property => $limit) {
if (isset($logline->$property)) {
$logline->$property = substr($logline->$property, 0, $limit);
}
}
return $logline;
}
}
?>
+33
View File
@@ -170,6 +170,39 @@ Example file:
?>
--
How to upgrade your Service Provider to 2.x
-------------------------------------------------------------------------------
In case your upgrade your Service Provider 1.3.x to 2.x, be aware of the fact
that in version 2.0 the default behaviour regarding attribute propagation
changed.
While the Service Provider 1.3.x published the Shibboleth attributes to the
web server environment as HTTP Request headers, the Service Provider 2.x
publishes attributes as environment variables, which increases the security for
some platforms.
However, this change has the effect that the attribute names change.
E.g. while the surname attribute was published as 'HTTP_SHIB_PERSON_SURNAME'
with 1.3.x, this attribute will be available in $_SERVER['Shib-Person-surname']
or depending on your /etc/shibboleth/attribute-map.xml file just as
$_SERVER['sn'].
Because Moodle needs to know what Shibboleth attributes it shall map onto which
Moodle user profile field, one has to make sure the mapping is updated as well
after the Service Provider upgrade.
********************************************************************************
Because you risk locking yourself out of Moodle it is strongly
recommended to use the following approach when upgrading the Service Provider:
1. Enable manual authentication before the upgrade.
2. Make sure that you have at least one manual account with administration
privileges working before upgrading your Service Provider to 2.x.
3. After the SP upgrade, use this account to log into Moodle and adapt the
attribute mapping in 'Site Administration -> Users -> Shibboleth' to reflect
the changed attribute names.
4. Test the login with a Shibboleth account
5. If all is working, disable manual authentication again
********************************************************************************
--------------------------------------------------------------------------------
In case of problems and questions with Shibboleth authentication, contact
Lukas Haemmerle <haemmerle@switch.ch> or Markus Hagman <hagman@hytti.uku.fi>
+1 -1
View File
@@ -86,7 +86,7 @@
// If we can find any (user independent) Shibboleth attributes but no user
// attributes we probably didn't receive any user attributes
elseif (!empty($_SERVER['HTTP_SHIB_APPLICATION_ID'])) {
elseif (!empty($_SERVER['HTTP_SHIB_APPLICATION_ID']) || !empty($_SERVER['Shib-Application-ID'])) {
error(get_string( 'shib_no_attributes_error', 'auth' , '\''.$pluginconfig->user_attribute.'\', \''.$pluginconfig->field_map_firstname.'\', \''.$pluginconfig->field_map_lastname.'\' and \''.$pluginconfig->field_map_email.'\''));
} else {
error(get_string( 'shib_not_set_up_error', 'auth'));
+1 -1
View File
@@ -177,7 +177,7 @@ function schedule_backup_cron() {
//Reference
if ($count_error != 0 || $count_unfinished != 0) {
$message .= " ".get_string('backupfailed')."\n\n";
$dest_url = $CFG->wwwroot.'/admin/report/backups/index.php';
$dest_url = "$CFG->wwwroot/$CFG->admin/report/backups/index.php";
$message .= " ".get_string('backuptakealook','',$dest_url)."\n\n";
//Set message priority
$admin->priority = 1;
+2 -1
View File
@@ -1628,7 +1628,8 @@
{$CFG->prefix}backup_ids bi
WHERE gm.groupid = $groupid
AND bi.backup_code = $preferences->backup_unique_code
AND bi.table_name = 'user'");
AND bi.table_name = 'user'
AND bi.old_id = gm.userid");
//Pring groups_members header
if ($groups_members) {
+2 -2
View File
@@ -22,8 +22,8 @@
$course_header->course_fullname = stripslashes_safe($form1->fullname); //"update_FullName";
/// Roll dates only if the backup course has a start date
/// (some formats like main page, social..., haven't it and rolling dates
/// from 0 produces crazy dates. MDL-10125
if ($course_header->course_startdate) {
/// from 0 produces crazy dates. MDL-10125 and we have passed some custom startyear/month/day. MDL-12922
if ($course_header->course_startdate && !empty($form1->startyear)) {
$form1->startdate = make_timestamp($form1->startyear, $form1->startmonth, $form1->startday);
$currentcoursestartdate = $course_header->course_startdate;
$coursestartdatedateoffset = $form1->startdate - $currentcoursestartdate;
+6 -1
View File
@@ -254,6 +254,11 @@ function selectItemInCheckboxByName(formId, checkName, checked ) {
}
helpbutton("coursestartdate", get_string("startdate"));
echo "</td></tr>";
} else {
/// If user cannot create course, prevent any change in startyear/month/day (so restore wont calculate any roll. MDL-12922
echo '<input type="hidden" name="startyear" value="0" />';
echo '<input type="hidden" name="startmonth" value="0" />';
echo '<input type="hidden" name="startday" value="0" />';
}
//Line
echo "<tr><td colspan=\"4\"><hr /></td></tr>";
@@ -635,4 +640,4 @@ function restore_is_samerole($rolea, $roleb) {
}
return true;
}
?>
?>
+17
View File
@@ -974,6 +974,11 @@
//Get section id when restoring in existing course
$rec = get_record("course_sections","course",$restore->course_id,
"section",$section->section);
//If section exists, has empty summary and backup has some summary, use it. MDL-8848
if ($rec && empty($rec->summary) && !empty($section->summary)) {
$rec->summary = $section->summary;
update_record("course_sections", $rec);
}
//If that section doesn't exist, get section 0 (every mod will be
//asigned there
if(!$rec) {
@@ -3343,6 +3348,18 @@
} else {
$status = false;
}
// MDL-14326 remove empty course modules instance's (credit goes to John T. Macklin from Remote Learner)
$course_modules_inst_zero = get_records_sql("SELECT id, course, instance
FROM {$CFG->prefix}course_modules
WHERE id = '$cm_module->new_id' AND
instance = '0'");
if($course_modules_inst_zero){ // Clean up the invalid instances
foreach($course_modules_inst_zero as $course_modules_inst){
delete_records('course_modules', 'id',$course_modules_inst->id);
}
}
}
}
+2 -2
View File
@@ -164,10 +164,10 @@ class block_admin extends block_list {
if (empty($course->metacourse) && ($course->id!==SITEID)) {
if (has_capability('moodle/legacy:guest', $context, NULL, false)) { // Are a guest now
$this->content->items[]='<a href="enrol.php?id='.$this->instance->pageid.'">'.get_string('enrolme', '', format_string($course->shortname)).'</a>';
$this->content->items[]='<a href="'.$CFG->wwwroot.'/course/enrol.php?id='.$this->instance->pageid.'">'.get_string('enrolme', '', format_string($course->shortname)).'</a>';
$this->content->icons[]='<img src="'.$CFG->pixpath.'/i/user.gif" class="icon" alt="" />';
} else if (has_capability('moodle/role:unassignself', $context, NULL, false)) { // Have some role
$this->content->items[]='<a href="unenrol.php?id='.$this->instance->pageid.'">'.get_string('unenrolme', '', format_string($course->shortname)).'</a>';
$this->content->items[]='<a href="'.$CFG->wwwroot.'/course/unenrol.php?id='.$this->instance->pageid.'">'.get_string('unenrolme', '', format_string($course->shortname)).'</a>';
$this->content->icons[]='<img src="'.$CFG->pixpath.'/i/user.gif" class="icon" alt="" />';
}
}
View File
View File
+1 -1
View File
@@ -196,7 +196,7 @@ class block_admin_tree extends block_base {
$searchcontent = isset($CFG->adminsearchquery) ? $CFG->adminsearchquery : '';
$this->content->footer = '<div class="adminsearchform">'.
'<form action="'.$CFG->wwwroot.'/admin/search.php" method="get"><div>'.
'<form action="'.$CFG->wwwroot.'/'.$CFG->admin.'/search.php" method="get"><div>'.
'<label for="query" class="accesshide">'.get_string('searchinsettings', 'admin').'</label>'.
'<input type="text" name="query" id="query" size="8" value="'.s($searchcontent).'" />'.
'<input type="submit" value="'.get_string('search').'" /></div>'.
View File
+4 -4
View File
@@ -53,10 +53,10 @@ class block_course_list extends block_list {
if (has_capability('moodle/course:update', get_context_instance(CONTEXT_SYSTEM)) || empty($CFG->block_course_list_hideallcourseslink)) {
$this->content->footer = "<a href=\"$CFG->wwwroot/course/index.php\">".get_string("fulllistofcourses")."</a> ...";
}
$this->get_remote_courses();
if ($this->content->items) { // make sure we don't return an empty list
return $this->content;
}
}
$this->get_remote_courses();
if ($this->content->items) { // make sure we don't return an empty list
return $this->content;
}
}
View File
View File
View File
+8 -3
View File
@@ -12,7 +12,7 @@ class block_html extends block_base {
}
function specialization() {
$this->title = isset($this->config->title) ? $this->config->title : get_string('newhtmlblock', 'block_html');
$this->title = isset($this->config->title) ? format_string($this->config->title) : get_string('newhtmlblock', 'block_html');
}
function instance_allow_multiple() {
@@ -24,8 +24,13 @@ class block_html extends block_base {
return $this->content;
}
$filteropt = new stdClass;
$filteropt->noclean = true;
if (!empty($this->instance->pinned) or $this->instance->pagetype === 'course-view') {
// fancy html allowed only on course page and in pinned blocks for security reasons
$filteropt = new stdClass;
$filteropt->noclean = true;
} else {
$filteropt = null;
}
$this->content = new stdClass;
$this->content->text = isset($this->config->text) ? format_text($this->config->text, FORMAT_HTML, $filteropt) : '';
+9 -2
View File
@@ -1,4 +1,11 @@
<?php $usehtmleditor = can_use_html_editor(); ?>
<?php
$usehtmleditor = can_use_html_editor();
$text = isset($this->config->text) ? $this->config->text : '';
if (empty($this->instance->pinned) and $this->instance->pagetype !== 'course-view') {
$text = clean_text($text, FORMAT_HTML);
}
?>
<table cellpadding="9" cellspacing="0">
<tr valign="top">
<td align="right"><?php print_string('configtitle', 'block_html'); ?>:</td>
@@ -6,7 +13,7 @@
</tr>
<tr valign="top">
<td align="right"><?php print_string('configcontent', 'block_html'); ?>:</td>
<td><?php print_textarea($usehtmleditor, 25, 50, 0, 0, 'text', isset($this->config->text)?$this->config->text:'') ?></td>
<td><?php print_textarea($usehtmleditor, 25, 50, 0, 0, 'text', $text) ?></td>
</tr>
<tr>
<td colspan="3" align="center">
+1
View File
@@ -50,6 +50,7 @@ class block_mnet_hosts extends block_list {
WHERE
h.id != '{$CFG->mnet_localhost_id}' AND
h.id = h2s_IDP.hostid AND
h.deleted = 0 AND
h2s_IDP.serviceid = s_IDP.id AND
s_IDP.name = 'sso_idp' AND
h2s_IDP.publish = '1' AND
View File
View File
View File
View File
View File
View File
View File
View File
View File
+2 -2
View File
@@ -216,8 +216,8 @@
echo '<div class="audience">'.$blogtype.'</div>';
// Print whole message
echo format_text($template['body']);
echo $template['body'];
/// Print attachments
echo $attachedimages;
/// Links to tags
+2 -2
View File
@@ -11,12 +11,12 @@ $authtoken = required_param('authtoken', PARAM_ALPHANUM);
//Fetch user information
if (!$user = get_complete_user_data('username', $username)) {
//No such user
die("No such user '$username'");
die('Invalid authentication');
}
//Check authentication token
if ($authtoken != sha1($username . $user->password)) {
die('Invalid authentication token');
die('Invalid authentication');
}
$what = optional_param('preset_what', 'all', PARAM_ALPHA);
+1 -1
View File
@@ -52,7 +52,7 @@
$stredit = get_string('edit', '', " $sectionname");
$strsummaryof = get_string('summaryof', '', " $sectionname");
} else {
$sectionname = get_string("name$course->format");
$sectionname = get_section_name($course->format);
$stredit = get_string('edit', '', " $sectionname $section->section");
$strsummaryof = get_string('summaryof', '', " $sectionname $form->section");
}
+42 -32
View File
@@ -244,24 +244,52 @@ function make_log_url($module, $url) {
case 'message':
case 'calendar':
case 'blog':
return "/$module/$url";
if (strpos($url, '../') === 0) {
$url = ltrim($url, '.');
} else {
$url = "/course/$url";
}
break;
case 'mnet course':
return "/course/$url";
$url = "/course/$url";
break;
case 'upload':
return $url;
$url = $url;
break;
case 'library':
case '':
return '/';
$url = '/';
break;
default:
return "/mod/$module/$url";
$url = "/mod/$module/$url";
break;
}
}
//now let's sanitise urls - there might be some ugly nasties:-(
$parts = explode('?', $url);
$script = array_shift($parts);
if (strpos($script, 'http') === 0) {
$script = clean_param($script, PARAM_URL);
} else {
$script = clean_param($script, PARAM_PATH);
}
$query = '';
if ($parts) {
$query = implode('', $parts);
$query = str_replace('&amp;', '&', $query); // both & and &amp; are stored in db :-|
$parts = explode('&', $query);
$eq = urlencode('=');
foreach ($parts as $key=>$part) {
$part = urlencode(urldecode($part));
$part = str_replace($eq, '=', $part);
$parts[$key] = $part;
}
$query = '?'.implode('&amp;', $parts);
}
return $script.$query;
}
function build_mnet_logs_array($hostid, $course, $user=0, $date=0, $order="l.time ASC", $limitfrom='', $limitnum='',
$modname="", $modid=0, $modaction="", $groupid=0) {
@@ -463,7 +491,7 @@ function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $per
print_paging_bar($totalcount, $page, $perpage, "$url&amp;perpage=$perpage&amp;");
echo '<table class="logtable genearlbox boxaligncenter" summary="">'."\n";
echo '<table class="logtable generalbox boxaligncenter" summary="">'."\n";
// echo "<table class=\"logtable\" cellpadding=\"3\" cellspacing=\"0\" summary=\"\">\n";
echo "<tr>";
if ($course->id == SITEID) {
@@ -504,10 +532,6 @@ function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $per
//Filter log->info
$log->info = format_string($log->info);
$log->url = strip_tags(urldecode($log->url)); // Some XSS protection
$log->info = strip_tags(urldecode($log->info)); // Some XSS protection
$log->url = s($log->url); /// XSS protection and XHTML compatibility - should be in link_to_popup_window() instead!!
echo '<tr class="r'.$row.'">';
if ($course->id == SITEID) {
echo "<td class=\"cell c0\">\n";
@@ -615,10 +639,6 @@ function print_mnet_log($hostid, $course, $user=0, $date=0, $order="l.time ASC",
//Filter log->info
$log->info = format_string($log->info);
$log->url = strip_tags(urldecode($log->url)); // Some XSS protection
$log->info = strip_tags(urldecode($log->info)); // Some XSS protection
$log->url = str_replace('&', '&amp;', $log->url); /// XHTML compatibility
echo '<tr class="r'.$row.'">';
if ($course->id == SITEID) {
echo "<td class=\"r$row c0\" >\n";
@@ -710,10 +730,7 @@ function print_log_csv($course, $user, $date, $order='l.time DESC', $modname,
//Filter log->info
$log->info = format_string($log->info);
$log->url = strip_tags(urldecode($log->url)); // Some XSS protection
$log->info = strip_tags(urldecode($log->info)); // Some XSS protection
$log->url = str_replace('&', '&amp;', $log->url); // XHTML compatibility
$firstField = $courses[$log->course];
$fullname = fullname($log, has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $course->id)));
@@ -1378,14 +1395,15 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false,
}
if ($mod->modname == "label") {
echo "<span class=\"";
if (!$mod->visible) {
echo "<span class=\"dimmed_text\">";
echo 'dimmed_text';
} else {
echo 'label';
}
echo '">';
echo format_text($extra, FORMAT_HTML, $labelformatoptions);
if (!$mod->visible) {
echo "</span>";
}
echo "</span>";
} else { // Normal activity
//Accessibility: for files get description via icon.
@@ -2541,16 +2559,8 @@ function move_courses ($courseids, $categoryid) {
$course->category = $categoryid;
$course->sortorder = $sortorder;
$course->fullname = addslashes($course->fullname);
$course->shortname = addslashes($course->shortname);
$course->summary = addslashes($course->summary);
$course->password = addslashes($course->password);
$course->teacher = addslashes($course->teacher);
$course->teachers = addslashes($course->teachers);
$course->student = addslashes($course->student);
$course->students = addslashes($course->students);
if (!update_record('course', $course)) {
if (!update_record('course', addslashes_recursive($course))) {
notify("An error occurred - course not moved!");
}
// parents changed (course category), do not delete child context relations
+2 -2
View File
@@ -587,7 +587,7 @@
$form->mode = "add";
$form->sesskey = !empty($USER->id) ? $USER->sesskey : '';
$sectionname = get_string("name$course->format");
$sectionname = get_section_name($course->format);
$fullmodulename = get_string("modulename", $module->name);
if ($form->section) {
@@ -636,7 +636,7 @@
$form->type = $type;
}
$sectionname = get_string("name$course->format");
$sectionname = get_section_name($course->format);
$fullmodulename = get_string("modulename", $module->name);
if ($form->section && $course->format != 'site') {
+1 -1
View File
@@ -295,7 +295,7 @@ function authorize_action(&$order, &$message, &$extra, $action=AN_ACTION_NONE, $
$responsecode = intval($response[0]);
if ($responsecode == AN_APPROVED || $responsecode == AN_REVIEW)
{
$transid = intval($response[6]);
$transid = floatval($response[6]);
if ($test || $transid == 0) {
return $responsecode; // don't update original transaction in test mode.
}
+3 -3
View File
@@ -12,7 +12,7 @@
<FIELD NAME="ccname" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="refundinfo" NEXT="courseid"/>
<FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="ccname" NEXT="userid"/>
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="courseid" NEXT="transid"/>
<FIELD NAME="transid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="userid" NEXT="status"/>
<FIELD NAME="transid" TYPE="int" LENGTH="20" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="userid" NEXT="status"/>
<FIELD NAME="status" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="transid" NEXT="timecreated"/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="status" NEXT="settletime"/>
<FIELD NAME="settletime" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="timecreated" NEXT="amount"/>
@@ -35,7 +35,7 @@
<FIELD NAME="orderid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="id" NEXT="status"/>
<FIELD NAME="status" TYPE="int" LENGTH="1" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="orderid" NEXT="amount"/>
<FIELD NAME="amount" TYPE="char" LENGTH="10" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="status" NEXT="transid"/>
<FIELD NAME="transid" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="amount" NEXT="settletime"/>
<FIELD NAME="transid" TYPE="int" LENGTH="20" NOTNULL="false" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="amount" NEXT="settletime"/>
<FIELD NAME="settletime" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="transid"/>
</FIELDS>
<KEYS>
@@ -47,4 +47,4 @@
</INDEXES>
</TABLE>
</TABLES>
</XMLDB>
</XMLDB>
+40
View File
@@ -59,6 +59,46 @@ function xmldb_enrol_authorize_upgrade($oldversion=0) {
}
}
if ($result && $oldversion < 2006112902) {
/// enrol_authorize.transid
/// Define index transid (not unique) to be dropped form enrol_authorize
$table = new XMLDBTable('enrol_authorize');
$index = new XMLDBIndex('transid');
$index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('transid'));
drop_index($table, $index);
/// Changing precision of field transid on table enrol_authorize to (20)
$table = new XMLDBTable('enrol_authorize');
$field = new XMLDBField('transid');
$field->setAttributes(XMLDB_TYPE_INTEGER, '20', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0', 'userid');
change_field_precision($table, $field);
/// Launch add index transid again
$table = new XMLDBTable('enrol_authorize');
$index = new XMLDBIndex('transid');
$index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('transid'));
add_index($table, $index);
/// enrol_authorize_refunds.transid
/// Define index transid (not unique) to be dropped form enrol_authorize_refunds
$table = new XMLDBTable('enrol_authorize_refunds');
$index = new XMLDBIndex('transid');
$index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('transid'));
drop_index($table, $index);
/// Changing precision of field transid on table enrol_authorize_refunds to (20)
$table = new XMLDBTable('enrol_authorize_refunds');
$field = new XMLDBField('transid');
$field->setAttributes(XMLDB_TYPE_INTEGER, '20', XMLDB_UNSIGNED, null, null, null, null, '0', 'amount');
change_field_precision($table, $field);
/// Launch add index transid again
$table = new XMLDBTable('enrol_authorize_refunds');
$index = new XMLDBIndex('transid');
$index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('transid'));
add_index($table, $index);
}
return $result;
}
+1 -1
View File
@@ -561,7 +561,7 @@ function authorize_get_status_action($order)
$canmanage = has_capability('enrol/authorize:managepayments', get_context_instance(CONTEXT_COURSE, $order->courseid));
if (intval($order->transid) == 0) { // test transaction or new order
if (floatval($order->transid) == 0) { // test transaction or new order
if ($order->timecreated < $newordertime) {
if ($canmanage) {
$ret->actions = array(ORDER_DELETE);
+1 -1
View File
@@ -1,6 +1,6 @@
<?php // $Id$
$plugin->version = 2006112901;
$plugin->version = 2006112902;
$plugin->requires = 2006100401;
?>
+54 -50
View File
@@ -4,11 +4,11 @@ require_once($CFG->dirroot.'/enrol/enrol.class.php');
class enrolment_plugin_database {
var $log;
var $log;
/*
* For the given user, let's go out and look in an external database
* for an authoritative list of enrolments, and then adjust the
* for an authoritative list of enrolments, and then adjust the
* local Moodle assignments to match.
*/
function setup_enrolments(&$user) {
@@ -32,7 +32,7 @@ function setup_enrolments(&$user) {
//error_log('[ENROL_DB] found ' . count($roles) . ' roles:');
foreach($roles as $role) {
//error_log('[ENROL_DB] setting up enrolments for '.$role->shortname);
/// Get the authoritative list of enrolments from the external database table
@@ -45,10 +45,10 @@ function setup_enrolments(&$user) {
/// Check if a particular role has been forced by the plugin site-wide
/// (if we aren't doing a role-based select)
if (!$have_role && $CFG->enrol_db_defaultcourseroleid) {
if (!$have_role && $CFG->enrol_db_defaultcourseroleid) {
$role = get_record('role', 'id', $CFG->enrol_db_defaultcourseroleid);
}
/// Whether to fetch the default role on a per-course basis (below) or not.
$use_default_role = !$role;
@@ -60,7 +60,7 @@ function setup_enrolments(&$user) {
} else {
error_log('[ENROL_DB] Using config default for roles: '.$role->shortname);
}*/
if ($rs = $enroldb->Execute("SELECT {$CFG->enrol_remotecoursefield} as enrolremotecoursefield
FROM {$CFG->enrol_dbtable}
WHERE {$CFG->enrol_remoteuserfield} = " . $useridfield .
@@ -84,6 +84,7 @@ function setup_enrolments(&$user) {
$courselist = array();
while ($fields_obj = rs_fetch_next_record($rs)) { // Make a nice little array of courses to process
$fields_obj = (object)array_change_key_case((array)$fields_obj , CASE_LOWER);
$courselist[] = $fields_obj->enrolremotecoursefield;
}
rs_close($rs);
@@ -120,14 +121,14 @@ function setup_enrolments(&$user) {
if ($use_default_role) {
$role = get_default_course_role($course);
}
$context = get_context_instance(CONTEXT_COURSE, $course->id);
// Couldn't get a role or context, skip.
if (!$role || !$context) {
continue;
}
// Search the role assignments to see if this user
// already has this role in this context. If it is, we
// skip to the next course.
@@ -139,7 +140,7 @@ function setup_enrolments(&$user) {
continue 2;
}
}
//error_log('[ENROL_DB] Enrolling user in course '.$course->idnumber);
role_assign($role->id, $user->id, 0, $context->id, 0, 0, 0, 'database');
}
@@ -156,7 +157,7 @@ function setup_enrolments(&$user) {
} else {
error_log('[ENROL_DB] Couldn\'t get rows from external db: '.$enroldb->ErrorMsg());
}
}
}
$this->enrol_disconnect($enroldb);
}
@@ -173,7 +174,7 @@ function sync_enrolments($role = null) {
// Connect to the external database
$enroldb = $this->enrol_connect();
if (!$enroldb) {
if (!$enroldb) {
notify("enrol/database cannot connect to server");
return false;
}
@@ -183,12 +184,12 @@ function sync_enrolments($role = null) {
} else {
echo "=== Syncing enrolments for default role ===\n";
}
// first, pack the sortorder...
fix_course_sortorder();
list($have_role, $remote_role_name, $remote_role_value) = $this->role_fields($enroldb, $role);
if (!$have_role) {
if (!empty($CFG->enrol_db_defaultcourseroleid)
and $role = get_record('role', 'id', $CFG->enrol_db_defaultcourseroleid)) {
@@ -197,7 +198,7 @@ function sync_enrolments($role = null) {
echo "!!! WARNING: Role specified by caller, but no (or invalid) role configuration !!!\n";
}
}
// get enrolments per-course
$sql = "SELECT DISTINCT {$CFG->enrol_remotecoursefield} " .
" FROM {$CFG->enrol_dbtable} " .
@@ -216,10 +217,11 @@ function sync_enrolments($role = null) {
begin_sql();
$extcourses = array();
while ($extcourse_obj = rs_fetch_next_record($rs)) { // there are more course records
$extcourse = $extcourse_obj->{$CFG->enrol_remotecoursefield};
$extcourse_obj = (object)array_change_key_case((array)$extcourse_obj , CASE_LOWER);
$extcourse = $extcourse_obj->{strtolower($CFG->enrol_remotecoursefield)};
array_push($extcourses, $extcourse);
// does the course exist in moodle already?
// does the course exist in moodle already?
$course = false;
$course = get_record( 'course',
$CFG->enrol_localcoursefield,
@@ -253,7 +255,7 @@ function sync_enrolments($role = null) {
if (!$have_role) {
$role = get_default_course_role($course);
}
// get a list of the student ids the are enrolled
// in the external db -- hopefully it'll fit in memory...
$extenrolments = array();
@@ -261,7 +263,7 @@ function sync_enrolments($role = null) {
" FROM {$CFG->enrol_dbtable} " .
" WHERE {$CFG->enrol_remotecoursefield} = " . $enroldb->quote($extcourse) .
($have_role ? ' AND '.$remote_role_name.' = '.$remote_role_value : '');
$crs = $enroldb->Execute($sql);
if (!$crs) {
trigger_error($enroldb->ErrorMsg() .' STATEMENT: '. $sql);
@@ -273,7 +275,8 @@ function sync_enrolments($role = null) {
// slurp results into an array
while ($crs_obj = rs_fetch_next_record($crs)) {
array_push($extenrolments, $crs_obj->{$CFG->enrol_remoteuserfield});
$crs_obj = (object)array_change_key_case((array)$crs_obj , CASE_LOWER);
array_push($extenrolments, $crs_obj->{strtolower($CFG->enrol_remoteuserfield)});
}
rs_close($crs); // release the handle
@@ -298,7 +301,7 @@ function sync_enrolments($role = null) {
AND ra.roleid = ". $role->id . ($extenrolments
? " AND u.{$CFG->enrol_localuserfield} NOT IN (".join(", ", array_map(array(&$db, 'quote'), $extenrolments)).")"
: ''));
if ($to_prune) {
foreach ($to_prune as $role_assignment) {
if (role_unassign($role->id, $role_assignment->userid, 0, $role_assignment->contextid)){
@@ -308,9 +311,9 @@ function sync_enrolments($role = null) {
}
}
}
//
// insert current enrolments
// insert current enrolments
// bad we can't do INSERT IGNORE with postgres...
//
foreach ($extenrolments as $member) {
@@ -321,7 +324,7 @@ function sync_enrolments($role = null) {
LEFT OUTER JOIN {$CFG->prefix}role_assignments ra ON u.id = ra.userid
AND ra.roleid = {$role->id}
AND ra.contextid = {$context->id}
WHERE u.{$CFG->enrol_localuserfield} = ".$db->quote($member) .
WHERE u.{$CFG->enrol_localuserfield} = ".$db->quote($member) .
" AND (u.deleted IS NULL OR u.deleted=0) ";
$ers = $db->Execute($sql);
@@ -330,7 +333,7 @@ function sync_enrolments($role = null) {
return false;
}
if ( $ers->RecordCount() == 0 ) { // if this returns empty, it means we don't have the student record.
// should not happen -- but skip it anyway
// should not happen -- but skip it anyway
trigger_error('weird! no user record entry?');
continue;
}
@@ -342,7 +345,7 @@ function sync_enrolments($role = null) {
if ($enrolmentid) { // already enrolled - skip
continue;
}
if (role_assign($role->id, $userid, 0, $context->id, 0, 0, 0, 'database')){
error_log( "Assigned role {$role->shortname} to user {$userid} in course {$course->id} (" . format_string($course->shortname) . ")");
} else {
@@ -381,8 +384,9 @@ function sync_enrolments($role = null) {
trigger_error($db->ErrorMsg() .' STATEMENT: '. $sql);
return false;
}
if ( $ers->RecordCount() > 0 ) {
if ( $ers->RecordCount() > 0 ) {
while ($user_obj = rs_fetch_next_record($ers)) {
$user_obj = (object)array_change_key_case((array)$user_obj , CASE_LOWER);
$roleid = $user_obj->roleid;
$user = $user_obj->userid;
$contextid = $user_obj->contextid;
@@ -390,15 +394,15 @@ function sync_enrolments($role = null) {
error_log( "Unassigned role {$roleid} from user $user in context $contextid");
} else {
error_log( "Failed unassign role {$roleid} from user $user in context $contextid");
}
}
}
rs_close($ers); // release the handle
}
commit_sql();
// we are done now, a bit of housekeeping
fix_course_sortorder();
$this->enrol_disconnect($enroldb);
return true;
}
@@ -412,11 +416,11 @@ function get_access_icons($course) {
function config_form($frm) {
global $CFG;
$vars = array('enrol_dbhost', 'enrol_dbuser', 'enrol_dbpass',
'enrol_dbname', 'enrol_dbtable',
'enrol_localcoursefield', 'enrol_localuserfield',
$vars = array('enrol_dbhost', 'enrol_dbuser', 'enrol_dbpass',
'enrol_dbname', 'enrol_dbtable',
'enrol_localcoursefield', 'enrol_localuserfield',
'enrol_remotecoursefield', 'enrol_remoteuserfield',
'enrol_db_autocreate', 'enrol_db_category', 'enrol_db_template',
'enrol_db_autocreate', 'enrol_db_category', 'enrol_db_template',
'enrol_db_localrolefield', 'enrol_db_remoterolefield',
'enrol_remotecoursefield', 'enrol_remoteuserfield',
'enrol_db_ignorehiddencourse', 'enrol_db_defaultcourseroleid');
@@ -424,7 +428,7 @@ function config_form($frm) {
foreach ($vars as $var) {
if (!isset($frm->$var)) {
$frm->$var = '';
}
}
}
include("$CFG->dirroot/enrol/database/config.html");
}
@@ -486,7 +490,7 @@ function process_config($config) {
$config->enrol_db_autocreate = '';
}
set_config('enrol_db_autocreate', $config->enrol_db_autocreate);
if (!isset($config->enrol_db_category)) {
$config->enrol_db_category = '';
}
@@ -506,7 +510,7 @@ function process_config($config) {
$config->enrol_db_localrolefield = '';
}
set_config('enrol_db_localrolefield', $config->enrol_db_localrolefield);
if (!isset($config->enrol_db_remoterolefield)) {
$config->enrol_db_remoterolefield = '';
}
@@ -522,7 +526,7 @@ function process_config($config) {
// will create the moodle course from the template
// course_ext is an array as obtained from ldap -- flattened somewhat
// NOTE: if you pass true for $skip_fix_course_sortorder
// NOTE: if you pass true for $skip_fix_course_sortorder
// you will want to call fix_course_sortorder() after your are done
// with course creation
function create_course ($course,$skip_fix_course_sortorder=0){
@@ -558,15 +562,15 @@ function create_course ($course,$skip_fix_course_sortorder=0){
if (empty($course->$key)) {
$course->$key = $template[$key];
}
}
}
$course->category = 1; // the misc 'catch-all' category
if (!empty($CFG->enrol_db_category)){ //category = 0 or undef will break moodle
$course->category = $CFG->enrol_db_category;
}
// define the sortorder
$sort = get_field_sql('SELECT COALESCE(MAX(sortorder)+1, 100) AS max ' .
// define the sortorder
$sort = get_field_sql('SELECT COALESCE(MAX(sortorder)+1, 100) AS max ' .
' FROM ' . $CFG->prefix . 'course ' .
' WHERE category=' . $course->category);
$course->sortorder = $sort;
@@ -575,14 +579,14 @@ function create_course ($course,$skip_fix_course_sortorder=0){
$course->startdate = time() + 3600 * 24;
$course->timecreated = time();
$course->visible = 1;
// clear out id just in case
unset($course->id);
unset($course->id);
// truncate a few key fields
$course->idnumber = substr($course->idnumber, 0, 100);
$course->shortname = substr($course->shortname, 0, 15);
// store it and log
if ($newcourseid = insert_record("course", addslashes_object($course))) { // Set up new course
$section = NULL;
@@ -593,8 +597,8 @@ function create_course ($course,$skip_fix_course_sortorder=0){
blocks_repopulate_page($page); // Return value no
if(!$skip_fix_course_sortorder){
fix_course_sortorder();
if(!$skip_fix_course_sortorder){
fix_course_sortorder();
}
add_to_log($newcourseid, "course", "new", "view.php?id=$newcourseid", "enrol/database auto-creation");
} else {
@@ -602,7 +606,7 @@ function create_course ($course,$skip_fix_course_sortorder=0){
notify("Serious Error! Could not create the new course!");
return false;
}
return $newcourseid;
}
@@ -622,7 +626,7 @@ function enrol_connect() {
trigger_error("Error connecting to enrolment DB backend with: "
. "$CFG->enrol_dbhost,$CFG->enrol_dbuser,$CFG->enrol_dbpass,$CFG->enrol_dbname");
return false;
}
}
}
/// DB Disconnect
@@ -642,7 +646,7 @@ function enrol_disconnect($enroldb) {
*/
function role_fields($enroldb, $role) {
global $CFG;
if ($have_role = !empty($role)
&& !empty($CFG->enrol_db_remoterolefield)
&& !empty($CFG->enrol_db_localrolefield)
+1 -1
View File
@@ -238,7 +238,7 @@ function get_access_icons($course) {
if ($fields[1] == "student") {
if ($teachers = get_users_by_capability($context, 'moodle/course:update', 'u.*,ra.hidden', 'sortorder ASC')) {
if ($teachers = get_users_by_capability($context, 'moodle/course:update', 'u.*,ra.hidden', 'ra.sortorder ASC')) {
foreach ($teachers as $u) {
if (!$u->hidden || has_capability('moodle/role:viewhiddenassigns', $context)) {
$teacher = $u;
+5 -3
View File
@@ -41,13 +41,15 @@
//Exclude labels and hidden items
if ($activity->mod != "label" && $activity->visible) {
$title = trim(strip_tags(urldecode($activity->name)));
$currentname = trim(urldecode($activity->name));
$entitisedname = s($currentname);
/// Avoid empty or unlinkable activity names
if (!empty($title)) {
$title = str_replace('"', "'", $title);
$href_tag_begin = "<a class=\"autolink\" title=\"$title\" href=\"$CFG->wwwroot/mod/$activity->mod/view.php?id=$activity->cm\" $CFG->frametarget>";
$currentname = urldecode($activity->name);
if ($currentname = trim($currentname)) {
$activitylist[] = new filterobject($currentname, $href_tag_begin, '</a>', false, true);
$activitylist[] = new filterobject($currentname, $href_tag_begin, '</a>', false, true);
if ($currentname != $entitisedname) { /// If name has some entity (&amp; &quot; &lt; &gt;) add that filter too. MDL-17545
$activitylist[] = new filterobject($entitisedname, $href_tag_begin, '</a>', false, true);
}
}
}
+3
View File
@@ -16,6 +16,8 @@
}
}
require_once($CFG->dirroot.'/filter/tex/lib.php');
$CFG->texfilterdir = "filter/tex";
$CFG->algebrafilterdir = "filter/algebra";
$CFG->algebraimagedir = "filter/algebra";
@@ -233,6 +235,7 @@ function tex2image($texexp, $md5, $return=false) {
}
$commandpath = "";
$cmd = "";
$texexp = tex_sanitize_formula($texexp);
$texexp = escapeshellarg($texexp);
switch (PHP_OS) {
case "Linux":
+2
View File
@@ -19,6 +19,7 @@
// disable moodle specific debug messages
disable_debugging();
require_once($CFG->dirroot.'/filter/tex/lib.php');
require_once($CFG->libdir.'/filelib.php');
$CFG->texfilterdir = 'filter/tex';
@@ -54,6 +55,7 @@
$texexp = str_replace('&gt;','>',$texexp);
$texexp = preg_replace('!\r\n?!',' ',$texexp);
$texexp = '\Large ' . $texexp;
$texexp = tex_sanitize_formula($texexp);
$texexp = escapeshellarg($texexp);
if ((PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) {
+1 -1
View File
@@ -1,4 +1,4 @@
The FLV player is by Jeroen Wijering - www.jeroenwijering.com
and included in Moodle by his permission under the GPL.
and included in Moodle by his permission under the GNU GPL version 2 or later.
Thanks, Jeroen!
Binary file not shown.
Binary file not shown.
+4 -2
View File
@@ -44,9 +44,11 @@
* @return string the latex document
*/
function construct_latex_document( $formula, $fontsize=12 ) {
// $fontsize don't affects to formula's size. $density can change size
global $CFG;
$formula = tex_sanitize_formula($formula);
// $fontsize don't affects to formula's size. $density can change size
$doc = "\\documentclass[{$fontsize}pt]{article}\n";
$doc .= $CFG->filter_tex_latexpreamble;
$doc .= "\\pagestyle{empty}\n";
+40
View File
@@ -0,0 +1,40 @@
<?php //$Id$
function tex_sanitize_formula($texexp) {
/// Check $texexp against blacklist (whitelisting could be more complete but also harder to maintain)
$tex_blacklist = array(
'include','command','loop','repeat','open','toks','output',
'input','catcode','name','^^',
'\def','\edef','\gdef','\xdef',
'\every','\errhelp','\errorstopmode','\scrollmode','\nonstopmode',
'\batchmode','\read','\write','csname','\newhelp','\uppercase',
'\lowercase','\relax','\aftergroup',
'\afterassignment','\expandafter','\noexpand','\special',
'\let', '\futurelet','\else','\fi','\chardef','\makeatletter','\afterground',
'\noexpand','\line','\mathcode','\item','\section','\mbox','\declarerobustcommand'
);
return str_ireplace($tex_blacklist, 'forbiddenkeyword', $texexp);
}
/**
* Purge all caches when settings changed.
*/
function filter_tex_updatedcallback($name) {
global $CFG;
if (file_exists("$CFG->dataroot/filter/tex")) {
remove_dir("$CFG->dataroot/filter/tex");
}
if (file_exists("$CFG->dataroot/filter/algebra")) {
remove_dir("$CFG->dataroot/filter/algebra");
}
if (file_exists("$CFG->dataroot/temp/latex")) {
remove_dir("$CFG->dataroot/temp/latex");
}
delete_records('cache_filters', 'filter', 'tex');
delete_records('cache_filters', 'filter', 'algebra');
}
?>
+3 -1
View File
@@ -20,8 +20,9 @@
disable_debugging();
require_once($CFG->libdir.'/filelib.php');
require_once($CFG->dirroot.'/filter/tex/lib.php');
require_once($CFG->dirroot.'/filter/tex/latex.php');
require_once('defaultsettings.php' );
require_once('latex.php');
$CFG->texfilterdir = 'filter/tex';
$CFG->teximagedir = 'filter/tex';
@@ -69,6 +70,7 @@
$texexp = str_replace('&gt;','>',$texexp);
$texexp = preg_replace('!\r\n?!',' ',$texexp);
$texexp = '\Large ' . $texexp;
$texexp = tex_sanitize_formula($texexp);
$texexp = escapeshellarg($texexp);
if ((PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) {
+8 -4
View File
@@ -1,12 +1,9 @@
<?PHP // $Id$
<?php // $Id$
// This function fetches math. images from the data directory
// If not, it obtains the corresponding TeX expression from the cache_tex db table
// and uses mimeTeX to create the image file
$nomoodlecookie = true; // Because it interferes with caching
require_once("../../config.php");
require( 'latex.php' );
if (empty($CFG->textfilters)) {
error ('Filter not enabled!');
@@ -17,6 +14,9 @@
}
}
require_once($CFG->dirroot.'/filter/tex/lib.php');
require_once($CFG->dirroot.'/filter/tex/latex.php');
$CFG->texfilterdir = "filter/tex";
$CFG->teximagedir = "filter/tex";
@@ -24,6 +24,9 @@
$param->action = optional_param( 'action','',PARAM_ALPHA );
$param->tex = optional_param( 'tex','' );
require_login();
require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM), $USER->id); /// Required cap to run this. MDL-18552
$query = urldecode($_SERVER['QUERY_STRING']);
error_reporting(E_ALL);
$output = '';
@@ -140,6 +143,7 @@
}
$commandpath = "";
$cmd = "";
$texexp = tex_sanitize_formula($texexp);
$texexp = escapeshellarg($texexp);
switch (PHP_OS) {
case "Linux":
+2
View File
@@ -6,6 +6,7 @@
$nomoodlecookie = true; // Because it interferes with caching
require_once("../../config.php");
require_once($CFG->dirroot.'/filter/tex/lib.php');
if (empty($CFG->textfilters)) {
error ('Filter not enabled!');
@@ -32,6 +33,7 @@
make_upload_directory($CFG->teximagedir);
}
$pathname = "$CFG->dataroot/$CFG->teximagedir/$image";
$texexp = tex_sanitize_formula($texexp);
$texexp = escapeshellarg($texexp);
switch (PHP_OS) {
+3 -3
View File
@@ -238,7 +238,7 @@ function grade_get_formatted_grades() {
}
$all_categories["$cur_category"]["$instance->name"]['grade_against'] = $all_categories["$cur_category"]["$instance->name"]['scaled_max'];
if (!isset($all_categories["$cur_category"]['stats']['weight'])) {
$weight = grade_get_category_weight($course->id, $cur_category);
$weight = grade_get_category_weight($course->id, addslashes($cur_category));
$all_categories["$cur_category"]['stats']['weight'] = $weight->weight;
}
@@ -248,7 +248,7 @@ function grade_get_formatted_grades() {
$all_categories["$cur_category"]["$instance->name"]['modname'] = $modname->name;
// get bonus points and drop the x lowest
$drop = get_record('grade_category', 'courseid', $course->id, 'name', $cur_category);
$drop = get_record('grade_category', 'courseid', $course->id, 'name', addslashes($cur_category));
$all_categories["$cur_category"]['stats']['drop'] = $drop->drop_x_lowest;
$all_categories["$cur_category"]['stats']['bonus_points'] = $drop->bonus_points;
}
@@ -2324,7 +2324,7 @@ function grade_set_grade_weights() {
$submitted_category = optional_param($form_catname);
if (is_numeric($submitted_category)) {
// see if there is a weight if so see if it needs to be updated
$weight = grade_get_category_weight($course->id, $category->name);
$weight = grade_get_category_weight($course->id, addslashes($category->name));
if ($weight) {
if ($weight->weight != $submitted_category)
{
+14 -3
View File
@@ -69,6 +69,17 @@ function install_group_db() {
/// 5) Add one UNIQUE index on groups_members (groupid, userid)
// first remove duplicates
$sql = "SELECT cm1.id
FROM {$CFG->prefix}groups_members cm1, {$CFG->prefix}groups_members cm2
WHERE cm1.groupid = cm2.groupid AND cm1.userid = cm2.userid AND cm1.id <> cm2.id
ORDER BY cm1.id DESC";
while ($duplicates = get_records_sql($sql, 0, 1)) {
$first = reset($duplicates);
delete_records('groups_members', 'id', $first->id);
}
/// Define index groupid-courseid (unique) to be added to groups_members
$table = new XMLDBTable('groups_members');
$index = new XMLDBIndex('groupid-courseid');
@@ -174,20 +185,20 @@ function install_group_db() {
$rec->action = 'view';
$rec->mtable = 'groups';
$rec->field = 'name';
$result = insert_record('log_display', $rec);
$result = $result && insert_record('log_display', $rec);
}
/// 11) PERFORM ALL THE NEEDED MOVEMENTS OF DATA
$db->debug = false; // suppressing because there can be too many
/// a) get the current groups, foreach one add an entry in groups_courses_groups
if ($oldgroups = get_records('groups')) {
if ($result and $oldgroups = get_records('groups')) {
foreach ($oldgroups as $oldgroup) {
$rec = new Object();
$rec->courseid = $oldgroup->courseid;
$rec->groupid = $oldgroup->id;
$rec->timeadded = $oldgroup->timemodified; // I think this is not needed since the field is gone?
insert_record('groups_courses_groups', $rec);
$result = $result && insert_record('groups_courses_groups', $rec);
}
}
$db->debug = true;
+39 -40
View File
@@ -4,14 +4,15 @@
*
* @copyright &copy; 2006 The Open University
* @author N.D.Freear AT open.ac.uk
* @author J.White AT open.ac.uk
* @author J.White AT open.ac.uk
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package groups
*/
require_once('../config.php');
require_once('lib.php');
require_once($CFG->libdir.'/moodlelib.php');
require_once($CFG->libdir.'/json/JSON.php');
ini_set('include_path', $CFG->libdir.'/pear'.PATH_SEPARATOR.ini_get('include_path'));
require_once('HTML/AJAX/JSON.php');
require_js('yui_yahoo');
require_js('yui_dom');
@@ -79,8 +80,7 @@ if ($success) {
$groupids = groups_get_groups_in_grouping($groupingid);
}
$group_names = groups_groupids_to_group_names($groupids);
$json = new Services_JSON();
echo $json->encode($group_names);
echo json_encode($group_names);
die; // Client side JavaScript takes it from here.
case 'ajax_getmembersingroup':
@@ -88,8 +88,7 @@ if ($success) {
if ($memberids = groups_get_members($groupid)) {
$member_names = groups_userids_to_user_names($memberids, $courseid);
$json = new Services_JSON();
echo $json->encode($member_names);
echo json_encode($member_names);
}
die; // Client side JavaScript takes it from here.
@@ -153,16 +152,16 @@ if ($success) {
$strparticipants = get_string('participants');
print_header("$course->shortname: $strgroups home", //TODO: home
$course->fullname,
$course->fullname,
"<a href=\"$CFG->wwwroot/course/view.php?id=$courseid\">$course->shortname</a> ".
"-> <a href=\"$CFG->wwwroot/user/index.php?id=$courseid\">$strparticipants</a> ".
"-> $strgroups", '', '', true, '', user_login_string($course, $USER));
$usehtmleditor = false;
//TODO: eventually we'll implement all buttons, meantime hide the ones we haven't finished.
$shownotdone = false;
$shownotdone = false;
$disabled = 'disabled="disabled"';
// Pre-disable buttons based on URL variables
if (!empty($groupingid) && $groupingid > -1) {
$showeditgroupsettingsform_disabled = '';
@@ -172,34 +171,34 @@ if ($success) {
$printerfriendly_disabled = '';
$showcreategroupform_disabled = '';
} else {
$showeditgroupsettingsform_disabled = $disabled;
$showeditgroupingsettingsform_disabled = $disabled;
$showeditgroupsettingsform_disabled = $disabled;
$showeditgroupingsettingsform_disabled = $disabled;
$deletegroup_disabled = $disabled;
$deletegrouping_disabled = $disabled;
$printerfriendly_disabled = $disabled;
$showcreategroupform_disabled = $disabled;
}
if ($groupingid == -1 && groups_count_groups_in_grouping(GROUP_NOT_IN_GROUPING, $courseid) > 0) {
$printerfriendly_disabled = '';
}
if (!empty($groupid)) {
$showaddmembersform_disabled = '';
$showeditgroupsettingsform_disabled = '';
$showeditgroupsettingsform_disabled = '';
$deletegroup_disabled = '';
} else {
$deletegroup_disabled = $disabled;
$showeditgroupsettingsform_disabled = $disabled;
$showaddmembersform_disabled = $disabled;
$showeditgroupsettingsform_disabled = $disabled;
$showaddmembersform_disabled = $disabled;
}
print_heading(format_string($course->shortname) .' '.$strgroups, 'center', 3);
echo '<form id="groupeditform" action="index.php" method="post">'."\n";
echo '<div>'."\n";
echo '<input type="hidden" name="id" value="' . $courseid . '" />'."\n";
/*
/*
<input type="hidden" name="groupid" value="<?php p($selectedgroup) ?>" />
<input type="hidden" name="sesskey" value="<?php p($sesskey) ?>" />
<input type="hidden" name="roleid" value="<?php p($roleid) ?>" />
@@ -223,16 +222,16 @@ if (empty($CFG->enablegroupings)) {
//NOTE, only show the pseudo-grouping if it has groups.
$groupingids[] = GROUP_NOT_IN_GROUPING;
}
$sel_groupingid = -1;
if ($groupingids) {
if ($groupingids) {
// Put the groupings into a hash and sort them
foreach($groupingids as $id) {
$listgroupings[$id] = groups_get_grouping_displayname($id, $courseid);
}
natcasesort($listgroupings);
// Print out the HTML
$count = 1;
foreach($listgroupings as $id => $name) {
@@ -250,29 +249,29 @@ if (empty($CFG->enablegroupings)) {
echo '</select>'."\n";
echo '<p><input type="submit" name="act_updategroups" id="updategroups" value="'
. get_string('showgroupsingrouping', 'group') . '" /></p>'."\n";
echo '<p><input type="submit" ' . $showeditgroupingsettingsform_disabled . ' name="act_showgroupingsettingsform" id="showeditgroupingsettingsform" value="'
. get_string('editgroupingsettings', 'group') . '" /></p>'."\n";
if ($shownotdone) {
echo '<p><input type="submit" '.$disabled.' name="act_showgroupingpermsform" '
. 'id="showeditgroupingpermissionsform" value="'
. get_string('editgroupingpermissions', 'group') . '" /></p>'."\n";
}
}
echo '<p><input type="submit" ' . $deletegrouping_disabled . ' name="act_deletegrouping" id="deletegrouping" value="'
. get_string('deletegrouping', 'group') . '" /></p>'."\n";
echo '<p><input type="submit" name="act_showcreategroupingform" id="showcreategroupingform" value="'
. get_string('creategrouping', 'group') . '" /></p>'."\n";
if ($shownotdone) {
echo '<p><input type="submit" '.$disabled.' name="act_createautomaticgroupingform" '
. 'id="showcreateautomaticgroupingform" value="'
. 'id="showcreateautomaticgroupingform" value="'
. get_string('createautomaticgrouping', 'group') . '" /></p>'."\n";
}
echo '<p><input type="submit" ' . $printerfriendly_disabled . ' name="act_printerfriendly" id="printerfriendly" value="'
. get_string('printerfriendly', 'group') . '" /></p>'."\n";
echo "</td>\n";
@@ -295,7 +294,7 @@ if (empty($CFG->enablegroupings)) {
if ($groupids) {
// Put the groups into a hash and sort them
$group_names = groups_groupids_to_group_names($groupids);
// Print out the HTML
$count = 1;
foreach ($group_names as $group) {
@@ -307,11 +306,11 @@ if (empty($CFG->enablegroupings)) {
echo "<option value=\"{$group->id}\"$select title=\"{$group->name}\">{$group->name}</option>\n";
$count++;
}
} else {
} else {
// Print an empty option to avoid the XHTML error of having an empty select element
echo '<option>&nbsp;</option>';
}
echo '</select>'."\n";
echo '<p><input type="submit" name="act_updatemembers" id="updatemembers" value="'
. get_string('showmembersforgroup', 'group') . '" /></p>'."\n";
@@ -319,7 +318,7 @@ if (empty($CFG->enablegroupings)) {
. get_string('editgroupsettings', 'group') . '" /></p>'."\n";
echo '<p><input type="submit" '. $deletegroup_disabled . ' name="act_deletegroup" onclick="onDeleteGroup()" id="deletegroup" value="'
. get_string('deleteselectedgroup', 'group') . '" /></p>'."\n";
if ($shownotdone) {
echo '<p><input type="submit" '.$disabled.' name="act_removegroup" '
. 'id="removegroup" value="' . get_string('removegroupfromselectedgrouping', 'group') . '" /></p>'."\n";
@@ -331,13 +330,13 @@ if (empty($CFG->enablegroupings)) {
. get_string('creategroup', 'group') . '" /></p>'."\n";
echo '<p><input type="submit" name="act_printerfriendly" id="printerfriendly" value="'
. get_string('printerfriendly', 'group') . '" /></p>'."\n";
} else {
} else {
echo '<p><input type="submit" ' . $showcreategroupform_disabled . ' name="act_showcreategroupform" id="showcreategroupform" value="'
. get_string('creategroupinselectedgrouping', 'group') . '" /></p>'."\n";
echo '<p><input type="submit" name="act_showcreateorphangroupform" id="showcreateorphangroupform" value="'
. get_string('createorphangroup', 'group') . '" /></p>'."\n";
if ($shownotdone) {
echo '<p><input type="submit" '.$disabled.' name="act_addgroupstogroupingform" '
. 'id="showaddgroupstogroupingform" value="' . get_string('addgroupstogrouping', 'group') . '" /></p>'."\n";
@@ -350,11 +349,11 @@ if (empty($CFG->enablegroupings)) {
//NOTE: the SELECT was, multiple="multiple" name="user[]" - not used and breaks onclick.
echo '<select name="user" id="members" size="15" class="select"'."\n";
echo ' onclick="window.status=this.options[this.selectedIndex].title;" onmouseout="window.status=\'\';">'."\n";
if (isset($sel_groupid)) {
$userids = groups_get_members($sel_groupid);
}
if (isset($userids)) { //&& is_array($userids)
if (isset($userids)) { //&& is_array($userids)
// Put the groupings into a hash and sort them
$user_names = groups_userids_to_user_names($userids, $courseid);
if(empty($user_names)) {
@@ -364,18 +363,18 @@ if (empty($CFG->enablegroupings)) {
echo "<option value=\"{$user->id}\" title=\"{$user->name}\">{$user->name}</option>\n";
}
}
} else {
} else {
// Print an empty option to avoid the XHTML error of having an empty select element
echo '<option>&nbsp;</option>';
}
echo '</select>'."\n";
if ($shownotdone) {
echo '<p><input type="submit" '.$disabled.' name="act_removemembers" '
. 'id="removemembers" value="' . get_string('removeselectedusers', 'group') . '"/></p>'."\n";
}
echo '<p><input type="submit" ' . $showaddmembersform_disabled . ' name="act_showaddmembersform" '
. 'id="showaddmembersform" value="' . get_string('adduserstogroup', 'group'). '" /></p>'."\n";
echo '</td>'."\n";
@@ -385,7 +384,7 @@ if (empty($CFG->enablegroupings)) {
//<input type="hidden" name="rand" value="om" />
echo '</div>'."\n";
echo '</form>'."\n";
echo '<script type="text/javascript">'."\n";
echo '//<![CDATA['."\n";
echo 'var groupsCombo = new UpdatableGroupsCombo("'.$CFG->wwwroot.'", '.$course->id.');'."\n";
+1 -1
View File
@@ -103,7 +103,7 @@
BLOCK_R_MAX_WIDTH);
print_header($SITE->fullname, $SITE->fullname, 'home', '',
'<meta name="description" content="'. s(strip_tags($SITE->summary)) .'" />',
'<meta name="description" content="'. strip_tags(format_text($SITE->summary, FORMAT_HTML)) .'" />',
true, '', user_login_string($SITE).$langmenu);
?>
+17 -5
View File
@@ -427,7 +427,8 @@ if ($INSTALL['stage'] == ENVIRONMENT) {
$dbconnected = $db->Connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname']);
error_reporting(7); // Show errors
if ($dbconnected) {
/// Execute environment check, printing results
/// Execute environment check, not printing results
@remove_dir($INSTALL['dataroot'] . '/environment'); /// Always delete downloaded env. info to force use of the released one. MDL-9796
if (!check_moodle_environment($INSTALL['release'], $environment_results, false)) {
$nextstage = ENVIRONMENT;
}
@@ -464,7 +465,7 @@ if ($INSTALL['stage'] == DOWNLOADLANG && $INSTALL['downloadlangpack']) {
case ERROR:
if ($cd->get_error() == 'remotedownloadnotallowed') {
$a = new stdClass();
$a->url = 'http://download.moodle.org/lang16/'.$pack.'.zip';
$a->url = 'http://download.moodle.org/lang16/'.$INSTALL['language'].'.zip';
$a->dest= $CFG->dataroot.'/lang';
$downloaderror = get_string($cd->get_error(), 'error', $a);
} else {
@@ -714,6 +715,8 @@ if ($nextstage == SAVE) {
function form_table($nextstage = WELCOME, $formaction = "install.php") {
global $INSTALL, $db;
$enablenext = true;
/// Print the standard form if we aren't in the DOWNLOADLANG page
/// because it has its own form.
if ($nextstage != DOWNLOADLANG) {
@@ -748,12 +751,16 @@ function form_table($nextstage = WELCOME, $formaction = "install.php") {
/// Check that PHP is of a sufficient version
print_compatibility_row(inst_check_php_version(), get_string('phpversion', 'install'), get_string('phpversionerror', 'install'), 'phpversionhelp');
$enablenext = $enablenext && inst_check_php_version();
/// Check session auto start
print_compatibility_row(!ini_get_bool('session.auto_start'), get_string('sessionautostart', 'install'), get_string('sessionautostarterror', 'install'), 'sessionautostarthelp');
$enablenext = $enablenext && !ini_get_bool('session.auto_start');
/// Check magic quotes
print_compatibility_row(!ini_get_bool('magic_quotes_runtime'), get_string('magicquotesruntime', 'install'), get_string('magicquotesruntimeerror', 'install'), 'magicquotesruntimehelp');
$enablenext = $enablenext && !ini_get_bool('magic_quotes_runtime');
/// Check unsupported PHP configuration
print_compatibility_row(ini_get_bool('magic_quotes_gpc') || (!ini_get_bool('register_globals')), get_string('globalsquotes', 'install'), get_string('globalsquoteserror', 'install'), 'globalsquoteshelp');
print_compatibility_row(!ini_get_bool('register_globals'), get_string('globalsquotes', 'install'), get_string('globalswarning', 'install'));
$enablenext = $enablenext && !ini_get_bool('register_globals');
/// Check safe mode
print_compatibility_row(!ini_get_bool('safe_mode'), get_string('safemode', 'install'), get_string('safemodeerror', 'install'), 'safemodehelp', true);
/// Check file uploads
@@ -861,6 +868,7 @@ function form_table($nextstage = WELCOME, $formaction = "install.php") {
error_reporting(7); // Show errors
if ($dbconnected) {
/// Execute environment check, printing results
@remove_dir($INSTALL['dataroot'] . '/environment'); /// Always delete downloaded env. info to force use of the released one. MDL-9796
check_moodle_environment($INSTALL['release'], $environment_results, true);
} else {
/// We never should reach this because DB has been tested before arriving here
@@ -925,9 +933,11 @@ function form_table($nextstage = WELCOME, $formaction = "install.php") {
<input type="hidden" name="stage" value="<?php echo $nextstage ?>" />
<?php
}
$disabled = $enablenext ? '' : 'disabled="disabled"';
?>
<?php echo ($nextstage < SAVE) ? "<input type=\"submit\" name=\"next\" value=\"".get_string('next')." &raquo;\" style=\"float: ".fix_align_rtl("right")."\"/>\n" : "&nbsp;\n" ?>
<?php echo ($nextstage < SAVE) ? "<input $disabled type=\"submit\" name=\"next\" value=\"".get_string('next')." &raquo;\" style=\"float: ".fix_align_rtl("right")."\"/>\n" : "&nbsp;\n" ?>
<?php echo ($nextstage > WELCOME) ? "<input type=\"submit\" name=\"prev\" value=\"&laquo; ".get_string('previous')."\" style=\"float: ".fix_align_rtl("left")."\"/>\n" : "&nbsp;\n" ?>
<?php
@@ -971,7 +981,9 @@ function print_compatibility_row($success, $testtext, $errormessage, $helpfield=
echo "</p></td>\n";
echo "<td valign=\"top\">";
echo "<p>$errormessage ";
install_helpbutton("install.php?help=$helpfield");
if ($helpfield !== '') {
install_helpbutton("install.php?help=$helpfield");
}
echo "</p></td>\n";
}
echo "</tr>\n";
-2
View File
@@ -11,10 +11,8 @@
$string['closewindow'] = 'Maak die venster toe';
$string['continue'] = 'Gaan voort';
$string['doyouagree'] = 'Het jy die voorwaardes gelees en verstaan jy dit?';
$string['error'] = 'Fout';
$string['help'] = 'Help';
$string['invalidemail'] = 'Ongeldige email adres';
$string['language'] = 'Taal';
$string['name'] = 'Naam';
$string['next'] = 'Volgende';

Some files were not shown because too many files have changed in this diff Show More