Compare commits

..

1155 Commits

Author SHA1 Message Date
moodler 2159765e74 Bumped 1.9.5 version for release 2009-05-13 06:55:11 +00:00
jerome f03f3a665a authentication MDL-18273 Custom Authentication Plugin title can be retrieved from specific language file 2009-05-13 05:35:37 +00:00
moodlerobot e15ed28787 Updated the 19 build version to 20090513 2009-05-13 00:36:53 +00:00
stronk7 b5fcbcf59c MDL-19163 restore - enable course selection for teachers having perms in more than 1 course 2009-05-12 14:53:45 +00:00
stronk7 de0caf4bda MDL-19161 - DB 2.0 reqs. Updated to fulfil 2.0 Roadmap 2009-05-12 09:27:57 +00:00
nicolasconnault 4985cbde0b 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:08 +00:00
moodler 3c95dfea94 course/format/social MDL-18483 For social course format, print forum intro on course page 2009-05-12 05:09:28 +00:00
moodlerobot 2cfd5fd531 Updated the 19 build version to 20090512 2009-05-12 00:38:07 +00:00
fmarier 9c067299f6 MDL-19156: auth/fc: clarifying the licensing terms as per author's email 2009-05-11 23:38:44 +00:00
diml 989b0e64f1 MDL-16979 - protects update queries by setting a real value in $CFG->search_indexer_update_date 2009-05-11 19:58:58 +00:00
diml 67b98646eb addresses MDL-19154. May not fix every thing here... more tests in progress. 2009-05-11 19:52:13 +00:00
diml a9e79cb1d7 Fix MDL-19155 on glossary 2009-05-11 19:48:42 +00:00
stronk7 767904d06c MDL-16879 - check & fix mandatory mnet_host records and orphan users. Bump version to next int one. 2009-05-11 18:29:27 +00:00
stronk7 0a5bf56672 MDL-18547 mysql floats - only none/both params (length & decimals) syntax is
allowed. So, if decimals are missing, enforce 0 if length is defined.
2009-05-11 15:04:30 +00:00
nicolasconnault abf58c0272 MDL-7028 global $QTYPES is only available if lib/questionlib.php is included. 2009-05-11 06:31:58 +00:00
moodlerobot e51f717e51 Updated the 19 build version to 20090511 2009-05-11 00:37:11 +00:00
stronk7 f10af7b137 MDL-18746 get_user_courses_bycap() - avoid ambiguous (repeated) column names 2009-05-11 00:02:43 +00:00
stronk7 89c1fe8297 MDL-19084 - backup_course_silently() missing call to xxx__check_backup_mods()
causing quizzes to be incorrect (thanks Piers Harding) plus problems with users,
files and role assignments.
2009-05-10 23:16:06 +00:00
stronk7 61ac3a70dd MDL-15534 wiki special pages heading title. Apply ewiki_t() to get translated heading names 2009-05-10 15:27:34 +00:00
stronk7 eb1b491181 MDL-12618 restore events - delete some missed debug lines...oops 2009-05-10 14:38:34 +00:00
stronk7 9d73b7e3fc MDL-12618 restore events - apply cross-db sql_compare_text(). MSSQL & Oracle were broken here. 2009-05-10 14:35:19 +00:00
stronk7 972f7bb2f0 MDL-11144 - restore of mnet users. Another improvement... 2009-05-10 11:50:45 +00:00
skodak 4889610b11 MDL-19139 selectgroups formslib element improvements - 1/ does not validate if optgroup array empty 2/ add optional $showchoose parameter which adds "Choose..." as first item of list with empty value 2009-05-10 11:48:24 +00:00
stronk7 c07cb2e8bc MDL-17009 restore of mnet users - prevent any user using local host to end with mnet auth 2009-05-10 01:14:52 +00:00
moodlerobot c0e37117b2 Updated the 19 build version to 20090510 2009-05-10 00:37:23 +00:00
moodlerobot aa13521bf1 Automatic installer.php lang files by installer_builder (20090510) 2009-05-10 00:31:07 +00:00
fmarier 04da7fef54 MDL-19117 clarification to the license 2009-05-09 04:32:33 +00:00
stronk7 62082bebd0 MDL-16879 copy/paste double dollar fixed 2009-05-09 01:45:27 +00:00
stronk7 9499230085 MDL-16879 - fix mnet hosts. Tentative function. Not applied to upgrade yet. Please review. 2009-05-09 01:32:41 +00:00
moodlerobot 3556e43683 Updated the 19 build version to 20090509 2009-05-09 00:38:08 +00:00
skodak b8f2fd6a59 MDL-16957 explain why our htaccess is intentionally broken 2009-05-08 21:30:31 +00:00
skodak c5c5f5376c MDL-18311 fixed magic quotes trouble when moving courses 2009-05-08 21:05:18 +00:00
skodak b945888dca MDL-14831 adding warning - excluded grades are not compatible with sum agg; backported from HEAD 2009-05-08 20:08:53 +00:00
mjollnir_ e0eb5d21f5 fix for MDL-19110
Author: Adrian Schlegel <adrian@liip.ch>
2009-05-08 14:26:17 +00:00
nicolasconnault 2e14051ba0 MDL-19121 Not allowing negative values for droplow and keephigh: capping at 0 2009-05-08 13:29:32 +00:00
skodak adb6ccd946 MDL-19068 fixed item decimals before saving item 2009-05-08 13:17:45 +00:00
skodak 9346a8ff99 MDL-18476 fixed default guest role display hint 2009-05-08 12:22:59 +00:00
skodak fa952896a3 MDL-18704 fixed incorrect mnet logging 2009-05-08 12:15:34 +00:00
skodak c73705641f MDL-18869 fixed full name display 2009-05-08 12:07:00 +00:00
skodak bfe5f847b4 MDL-18492 it is not possible to do anything with moddata directory anymore - this is too dangerous for many people ;-) 2009-05-08 08:52:42 +00:00
moodler 10ac51efae theme/standard MDL-19082 Added a margin to standard theme on redirects page 2009-05-08 08:15:45 +00:00
skodak 623a81e19a MDL-18744 cas fix, credit goes to Thibault Le Meur 2009-05-08 07:53:11 +00:00
nicolasconnault feeb76097b MDL-18402 Put default value of 1 for grade item's aggregationcoef if parent category's aggregation is weighted mean. Put 0 for gradepass if field is empty, and 0 for grademin if left empty. This prevents SQL errors because all three fields (aggregationcoef, gradepass and grademin) are non-NULL. 2009-05-08 07:16:44 +00:00
nicolasconnault 79b4a87567 MDL-16416 Created a new help file including explanations of extra credit for both "Sum of Grades" and "Mean with extra credit" aggregation types. This is used on the "Edit categories and items" page. 2009-05-08 06:25:09 +00:00
moodlerobot 8166ff5358 Updated the 19 build version to 20090508 2009-05-08 00:37:15 +00:00
stronk7 56eece4e54 MDL-15690, MDL-16518 backup - include roles with overrides (not only with assignments). Credit goes to Clinton Graham. 2009-05-07 23:53:14 +00:00
gbateson 6f806335e0 when searhcing for urls of next quiz, remove requirement for navigation buttons to have class="NavButton" 2009-05-07 23:01:37 +00:00
stronk7 80fbfbb3f6 MDL-13826 link/file resource - check maximum length 2009-05-07 20:39:46 +00:00
stronk7 3be9556391 MDL-19112 choosecoursefile group element - pass specified attrs to text element 2009-05-07 20:29:16 +00:00
skodak 8f0a36a201 MDL-19111 fixed dimming of hidden until items 2009-05-07 17:38:10 +00:00
ericmerrill 1c077f6ad0 MDL-19092 Fixed the user login view, which was incomplete and broken on some browsers 2009-05-07 12:13:10 +00:00
skodak 156726fd07 MDL-2307 improved file name cleanup during unzip 2009-05-07 10:47:57 +00:00
nicolasconnault 0d21fc03a3 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 2009-05-07 09:44:07 +00:00
nicolasconnault c373242b42 MDL-14412 Applied Michael's patches to fix ram/rm support in firefox 2009-05-07 08:55:50 +00:00
skodak fedfff27f5 MDL-19101 scale selection validated on category edit form 2009-05-07 08:47:26 +00:00
skodak 79143931ce MDL-19091 removed custom scales from different courses + added BC hack 2009-05-07 08:36:11 +00:00
nicolasconnault 0074ab9cef MDL-12444 Removed aggregationview preference from category edit form 2009-05-07 07:52:10 +00:00
skodak 2a200a31d0 MDL-19090 fixed user report preferences 2009-05-07 07:37:29 +00:00
skodak 48629ec809 MDL-19088 fixed category aggregation limitations 2009-05-07 07:18:36 +00:00
dongsheng 8dd6ca3a27 "MDL-18971, fixed .unread class definition" 2009-05-07 05:39:09 +00:00
dongsheng 7fbdd28395 "MDL-3729, use forces language for htmleditor" 2009-05-07 05:30:10 +00:00
fmarier 8a50f7d16b MDL-19096 include a copy of the GPL 2009-05-07 03:03:25 +00:00
moodlerobot 617d203373 Updated the 19 build version to 20090507 2009-05-07 00:36:52 +00:00
skodak a71482a737 MDL-19029 fixed validation problems 2009-05-06 18:50:20 +00:00
skodak 14e93d3cae MDL-19029 fixed validation problem in yui titles 2009-05-06 18:35:18 +00:00
skodak 69785be47a MDL-16915 fixed warnings caused by empty arrays in forum ratings 2009-05-06 18:13:29 +00:00
stronk7 7738dd48c5 MDL-14463 search/order - make it cross-db + delete unused column from query 2009-05-06 17:24:29 +00:00
skodak e8e23ffcc3 MDL-19036 fixed multiple SQL injections 2009-05-06 16:17:50 +00:00
skodak 9a71308057 MDL-18670 adding proper permissions for mkdir() 2009-05-06 16:10:14 +00:00
skodak 2e4dfb210e MDL-18757 using new addslashes_recursive() instead of old addslashes_object() which does not tollerate arrays, nulls, etc. 2009-05-06 15:53:52 +00:00
stronk7 8d73532067 MDL-18059 database rates - secured 2009-05-06 10:16:54 +00:00
stronk7 696018df63 MDL-18058 glossary rates - secured 2009-05-06 09:15:46 +00:00
skodak c7ad7da9c0 MDL-2307, MDL-18415 - improved unzipping - now properly removing forbidden chars and symlinks 2009-05-06 08:48:51 +00:00
moodlerobot 1701805b9e Updated the 19 build version to 20090506 2009-05-06 00:38:23 +00:00
moodlerobot 916dec711b Automatic installer.php lang files by installer_builder (20090506) 2009-05-06 00:32:00 +00:00
skodak 0af2efcf54 MDL-19029 added missing CDATA 2009-05-05 11:52:03 +00:00
skodak 5bac2c2848 MDL-19029 removed bogus feedback end span 2009-05-05 11:42:04 +00:00
stronk7 a4bb739b92 MDL-18799 backup of file.php links - now using unicode modifiers if allowed in the server 2009-05-05 09:25:59 +00:00
moodlerobot 9c536d5a9c Updated the 19 build version to 20090505 2009-05-05 00:38:33 +00:00
skodak 400688352e MDL-19009 cleanup - there is no CONTEXT_GROUP and pinned block context; backported from HEAD 2009-05-04 20:24:45 +00:00
skodak 45c3dd8fce MDL-18124 course creators can not delete any courses in their category any more, only those they created at most one day ago 2009-05-04 19:56:04 +00:00
skodak e67af80ed5 MDL-19052 separate group mode improvements and fixes 2009-05-04 13:14:17 +00:00
skodak cd669edcc1 MDL-19052 fixed separate group mode access on grader report 2009-05-04 13:12:09 +00:00
skodak 4f7ee1cdcc MDL-19052 separate group mode improvements and fixes 2009-05-04 12:54:37 +00:00
nicolasconnault 9f09bc9342 MDL-12444 Removed aggregationview preference from grader report 2009-05-04 12:26:19 +00:00
stronk7 95444f7b1d MDL-18227 forum ratings - clean wrong records 2009-05-04 08:11:15 +00:00
moodlerobot c22c551225 Updated the 19 build version to 20090504 2009-05-04 00:39:41 +00:00
moodlerobot ae47f3bde9 Updated the 19 build version to 20090503 2009-05-03 00:39:52 +00:00
moodlerobot 6ea3353c7c Updated the 19 build version to 20090502 2009-05-02 00:38:55 +00:00
tjhunt cb5c33b235 adminlib: MDL-19038 lazy-load the list of users in admin_setting_users_with_capability 2009-05-01 10:21:58 +00:00
dongsheng 551d425a88 "MDL-19037, use getremoteaddr to get remote ip address, backported from 2.0" 2009-05-01 08:06:08 +00:00
moodlerobot 0d5f1abbef Updated the 19 build version to 20090501 2009-05-01 00:39:29 +00:00
skodak 35d3f6b7d9 MDL-15801 fixed incorrect use of get complete user data function 2009-04-30 20:07:25 +00:00
skodak 5fcba158ce MDL-14561 fixed https issue in IE 2009-04-30 19:56:10 +00:00
skodak b1f45df9be MDL-18523 fixed notice when no cms present yet 2009-04-30 19:04:51 +00:00
skodak 03c4782e11 MDL-19029 fixed incorrect closing of divs on grader report 2009-04-30 10:35:04 +00:00
skodak e41ba841e0 MDL-19029 xhtml strict 2009-04-30 10:15:53 +00:00
skodak 3effcb29a1 MDL-19030 even uglier hack - do not try to add id to labels of static element - they do not have it 2009-04-30 10:08:37 +00:00
skodak fffe748c4c MDL-19030 very ugly hack - do not try to add id to labels of element group - they do not have it 2009-04-30 10:01:43 +00:00
skodak 2ead96df61 MDL-19030 fixed xhtml strictness when label attached to frozen element 2009-04-30 09:48:52 +00:00
skodak 5200e67665 MDL-18951 standardised group support in grader report - forgotten string 2009-04-30 09:16:13 +00:00
skodak 10cae68206 MDL-19016 xhtml strict fix; backported from HEAD 2009-04-30 09:15:13 +00:00
skodak 7234be25bb MDL-18951 standardised group support in grader report; backported from HEAD 2009-04-30 09:01:01 +00:00
nicolasconnault 580898921f MDL-19028 Hiding hidden category from student report instead of grade items. See code diff for better explanation 2009-04-30 08:39:45 +00:00
skodak 3bd8cfe4a3 MDL-18951 standardised group support in grader report (not complete yet); backported from HEAD 2009-04-30 08:08:14 +00:00
nicolasconnault 30911d519a MDL-19027 Added <th> for controls row in edit mode with screenreader and editing on 2009-04-30 07:04:53 +00:00
moodlerobot 25fcb7a520 Updated the 19 build version to 20090430 2009-04-30 00:38:00 +00:00
skodak 6da5a0db23 MDL-13722, MDL-12909 - idnumber required in xml grade export, if not present do not show user in export preview 2009-04-29 20:57:32 +00:00
skodak dd385043a6 MDL-16687 fixed incorrect sorting - thanks Philip Cali 2009-04-29 20:35:37 +00:00
skodak 1ee253d0ef MDL-17829 category edit page cleanup; backported from HEAD 2009-04-29 15:16:04 +00:00
skodak 719e210878 MDL-18991 proper locking of grade type and min/max when sum agg selected and other code cleanup; backported from HEAD 2009-04-29 15:04:44 +00:00
skodak 82a461040d MDL-19014 multiplicator and offset are used only for activity grades - must be disabled elsewhere; backported from HEAD 2009-04-29 14:44:05 +00:00
skodak db6f2bb775 MDL-19015 removed category item editing from normal item edit form; backported from HEAD 2009-04-29 14:36:02 +00:00
skodak f53d2cf806 MDL-19008 extra credis should not be dropped when drop low or keep high specified (including unit tests); backported from HAED and full regrading which is also needed for MDL-18993 2009-04-29 13:44:17 +00:00
skodak 3cee044c01 MDL-18993 implemented frull support for droplow and keephigh in sum aggregation type; backported from HEAD 2009-04-29 10:06:25 +00:00
nicolasconnault d13cf40879 MDL-18963 Applied Matt's patch. Thanks 2009-04-29 09:24:43 +00:00
skodak 309be30e7a MDL-18993 implemented frull support for droplow and keephigh in sum aggregation type; backported from HEAD 2009-04-29 08:55:45 +00:00
moodlerobot b2fe689814 Updated the 19 build version to 20090429 2009-04-29 00:39:46 +00:00
skodak 6f31d67743 MDL-19001 fixed sql typo - thanks Alan Trick 2009-04-28 18:50:12 +00:00
moodlerobot 081c26d41f Updated the 19 build version to 20090428 2009-04-28 00:42:30 +00:00
skodak 0ba3cbecca MDL-17248 fixed incorrect sum when scales involved 2009-04-27 15:20:14 +00:00
skodak bd2fb930a2 MDL-18987 fixed broken item editing when only one category present 2009-04-27 14:26:42 +00:00
skodak 50d3981988 MDL-16918 fixed deleting in csv import file - thanks Luis de Vasconcelos 2009-04-27 10:21:45 +00:00
skodak d7b3edf944 MDL-18985 improved group access control in gradebook exports; backported from HEAD 2009-04-27 08:52:39 +00:00
skodak 8ccb3b2440 MDL-18984 gradebook csv import group access control implemented; backported from HEAD 2009-04-27 08:47:54 +00:00
skodak e30fdc6c94 MDL-18325 one more pgl fix - thanks Richard Mansfield 2009-04-27 06:34:04 +00:00
moodlerobot e11bdd6ac7 Updated the 19 build version to 20090427 2009-04-27 00:36:51 +00:00
stronk7 156f59304e MDL-16824 messaging - move unread messages from deleted users to message_read.
Pending to commit changes to uploaduser.php. Credit goes to Anthony Borrow. Thanks!
2009-04-26 21:12:55 +00:00
moodlerobot 851c918d23 Updated the 19 build version to 20090426 2009-04-26 00:36:43 +00:00
stronk7 d8b837f9f2 MDL-18940 meta description in main page - render multilang summary properly 2009-04-25 21:18:24 +00:00
stronk7 2764745f48 MDL-18799 backup - fixed recently introduced regexp to be PHP 4.3.x compatible. 19_STABLE only. 2009-04-25 11:52:43 +00:00
nicolasconnault 228b3a13c6 MDL-18963 Applying Matt's patch to fix the YUI tooltips in the grader report 2009-04-25 06:52:14 +00:00
moodlerobot c4e8deecbb Updated the 19 build version to 20090425 2009-04-25 00:35:59 +00:00
skodak fa297173a7 MDL-18961, MDL-12942, MDL-18960 - added better extra credit upgrade, fixed potential problem with bogus coefs value for simple mean in current installs + finally fixed long standing "no course total" bug 2009-04-24 18:07:23 +00:00
skodak f2c7967ce5 MDL-18961 fixed warning during upgrade 2009-04-24 17:58:58 +00:00
skodak 4ea98f458e MDL-12942 new extra credit option for simple mean agg 2009-04-24 16:24:10 +00:00
nicolasconnault 0b3f171430 MDL-13579 Fixed an undefined variable ($course_value) 2009-04-24 09:04:53 +00:00
nicolasconnault 9937440935 MDL-18950 Not printing "move selected to" element if no grade category exists 2009-04-24 08:12:39 +00:00
nicolasconnault e40c5d4def MDL-18949 Move selector is now disabled unless at least one grade item is selected. 2009-04-24 07:49:30 +00:00
nicolasconnault 6627e36129 MDL-18942 Fixed user selector lang string 2009-04-24 07:26:02 +00:00
skodak 1e6e88f1fb MDL-18948 fixed handling of indexes when removing options 2009-04-24 07:14:16 +00:00
moodlerobot 9b729e076c Updated the 19 build version to 20090424 2009-04-24 00:36:37 +00:00
skodak 6e7b8954e9 MDL-18942 user selection and group support in gradebook user overview report 2009-04-23 20:28:35 +00:00
skodak 3ecb39e535 MDL-18943 xhtml strict - using class instead of repeated id attribute 2009-04-23 20:20:03 +00:00
skodak e0240136f5 MDL-18941 group support in user gradebook report 2009-04-23 19:26:36 +00:00
nicolasconnault ceb41f927c MDL-18419 Hiding export and import tabs from users who lack moodle/grade:export|import caps 2009-04-23 07:20:13 +00:00
nicolasconnault 3c01f1883c MDL-9306 Converting tabs to spaces 2009-04-23 06:50:48 +00:00
moodlerobot 48e8f83bc2 Updated the 19 build version to 20090423 2009-04-23 00:38:18 +00:00
skodak 8074fe4f8c MDL-18523 Only display the 'Synchronise legacy grades' button when necessary 2009-04-22 21:29:23 +00:00
skodak b50ff44a27 MDL-18930 fixed behaviour of dropdown menu selector in gradebook - the headings are not selectable again like the rest of moodle dropdowns 2009-04-22 20:53:21 +00:00
skodak 5b24f78751 MDL-18929 fixed double colons, in fact we stopped using colons long time ago 2009-04-22 20:04:41 +00:00
skodak 542288130f MDL-18933 Cannot assign default value to variable passed by reference 2009-04-22 20:01:07 +00:00
skodak d1c3e2b83c MDL-18932 PHP5 exceptions replaced with error() 2009-04-22 19:48:18 +00:00
uid536 45b80481ef MDL-18931 removed PHP5 syntaxt function()->function() 2009-04-22 19:45:03 +00:00
skodak 1d375abe68 MDL-18927 fixed performance regression 2009-04-22 19:39:54 +00:00
skodak 69472eef28 MDL-18928 removed unnecessary feedback from core gradebook function 2009-04-22 19:29:25 +00:00
skodak c160d5fe09 MDL-18926 readding deleted sum icon 2009-04-22 19:26:28 +00:00
nicolasconnault 432d2bade1 MDL-18083 Replaced php5 constructors with php4 style 2009-04-22 10:37:50 +00:00
nicolasconnault aa665d6353 MDL-18083 Bumping version number 2009-04-22 08:52:09 +00:00
nicolasconnault 86c651cc3d MDL-18083 Minor changes related to big gradebook patch. 2009-04-22 08:40:31 +00:00
nicolasconnault 1060c2164d MDL-18083 MDL-18228 MDL-17807 MDL-18004 Implemented fixed student column in grader report, mouseover tooltips over grade cells and new browser detection code in moodlelib. Also added new navigation code. 2009-04-22 08:40:03 +00:00
nicolasconnault 27e280b27c MDL-18083 MDL-18228 MDL-17807 Implemented fixed student column in grader report, mouseover tooltips over grade cells and new browser detection code in moodlelib. 2009-04-22 08:39:27 +00:00
nicolasconnault 28435cbcb6 MDL-18083 MDL-18004 MDL-17991
Facelife for user report. Also added new navigation code.
2009-04-22 08:37:21 +00:00
nicolasconnault ade7c41b90 MDL-18083 MDL-18004 MDL-17829
Combining grade item and category forms into one. Also added new navigation code.
2009-04-22 08:36:54 +00:00
nicolasconnault 5383ba0d43 MDL-18083 MDL-14961 MDL-15680 MDL-16913 New Edit Categories and Items interface with heaps of improvements. Replaces the original page. Also added a help string for the "synchronise legacy grades" button. 2009-04-22 08:36:22 +00:00
nicolasconnault 5f9b44089e MDL-18083 MDL-18004 MDL-12631 MDL-13417
Mainly changes related to new tab navigation in the gradebook. Outcomes report is also no longer visible if outcomes are disabled in the course/site.
2009-04-22 08:35:30 +00:00
nicolasconnault f32ee22655 MDL-18083 MDL-12380 MDL-14961 MDL-15680 MDL-16913 MDL-17991 MDL-18228 MDL-17807
New or improved lang strings for gradebook
2009-04-22 08:34:03 +00:00
nicolasconnault e7d8321f40 MDL-18083 MDL-18004 MDL-12380 Implementing new tab navigation in gradebook and grades over 100% 2009-04-22 08:31:56 +00:00
nicolasconnault c4b46d9a7e MDL-18083 MDL-17991 User report facelift, with more presentation options and better layout, similar to the new edit categories and items interface. 2009-04-22 08:31:16 +00:00
nicolasconnault 1dd40dc0d7 MDL-18083 MDL-17829
Combining grade item and category forms into one
2009-04-22 08:30:07 +00:00
nicolasconnault e4bfac7587 MDL-18083 MDL-15680 MDL-16913 New Edit Categories and Items interface with heaps of improvements. Replaces the original page. 2009-04-22 08:28:35 +00:00
nicolasconnault 9612e92185 MDL-18083 MDL-12380 MDL-18228 MDL-17807
Implementing grades over 100% in the grader report, new tab navigation, fixed student column and mouseover tooltips for grade cells.
2009-04-22 08:25:10 +00:00
nicolasconnault dc60ee9a74 MDL-18083 MDL-12380 MDL-15680 MDL-16913
Combining grade item and category forms into one, implementing grades over 100%, and patches for correct aggregation.
2009-04-22 08:23:30 +00:00
nicolasconnault 3c9c3aa722 MDL-18083 MDL-12380 Implementing grades over 100% for the gradebook 2009-04-22 08:21:49 +00:00
nicolasconnault 68f82f804c MDL-18083 MDL-18004 Implementing new tab navigation in gradebook. 2009-04-22 08:20:20 +00:00
moodlerobot 90260a3a2a Updated the 19 build version to 20090422 2009-04-22 00:46:06 +00:00
stronk7 05105cbe47 MDLSITE-545 MDL-18024 - reaplying incorrectly reverted fix 2009-04-21 14:13:15 +00:00
moodlerobot 3b5ff77414 Updated the 19 build version to 20090421 2009-04-21 00:38:05 +00:00
stronk7 e4043b37d8 MDL-18893 TeX filter - fine tune "def" commands + add some more commands to blacklist (from Kopete).
Thanks to Mauno Korpelainen and Steve Mayer
2009-04-20 21:24:00 +00:00
tjhunt c8c1f2f3ac category paths: MDL-18897 call fix_course_sortorder eveywhere we insert a category to set category.path and .depth 2009-04-20 05:59:17 +00:00
moodlerobot 43cf71ebc0 Updated the 19 build version to 20090420 2009-04-20 00:34:27 +00:00
gbateson 903c830041 MDL-18880: only insert media players for swf URLs if $CFG->filter_mediaplugin_enable_swf is set 2009-04-19 23:53:47 +00:00
moodlerobot 581e0d7ac4 Updated the 19 build version to 20090419 2009-04-19 00:34:53 +00:00
moodlerobot b994941167 Updated the 19 build version to 20090418 2009-04-18 00:35:26 +00:00
stronk7 6483c5b005 MDL-18799 backup & restore - improve file.php handling by using neutral syntax to support any slasharguments combination 2009-04-17 23:42:01 +00:00
gbateson 66a2d3b1fc MDL-17426: removing superflous link to "Selecting a report" 2009-04-17 02:24:23 +00:00
gbateson beef81db81 MDL-18883: fix setting of absolute urls for images in subfolders of course files 2009-04-17 01:50:11 +00:00
moodlerobot 64895b6a85 Updated the 19 build version to 20090417 2009-04-17 00:36:57 +00:00
skodak 36560de1bf MDL-18875 no PHP5 syntax in 1.9.x yet 2009-04-16 06:27:37 +00:00
tjhunt d1a83777f9 quiz editing: MDL-18871 logic was backwards for deciding whether to show the 'This quiz is not graded, so you cannot set overall feedback that differs by grade' warning introduced in MDL-18583. 2009-04-16 03:12:20 +00:00
moodlerobot 342f26f5a7 Updated the 19 build version to 20090416 2009-04-16 00:36:25 +00:00
moodlerobot 96d5e696d6 Automatic installer.php lang files by installer_builder (20090416) 2009-04-16 00:29:51 +00:00
dongsheng 9ff8c54b52 "MDL-18540, add 512 mo options to extramemeorylimit" 2009-04-15 03:52:18 +00:00
danmarsden 5828d143d4 MDL-18818 - don't define var if already defined - happens when these functions are called more than once at a time. merged from HEAD 2009-04-15 02:18:04 +00:00
moodlerobot b486ed5604 Updated the 19 build version to 20090415 2009-04-15 00:38:49 +00:00
moodlerobot c669f4025d Automatic installer.php lang files by installer_builder (20090415) 2009-04-15 00:31:55 +00:00
moodlerobot 2802a8eb01 Updated the 19 build version to 20090414 2009-04-14 00:45:26 +00:00
moodlerobot abe7973a9a Updated the 19 build version to 20090413 2009-04-13 00:44:04 +00:00
moodlerobot 704926310d Updated the 19 build version to 20090412 2009-04-12 01:05:30 +00:00
moodlerobot d756a3ef79 Updated the 19 build version to 20090411 2009-04-11 00:35:33 +00:00
moodlerobot fc431a5a19 Automatic installer.php lang files by installer_builder (20090411) 2009-04-11 00:28:22 +00:00
moodlerobot 89af1a706a Updated the 19 build version to 20090410 2009-04-10 00:35:03 +00:00
nicolasconnault 4d07f1c87e MDL-17273 Added a back button to the error message and fixed missing handling of "custom" scope 2009-04-09 12:26:11 +00:00
skodak dec816756a MDL-18820 add module_is_moddata_trusted() callback to file.php (improved anti XSS protection for contrib modules); HEAD already has this feature - fixed silly typo 2009-04-09 11:19:50 +00:00
skodak 676e4d4569 MDL-18820 add module_is_moddata_trusted() callback to file.php (improved anti XSS protection for contrib modules); HEAD already has this feature 2009-04-09 09:30:31 +00:00
skodak eb24292dee MDL-18338 option for hiding of groups in user profile; backported from HEAD 2009-04-09 08:30:10 +00:00
skodak 66f303360d MDL-13843 user profile in separate group mode even if group mode not forced course-wide (improved consistency in groups at course level) 2009-04-09 08:23:32 +00:00
skodak 9ed386b6cf MDL-13843 treat default course grouping as current grouping at course level (groupmode is used the same way at course level) 2009-04-09 08:16:47 +00:00
skodak a51fb7e9ba MDL-13843 user participation in separate group mode even if group mode not forced course-wide (improved consistency in groups at course level); backported from HEAD 2009-04-09 07:59:11 +00:00
moodlerobot c194163564 Updated the 19 build version to 20090409 2009-04-09 00:35:09 +00:00
moodlerobot 6524c910da Automatic installer.php lang files by installer_builder (20090409) 2009-04-09 00:28:49 +00:00
moodlerobot 4c92d180ac Updated the 19 build version to 20090408 2009-04-08 00:35:12 +00:00
moodlerobot 8a945601b3 Automatic installer.php lang files by installer_builder (20090408) 2009-04-08 00:28:39 +00:00
arborrow 5bb0cd916d MDL-16798 - add continue buttons to role assignment page to avoid "deadend" 2009-04-07 23:48:00 +00:00
skodak 31a8cf8e83 MDL-13224 fixed coding style; backported from HEAD 2009-04-07 07:46:25 +00:00
moodlerobot 7e3fdfdb0e Updated the 19 build version to 20090407 2009-04-07 00:36:32 +00:00
sam_marshall 786eed65f9 MDL-18768: Limited size of context and modinfo caches to avoid memory problems with code that loops through many courses, also changed forum role_assign to use recordset for all-courses loops 2009-04-06 09:49:40 +00:00
peterbulmer 6d305e4f73 MDL-15942 - missing patch 2009-04-06 06:37:43 +00:00
peterbulmer 55ea2fb983 MDL-18414 change sql query syntax
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2009-04-06 06:21:27 +00:00
peterbulmer 79b35f3866 MDL-18413 limit length of coursedata strings before trying to store them in the db
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2009-04-06 06:19:47 +00:00
arborrow fd13e4f162 typo - reponse instead of response 2009-04-06 03:44:13 +00:00
tjhunt f5187943c0 fomslib: MDL-18735 disabledif not working in IE if depended on element was a <select>.
This was a regression from MDL-18522. Sorry.
2009-04-06 02:56:25 +00:00
tjhunt 579c4bc033 shortanswer qtype: Add the problem case from http://moodle.org/mod/forum/discuss.php?d=120557 to the unit tests. 2009-04-06 02:03:05 +00:00
moodlerobot 7727d7a558 Updated the 19 build version to 20090406 2009-04-06 00:36:01 +00:00
skodak 03acab4231 MDL-18384 better symlink support, do not recurse symlinks when deleting - patch by Matt Oquist, thanks 2009-04-05 20:55:55 +00:00
skodak 814783b478 MDL-18771 fixed db quoting 2009-04-05 20:26:21 +00:00
skodak bb6c8de31f MDL-18772 fixed aut oupdating of grademax for SUM aggregation type; backported from HEAD 2009-04-05 20:17:38 +00:00
skodak 265859b120 MDL-18778 more robust reset form defaults; backported from HEAD 2009-04-05 19:33:02 +00:00
skodak d370403233 MDL-18785 configurable FRONTPAGECOURSELIMIT ; backported from HEAD 2009-04-05 19:21:12 +00:00
arborrow e04abdba8b typo - missinf instead of missing 2009-04-05 05:16:08 +00:00
moodlerobot fd9e47f7c9 Updated the 19 build version to 20090405 2009-04-05 00:35:11 +00:00
moodlerobot 645574ae9c Updated the 19 build version to 20090404 2009-04-04 00:32:29 +00:00
sam_marshall e04544af60 MDL-18094: course/viewhiddenactivities didn't work (in some parts of the code) at module level 2009-04-03 13:11:43 +00:00
nicolasconnault b540ebdc82 MDL-17272 1. Hiding the outcomes menu from admin tree 2009-04-03 08:04:52 +00:00
moodlerobot 28f148f63c Updated the 19 build version to 20090403 2009-04-03 00:35:30 +00:00
moodlerobot 2767262c21 Automatic installer.php lang files by installer_builder (20090403) 2009-04-03 00:29:02 +00:00
fmarier b8b118b322 html2text: MDL-17542 switch to a GPL-compatible html2text library 2009-04-02 23:00:12 +00:00
sam_marshall 04e43cfc7e MDL-18094: course/viewhiddenactivities didn't work (in some parts of the code) at module level 2009-04-02 16:32:37 +00:00
nicolasconnault 71bf0e07aa MDL-17273 Preventing import of corrupted csv files 2009-04-02 12:37:59 +00:00
nicolasconnault 67f381e4d3 MDL-17273 Preventing import of corrupted csv files 2009-04-02 12:35:06 +00:00
dongsheng e9c5d87a17 "MDL-13224, language string for mymoodle options" 2009-04-02 03:31:30 +00:00
dongsheng f868465f02 "MDL-13224, convert type of courses limit, everything coming from database is string" 2009-04-02 02:49:10 +00:00
moodlerobot b546e97106 Updated the 19 build version to 20090402 2009-04-02 00:34:21 +00:00
moodlerobot 2e2a9ec02c Automatic installer.php lang files by installer_builder (20090402) 2009-04-02 00:28:03 +00:00
skodak 88b119010d MDL-18769 PHP5ism not allowed in 1.9 2009-04-01 15:48:57 +00:00
dongsheng e7b98680d7 "MDL-13224, select how many courses can be shown in mymoodle page, backported from 2.0" 2009-04-01 07:39:42 +00:00
moodlerobot aa96913f3c Updated the 19 build version to 20090401 2009-04-01 00:34:25 +00:00
diml df859bc818 MDL-18474 - fix include link better... before tagging MERGED. 2009-03-31 23:17:09 +00:00
skodak b950f12601 MDL-18552 different TeX trouble fix; backported from HEAD 2009-03-31 10:23:53 +00:00
tjhunt 2f4ec8a0a7 MDL-15484 Avoid JavaScript errors after a popup has been blocked.
Also clean up coding style of some nearby functions.
2009-03-31 03:24:15 +00:00
moodlerobot 3682b74272 Updated the 19 build version to 20090331 2009-03-31 00:37:15 +00:00
skodak 5a966b8089 MDL-18540 undoing regression in last commit, sorrry - thanks Eloy 2009-03-30 17:34:56 +00:00
skodak 898be4fbdb MDL-18540 fixing "extra" memory strings; backported from HEAD 2009-03-30 17:10:00 +00:00
dongsheng f60ff51cac "MDL-18540, change the uses of option" 2009-03-30 10:04:57 +00:00
dongsheng 83e55afa36 "MDL-18540, change option name to extramemorylimit" 2009-03-30 09:36:52 +00:00
dongsheng 4113a8d05d "MDL-18540, use admin_setting_configselect to set option" 2009-03-30 09:17:05 +00:00
tjhunt d547bb0bd0 qtypes: MDL-18711 Allow qtype plugins to have custom CSS and JavaScript on the editing page. 2009-03-30 09:15:37 +00:00
gbateson cd0de43baf when search for media players, remove requirment for <object> tag to contain a space, and make closing </A> tag lowercase 2009-03-30 07:02:23 +00:00
dongsheng 3fca7144ca "MDL-18540, fixed default value of memorylimit" 2009-03-30 04:42:26 +00:00
moodlerobot 22de2a9020 Updated the 19 build version to 20090330 2009-03-30 00:41:39 +00:00
moodlerobot bc4fb0c278 Updated the 19 build version to 20090329 2009-03-29 00:37:17 +00:00
moodlerobot dff2a97ab1 Updated the 19 build version to 20090328 2009-03-27 23:34:47 +00:00
moodlerobot f2234e611d Automatic installer.php lang files by installer_builder (20090328) 2009-03-27 23:28:31 +00:00
fmarier 19a9e4f2fa 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:20:13 +00:00
danmarsden abe16888de SCORM MDL-18626 - fix SCORM navigation breadcrumbs merged from HEAD 2009-03-27 01:48:14 +00:00
moodlerobot 2788e588fe Updated the 19 build version to 20090327 2009-03-26 23:35:54 +00:00
stronk7 7ed8fad35b MDL-18552 TeX filter - add string 2009-03-26 21:32:34 +00:00
danmarsden 067b054260 Choice MDL-18600 fix sort to be sorted by surname,firstname - thanks to Mihai Sucan for the fix merged from HEAD 2009-03-26 21:24:07 +00:00
skodak 52c28ff98a MDL-18313 - fixed admin count on security overview report - finally! 2009-03-26 20:59:31 +00:00
danmarsden d9c0d727d7 AICC MDL-18702 Completion Logic incorrect - thanks to Martin Holden for the fix! merged from HEAD 2009-03-26 20:23:43 +00:00
skodak 31c8f5ebaa MDL-18676 auth plugins should run before enrol because it may create new users - proposed by Jason Hardin; backported from HEAD 2009-03-26 19:56:25 +00:00
stronk7 35a8b3cfac MDL-18552 TeX filter - blacklist unsecure commands + protect texdebug 2009-03-26 19:06:29 +00:00
dongsheng 88906bf330 "MDL-17966, fixed installation blocker" 2009-03-26 13:17:56 +00:00
tjhunt 823ebe16cc local lang: MDL-13001 perf improvement: only searches extra folders if $module == 'local'
Will merge to HEAD later, as part of MDL-18669
2009-03-26 09:00:15 +00:00
dongsheng 1a5a1c0e6c "ADMINLIB/MDL-17966, overwrite write_setting to update settings instead execute sql execute in get_settings, this will not hurt performance" 2009-03-26 08:50:50 +00:00
tjhunt 6042285796 questions: unit tests for default_questiontype::compare_responses. 2009-03-26 08:42:18 +00:00
dongsheng ea718748b8 "ADMINLIB/MDL-17966, update after writing settings" 2009-03-26 02:32:45 +00:00
dongsheng fec5c0cf5f "ADMINLIB/MDL-17966, update after writing settings" 2009-03-26 02:24:00 +00:00
dongsheng 28d02ef39e "MEMORY/MDL-18540,remove hard-coded php memory limit, added system setting for it, create a function reduce_memory_limit to reduce memroy limit and respect php.ini setting in the meanwhile" 2009-03-26 01:43:08 +00:00
dongsheng 307b92632b "MEMORY/MDL-18540,remove hard-coded php memory limit, added system setting for it, create a function reduce_memory_limit to reduce memroy limit and respect php.ini setting in the meanwhile" 2009-03-26 01:36:16 +00:00
moodlerobot dfabc486c9 Updated the 19 build version to 20090326 2009-03-25 23:34:38 +00:00
diml c2b308cfc0 MDL-18672 and MDL-18679 fixed. DIRECTORY_SEPARATOR / PATH_SEPARATOR mismatch 2009-03-25 21:27:37 +00:00
diml 191e741060 MDL-18672 and MDL-18679 fixed. DIRECTORY_SEPARATOR / PATH_SEPARATOR mismatch 2009-03-25 21:21:21 +00:00
poltawski fdb5bf270e Fix 'progile' typo MDL-18312 2009-03-25 09:45:43 +00:00
poltawski 826cedfd54 Fix 'drow-down' typo MDL-18320 2009-03-25 09:42:25 +00:00
poltawski e46fe67177 lib/moodlelib.php MDL-18406 - use more robust require path
thanks to Daniel Neis
2009-03-25 09:37:57 +00:00
poltawski d27ab8aa93 documentation/workshop MDL-2605 - bad helpfile link 2009-03-25 09:30:56 +00:00
poltawski df2415e85f 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
2009-03-25 09:16:33 +00:00
tjhunt 5df04607be accesslib: MDL-18604 you should never be allowed to switch to a role with moodle/site:doanything.
Further logic correction.
2009-03-25 02:37:27 +00:00
dongsheng da9429c8e6 "DATA/MDL-18136, change to moodle coding style" 2009-03-25 01:46:58 +00:00
tjhunt 9658298c2e accesslib: MDL-18604 you should never be allowed to switch to a role with moodle/site:doanything.
The SQL in get_assignable_roles_for_switchrole was wrong.
2009-03-25 01:41:05 +00:00
moodlerobot 45f782d7c7 Updated the 19 build version to 20090325 2009-03-24 23:33:46 +00:00
skodak 9709ffccc9 MDL-17966 reverting previous commit, solution proposed in tracker 2009-03-24 11:00:25 +00:00
thepurpleblob e5dbb5ea88 MDL-18542
Finally committing one line patch for bug. Sigh :-)
2009-03-24 10:38:59 +00:00
thepurpleblob 0326d0e6f7 MDL-18542:
Replacing another (intermediate) fix.
2009-03-24 10:33:54 +00:00
moodlerobot e56c4c0027 Updated the 19 build version to 20090324 2009-03-23 23:34:28 +00:00
diml 5d4d1af5d7 Addresses MDL-18474 (global search should use of PATH_SEPARATOR) 2009-03-23 21:55:39 +00:00
diml f891b69aec Addresses MDL-18638 (Search code does not follow coding guidelines) and MDL-18474 (global search should use of PATH_SEPARATOR) 2009-03-23 21:54:42 +00:00
thepurpleblob 0f899b0cc3 Whoops... missed Tim's edit. 2009-03-23 21:46:38 +00:00
thepurpleblob 0471947593 Reverting changes in MDL-18542 2009-03-23 21:34:31 +00:00
thepurpleblob 0791d2fbb5 Reverting changes in MDL-18542 (some more to do in fields, but this should
un-break it). Checkbox error still extant.
2009-03-23 21:22:52 +00:00
mudrd8mz 654e003982 MDL-18644 Add a note about the bug found and upstream bug link. Backported from HEAD 2009-03-23 10:56:42 +00:00
mudrd8mz f847d9f546 MDL-18644 Both if and else end with return therefore another return afterwards is
obsolete. Also, "return true" at top of the function renders all the
following code useless
2009-03-23 09:47:45 +00:00
mudrd8mz 68a3d81779 MDL-18644 Variables used without $-prefix 2009-03-23 09:47:30 +00:00
mudrd8mz bd294d2986 MDL-18644 Function name must be enclosed in quotes 2009-03-23 09:46:18 +00:00
mudrd8mz e24a45df3f MDL-18644 Invalid assignment instead of comparation
Should be checked and reported upstream, too
2009-03-23 09:45:57 +00:00
mudrd8mz 6f49985bb8 MDL-18644 Both if and else end with return therefore another return afterwards is
obsolete
2009-03-23 09:45:42 +00:00
mudrd8mz 5a1655832f MDL-18644 Variable used without $-prefix 2009-03-23 09:44:52 +00:00
nicolasconnault 26c2f68336 MDL-18402 Reverting aggregationcoef default 2009-03-23 08:33:53 +00:00
dongsheng 1fcf706f09 "DATA/MDL-14818, fix checkbox options cannot dispaly properly in search form" 2009-03-23 05:38:02 +00:00
tjhunt 8871d7f463 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:18 +00:00
moodlerobot 912481e00d Updated the 19 build version to 20090323 2009-03-22 23:42:19 +00:00
moodlerobot bbaec83b08 Automatic installer.php lang files by installer_builder (20090323) 2009-03-22 23:34:11 +00:00
poltawski acb1e9fc07 Messages block: Incorrect link to user profile
The block incorrectly links to site profile in the current pageid.
This doens't make sense in a number of different scenarios, but
most notably if the user who messaged isn't enrolled in the current
course. Instead link to the profile at site context like the messaging
popup does.

Fixes: MDL-18279 MDL-6890 MDL-5887
2009-03-22 22:39:40 +00:00
moodlerobot 57a049c4b5 Updated the 19 build version to 20090322 2009-03-21 23:38:36 +00:00
moodlerobot 533f83552c Updated the 19 build version to 20090321 2009-03-20 23:40:58 +00:00
poltawski 2867af6a5b mod/forum - invalid html in q&a forum MDL-18305
thanks to Neil Streeter for the patch
2009-03-20 13:38:27 +00:00
stronk7 cc18654ce9 MDL-15748 get_user_access_sitewide() - reduce looking for perms in any context below category level.
Dramatic speed-up in sites with zillions of contexts and overrides. Credit goes to Samuli Karevaara.
2009-03-20 12:01:38 +00:00
thepurpleblob 5e7932a38f MDL-18542:
Aaargh... yet another one missed. Hopefully that's it.
2009-03-20 11:35:03 +00:00
moodlerobot 19902c841f Updated the 19 build version to 20090320 2009-03-19 23:35:10 +00:00
moodlerobot edeb99025b Automatic installer.php lang files by installer_builder (20090320) 2009-03-19 23:28:38 +00:00
thepurpleblob d831f2bd37 MDL-18542:
Missed the format field for textarea.
2009-03-19 21:15:57 +00:00
thepurpleblob e04eb3c786 MDL-18542:
Correctly deals with field types that have multiple parts (e.g. data and lat/long)
Thanks to Eloy for spotting this.
2009-03-19 20:39:45 +00:00
stronk7 1316b059c9 MDL-18594 restore check - skip maintenance.html file on restore of sie files. Credit goes to Juan Segarra. 2009-03-19 14:43:25 +00:00
poltawski 776e168943 email_to_user: MDL-16328 - prevent empty receeipent address
Be a bit defensive as it seems to be possible for this to happen
with LDAP auth
2009-03-19 10:33:49 +00:00
moodlerobot 97e5e34231 Updated the 19 build version to 20090319 2009-03-18 23:35:43 +00:00
danmarsden 2538f34611 MDL-18564 choice - fix grammar - thanks to Ray Lawrence for the report merged from HEAD 2009-03-18 23:05:09 +00:00
sam_marshall a6b72a94d7 MDL-18582: Made config.php consistently require_once 2009-03-18 14:19:21 +00:00
sam_marshall 5a84b468c7 MDL-18582: Made config.php consistently require_once 2009-03-18 14:08:32 +00:00
exe-cutor f21a6c674c MDL-18597 Various code improvements, new logout return url config option and better instructions regarding Shibboleth logout 2009-03-18 13:26:31 +00:00
exe-cutor c7904acb92 MDL-18597: Added language strings for auth_shib_logout_return_url 2009-03-18 13:18:10 +00:00
thepurpleblob 4a093d5096 MDL-18579:
Provide nicer message if 'Stop on error' is selected and errors are found.
2009-03-18 11:14:17 +00:00
tjhunt 2b808f03b8 quiz settings: MDL-18583 When a quiz has no grade, make it clear that you can only enter one lot of overall feedback.
When the maximum grade for the quiz is 0, we disable all the overall feedback form controls except for the first, and display an explanitory message.
2009-03-18 07:34:04 +00:00
tjhunt 5636aa5494 formslib: MDL-15827 disabledif option to repeat_elements did not work if you depend on another repeated element.
Patch thanks to Matthieu Nué.
2009-03-18 07:08:25 +00:00
tjhunt a756e41f9f question bank: MDL-18531 Sorry, capability name typo. 2009-03-18 05:34:03 +00:00
tjhunt 73fc1a1820 quiz outline report: MDL-18285 Show regrade date, not last attempt date.
I also took the opportunity to clean up the code a bit.
2009-03-18 05:16:42 +00:00
tjhunt 0c34967646 question bank: MDL-18531 actually, moodle/question:use would be a better capabilty to check than moodle/question:add. 2009-03-18 05:01:54 +00:00
tjhunt e299d01687 formslib disabledif: MDL-18522 make it work if either end of a disabledif relationship is a set of radio buttons.
Backport from HEAD to 1.9 stable.
2009-03-18 04:46:52 +00:00
tjhunt 2113a65fdd question bank: MDL-18531 if someone can add questions in the quiz context, but no the course context, choose a more sensible default category in the question bank. 2009-03-18 04:45:47 +00:00
moodlerobot f0fbafe9d9 Updated the 19 build version to 20090318 2009-03-17 23:38:44 +00:00
moodlerobot 5ea5f1052c Automatic installer.php lang files by installer_builder (20090318) 2009-03-17 23:31:00 +00:00
mark-nielsen 589358b7f3 shortanswer grading: MDL-18347 shortanswer was not grading correctly with custom scoring set to No 2009-03-17 16:24:47 +00:00
tjhunt f40fb532d8 database mod: XHTML strict! 2009-03-17 04:28:52 +00:00
tjhunt 7fc3fa77d7 database mod: XHTML strict! 2009-03-17 04:22:55 +00:00
moodlerobot 70d00ab90b Updated the 19 build version to 20090317 2009-03-16 23:35:31 +00:00
stronk7 22973ebf85 MDL-18576 timezones - info updated to tzdata2009c 2009-03-16 17:53:55 +00:00
thepurpleblob 0479b1aa14 MDL-18567:
Check for (boolean) false coming back from database instead of real data
2009-03-16 16:35:44 +00:00
thepurpleblob 20538060c3 MDL-18542
Can now uncheck checkboxes and have them stored correctly.
2009-03-16 15:35:48 +00:00
thepurpleblob 80fe7b9ef7 MDL-18555:
Adding better handling for unsupported question types.
2009-03-16 14:19:46 +00:00
thepurpleblob 7d8f12b630 MDL-18390:
Now looks up the questiontype name correctly.
2009-03-16 13:43:19 +00:00
tjhunt d3c7da5741 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:52:24 +00:00
gbateson a1e836ace4 force Moodle gradebook grades to be recalculated when HotPot grade method is changed: http://moodle.org/mod/forum/discuss.php?d=117691 2009-03-16 01:46:54 +00:00
Francois Marier 10ec29097f Fix CVS-git drift 2009-03-15 23:33:21 +00:00
moodlerobot ee8d4be64f Updated the 19 build version to 20090316 2009-03-15 23:33:21 +00:00
skodak 772230543b MDL-18265 fixed regression in menu field - discovered and patched by Vlas Voloshin, thanks! 2009-03-15 13:43:28 +00:00
moodlerobot f6de7336d1 Updated the 19 build version to 20090315 2009-03-14 23:37:46 +00:00
moodlerobot aa6ab4e614 Automatic installer.php lang files by installer_builder (20090315) 2009-03-14 23:31:24 +00:00
diml 6e1f85a7a8 Changing PATH_SEPARATOR - Fixing MDL-18474 2009-03-14 10:25:57 +00:00
moodlerobot f9d9e0e512 Updated the 19 build version to 20090314 2009-03-13 23:33:47 +00:00
moodlerobot 9740b1b449 Updated the 19 build version to 20090313 2009-03-12 23:34:27 +00:00
stronk7 312fc573c7 MDL-18482 restore skipping non selected activities. 2009-03-12 23:14:11 +00:00
stronk7 e3cc7cfd7c MDL-18543 restore of role assignments / overrides - skip non-restored contexts. 2009-03-12 22:20:44 +00:00
stronk7 b890fdaed4 MDL-18541 replace script - now also replaces within well known html blocks. 2009-03-12 19:02:08 +00:00
stronk7 acfc17d452 Delete one non-critical-but-unnecessary trailing semicolon 2009-03-12 18:09:26 +00:00
exe-cutor 37934e4996 Shibboleth authentication: Fixed bug MDL-18538 that overwrites alternateloginurl when Shibboleth authentication settings are saved 2009-03-12 15:06:07 +00:00
thepurpleblob 7b1476eb6d MDL-18535:
Adding checks for field name mismatches and "proper" error messages.
2009-03-12 14:38:09 +00:00
moodlerobot c1d77cb923 Updated the 19 build version to 20090312 2009-03-11 23:34:44 +00:00
danmarsden 6e5eaf55b9 MDL-18519 SCORM remove rubbish from locallib.php 2009-03-11 20:25:04 +00:00
thepurpleblob 4e334e2d89 MDL-18390 - now correctly looks up name of questiontype from language pack 2009-03-11 13:15:32 +00:00
stronk7 3ab60a5351 MDL-18518 user firstaccess - forgot to commit lang string. 2009-03-11 10:35:57 +00:00
stronk7 6b31e49438 MDL-18518 user firstaccess - added suport to display user->firstaccess. Credit goes to Anthony Borrow! 2009-03-11 10:34:56 +00:00
dongsheng ec6270acb8 "DATA/MDL-18024, use rid instead page to comment a record" 2009-03-11 05:31:02 +00:00
danmarsden 73c0691713 MDL-18412 typo - remove bad code that hid the real issue 2009-03-11 04:48:59 +00:00
dongsheng 08888c21c6 "DATA/MDL-18136, fix pagination in data mod" 2009-03-11 04:19:57 +00:00
dongsheng 2c0838a960 "ADMINLIB/MDL-17966, display changes saved in admin page" 2009-03-11 02:40:56 +00:00
dongsheng 03d0e079c7 "CHAT/MDL-14949, remove mod/chat:talk capability and check chat and readlog capabilities respectively" 2009-03-11 02:21:45 +00:00
danmarsden aab2a31c11 MDL-18460 - SCORM Report - remove duplicated header - thanks Vlas Voloshin for the report. - merged from HEAD 2009-03-11 01:18:41 +00:00
moodlerobot 3216e3bcdf Updated the 19 build version to 20090311 2009-03-10 23:33:56 +00:00
moodlerobot 40ffadedca Automatic installer.php lang files by installer_builder (20090311) 2009-03-10 23:27:42 +00:00
nicolasconnault 30f703a490 MDL-14961 Added a help button for the synchronise legacy grades button 2009-03-10 14:00:19 +00:00
moodlerobot c52af6208e Updated the 19 build version to 20090310 2009-03-09 23:34:39 +00:00
stronk7 e85de04d7b MDL-18468 Adding admin experimental option to enable split on restore. Thanks for string cleanup, Helen. 2009-03-09 23:30:55 +00:00
stronk7 cb512feef5 MDL-18468 restore preprocessing (split) - Added $CFG->experimentalsplitrestore option
to enable split of moodle.xml files into upto 19 smaller files for quicker restore.
2009-03-09 23:28:39 +00:00
moodlerobot e603181eeb Automatic installer.php lang files by installer_builder (20090310) 2009-03-09 23:28:20 +00:00
mjollnir_ b3c8c097aa MDL-18462 theme: consistency in css for incorrect questions 2009-03-09 09:23:09 +00:00
poltawski f8338c21b5 forum/subscribe to all forums broken - MDL-15317
Was calling has_capability on $cm rather than a context..
thanks to Garret Gengler for the fix.
2009-03-08 23:49:59 +00:00
moodlerobot dc56fc912e Updated the 19 build version to 20090309 2009-03-08 23:39:39 +00:00
moodlerobot 93c0ab4628 Updated the 19 build version to 20090308 2009-03-07 23:37:32 +00:00
skodak 734e6125ed MDL-18265 fixed regressions by hardfreeze security workaround - defaults were overriding locked values - backported from HEAD 2009-03-07 21:01:39 +00:00
moodlerobot 689eeabb2f Updated the 19 build version to 20090307 2009-03-06 23:33:02 +00:00
mark-nielsen b31b9c0d8d lesson grading: MDL-17101 The lesson module was sending the incorrect raw grade values. Correcting the values by calculating the actual raw grade before sending to gradebook. 2009-03-06 18:44:54 +00:00
moodlerobot baec5bf1b5 Updated the 19 build version to 20090306 2009-03-05 23:39:01 +00:00
moodlerobot 675c797a5c Automatic installer.php lang files by installer_builder (20090306) 2009-03-05 23:32:43 +00:00
moodlerobot cec35fd605 Updated the 19 build version to 20090305 2009-03-04 23:37:56 +00:00
moodlerobot b0178a9339 Automatic installer.php lang files by installer_builder (20090305) 2009-03-04 23:31:39 +00:00
stronk7 73078aefd5 MDL-18440 email_to_user() - avoid some notices 2009-03-04 14:59:45 +00:00
skodak c5129f59e6 MDL-16852 fixed left join trouble 2009-03-04 13:34:20 +00:00
sam_marshall b3e0a94764 MDL-15913: Smartpix fails if themes or images have upper-case names 2009-03-04 11:55:19 +00:00
thepurpleblob a34725b3eb MDL-18390
Corrected handling of unsupported question types and added new language file
to remove hard coded strings.
2009-03-04 10:25:23 +00:00
danmarsden 102ab4b93d MDL-15276 add check for RESTORE_SILENTLY merged from HEAD 2009-03-04 02:45:10 +00:00
moodlerobot 0b8efe1434 Updated the 19 build version to 20090304 2009-03-03 23:35:41 +00:00
moodlerobot 1c3090aabc Automatic installer.php lang files by installer_builder (20090304) 2009-03-03 23:29:25 +00:00
dongsheng 135de95512 "FORUM/MDL-15968, respect mod/forum:viewqandawithoutposting in forum_search_posts" 2009-03-03 06:46:28 +00:00
tjhunt 86bfbf6d5a Aiken question import: MDL-18423 Greater robustness when parsing. 2009-03-03 05:12:06 +00:00
tjhunt 4bfcbb6065 qtype base: remove debug code. 2009-03-03 04:37:46 +00:00
dongsheng 3ebec13e90 "FORUM/MDL-14860, declare subtext varible before use it" 2009-03-03 01:03:10 +00:00
stronk7 4130b29319 MDL-17934 flv player in resources - allow full screen. Credit goes to Darren Jones. 2009-03-02 23:40:26 +00:00
moodlerobot 7c581c26d6 Updated the 19 build version to 20090303 2009-03-02 23:33:56 +00:00
piers 753d8d6b8f MDL-18412 - fixed incorrect config var name. thanks Anthony. backport 1.9. 2009-03-02 23:21:26 +00:00
mudrd8mz cac526294c MDL-17492 Reset flag did not work in PostgreSQL
Postgres does not seem to support table alias in UPDATE statement.
Therefore the SQL like
 UPDATE mdl_tag tg SET tg.flag = 0, tg.timemodified = 1236027984 WHERE tg.id IN (4)
ends with an ERROR: column "tg" of relation "mdl_tag" does not exist
The fix is quite easy - just do not use table alias as it makes no sense
here anyway.
Besides this, the commit also fixes:
* do not try to access the array key [0] in case of empty array (no tags
  exist yet)
* do not require_capability() at the function level - it is already
  checked at the caller script level
2009-03-02 21:36:50 +00:00
stronk7 9d86cefba4 MDL-18420 reserved words - adding 2 new PG reserved words. 2009-03-02 19:08:26 +00:00
stronk7 9161104df4 MDL-18420 reserved words - pointing to new URL 2009-03-02 18:53:16 +00:00
stronk7 a1f37c56c7 MDL-18420 reserved words - adding MySQL 5.1 and 6.0 new reserved words 2009-03-02 18:46:38 +00:00
mudrd8mz 4ff615ba18 MDL-14743 offer a link to the English help file 2009-03-02 14:06:22 +00:00
moodlerobot 0b01e09a84 Updated the 19 build version to 20090302 2009-03-01 23:34:29 +00:00
moodlerobot 2546b11627 Updated the 19 build version to 20090301 2009-02-28 23:38:24 +00:00
gbateson 3856061526 MDL-18409 add "Remove grade item" to mod_form.php form and standardize grade items for HotPots: (i) remove orphan grade items, (ii) remove grade items for HotPots with a zero grade, (iii) synchronize grade item name and HotPot name (iv) add missing grade items 2009-02-28 04:03:58 +00:00
gbateson 97268bfcd1 MDL-18409 new help file for "Remove grade item" form element 2009-02-28 04:00:56 +00:00
gbateson 61b8ee4cc8 MDL-18409: new message required for "Remove grade item" form element 2009-02-28 03:59:28 +00:00
moodlerobot dc30763a29 Updated the 19 build version to 20090228 2009-02-27 23:33:36 +00:00
nicolasconnault 13cd3572ef MDL-18402 Setting aggregationcoef to 1 if left empty 2009-02-27 13:05:58 +00:00
sam_marshall 61ed6f0fef MDL-18401: Glossary page bar should highlight current page 2009-02-27 12:58:00 +00:00
moodlerobot e366e28485 Updated the 19 build version to 20090227 2009-02-26 23:33:20 +00:00
piers 6323f16bce MDL-18148 - AICC compliance fixes from Martin Holden. 2009-02-26 15:52:56 +00:00
dongsheng 0728db718f "LANG/MDL-17620, add language string" 2009-02-26 02:31:42 +00:00
moodlerobot 7ac3cc9a32 Updated the 19 build version to 20090226 2009-02-25 23:35:20 +00:00
moodlerobot cf8a84bf7e Automatic installer.php lang files by installer_builder (20090226) 2009-02-25 23:29:07 +00:00
piers 33edb1d079 MDL-18212 - switch to addslashes_js - thanks Tim. Backport 1.9. 2009-02-25 23:06:35 +00:00
nicolasconnault 6aec578ba1 MDL-18321 Changed default permissions for overview report 2009-02-25 06:57:59 +00:00
dongsheng f8c0dc7619 "FORUM/MDL-14860, hide unsubscribe link if users are not allowed to unsubscribe from this forum" 2009-02-25 05:26:28 +00:00
moodlerobot 22aa2fdc7c Updated the 19 build version to 20090225 2009-02-24 23:33:54 +00:00
moodlerobot 070fd51ff0 Automatic installer.php lang files by installer_builder (20090225) 2009-02-24 23:27:38 +00:00
moodlerobot 574b31e05a Updated the 19 build version to 20090224 2009-02-23 23:33:33 +00:00
mjollnir_ 6a00dfa325 MDL-18351: activity block: detect when there's no course (eg admin page) and return 2009-02-23 14:47:44 +00:00
stronk7 4d5f3910e9 Annotating some more customizations performed in PHPMailer() 2009-02-23 09:07:54 +00:00
skodak a2e4bb85a6 MDL-18348 CVE-2007-3215 2009-02-23 07:45:30 +00:00
dongsheng 056a946997 "DATA MOD/MDL-18079, respect mod/data:comment capability when adding comments" 2009-02-23 07:24:04 +00:00
moodlerobot 7b97dc4cbb Updated the 19 build version to 20090223 2009-02-22 23:33:33 +00:00
moodlerobot 6d45d2bb7c Updated the 19 build version to 20090222 2009-02-21 23:33:10 +00:00
moodlerobot 362b789ca0 Updated the 19 build version to 20090221 2009-02-20 23:33:22 +00:00
moodlerobot e2e7da4724 Automatic installer.php lang files by installer_builder (20090221) 2009-02-20 23:27:04 +00:00
skodak 82e0a8a59f MDL-18325 Grade Import Outcomes SQL Issues - thanks Tim Lock 2009-02-20 07:22:26 +00:00
moodlerobot f73d700f79 Updated the 19 build version to 20090220 2009-02-19 23:33:39 +00:00
moodlerobot c64f343eaa Automatic installer.php lang files by installer_builder (20090220) 2009-02-19 23:27:21 +00:00
sam_marshall 458cc5c807 MDL-18322: Fix debug warning on course view page when forum has grouping set 2009-02-19 17:41:48 +00:00
skodak f964ff9281 MDL-18039 fixed footer docs link; backported from HEAD 2009-02-19 07:33:36 +00:00
skodak 67c0bc01eb MDL-18274 fixed lang string, thanks Helen; backported from HEAD 2009-02-19 07:21:42 +00:00
tjhunt 51d6e3d5b9 Add missing Id tags to all files under question, to help the unmerged files script. 2009-02-19 01:09:33 +00:00
moodlerobot 8dea1ae18c Updated the 19 build version to 20090219 2009-02-18 23:33:46 +00:00
moodlerobot 55b51fafa7 Automatic installer.php lang files by installer_builder (20090219) 2009-02-18 23:27:40 +00:00
skodak e0240b2abd MDL-18041 improved hints - thanks helen 2009-02-18 20:32:13 +00:00
pichetp fbffc13306 MDL-18034 MDL-18035 fixing typo merged from HEAD 2009-02-18 18:04:12 +00:00
stronk7 2a2124087f MDL-18302 filterlib - fixed rebuild of nested ignoretags 2009-02-18 11:02:11 +00:00
dongsheng 1c86f1b0ac "RESOURCE/MDL-17696, remove extra div" 2009-02-18 08:09:51 +00:00
tjhunt e18c7dde34 question editing: MDL-18035 Nice refactoring from Oleg Sychev that saves 50+ lines of code between the various editing forms. 2009-02-18 06:52:02 +00:00
moodlerobot c672c0ed6c Updated the 19 build version to 20090218 2009-02-17 23:33:51 +00:00
moodlerobot fb205e7b0b Automatic installer.php lang files by installer_builder (20090218) 2009-02-17 23:27:34 +00:00
skodak a92a26b3b6 MDL-18223 removed repeated format_text() - should be applied only once; backported from HEAD 2009-02-17 23:01:43 +00:00
skodak 7ece8b4084 MDL-18223 XHTML strrrict - backported 2009-02-17 22:57:08 +00:00
skodak dca4f867b6 MDL-18223 fixed admin string sorting 2009-02-17 22:49:32 +00:00
skodak eaea1cefde MDL-18223 fixed theoretical XSS 2009-02-17 22:45:22 +00:00
skodak d7267110ca MDL-18223 removed 2.0 code from spamcleaner + fixed report name in admin tree 2009-02-17 22:41:26 +00:00
skodak 2f64c88416 MDL-11313 improved strings in for simplified user switching 2009-02-17 22:24:22 +00:00
nicolasconnault 5af402822b MDL-18238 Reverting 2009-02-17 07:51:01 +00:00
nicolasconnault 82b904822e MDL-18247 Reverting the new navigation code, not ready yet. 2009-02-17 07:33:37 +00:00
tjhunt 4b2839e2a5 formslib: MDL-17403 add accept-charset="UTF-8" to all formslib forms. Backported from HEAD. 2009-02-17 07:24:58 +00:00
nicolasconnault 0ce91e17f7 MDL-18247 Implemented a constant for line length 2009-02-17 07:24:42 +00:00
tjhunt 42f60c49fb quiz attempts: MDL-18283 add accept-charset="utf-8" to avoid encoding problems. 2009-02-17 07:21:51 +00:00
tjhunt 56cef87b61 random question: MDL-18174 Fix notice when adding a random question to a quiz. 2009-02-17 06:14:48 +00:00
tjhunt c52849d56c tex filter: MDL-18230 ensure we always generate valid XHTML. 2009-02-17 05:24:35 +00:00
moodler afb7e5382c report/spamcleaner MDL-18223 Renaming main script from spamcleaner.php to index.php 2009-02-17 03:27:56 +00:00
moodlerobot a50c3fb9ad Updated the 19 build version to 20090217 2009-02-16 23:33:07 +00:00
stronk7 5515ae9a0a Erasing trailer semicolon breaking on Oracle. 2009-02-16 18:03:12 +00:00
stronk7 e0d027939e MDL-18243 data module filter - make it cross-db by using sql_compare_text() 2009-02-16 17:57:19 +00:00
wildgirl 3354933a9f welcometocoursetext lang string: MDL-18260 small rewording 2009-02-16 17:12:53 +00:00
poltawski c88022ade7 performance/mymoodle MDL-18241 - Assigments were very expensive
Reworked to take queries out of loops and let it scale. Unfortunately
I don't think we can get the get_users_by_capability() call out of the
loop on assignments.

Real query numbers before/after:
Teacher: 13,129 / 314
Student: 127 / 72
Admin: 718 / 133
2009-02-16 13:09:01 +00:00
dongsheng 5a6d196559 "SPAM/MDL-18223, if the user is deleted, ignore its blog posts" 2009-02-16 11:00:49 +00:00
stronk7 8d0787e3b1 MDL-18222 restore - fixed restoring of course->summary links. Was being handled too early. Moved to final decoding links process. 2009-02-16 10:26:25 +00:00
dongsheng 3cbb43304a "SPAM/MDL-18223, move language string to report_spamcleaner.php" 2009-02-16 09:37:47 +00:00
dongsheng 52b6e169b8 "SPAM/MDL-18223, spam cleaner for MOODLE 1.9" 2009-02-16 09:28:21 +00:00
dongsheng 460da32af8 "FILTER/MDL-17703, reverse changes to work within p tag" 2009-02-16 07:08:17 +00:00
tjhunt 7ca1f7a0fc quiz overview report: MDL-18256 Fix the more flagrant performance problems. 2009-02-16 04:17:54 +00:00
tjhunt 1726d852ae weblib: finish documenting print_user_picture. 2009-02-16 04:15:59 +00:00
dongsheng 2dc83e6145 "FILTER/MDL-18230, remove hardcoded style for TeX formulas image" 2009-02-16 03:08:47 +00:00
tjhunt bb2067c851 database: MDL-18269 query logging behaviour changed in Moodle 1.9 due to internal ADODB changes. 2009-02-16 03:00:07 +00:00
moodlerobot d5b43ea6a2 Updated the 19 build version to 20090216 2009-02-15 23:33:15 +00:00
stronk7 4c7971bb08 MDL-18244 sql_length() - apply new function to resource names filter 2009-02-15 23:20:36 +00:00
stronk7 047158d694 MDL-18244 sql_length() - new cross-db function to calculate the length in chars of any expression 2009-02-15 23:04:43 +00:00
skodak f2af2ec841 MDL-18209 fixe short php tag - thanks Jeffrey Silverman 2009-02-15 19:23:24 +00:00
skodak f01be9f366 MDL-18253 hopefully fixed weird float precision that breaks upgrade and gradebook; backported from HEAD 2009-02-15 19:03:18 +00:00
skodak a5886c1a26 MDL-18258 fixed legacy type and improved risky default course role hints; backported from HEAD 2009-02-15 18:46:07 +00:00
skodak 6ed6493820 MDL-18039 xhtml strict fixes 2009-02-15 17:40:59 +00:00
iarenaza 6a31fe27bb 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 14:53:58 +00:00
skodak 8cc2a7e47a MDL-18041 improved admin risk info; backported from HEAD 2009-02-15 11:31:18 +00:00
skodak 473474f370 MDL-18155 mentioned possiblity to lock email field 2009-02-15 10:05:07 +00:00
skodak ecde99b07d MDL-18155 no warning if allowed email domains set 2009-02-15 09:55:19 +00:00
skodak 26f86416a0 MDL-18078 adding docs links from detailed security overview report 2009-02-15 09:45:00 +00:00
moodlerobot 9eb6cba683 Updated the 19 build version to 20090215 2009-02-14 23:32:10 +00:00
iarenaza b65da94dd7 NTLM SSO: MDL-13760 Speed up ntlm sign on with conditional redirect for msie
Provides an option, configurable by admin, to make the ntlm test happen
only if MSIE is not used. This speeds things up for IE.
2009-02-14 16:17:51 +00:00
iarenaza f8102d906e NTLM SSO: MDL-14584 Fix for several outstanding NTLM SSO issues.
These include:

MDL-14078: redirect() doubles the specified timeout when we haven't printed
           the page header and uses javascript to execute the redirect. This
           is interacting badly with some versions of IE and FF (at least
           3.0.x Windows version) that fireup javascript timers even if
           we already left the page where we set those up. Just print
           the page header (we are printing other content anyway) to
           make redirect respect our timeouts.

MDL-14071: All the relevant details are in the description of the bug :)

MDL-14297: This is probably the same as MDL-14078
2009-02-14 16:14:22 +00:00
nicolasconnault 1db15f42c6 MDL-18247 2009-02-14 13:59:46 +00:00
stronk7 5494b1a058 MDL-9796 install - delete dataroot's env info (shouldn't exist) to force check against released one ; merged from 18_STABLE 2009-02-14 11:05:30 +00:00
moodlerobot 6790b9a824 Updated the 19 build version to 20090214 2009-02-13 23:33:04 +00:00
stronk7 bfe073b05d MDL-9796 upgrade & env - delete dataroot's environmetal info to force check against released one ; merged from 18_STABLE 2009-02-13 15:46:35 +00:00
nicolasconnault 5c211a86f1 MDL-18238 Applied capability check to gradebook report settings pages 2009-02-13 13:09:57 +00:00
stronk7 52a7473e9a MDL-12846 course defaults - don't apply coursedefaults->category anymore. Backported from HEAD 2009-02-13 10:01:15 +00:00
stronk7 28364d4103 MDL-12846 MDL-17074 course defaults - backport deletion of default category 2009-02-13 09:58:21 +00:00
tjhunt a2b4f68e91 question bank: MDL-12719, MDL-15774, MDL-17105, and MDL-18174
These are all to do with the combination of the $form->category, and $form->categorymoveto fields on the question editing forms since Moodle 1.9. These are now resolved to a single ->category value in question.php, which simplifies the logic for the individual question types.

MDL-15774 and MDL-12719 errors editing Cloze question
MDL-17105 problems with qustion saving logic.
MDL-18174 'Select from subcategories' option not preserved when editing a random question.
2009-02-13 06:11:58 +00:00
moodlerobot f91d11fc6f Updated the 19 build version to 20090213 2009-02-12 23:33:14 +00:00
moodlerobot 4a040da19a Automatic installer.php lang files by installer_builder (20090213) 2009-02-12 23:27:06 +00:00
jerome 0c24a4523d Switch Roles MDL-11313 add a new config option to allow user to switch roles that they can't assign 2009-02-12 02:29:34 +00:00
moodlerobot ae5c3732d1 Updated the 19 build version to 20090212 2009-02-12 00:34:40 +00:00
stronk7 3ee21ffa01 MDL-17074 course settings - new defaults to be applied on interactive course creation 2009-02-11 18:00:05 +00:00
stronk7 d2aa927a0a MDL-17074 - backport ability of admin settings to use the config_plugins table 2009-02-11 17:51:34 +00:00
mjollnir_ 50537ba778 local settings in admin tree: include, rather than include once since it gets unset and regenerated. 2009-02-11 12:13:15 +00:00
stronk7 eada690a18 MDL-17365 forum ajax rating - revert menu color back after error 2009-02-11 09:59:41 +00:00
moodlerobot 33f4c4c10b Updated the 19 build version to 20090211 2009-02-11 00:14:25 +00:00
tjhunt 45b0c62de6 datasetdependant qtype: fix whitespace. 2009-02-10 05:40:13 +00:00
tjhunt d25db1b795 weblib: XHTML strict. 2009-02-10 03:27:48 +00:00
moodlerobot 95c1a1e51d Updated the 19 build version to 20090210 2009-02-09 23:42:35 +00:00
danmarsden adfd6053f1 MDL-17198 - show better confirmation of choice selection. missed lang file 2009-02-09 09:53:51 +00:00
danmarsden 22962abbf0 MDL-17198 - show better confirmation of choice selection. merged from HEAD 2009-02-09 09:52:59 +00:00
danmarsden 94e044dd6f MDL-18092 - better checking for empty vars when no users are in course. wrong place for empty check! 2009-02-09 09:31:54 +00:00
danmarsden e9103c0a0e MDL-18092 - better checking for empty vars when no users are in course. merged from HEAD 2009-02-09 09:26:47 +00:00
moodlerobot 098a5acddd Updated the 19 build version to 20090209 2009-02-08 23:35:08 +00:00
moodlerobot 76d9c74e68 Automatic installer.php lang files by installer_builder (20090209) 2009-02-08 23:29:12 +00:00
skodak 51bddf22fd MDL-9796 fixed error array when environment file broken 2009-02-08 21:30:06 +00:00
moodlerobot b290c986f6 Updated the 19 build version to 20090208 2009-02-07 23:38:43 +00:00
skodak 85557feb30 MDL-18138 added option to supply username as GET param - based on patch by Robert Allerstorfer 2009-02-07 22:54:04 +00:00
skodak bb8b3cffe6 MDL-18137 all cookies now secure if configured to be; backported from HEAD 2009-02-07 22:48:11 +00:00
skodak 4b3fd72079 MDL-18150 fixed typo- thanks Chris Potter 2009-02-07 22:31:38 +00:00
skodak c972b89def MDL-18151 fixed problem in legacy filter code - thanks Mark Nielsen 2009-02-07 22:24:26 +00:00
skodak 7d3d94eee5 MDL-14924 fixed typo - thanks bouley Hélène 2009-02-07 11:14:57 +00:00
stronk7 791733eaab MDL-18165 filterlib - Use one exclusive separator, instead of "." (dot) to avoid saved tags to match with phrases being processed 2009-02-07 00:58:16 +00:00
moodlerobot 69658560bf Updated the 19 build version to 20090207 2009-02-06 23:37:53 +00:00
exe-cutor 08b51e7f13 authentication: MDL-18116 Added Shibboleth logout handler URL, remove hard-coded strings to lang file, updated README
- Added a new setting logout_handler to the Shibboleth authentication settings
- Removed hard-coded strings in the configuration settings and replaced them with proper print_string expressions
- Added a logoutpage_hook function that (optinally) sends a user who clicks on the logout button to the Shibboleth logout handler after Moodle logout
- Updated README
2009-02-06 08:19:58 +00:00
jerome ab478fe0bc mp3 flash player MDL-7549 MP3 flash player now plays the end of the mp3 file 2009-02-06 07:18:57 +00:00
stronk7 94f7464280 MDL-18066 import_backup_file_silently() - delete dangerous code 2009-02-06 01:55:01 +00:00
jerome 277ae48e25 mnet MDL-10935 fix unicode character when the remote site send the course name for updating enrolment 2009-02-06 00:36:41 +00:00
moodlerobot fe27f84099 Updated the 19 build version to 20090206 2009-02-05 23:39:00 +00:00
stronk7 876a3baa42 MDL-10583 course format - some more uses of the get_section_name() added 2009-02-05 13:41:18 +00:00
stronk7 1465d3d426 MDL-10583 course format - discovered the get_section_name() that performs the fallback harcoded in previous commit. 2009-02-05 13:28:46 +00:00
stronk7 bc5368842f MDL-10583 course format - allow course formats to specify their section name 2009-02-05 13:12:03 +00:00
jerome 4dc25063e8 link resource MDL-16272 fix anchor into the url (not urlescaped anymore) 2009-02-05 02:25:40 +00:00
moodlerobot 436e9574a5 Updated the 19 build version to 20090205 2009-02-05 00:35:54 +00:00
piers fd50629bd0 MDL-17832 - consistent adding and removing of slashes for track data. backport 1.9. 2009-02-04 18:59:53 +00:00
piers 59fc418b73 MDL-18023 - add type check to check against default to avoid 0 error. backport 1.9. 2009-02-04 18:40:09 +00:00
stronk7 9ac773b15c MDL-8848 restore section summaries - now restored if target course have them empty 2009-02-04 17:19:52 +00:00
stronk7 d6546599dd MDL-18129 blog_print_entry() - avoid double format_text() 2009-02-04 16:39:27 +00:00
tjhunt 552ae7276f themes / pix: MDL-10441 better up, down, left and right icons without a white fringe.
Since these are not anti-aliased on a white background, they look better against a wider range of background colours. Since all the lines are at 90 or 45 degrees, jagged edges are not a problem.

Thanks to Dag Klimas for these.
2009-02-04 09:24:51 +00:00
tjhunt e8d902964d themes / participants: MDL-17526 add class name to search form on the participants page. 2009-02-04 09:15:06 +00:00
tjhunt a0dd83702f themes / pix: MDL-18052 dmg.gif icon should not contain excessive colour profile information.
This reduces the files size from 3.7k to 200b.
2009-02-04 08:42:36 +00:00
tjhunt 4b53c0f87d weblib: MDL-17525 Give previous and next links in paging bars class names, so they can be themed.
Thanks to Daniel Neis for the patch.

I checked the standard theme, and I don't see any rules there that would erroneously apply to these class names in paging bars.
2009-02-04 08:21:06 +00:00
tjhunt 87c2747ee5 weblib: MDL-14901 Fix misleading comment on print_navigation 2009-02-04 07:34:52 +00:00
tjhunt eaffb7ef7c admin reports: MDL-18134 Third-party admin reports not listed with the correct name.
Regression caused by MDL-17372.
2009-02-04 02:15:27 +00:00
moodlerobot a92bc4ed2d Updated the 19 build version to 20090204 2009-02-03 23:43:16 +00:00
moodlerobot 6b57802eca Automatic installer.php lang files by installer_builder (20090204) 2009-02-03 23:41:29 +00:00
tjhunt 8788cc6fe6 theme / navbar: MDL-14133 every link in the nav bar was getting class="first"! 2009-02-03 09:32:47 +00:00
tjhunt 91792878a0 theme / weblib: MDL-14400 Setting $THEME->makenavmenulist = true causes a php notice 2009-02-03 07:47:11 +00:00
moodlerobot 2d3799bfc8 Updated the 19 build version to 20090203 2009-02-02 23:44:17 +00:00
piers fc85b7977f MDL-17498 - fix grading output for submissions. 2009-02-02 22:09:29 +00:00
stronk7 397ad6af5b MDL-18100 tex filted debug - fix missing quote. Credit goes to Paulo Matos. 2009-02-02 21:08:11 +00:00
poltawski 3aeca96386 mnet/ email links rewritten MDL-18118 2009-02-02 17:44:59 +00:00
skodak 256c570e0a MDL-18040 fixed adminrisk query too - now much faster; backported from HEAD 2009-02-02 13:15:43 +00:00
Francois Marier cc90879d52 Fix CVS-git drift (old .sql files) 2009-02-01 23:44:30 +00:00
moodlerobot 822f1fe81c Updated the 19 build version to 20090202 2009-02-01 23:44:30 +00:00
moodlerobot a063109a4a Automatic installer.php lang files by installer_builder (20090202) 2009-02-01 23:42:45 +00:00
skodak 4ba3104b23 MDL-10275 backporting gd environment test 2009-02-01 16:22:32 +00:00
moodlerobot 32f25d39b7 Updated the 19 build version to 20090201 2009-01-31 23:47:40 +00:00
moodlerobot 8ae0e59cbb Automatic installer.php lang files by installer_builder (20090201) 2009-01-31 23:45:42 +00:00
skodak 49f3723381 MDL-17808 more lastname support when resetting passwords 2009-01-31 21:37:10 +00:00
moodlerobot f5838b1e56 Updated the 19 build version to 20090131 2009-01-30 23:48:27 +00:00
moodlerobot 0b0b1022f9 Automatic installer.php lang files by installer_builder (20090131) 2009-01-30 23:46:40 +00:00
stronk7 0d217d2820 MDL-18066 import_backup_file_silently - reverting last commit. 2009-01-30 13:17:55 +00:00
mudrd8mz 669db62519 MDL-17940 Display the count of ratings together with the aggregated grade for the post 2009-01-30 11:30:21 +00:00
stronk7 65cb682f22 MDL-18076 course participation report - fix actions dropdown not working. Credit goes to Paul Holden. 2009-01-30 10:12:44 +00:00
stronk7 5648e66cb2 MDL-18066 - import_backup_file_silently - better handling of missing $USER. Credit goes to Gabriel Mazetto. 2009-01-30 09:56:16 +00:00
jerome 613d0f81c4 calendar MDL-14693 fix month link when calendar is displayed on a text page resource 2009-01-30 06:22:16 +00:00
moodlerobot 72f0f08f9d Updated the 19 build version to 20090130 2009-01-29 23:44:04 +00:00
danmarsden e00a6b577f MDL-18086 backport fix for incorrect ODS export 2009-01-29 21:24:27 +00:00
jamiesensei 4d5025a776 MDL-18085 "custom user profile fields : in a list box field if one of the admin chosen values has an apostrophe in it it breaks the query to update / save the value" 2009-01-29 13:43:50 +00:00
mudrd8mz 82e1b609d2 MDL-13449 Fix the problem with displaying aggregation type "Count of ratings" 2009-01-29 12:32:48 +00:00
moodlerobot 81126259ae Updated the 19 build version to 20090129 2009-01-28 23:46:13 +00:00
stronk7 1e98ff2a8d Bump 2009-01-28 23:44:23 +00:00
stronk7 827f863046 MDL-18073 environment - enforce PHP 5.2.8 req for Moodle 2.0 ; merged from 18_STABLE 2009-01-28 23:42:40 +00:00
skodak b3b4937eb6 MDL-18040 rewritten XSS query, I hope this will be much faster; backported from HEAD 2009-01-28 22:51:28 +00:00
piers 5893fbd8e1 MDL-16184 - patch to correct the calculation of first, and last access to a SCORM attempt. backport to 1.9. + missing php tag in debug. 2009-01-28 18:16:18 +00:00
piers e6dcae98fa MDL-17821 - fix incorrect data validation regexs for 2004. thanks Peter Chamberlin. backport to 1.9. 2009-01-28 18:14:57 +00:00
mudrd8mz 3f4820fadf MDL-13449 Reverting the previous commit, sorry - not working yet 2009-01-28 16:08:03 +00:00
mudrd8mz 78700ccdca MDL-13449 If the count exceeds the forum scale, then set the score to the max grade 2009-01-28 15:51:32 +00:00
sam_marshall be10e474f3 MDL-381: Added 'Move' button to reduce accidentally moving forum posts. 2009-01-28 13:11:22 +00:00
sam_marshall b1ddca5c74 MDL-17974: Calendar 'new entry' accessibility improvement 2009-01-28 12:10:23 +00:00
moodler e666ae15f6 Bumping to post 1.9.4 2009-01-28 07:37:27 +00:00
moodler e7ff269394 Bumping to Moodle 1.9.4 for release! 2009-01-28 06:20:53 +00:00
moodler 8c3666955a report/security MDL-18039 Just some trivial text fixes 2009-01-28 06:10:38 +00:00
moodlerobot a166672c09 Updated the 19 build version to 20090128 2009-01-27 23:54:27 +00:00
stronk7 cc84c1aba0 MDL-17365 forum rate - fix error message. Merged from 18_STABLE 2009-01-27 18:08:29 +00:00
stronk7 62c7a8c799 MDL-17365 forum rate - add 'invalidrate' string. 2009-01-27 17:51:52 +00:00
stronk7 0b174abec7 MDL-17365 forum rate - validate rating against scale values. 2009-01-27 17:40:02 +00:00
skodak ba58c9f08e MDL-18057 fixed XSS test 2009-01-27 17:38:40 +00:00
skodak dd75d8696e MDL-18040 adding warning that the security report processing may take a long time; backported from HEAD 2009-01-27 16:22:32 +00:00
skodak aaa9b674c9 MDL-18055 adding timeout protection to security report 2009-01-27 15:06:04 +00:00
skodak 2d1541b597 MDL-18015 improved lang strings - thanks Andrea! 2009-01-27 09:58:02 +00:00
tjhunt b226b10a60 multianswer help file: Many XHTML strict issues. 2009-01-27 07:32:20 +00:00
tjhunt 6e115e57be forum rating: MDL-18044 notice sometimes when a forum is rated, also XHTML strict problems and fix incorrect help text. 2009-01-27 06:35:44 +00:00
gbateson 8d81298c4a MDL-17679: implement course reset for HotPot module (thanks to Albert Gasset) 2009-01-27 05:33:57 +00:00
tjhunt cc8549eaae quiz view: MDL-18038 Open close dates displayed to teachers incorrectly. 2009-01-27 04:44:00 +00:00
moodlerobot a68a6dcc62 Updated the 19 build version to 20090127 2009-01-26 23:55:26 +00:00
moodlerobot ed103b539a Automatic installer.php lang files by installer_builder (20090127) 2009-01-26 23:53:30 +00:00
pichetp 3c6ed6e2ca MDL-17995 replacing is_null() by empty(). Merged from HEAD 2009-01-26 01:27:16 +00:00
pichetp eb64eefaab MDL-17995 replacing != '' by !empty(). Merged from HEAD 2009-01-26 01:26:03 +00:00
moodlerobot 284aefc537 Updated the 19 build version to 20090126 2009-01-25 23:54:28 +00:00
pichetp bb215b150f MDL-17995 replacing $wrapped !='' by !is_null($wrapped) Merge from HEAD 2009-01-25 14:52:56 +00:00
moodlerobot 2f1fc9d9f2 Updated the 19 build version to 20090125 2009-01-24 23:55:56 +00:00
stronk7 042be7ddd6 MDL-17835 backup & restore - encode/decode content links from/to course formats info.
Credit goes to Mark Nielsen. Thanks!
2009-01-24 00:20:51 +00:00
moodlerobot 6b502ee98f Updated the 19 build version to 20090124 2009-01-23 23:55:05 +00:00
moodlerobot 35aacbe41e Automatic installer.php lang files by installer_builder (20090124) 2009-01-23 23:53:29 +00:00
stronk7 63370ab86b MDL-17886 backup & restore - Add some defaults to import_backup_file_silently()
Credit goes to Mark Nielsen. Thanks!
- CVS: ----------------------------------------------------------------------
2009-01-23 23:28:40 +00:00
stronk7 aacdd2a2aa MDL-17998 forum ajax rating - avoid 'null' printout + improved search by class (IE7, you know) 2009-01-23 16:30:13 +00:00
tjhunt ee71dd5d5b matching qtype: MDL-17981 extra distractors feature was not working on MS SQL server, since MDL-14420 was fixed. 2009-01-23 02:19:36 +00:00
tjhunt 9637977c56 admin: xhtml strict problems. 2009-01-23 02:10:11 +00:00
moodlerobot 38abaa812b Updated the 19 build version to 20090123 2009-01-22 23:56:12 +00:00
moodlerobot 50a391f3ff Updated the 19 build version to 20090122 2009-01-21 23:56:39 +00:00
moodlerobot 2f0595b2ba Automatic installer.php lang files by installer_builder (20090122) 2009-01-21 23:55:05 +00:00
wildgirl 0d2d8435eb scorm lang string: MDL-16651 added scorm:deleteresponses 2009-01-21 16:21:37 +00:00
skodak 84d866f59a MDL-17463 bumped version report number numbers again - I found 3 sites that did not have the caps installed after upgrade - weird 2009-01-21 15:42:54 +00:00
mudrd8mz 3b8a200da9 MDL-17982 Security overview report backported to 1.9 uses 2.0 API
Fixes:
- admin/roles/manage.php instead of new admin/roles/define.php
- results returned by old get_recordset_sql() must be iterated using rs_fetch_next_record() instead of new foreach()
2009-01-21 10:57:53 +00:00
moodlerobot 3a281e4282 Updated the 19 build version to 20090121 2009-01-20 23:54:29 +00:00
wildgirl 8ad8632027 forum lang string: MDL-17364 small rewording 2009-01-20 10:43:54 +00:00
moodler adfe07e897 forum/css MDL-16749 added a div named "posting" around the posting 2009-01-20 07:54:14 +00:00
tjhunt c83e62ae8b upgrade reload icon MDL-17924 unobfuscate Martin's reload icon. 2009-01-20 06:56:44 +00:00
moodler 92179c5667 calendar ical MDL-17964 Better hostname derived from wwwroot 2009-01-20 06:21:03 +00:00
moodler b26a82e9a9 maintenance mode MDL-15700 Just some little tidyups of the maintenance mode page 2009-01-20 05:57:08 +00:00
tjhunt 1ed574d378 quiz backup: MDL-17970 MSSQL text / varchar compare issue.
Commiting this fix so it gets into 1.9.4. I've tested and it does not break sensible databases, and probably fixes the problem on MSSQL.
2009-01-20 04:24:01 +00:00
tjhunt 1ae3f411b5 backup/restore: MDL-16614 more reliable test for when we are restoring a backup that was made of the same site that we are restoring to.
* Use this to fix a question restore bug.
* Replace older code that does something similar with the new test.
* Refactor initialisation of $CFG->siteidentifier into a function. There were about 4 copies of this code ;-)
2009-01-20 03:16:05 +00:00
moodler 6592bac242 calendar/export MDL-17964 explicitly define a non-random UID for each event 2009-01-20 03:07:27 +00:00
moodlerobot d750ce8fa2 Updated the 19 build version to 20090120 2009-01-19 23:54:34 +00:00
moodlerobot 94b7fd6607 Automatic installer.php lang files by installer_builder (20090120) 2009-01-19 23:52:33 +00:00
sam_marshall 576ba278bc MDL-17965: Prevent forum move to forum you can't start discussions in 2009-01-19 14:18:24 +00:00
dongsheng 8a76863c7e "FILTER/MDL-17703, use classname instead of inline style" 2009-01-19 01:55:50 +00:00
dongsheng 000bfd6e5b "FORUM/MDL-17709, replace p with div in forum summary" 2009-01-19 01:36:18 +00:00
moodlerobot ec432881c3 Updated the 19 build version to 20090119 2009-01-18 23:52:25 +00:00
moodlerobot 17400c041b Automatic installer.php lang files by installer_builder (20090119) 2009-01-18 23:50:38 +00:00
moodlerobot 59911a0388 Updated the 19 build version to 20090118 2009-01-18 00:02:48 +00:00
stronk7 3c13c816f3 MDL-17364 forum ajax rating - needed strings ; backported from HEAD 2009-01-17 19:37:07 +00:00
stronk7 c57931ce32 MDL-17364 forum ajax rating working ; backporting from HEAD 2009-01-17 19:30:08 +00:00
stronk7 e33c29d4b2 file rate_ajax.php was added on branch MOODLE_19_STABLE on 2009-01-17 19:30:08 +0000 2009-01-17 19:14:38 +00:00
stronk7 0aa5484366 file rate_ajax.js was added on branch MOODLE_19_STABLE on 2009-01-17 19:30:08 +0000 2009-01-17 19:14:38 +00:00
stronk7 0f9654453d Adding small loading gif for AJAX processing. 2009-01-17 18:25:03 +00:00
stronk7 86b6811e97 MDL-17331 choose_from_menu() - backport listbox, multiple and class params 2009-01-17 18:09:38 +00:00
moodlerobot 13d2dda5de Updated the 19 build version to 20090117 2009-01-17 00:06:46 +00:00
moodlerobot 0f208a88f0 Automatic installer.php lang files by installer_builder (20090117) 2009-01-17 00:04:41 +00:00
nicolasconnault bb038bc7c8 MDL-17883 Added title attribute to grade item link 2009-01-16 14:56:59 +00:00
nicolasconnault c98fa2cd88 MDL-13778 Added new display types to course settings 2009-01-16 10:20:02 +00:00
dongsheng 6de4bdb976 "GLOSSARY/MDL-17707, remove extra div" 2009-01-16 08:59:39 +00:00
dongsheng 9f62d5bd19 "MDL-17710, remove extra div" 2009-01-16 08:52:09 +00:00
tjhunt 6f48c01a43 adminlib: MDL-6160 mess up my lovely code just to keep PHP4 happy.
Thanks to Ashley Holman for noticing my mistake.
2009-01-16 08:34:21 +00:00
dongsheng 50850f2545 "WIKI/MDL-17704, wrap wiki summary by div" 2009-01-16 05:37:56 +00:00
dongsheng d8c5e6c18f "QUIZ/MDL-17710, wrap quiz summary by div" 2009-01-16 05:31:55 +00:00
dongsheng 94d9f6d84f "FILTER/MDL-17703, wrap object tag by div" 2009-01-16 05:20:19 +00:00
dongsheng 5f3e7b35d4 "GLOSSARY/MDL-17708, use css selector instead of inline style" 2009-01-16 04:55:38 +00:00
dongsheng f6d70ceca1 "FORUM/MDL-17709, use css selector instead of inline style" 2009-01-16 04:52:01 +00:00
tjhunt 190dddfc0b quiz / questions: MDL-17919 Bad link edit questions from quiz preview page.
Thanks to Ann Adamcik for noticing this. It was a regression from MDL-6085.
2009-01-16 04:47:35 +00:00
dongsheng 9d06855887 "MDL-17707, replace p with div in module summary" 2009-01-16 04:46:31 +00:00
tjhunt b755cfd75c moodlelib: MDL-17761 More consistent error handling in get_string. 2009-01-16 04:18:32 +00:00
moodlerobot 3c2df10618 Updated the 19 build version to 20090116 2009-01-16 03:39:36 +00:00
moodler 187e8dc3a4 admin update reload MDL-17924 Changed reload form to an icon (merged from head) 2009-01-16 02:37:29 +00:00
moodler d3f811b3c4 file reload.gif was added on branch MOODLE_19_STABLE on 2009-01-16 02:37:29 +0000 2009-01-16 02:29:34 +00:00
whchuang 241cf74e0a Fixed a trivial typo in the quiz "item analysis table" help file - it was spelled as "stadard" which should be "standard" 2009-01-15 21:25:51 +00:00
skodak d78bca84e8 MDL-17222 backported security report into 1.9.x 2009-01-15 20:16:12 +00:00
skodak 9c73f43e69 file lib.php was added on branch MOODLE_19_STABLE on 2009-01-15 20:16:12 +0000 2009-01-15 18:30:26 +00:00
skodak 93c9712e34 file index.php was added on branch MOODLE_19_STABLE on 2009-01-15 20:16:12 +0000 2009-01-15 18:30:26 +00:00
tjhunt bf28249d82 questiontypes: MDL-17800 Add extra_question_fields() support to backup/restore functions.
* Implement this in the base class, and
* use this in the shortanswer type as a proof of concept.

This makes writing new question type subclasses a bit easier. Thanks to Oleg Sychev for this code.
2009-01-15 07:29:00 +00:00
tjhunt 4328416b29 question engine: MDL-17651 this context is not used anywhere, so remove it.
(There was a bug in the get_context_instance call.)
2009-01-15 05:15:31 +00:00
moodlerobot 959a292ddf Updated the 19 build version to 20090115 2009-01-15 03:07:47 +00:00
wildgirl a6dcdb14c9 help files: MDL-14319 small XHTML fixes, as reported by Chris Bandy 2009-01-14 20:15:55 +00:00
stronk7 e79859512f MDL-17837 apply some limits to the dropdown of users in first instance. 2009-01-14 17:47:00 +00:00
stronk7 22fc88f88b MDL-17837 opt limit resultsets returned by some get_xxxx_users() function. 2009-01-14 17:44:46 +00:00
thepurpleblob ac6e14ff79 MDL-17048:
Added additional check for non-visible fields in signup page.
2009-01-14 10:06:06 +00:00
tjhunt c8a507097c quiz: MDL-14926 New capability mod/quiz:reviewmyattempts, separate from mod/quiz:attempt. 2009-01-14 07:03:09 +00:00
dongsheng dfa8aab5d8 "MDL-6926, force language in forum module" 2009-01-14 04:55:10 +00:00
dongsheng 7bbe53f402 "MDL-17747, add max category depth setting" 2009-01-14 04:47:21 +00:00
tjhunt 8e88626ff3 admin settings: MDL-17877 Remember to pass u.id to get_users_by_capability. 2009-01-14 04:45:10 +00:00
tjhunt 68099376a3 accesslib: Nice debug developer warning if you call get_users_with_capability without including u.id in the list of fields. 2009-01-14 04:44:08 +00:00
dongsheng b5d665d551 "MDL-14949, reverse changes to permission which can cause problems" 2009-01-14 04:35:23 +00:00
moodlerobot 526a055559 Updated the 19 build version to 20090114 2009-01-13 23:58:22 +00:00
thepurpleblob a3d160fdec MDL-17048
Corrected misuse of formslib - works now.
2009-01-13 13:15:23 +00:00
wildgirl f442462c07 embedding files in a frame: MDL-10021 small rewording of help file 2009-01-13 10:21:39 +00:00
skodak b02e348184 MDL-17868 detection of incorrect hadnling of floats in version numbers - this should prevent dataloss in case it does not work as expected 2009-01-13 09:02:01 +00:00
tjhunt c1321f6c40 edit profile: MDL-15607 Edit profile form breaks if the list of countries in the language pack is broken.
After this patch it still breaks, unavoidably, but at least there is now an error message.
2009-01-13 06:03:36 +00:00
moodlerobot 58ce50f528 Updated the 19 build version to 20090113 2009-01-13 00:01:24 +00:00
dongsheng 8ab1c8dfeb "MDL-12077, add course delete hook for course format" 2009-01-12 06:22:38 +00:00
tjhunt 2b406390d8 Fix typo. 2009-01-12 06:03:10 +00:00
peterbulmer 489b503378 MDL-10498: Apostrophe / Quote in username or email breaks profile update
Author: Aaron Barnes <aaronb@catalyst.net.nz>
2009-01-12 02:05:12 +00:00
moodlerobot ee5537a5a9 Updated the 19 build version to 20090112 2009-01-11 23:55:14 +00:00
moodlerobot 7481a23090 Updated the 19 build version to 20090111 2009-01-11 00:07:50 +00:00
skodak 79536558fa MDL-17841 removed bogus remove lib/simpletest/slowcodetest.php 2009-01-10 13:48:06 +00:00
moodlerobot 85a0fcf2a2 Updated the 19 build version to 20090110 2009-01-09 23:55:45 +00:00
moodlerobot 7d8264c188 Automatic installer.php lang files by installer_builder (20090110) 2009-01-09 23:54:09 +00:00
tjhunt 1cb675b598 restorelib: fix incorrect indenting. 2009-01-09 06:35:34 +00:00
tjhunt c6c9b4faca accesslib: MDL-17626 delete the context whenever a block is deleted. This includes a new helper function blocks_delete_all_on_page. 2009-01-09 06:16:52 +00:00
tjhunt 2a538623e4 accesslib: MDL-17626 admin/modules.php should call delete_context when a module is uninstalled. 2009-01-09 05:34:54 +00:00
tjhunt 83b238f9b8 accesslib: MDL-17626 delete_course_module should call delete_context. 2009-01-09 05:32:16 +00:00
tjhunt 6548bc4898 accesslib: MDL-17626 role_names not cleaned up when a context is deleted. 2009-01-09 05:25:59 +00:00
tjhunt a23612213a shortanswer qtype: MDL-17706 use extra_question_fields mechanism to save on code. Changes thanks to Oleg Sychev. 2009-01-09 05:10:40 +00:00
jerome a75573c738 admin MDL-17155 cURL functions called in adminlib.php: add checking for disable_functions php configuration option 2009-01-09 02:05:45 +00:00
jerome 8ec33be76c online user block MDL-15325 optimize the display of the message icon/link (instantiation out of a loop) 2009-01-09 00:54:05 +00:00
moodlerobot 037f56034f Updated the 19 build version to 20090109 2009-01-08 23:57:11 +00:00
moodlerobot 57a8ff3a73 Automatic installer.php lang files by installer_builder (20090109) 2009-01-08 23:55:07 +00:00
stronk7 e12b3b10ca MDL-17826 restore - proper TEXT comparison. Was breaking MSSQL and Oracle. 2009-01-08 18:28:46 +00:00
nicolasconnault e2e0711a49 MDL-17825 Converting float grades to string when counting values using the Mode of Grades aggregation 2009-01-08 16:01:43 +00:00
nicolasconnault 54862201c5 MDL-13778 Improved code in grades admin settings page 2009-01-08 08:52:37 +00:00
nicolasconnault 69cce5950b MDL-13778 Added 6 "composite" grade display types for the grader report 2009-01-08 08:19:41 +00:00
jerome 624567f853 online user block MDL-15325 Online Users Block didn't perform capability check when displaying messaging icon 2009-01-08 07:37:17 +00:00
tjhunt fe6a9871bf course requests: MDL-6160 clean up admin option for choosing who is notified. 2009-01-08 07:05:31 +00:00
jerome 8656394dac resource: MDL-10021 change the wording "Yes, frame tag" "Yes, object tag" to "Yes, with frame" "Yes, without frame" 2009-01-08 02:59:54 +00:00
jerome be2f1abc87 resource: MDL-10021 upload file resource: change "keep navigation visible" into a select box. Choice are now No - Yes, Frame tag - Yes, Object tag 2009-01-08 02:19:44 +00:00
jerome 295c7cad90 database: MDL-16999 move the warning message from the environment check page to a normal upgrade page 2009-01-08 01:01:04 +00:00
moodlerobot 6eb25b3e8c Updated the 19 build version to 20090108 2009-01-08 00:05:04 +00:00
skodak 93eceb28d2 MDL-17799 proper log url sanitisation - big thanks to Full Name hacker ;-) backported from HEAD 2009-01-07 23:01:30 +00:00
skodak 5a33217812 MDL-17797 fixed cap definition - thanks Andrea Bicciolo 2009-01-07 19:55:25 +00:00
skodak 2f62d8b459 MDL-17811 fixed typos, thanks James Riggs 2009-01-07 19:51:18 +00:00
skodak 9802accd59 MDL-17808 Use users lastname in password change confirmation mails, thanks Andreas Grupp; backported from HEAD 2009-01-07 19:03:59 +00:00
thepurpleblob af993edd90 MDL-17048
Suppress display of empty custom profile field categories
2009-01-07 13:50:43 +00:00
moodlerobot 86ced6c244 Updated the 19 build version to 20090107 2009-01-06 23:56:02 +00:00
skodak 05f6536c54 MDL-17789 prevent potential XSS problems through PHP_SELF; backported from HEAD 2009-01-06 13:09:13 +00:00
diml d8b7674ec5 Fixes MDL17792 cron break effect 2009-01-06 10:26:31 +00:00
dongsheng 507c75ff7c "MDL-17747, Add Max category depth as a configuratble setting to the site settings, credit goes to Jason Hardin" 2009-01-06 06:52:19 +00:00
moodlerobot 77c64292d5 Updated the 19 build version to 20090106 2009-01-05 23:55:26 +00:00
moodlerobot 9dc01d93fe Automatic installer.php lang files by installer_builder (20090106) 2009-01-05 23:53:22 +00:00
thepurpleblob db784f7936 MDL-17779
Add simple check that question at least has questiontext before allowing it.
2009-01-05 15:20:11 +00:00
tjhunt acfbbeb1d3 XHTML Strict! 2009-01-05 02:18:49 +00:00
moodlerobot 5400aac79f Updated the 19 build version to 20090105 2009-01-04 23:54:26 +00:00
moodlerobot f67faa62d6 Updated the 19 build version to 20090104 2009-01-03 23:57:15 +00:00
moodlerobot e83a493a43 Updated the 19 build version to 20090103 2009-01-03 00:00:14 +00:00
moodlerobot 2b42953f9a Automatic installer.php lang files by installer_builder (20090103) 2009-01-02 23:58:20 +00:00
skodak ef005cf1fe MDL-17772 fixed guest access 2009-01-02 20:54:59 +00:00
stronk7 ef2286f2d8 MDL-17321 restore roll dates - prevent wrong rolls to 0 happening to teachers 2009-01-02 16:53:30 +00:00
arborrow 5c8cb3a6a4 removing files for new_forum_replies mistakenly added to 19STABLE intended for CONTRIB 2009-01-02 02:02:29 +00:00
arborrow 251e356eb1 CONTRIB-612 - adding new forum replies block submitted and maintained by Niall Barr 2009-01-02 01:42:44 +00:00
moodlerobot 6cde557687 Updated the 19 build version to 20090102 2009-01-01 23:57:34 +00:00
moodlerobot c512f546b0 Automatic installer.php lang files by installer_builder (20090102) 2009-01-01 23:55:04 +00:00
skodak aeb1c7c456 MDL-17226 reverted incorrect fix 2009-01-01 23:53:47 +00:00
mudrd8mz a606b17d90 A typo fixed 2009-01-01 23:43:10 +00:00
skodak 33698217a3 MDL-16262 recovery of broken single simple discussions after old reset; backported from HEAD 2009-01-01 22:54:06 +00:00
skodak 7685016d20 MDL-16262 fixed resetting of single simple discussions; backported from HEAD 2009-01-01 22:43:20 +00:00
skodak c37304a964 MDL-15172 lowered timeoout and adding warning that users must not click continue in middle of course import - this is a silly workaround, unfortunately I did not find better solution; backported from HEAD 2009-01-01 16:06:37 +00:00
skodak 95968dff75 MDL-17758 fixed hardcoded /admin/ links 2009-01-01 14:29:37 +00:00
moodlerobot ff3ce1ed42 Updated the 19 build version to 20090101 2008-12-31 23:55:14 +00:00
skodak 5f9e154544 MDL-17203 ooops, forgot to bump up main version number 2008-12-31 16:10:17 +00:00
skodak a963e6c8e4 MDL-17203 longer default salt 2008-12-31 15:56:49 +00:00
skodak 25da571df9 MDL-17203 prevent disclosing of sensitive information; backported from HEAD 2008-12-31 15:54:09 +00:00
skodak 3222c0c272 MDL-17203 hash salt added to calendar export; backported from HEAD 2008-12-31 15:51:27 +00:00
skodak 33942f16e2 MDL-17203 new option for disabling of calendar export; backported from HEAD 2008-12-31 14:11:34 +00:00
moodlerobot 6b13469879 Updated the 19 build version to 20081231 2008-12-30 23:59:41 +00:00
skodak 7e8ab13d8f MDL-17556 fixed whitespace; backported from HEAD 2008-12-30 16:34:14 +00:00
moodlerobot f9377c0a7e Updated the 19 build version to 20081230 2008-12-29 23:56:41 +00:00
skodak 7f491dc474 MDL-17682 added default value for city field; backported from HEAD 2008-12-29 21:47:27 +00:00
skodak c3e7bda77c MDL-17724 fixed group/grouping renaming now allows case change; backported from HEAD 2008-12-29 21:32:36 +00:00
skodak ea0bc86d6e MDL-17637 fixed adobe XSS protection; backported from HEAD 2008-12-29 21:18:32 +00:00
skodak ffb5a93032 MDL-17677 fixed string locations - patch by Vlas Voloshin 2008-12-29 20:19:59 +00:00
skodak e2cf6b91da MDL-17727 do not allow access to feeds from hidden courses or activitites - security improvement, in 2.0 this will be rewritten 2008-12-29 20:06:54 +00:00
skodak d100f76f6e MDL-17746 fixed debugdisplay typo in cron - patch by Tomasz Muras; backported from HEAD 2008-12-29 19:58:05 +00:00
moodlerobot 060f414899 Updated the 19 build version to 20081229 2008-12-28 23:57:07 +00:00
moodlerobot 8b68630612 Updated the 19 build version to 20081228 2008-12-27 23:56:11 +00:00
diml 323a266cf5 fixes reference id for label record in search index 2008-12-27 11:56:23 +00:00
diml 85203af7a3 completing access policy with course state examination 2008-12-27 11:42:54 +00:00
diml 0f2f33611f fixing constant CONTEXT_COURSE name 2008-12-27 11:42:25 +00:00
moodlerobot c201ac514b Updated the 19 build version to 20081227 2008-12-26 23:57:49 +00:00
moodlerobot 3080aa14e1 Automatic installer.php lang files by installer_builder (20081227) 2008-12-26 23:55:47 +00:00
arborrow 0502b5122c MDL-17741 - typo $tableparam; merged from MOODLE_18_STABLE 2008-12-26 23:19:47 +00:00
arborrow ae9f99119a MDL-17741 - typo $tableparam 2008-12-26 20:47:25 +00:00
iarenaza b11a0766ed auth/ldap: MDL-9405 sync_users() can create duplicated users
Merged from MOODLE_18_STABLE

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 16:00:12 +00:00
moodlerobot 0b3a3435a1 Updated the 19 build version to 20081226 2008-12-25 23:54:21 +00:00
moodlerobot 65eda6e60e Updated the 19 build version to 20081225 2008-12-24 23:55:41 +00:00
ikawhero 351c28559b MDL-17228 Allow admins to view hidden custom profile fields.
Thanks to Alan Barrett for the fix.
2008-12-24 04:16:21 +00:00
moodlerobot edd41a94eb Updated the 19 build version to 20081224 2008-12-23 23:55:26 +00:00
moodlerobot 937a8769de Automatic installer.php lang files by installer_builder (20081224) 2008-12-23 23:53:57 +00:00
moodlerobot a490bb4f0d Updated the 19 build version to 20081223 2008-12-22 23:53:48 +00:00
danmarsden 2252803d20 Accessibility: MDL-17705: Thanks Tim merged from HEAD 2008-12-22 07:04:37 +00:00
tjhunt 3a580fd193 admin tree: MDL-13104 - fix another external page so there are not problems when you click the blocks editing on/off button. 2008-12-22 03:16:51 +00:00
moodlerobot 1c1646cb4b Updated the 19 build version to 20081222 2008-12-21 23:52:17 +00:00
danmarsden 1caa37ac3e XHTML Striiict:MDL-17705 2008-12-21 22:27:40 +00:00
moodlerobot 14c870de0d Automatic installer.php lang files by installer_builder (20081222) 2008-12-21 16:58:04 +00:00
stronk7 3afd68857d Adding kk_utf8 to installer langs. Backported from HEAD. 2008-12-21 16:05:42 +00:00
stronk7 2f0a40ab47 file installer.php was added on branch MOODLE_19_STABLE on 2008-12-21 16:05:42 +0000 2008-12-21 16:02:16 +00:00
gbateson 615852be16 MDL-6467 add "swf" and "flv" to the list of files for which relative urls are converted to absolute urls 2008-12-21 01:48:21 +00:00
moodlerobot fa6eac40ee Updated the 19 build version to 20081221 2008-12-20 23:57:25 +00:00
moodlerobot 21aabcbc9f Updated the 19 build version to 20081220 2008-12-19 23:53:54 +00:00
mjollnir_ f3d3aa6881 MDL-17694: very small stickyblocks improvements 2008-12-19 09:49:10 +00:00
mjollnir_ c165e7462e MDL-17693: get_role_users - add lastaccess & mnethostid to the list of default fields to return. These are used by messaging/emailing. 2008-12-19 08:56:01 +00:00
mjollnir_ fd5244dc46 MDL-17692: count_role_users now accepts an int or an array of ints for roleid - this is now consistent with get_role_users. 2008-12-19 08:45:09 +00:00
moodler d8709908a0 user tabs MDL-17472 Fixed a regression where the $secondrow variable of forum posts was being wiped out (See also MDLSITE-594) 2008-12-19 01:44:48 +00:00
moodlerobot 2d10a5ef93 Updated the 19 build version to 20081219 2008-12-18 23:54:50 +00:00
moodler 968788be74 Cleaning up the main version file. 2008-12-18 06:44:51 +00:00
stronk7 f56cacd0d8 MDL-17009 restore of mnet users - order some recently added strings and add 1 more 2008-12-18 00:22:11 +00:00
stronk7 54cae7edcf MDL-17009 restore of mnet users - Automatic switching of remote users (unknown host) to local ones. 2008-12-18 00:18:44 +00:00
moodlerobot 07f8fab029 Updated the 19 build version to 20081218 2008-12-17 23:56:19 +00:00
moodlerobot ee89fdf92c Automatic installer.php lang files by installer_builder (20081218) 2008-12-17 23:54:09 +00:00
stronk7 8e99ea4081 MDL-17009 restore of mnet users - New lang strings. 2008-12-17 23:37:48 +00:00
stronk7 2a3f443ac1 MDL-17009 restore of mnet users - Prevent teachers to restore this type of backups to different sites. 2008-12-17 23:33:42 +00:00
diml b56ccc3192 Big global search update for 1.9. Will resolve major bug points in Global Search component section. 2008-12-17 20:52:07 +00:00
diml 323a68467c Big global search update for 1.9. Will resolve major bug points in Global Search component section. 2008-12-17 20:51:19 +00:00
skodak 68c5857cb9 MDL-14876 fixed regressions in user subscriptions - $cm used incorrectly instead of $cm->id 2008-12-17 18:09:11 +00:00
sam_marshall 7acc360f7c MDL-17556: Improve performance of get_fast_modinfo when courses have many activities 2008-12-17 12:40:09 +00:00
moodlerobot 80a6e5fb67 Updated the 19 build version to 20081217 2008-12-17 00:36:42 +00:00
stronk7 b18ecac385 MDL-17647 accesslib - cleaning some candoanything in comments 2008-12-17 00:29:52 +00:00
dongsheng 9111f5dacf "MDL-14949, add a new capability chat:talk" 2008-12-16 04:54:26 +00:00
moodlerobot d09916f929 Updated the 19 build version to 20081216 2008-12-15 23:53:33 +00:00
moodlerobot 41fd49847c Automatic installer.php lang files by installer_builder (20081216) 2008-12-15 23:51:55 +00:00
stronk7 60bcf0156d MDL-17599 scheduled backup: add support for grade history setting + minor XML formatting 2008-12-15 21:28:02 +00:00
tjhunt 9be7cc58e4 accesslib: MDL-17648 fix stupid typo. Sorry. 2008-12-15 08:12:53 +00:00
tjhunt 6913746fb1 accesslib: MDL-17647, MDL-17648 and MDL-17649 Bug fix, improvement and unit test.
MDL-17647 was referring to moodle/site:candoanything insstead of moodle/site:doanything

MDL-17648 Let get_users_by_capability take an array of capabilities, like has_any_capability

MDL-17649 get_users_by_capability must have unit tests (HEAD only).

The unit tests were briefly working (apart from the system context, which I had to set up by hand in the test contexts table). Then I made the mistake of trying to upgrade the test tables, and it all went horribly wrong (MDL-17644).
2008-12-15 06:22:40 +00:00
tjhunt bd88ac6161 forum subscriptions: MDL-14876 - followup - use the right table prefix on column names to avoid an ambiguous column name error. 2008-12-15 06:09:07 +00:00
tjhunt 797a1f7e0b 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:50 +00:00
moodlerobot 1c8e955e4b Updated the 19 build version to 20081215 2008-12-14 23:53:01 +00:00
moodlerobot 60ced88eb2 Automatic installer.php lang files by installer_builder (20081215) 2008-12-14 23:51:36 +00:00
jonathanharker 2b11b765dd MDL-17548 MNET: Fix email links for sites with path component in wwwroot
Where Moodle sites have a path in their wwwroot, the MNET function that
forced remote users to go via their identity provider (to make sure they
were logged in) previously directed the user back to a URL like
contentprovider.com/moodle/moodle/mod/forum/view.php?f=7 where there
should only be one /moodle in the middle of the URL.

Slightly tweaked from HEAD to support PHP4
2008-12-14 23:40:21 +00:00
jonathanharker 62cf1ae8c1 MDL-16875 New Moodle setting - sessioncookiedomain
Added new sessioncookiedomain setting to session handling section.

 * allows you to change the domain that the Moodle cookies are available
   from. This is useful for Moodle customisations (i.e. Squirrelmail SSO
   or enrolment plugins) that need to share Moodle session information
   with a web application on another subdomain.

 * Will NOT work if the moodle host does not have a domain - i.e. just a
   hostname, e.g. 'localhost' or 'myhostname'. Needs a FQDN

 * Currently the setting is set to PARAM_TEXT length 50 since PARAM_HOST
   does not allow a leading dot e.g.  '.mydomain.com'

 * TODO: do we make up a new PARAM_COOKIEDOMAIN which is the same as
   PARAM_HOST but allows leading dots? Using PARAM_HOST and prepending a
   dot may not always be desirable.
2008-12-14 23:30:58 +00:00
jonathanharker 501592d7be MDL-17549 auth/radius: add CHAP and MSCHAP auth support, detect PHP reqs
* Added support for CHAP and MSCHAP authentication schemes
   contributed by Stanislav Tsymbalov http://www.tsymbalov.net/
   original code at http://sourceforge.net/projects/moodleradius/

 * Tweak the detection of PHP RADIUS extension and Pear code

 * Update the warning notices to use more Moodly CSS classes

 * Add PEAR Auth_RADIUS and Crypt_CHAP packages to lib/pear
2008-12-14 23:18:53 +00:00
moodlerobot a658b7fe9c Updated the 19 build version to 20081214 2008-12-13 23:52:18 +00:00
mudrd8mz f9ed2393be MDL-16430 replaces hardcoded format to the one specified in the
langconfig.php
2008-12-13 02:19:41 +00:00
moodlerobot 7f8cd6639a Updated the 19 build version to 20081213 2008-12-12 23:53:42 +00:00
moodlerobot 689dfa7a7c Automatic installer.php lang files by installer_builder (20081213) 2008-12-12 23:52:23 +00:00
danmarsden f0e02543da include filelib.php:MDL-17622: 2008-12-12 19:39:32 +00:00
tjhunt 159865b202 multichoice qtype upgrade: MDL-17619 referring to constant from questionlib.php, which was not being included. 2008-12-12 13:12:59 +00:00
skodak 7fae1f7b6c MDL-17589 fixed handling of missing caps in admin tree 2008-12-12 10:45:48 +00:00
tjhunt c9f0c6e754 questions manual grading: MDL-15147 refine the logic for distinguishing '' and 0, so you can grade an essay 0 without making a comment, but also, grade some, but not all student's work in the manual grading report. 2008-12-12 09:00:03 +00:00
tjhunt b4502ae40f quiz info page: MDL-9542 refix: overridden grades in the gradebook not visible to students in the quiz UI, 2008-12-12 07:24:41 +00:00
tjhunt aa77a3d3de 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:01 +00:00
tjhunt c414f9e5ad course categories: fix typo introduced when fixing MDL-10801 2008-12-12 06:18:56 +00:00
tjhunt 2eaf6c0e95 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:30 +00:00
tjhunt 26207ab4c2 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:32 +00:00
tjhunt 23179e6a47 questionlib: clarify a comment. 2008-12-12 02:50:29 +00:00
moodlerobot 7fc859e6e4 Updated the 19 build version to 20081212 2008-12-11 23:53:23 +00:00
moodlerobot 29b951b6dd Automatic installer.php lang files by installer_builder (20081212) 2008-12-11 23:51:53 +00:00
danmarsden 080eed3f12 fix typo, improve text a bit:MDL-17612 2008-12-11 21:35:56 +00:00
stronk7 70cf5492bc MDL-17009 Restore of mnet users: Fix incorrectly named MNET_EXTERNALUSERS 2008-12-11 16:37:37 +00:00
tjhunt 9af88f530b course search: MDL-10801 Search terms were not being highlighted consistently in the results. 2008-12-11 10:47:57 +00:00
tjhunt 954a3a0b9c weblib: MDL-17606 Make the highlight function better, with unit tests. 2008-12-11 10:34:07 +00:00
tjhunt cf0031eef4 admin tree: MDL-10047 and MDL-13104 weird things happen when you turn editing on and off.
That was becuase not enough information was being passed in for the blocks editing controls to construct the right URL to reload the page.

It is also now possible for admin external pages to add some UI next to the turn blocks editing on/off button. For example, when you are editing the list of course catgories, the turn editing off button is now in the right place.
2008-12-11 09:21:52 +00:00
tjhunt bae97d133b forum subscriptions: MDL-14876 user of deprecated functions was breaking managing subscribers.
This was visible when, for example, unusual role definitions meant that someone could access a forum without being enrolled in a course.

Note that one of the places that was previously broken was front page forums. Since subscribers.php does not do paging at all, the fact that I have fixed this bug makes this page dangerous on large sites. A proper solution will have to wait until bug 17550 is fixed in HEAD.

This also fixes a minor problem introduced by MDL-12979.
2008-12-11 07:02:09 +00:00
tjhunt 4f4fa095e9 question bank: MDL-14376 Errors deleting a course containing Cloze questions.
(For some reason, this only seemed to cause problems on MySQL.)
2008-12-11 05:31:41 +00:00
dongsheng 576fe29a1c "MDL-16954, get rid of remote_addr notice on cli, set ip = 0.0.0.0 in mdl_log table when accessed from cli" 2008-12-11 05:17:02 +00:00
tjhunt 50a8526252 multianswer qtype help: Fix HTML errors. 2008-12-11 05:14:39 +00:00
tjhunt 5be081f0d9 matching qtype: MDL-14420 Could not use '0' as a question stem. Oops, more tests need to be corrected. 2008-12-11 05:01:43 +00:00
tjhunt 112b018900 matching qtype: MDL-14420 Could not use '0' as a question stem. Bloody PHP! 2008-12-11 04:57:45 +00:00
tjhunt 2c87248acc matching qtype: whitespace cleanup. 2008-12-11 04:55:48 +00:00
dongsheng e6551f36d0 "MDL-17469, fix assignment date when restore course" 2008-12-11 04:37:11 +00:00
tjhunt 88575207d3 numerical qtype: MDL-15159 Error moving a numerical question type with no units from one category to another. 2008-12-11 04:33:48 +00:00
moodlerobot 4058e8bacc Updated the 19 build version to 20081211 2008-12-10 23:54:14 +00:00
thepurpleblob dc37ac0b2f MDL-11090
Added absent trim - Thanks Tim :-)
2008-12-10 09:37:37 +00:00
dongsheng f3355b7b06 "MDL-17570, cleanup inline css" 2008-12-10 07:09:48 +00:00
tjhunt 110b003f86 quiz manual grading: MDL-5517 manual grading pop-up is too small. HTML editor does not fit. 2008-12-10 07:06:18 +00:00
dongsheng 1c870741af "MDL-17570, cleanup inline css settings" 2008-12-10 06:30:23 +00:00
tjhunt 51134a7b79 quiz: MDL-6085 when editing a question from various places like a preview attempt or review screen, don't use a popup, instead take advantage of the fact that question.php now takes a returnurl. 2008-12-10 06:22:04 +00:00
dongsheng 7921d02f15 "MDL-17570, clean up align property in div" 2008-12-10 06:07:39 +00:00
dongsheng f9c1a62f86 "MDL-17570, cleanup align property in div" 2008-12-10 06:05:24 +00:00
tjhunt 4fb4ff22a6 Simple whitespace cleanup. 2008-12-10 05:32:58 +00:00
tjhunt 5d922e47f7 course request: MDL-17575 and MDL-6160 further improvements:
1/ email notification when course requested
2/ course request capability so that we can limit who can request new course
3/ list of my pending course requests on the request form

Implemented in 1.9 by Petr Skoda, and reviewed and merged to HEAD by me.
2008-12-10 02:57:51 +00:00
tjhunt bc7bc8e1d6 performance: MDL-17577 only include lib/questionlib.php from the few parts of mod/quiz/lib.php that actually need it. 2008-12-10 02:11:24 +00:00
tjhunt 7b7863fa69 truefalse qtype: MDL-12027 remove spurious alt attribute from truefalse qtype radio buttons. 2008-12-10 00:54:33 +00:00
moodlerobot 4a8ded6144 Updated the 19 build version to 20081210 2008-12-09 23:53:54 +00:00
piers 7eea186ea0 MDL-17572 - remove php short tags. backport to 1.9. 2008-12-09 22:03:01 +00:00
danmarsden 1067cd48e9 fix php short tags:MDL-17566: Thanks Stephen Bourget 2008-12-09 20:38:28 +00:00
skodak 5903377c7a MDL-17479 category search: replaced old update capability 2008-12-09 20:29:15 +00:00
skodak ef232b4294 MDL-17502 oops, I have overlooked Tim already fixed this - sorry 2008-12-09 16:34:37 +00:00
skodak 16d3155e4e MDL-17502 accesslib: added warning if incorrect parameters supplied to has_all_capabilities() and fixed parameters in course lib code; backported from HEAD 2008-12-09 16:26:16 +00:00
tjhunt 248be37230 course categories: MDL-17502 followup. Fix notices. I'm sure I remember writing this code yesterday! 2008-12-09 09:27:17 +00:00
tjhunt 20cd50e2e7 course settings: MDL-17501 fix potential problem for people upgrading 1.6 -> 1.9.4.
I am amazed that Petr spotted this. Great catch.
2008-12-09 04:49:06 +00:00
moodlerobot aaae02a573 Updated the 19 build version to 20081209 2008-12-08 23:53:30 +00:00
skodak 2fa8ad59f9 MDL-17559 user edit: fixed undefined email property warnings 2008-12-08 20:15:39 +00:00
exe-cutor b926e3dde5 Added Upgrade instructions for Shibboleth 2.x
Corrected some typos for logout section
2008-12-08 10:46:13 +00:00
exe-cutor 8f12ddef8e Added fix for Shibboleth 2.x 2008-12-08 10:45:47 +00:00
tjhunt 02d92a5513 course categories: MDL-17502 when deleting a category and its contents, check moodle/course:delete capability.
* Note: this would never lead to problems with default role definions.
* Also ended up mostly rewriting delete_category_form to simplify the messages that are displayed.
* New helper function require_all_capabilities, a bit like require_any_capability.
2008-12-08 07:28:04 +00:00
tjhunt da4676a27e course settings: MDL-17501 check for moodle/course:visibility in the course settings form.
1. If a user does not have that capability, don't let them change whether the course is visible.
2. Give teachers that capability by default.
3. To avoid regressions, on upgrade, give moodle/course:visibility to any role that has moodle/course:update.
2008-12-08 02:30:56 +00:00
tjhunt 56d2fd74d9 Fix typo in error message. 2008-12-08 01:18:44 +00:00
skodak 52b6dd1533 MDL-17368 removing unused html area spell checker - we have our own implementation 2008-12-08 00:11:14 +00:00
moodlerobot 3656fb017a Updated the 19 build version to 20081208 2008-12-07 23:53:27 +00:00
moodlerobot c1832e69da Automatic installer.php lang files by installer_builder (20081208) 2008-12-07 23:51:58 +00:00
skodak c396e2239c MDL-17519 - restore: preventing group member duplicates 2008-12-07 22:24:06 +00:00
danmarsden 99c13aae72 force scorm update:MDL-17034: force update of SCORM when scorm_simple_play is used. merged from HEAD 2008-12-07 22:18:29 +00:00
piers 374b0f29cd MDL-17115 - SCORM onload API checking. Hunt for the API. backport 1.9. 2008-12-07 22:15:24 +00:00
danmarsden 0857948493 skip content structure page:MDL-11908: skip content structure page with multiple scos - if a teacher has set to skip, it should skip! - even with multiple scos. merged from HEAD 2008-12-07 22:09:46 +00:00
skodak d3363def5a MDL-17537 course request: shortname field shortened because db can store max 15 chars 2008-12-07 21:54:35 +00:00
skodak 2bc4631d41 MDL-17547 added missing param type 2008-12-07 21:30:48 +00:00
stronk7 86a01e810f MDL-17545 activity names filter: Improve handling when name contains htmlentities() chars. 2008-12-07 18:55:18 +00:00
stronk7 d84dacba45 MDL-17518 resource names filter: Improve handling when name contains htmlentities() chars. 2008-12-07 17:32:44 +00:00
moodlerobot 89f67f45aa Updated the 19 build version to 20081207 2008-12-06 23:52:59 +00:00
skodak 1d7651e19f MDL-15785 new options for enforcing of enrolment key commplexity and requirements; backported from HEAD 2008-12-06 21:21:55 +00:00
skodak 540875d055 MDL-17372 fixed regression in 3rd party admin reports 2008-12-06 20:41:42 +00:00
skodak 0043e716bc MDL-11265 added shorter log retention periods and a warning that it might have some side effects; backported from HEAD 2008-12-06 17:45:30 +00:00
moodlerobot 4c83ff8612 Updated the 19 build version to 20081206 2008-12-05 23:53:04 +00:00
moodlerobot 4c47d171d1 Automatic installer.php lang files by installer_builder (20081206) 2008-12-05 23:51:36 +00:00
mchurch 13c223cb2f MDL-17539 - Added a 'courseid' condition to the 'LEFT JOIN' of 'lastaccess' to limit the records returned to the correctly requested course. 2008-12-05 21:35:47 +00:00
tjhunt 7f2e6a23a9 course request: MDL-9854 major cleanup to the course request code.
* Rewrite all the forms to use formslib and improve usability.
* Put the place where admins need to go to process approvals in the admin menu.
* Show the request course/pending requests button on the page for the category that requested courses get added to.
2008-12-05 08:57:06 +00:00
tjhunt 32b1759f9d quiz settings: MDL-16781 Avoid concatenating and calling strtolower on language strings. 2008-12-05 04:20:32 +00:00
dongsheng e753201ea8 HTMLAREA/MDL-17448
fix flaw in logic, yui event module shouldn't be loaded in IE. Credit go to Kris Thornley, thanks.
2008-12-05 00:57:21 +00:00
moodlerobot 5cc23984d6 Updated the 19 build version to 20081205 2008-12-04 23:53:10 +00:00
moodlerobot a853baa1ef Automatic installer.php lang files by installer_builder (20081205) 2008-12-04 23:51:41 +00:00
pichetp 72a0975fd2 MDL-17524 Merging from HEAD
Deleting a calculated question delete datasetdefinitions shared by other question
2008-12-04 16:32:16 +00:00
exe-cutor 9333948786 Added Shibboleth front and back channel logout support 2008-12-04 16:27:00 +00:00
tjhunt 79518165b9 course categories: Fix many bugs with category editing and permissions. Clean up code.
Bugs: MDL-17479, MDL-16426, MDL-16063, MDL-16013, MDL-15658, MDL-15556, MDL-15161, MDL-14925, MDL-13742, MDL-11557.

* Simplify category editing permissions to just moodle/category:manage and moodle/category:seehiddencategories.
* Enforce those correctly. (Note MDL 17502 is still outstanding.)
* Don't screw up category sort order when you just edit name or description.
* Niceties like where redirects go when you cancel or submit forms.
* Make sure a global course creator can see the site admin block.
* Don't allow a category to be made the child of one of its children!
* General code cleanup to bring key files more in line with best pracitice.

Apologies for the fact it is one big patch, rather than a series of smaller patches. However, categoryedit.php, category.php and index.php where in pretty bad shape and needed significant cleaning up. categoryedit.php, in particular, was almost completely rewritten.
2008-12-04 08:49:47 +00:00
dongsheng 39dc0663e2 "htmlarea/MDL-17448, fix enlarging htmlarea, thanks chris fryer" 2008-12-04 08:22:20 +00:00
dongsheng b1b3aede9c ASSIGNMENT, RESTORE/MDL-17469 2008-12-04 08:04:09 +00:00
piers 383570242d MDL-17310 - Fixup an issue with relative directory paths. Thanks Jonathan. backport 1.9. 2008-12-04 03:26:24 +00:00
moodlerobot be0420e2ee Updated the 19 build version to 20081204 2008-12-03 18:37:55 +00:00
moodlerobot 44805fee30 Automatic installer.php lang files by installer_builder (20081204) 2008-12-03 18:30:36 +00:00
ericmerrill bde30ae513 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:48:08 +00:00
samulik 2e9cb9d29a course import: MDL-17497 PHP was running out of memory if a category had a lot of courses. Now get_courses only fetches course id and fullname. 2008-12-03 16:31:01 +00:00
piers b645325d98 MDL-17498 - fix postgres compatibility on recent activity block integration, correct recent activity links to trigger actual assignments. Lots of whitespace fixing. 2008-12-03 05:59:11 +00:00
pichetp fcb5bc8193 MDL-17264 merging the last version from HEAD a second time... 2008-12-02 05:19:11 +00:00
tjhunt 270b6e3444 help file: MDL-17490 multianswer help file was in the wrong place. 2008-12-02 03:26:42 +00:00
skodak d41415da8a MDL-17392 - mailstop typo - credit goes to Daniel Neis, thanks 2008-12-01 22:37:12 +00:00
skodak 98d9032ce1 MDL-17486 added option to make my courses list in user profile hidden; backported from HEAD 2008-12-01 22:06:55 +00:00
skodak 741426a8f6 MDL-11261 hiddenuserfields/lastaccess now fully respected on participants page; backported from HEAD 2008-12-01 20:46:13 +00:00
skodak 67a8105001 MDL-11261 setting hidden user lastaccess now works on outline report; backported from HEAD 2008-12-01 20:02:27 +00:00
skodak b2908c36a7 MDL-17485 roles: fixed use and definition of moodle/user:viewuseractivitiesreport; backported from HEAD 2008-12-01 19:20:16 +00:00
tjhunt 059ec02aaa Fix notice. 2008-12-01 07:19:40 +00:00
tjhunt c353917324 Remove unnecessary extra $Id$ tag. It messes up the unmerged files list, and makes merging extra difficult. 2008-12-01 07:09:44 +00:00
tjhunt 426c2ba5b2 restore: MDL-17480 Potentially expensive function user_can_create_courses called repeatedly from restore UI. 2008-12-01 06:55:31 +00:00
danmarsden a546aa2eec don't use copy() for http based copies: MDL-16123: use download_file_content for external SCORM packages instead of copy() 2008-12-01 05:27:59 +00:00
skodak a1990f18ef MDL-11259 stats report: do not show links to logs if not having required capability; backported from HEAD 2008-11-30 21:34:29 +00:00
skodak 8d2ef9efe8 MDL-17472 notes: backported disabling of notes and general refactoring from HEAD 2008-11-30 19:25:48 +00:00
skodak f499321716 MDL-11984 blocks: new capability block/online_users:viewlist which may be used to restrict viewing of list of online users, if cap not allowed only number of users dispalyed, I hope this will be also faster because only one query used now (insetad of two); for BC reasons enabled by default in all legacy roles; backported from HEAD 2008-11-30 15:43:28 +00:00
skodak 8f2f9d3d08 file access.php was added on branch MOODLE_19_STABLE on 2008-11-30 15:43:28 +0000 2008-11-30 15:42:48 +00:00
skodak 89ee56ed69 MDL-17372 moving the categories out of the if cap block - cap report needs to add page there; backported from HEAD 2008-11-30 14:20:32 +00:00
skodak 7ea8ea7f0a MDL-17464 profile reports are now respecting course report caps; backported from HEAD 2008-11-30 12:05:03 +00:00
piers d45250b531 MDL-16651 - add in delete attempt capability - thanks Dan/Tim. backport 1.9. 2008-11-29 17:56:43 +00:00
skodak cecd63c9f2 MDL-17372 new course reports string - role definition improvement 2008-11-29 16:28:21 +00:00
skodak 1a16c4486c MDL-17465 - separate live log capability adn admin tree link; backported from HEAD 2008-11-29 16:23:45 +00:00
skodak 0d2aa4a617 MDL-17465 - separate live log capability adn admin tree link; backported from HEAD 2008-11-29 16:16:21 +00:00
skodak 19a4956b35 file indexlive.php was added on branch MOODLE_19_STABLE on 2008-11-29 16:16:22 +0000 2008-11-29 16:15:40 +00:00
skodak f93c5dcf23 MDL-17463 - renamed outline to activity report 2008-11-29 15:08:46 +00:00
skodak 22a987837c MDL-17463 - reparate capabilities for course and admin reports; backported from HEAD 2008-11-29 14:30:55 +00:00
skodak c6bfc43c7c file version.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:58 +0000 2008-11-29 14:22:15 +00:00
skodak f23d1d4057 file access.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:31:00 +0000 2008-11-29 14:22:15 +00:00
skodak 8c25e10349 file version.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:57 +0000 2008-11-29 14:22:14 +00:00
skodak 475a460b6e file report_courseoverview.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:58 +0000 2008-11-29 14:22:12 +00:00
skodak 9f1bf377ac file coursereport_stats.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:59 +0000 2008-11-29 14:22:12 +00:00
skodak ec3bd695f3 file coursereport_participation.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:58 +0000 2008-11-29 14:22:12 +00:00
skodak 26d7e0294c file coursereport_outline.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:59 +0000 2008-11-29 14:22:12 +00:00
skodak 37be511e7c file coursereport_log.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:58 +0000 2008-11-29 14:22:12 +00:00
skodak da9dcf8ef7 file version.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:31:00 +0000 2008-11-29 14:22:11 +00:00
skodak ee65d12cfe file access.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:31:01 +0000 2008-11-29 14:22:11 +00:00
skodak b989fe2b0f file access.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:59 +0000 2008-11-29 14:22:11 +00:00
skodak a429bdab98 file version.php was added on branch MOODLE_19_STABLE on 2008-11-29 14:30:55 +0000 2008-11-29 14:22:10 +00:00
skodak 7b6f15a8c4 MDL-17372 admin reports: Added full plugin support for admin reports - fixed sorting regression, plugins now loaded as last category; backported from HEAD 2008-11-28 08:12:51 +00:00
danmarsden e8b6d6f62c MDL-17115 - no point in waiting for SCORM API to load when we know JS is disabled. merged from HEAD 2008-11-28 06:49:49 +00:00
tjhunt ae7b2e3829 random essay questions: MDL-8648 Allow essay questions to be selected by random question.
In the 1.9 branch this is controlled by a new option under Admin -> Experimental. In Moodle 2.0 dev it is not optional, it just works.

The main change is letting the manual grading report know which random questions might need manual grading. MDL-4004 - this depends on the random question under consideration, which requires a new questiontype method.

I also changed the random question code so that I could remove some global variables.
2008-11-28 06:07:24 +00:00
tjhunt 52e24fe922 file qtype_random.php was added on branch MOODLE_19_STABLE on 2008-11-28 06:07:24 +0000 2008-11-28 06:07:12 +00:00
ikawhero 0c51eaa6f0 MDL-17434 Full URLs for enrol/unenrol links 2008-11-28 06:03:16 +00:00
tjhunt 5c4bcc266e questionlib: fix typo. 2008-11-28 02:41:06 +00:00
moodlerobot 57dfa1557b Updated the 19 build version to 20081128 2008-11-28 01:57:46 +00:00
skodak 12748c8425 MDL-17372 course reports: Added full plugin support for course reports - backported from HEAD 2008-11-27 20:31:02 +00:00
tjhunt 901c4aae9f question bank: MDL-14434 Cannot edit the only question category in a context. 2008-11-27 11:50:20 +00:00
tjhunt 761e1f5cb5 listlib: MDL-17422 Paging in listlib was badly screwed 2008-11-27 10:53:40 +00:00
tjhunt 874be4b0f0 question bank: MDL-17078 Error after deleting a question category. 2008-11-27 07:30:11 +00:00
tjhunt 4ec232ec6a health centre: MDL-16935 Question categories should belong to a valid context solution has SQL that does not work in MySQL 2008-11-27 05:57:04 +00:00
tjhunt 3cacf33b58 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:47 +00:00
tjhunt 35c7aaa325 quiz item analysis report: MDL-13427 <br> tags in the headers of some columns. 2008-11-27 04:48:11 +00:00
moodlerobot 331fb695a9 Updated the 19 build version to 20081127 2008-11-27 02:03:18 +00:00
skodak 2d89f2de76 MDL-17372 admin reports: Added full plugin support for admin reports; added specail capability for unittest execution, minor refactoring - backported from HEAD 2008-11-26 20:58:03 +00:00
skodak 2910d40ad0 file version.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:04 +0000 2008-11-26 19:27:41 +00:00
skodak e998027091 file settings.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:07 +0000 2008-11-26 19:27:41 +00:00
skodak 065a86dbf7 file settings.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:03 +0000 2008-11-26 19:27:41 +00:00
skodak 8a893ed82f file report_unittest.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:06 +0000 2008-11-26 19:27:41 +00:00
skodak 3b85388c00 file index.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:04 +0000 2008-11-26 19:27:41 +00:00
skodak a5eebeaea3 file access.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:07 +0000 2008-11-26 19:27:41 +00:00
skodak 087d36b6e5 file report.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:05 +0000 2008-11-26 19:27:40 +00:00
skodak 8e66f84d9f file settings.php was added on branch MOODLE_19_STABLE on 2008-11-26 20:58:06 +0000 2008-11-26 19:27:39 +00:00
thepurpleblob ebce25e7b9 MDL-17125
Fix as suggested by Jonathan Kemp.
2008-11-26 15:13:51 +00:00
thepurpleblob 0afa12be00 MDL-11090
Passwords are now held in clear text so you can see what the password
is on the config screen.
Still backward compatible with old md5 passwords (which are still not displayed
of course)
2008-11-26 14:30:22 +00:00
thepurpleblob 1272fbf749 MDL-17411
defaultquestion() now reflects the one in the question bank code, thus supressing
lots of notices
2008-11-26 13:08:32 +00:00
thepurpleblob 498e0d12d8 MDL-14155
$a in string no longer required. Changed the text slightly to make it make some sense.
2008-11-26 11:49:11 +00:00
moodlerobot 08cbafdeac Updated the 19 build version to 20081126 2008-11-26 02:03:24 +00:00
moodlerobot 7b9d66434b Automatic installer.php lang files by installer_builder (20081126) 2008-11-26 01:56:28 +00:00
jerome 5649654bd5 database: MDL-16999 update 'Required Entries' warning message 2008-11-25 02:43:53 +00:00
moodlerobot 71a93cd00e Updated the 19 build version to 20081125 2008-11-25 02:00:15 +00:00
pichetp a208bffde9 MDL-17264 Merged from HEAD
Adding control of usecase for the shortanswer type using SHORTANSWER_C or
 SAC or MWC,
2008-11-24 16:46:31 +00:00
dongsheng cc89382bdc FILTER/MDL-17360
media plugin is truncating width and height to 3 digits, patched by Vlas Voloshin.
2008-11-24 01:59:12 +00:00
moodlerobot 04bf1303c2 Updated the 19 build version to 20081124 2008-11-24 01:58:48 +00:00
moodler 542cd89f8d Emoticons MDLSITE-564 Patch to avoid [[brackets]] around alt text 2008-11-24 01:02:33 +00:00
jerome 490414af8d database: MDL-16999 move the flag from config table to config_plugins table 2008-11-24 00:51:58 +00:00
piers 4df7f4237e MDL-17310 - take the opportunity to change the scorm defaults to a highest grade orientation. backport to 1.9. 2008-11-23 21:41:40 +00:00
moodlerobot dad879ae99 Updated the 19 build version to 20081123 2008-11-23 01:53:00 +00:00
moodlerobot f0a8545516 Automatic installer.php lang files by installer_builder (20081123) 2008-11-23 01:46:38 +00:00
moodlerobot 67aea44be9 Updated the 19 build version to 20081122 2008-11-22 02:05:49 +00:00
moodlerobot ae3c9c36d4 Automatic installer.php lang files by installer_builder (20081122) 2008-11-22 01:59:18 +00:00
mudrd8mz daed839963 MDL-17357 Removed duplicate string definition 2008-11-21 23:04:06 +00:00
mudrd8mz 9280eac530 MDL-17356 Use Unix style end of lines 2008-11-21 22:46:31 +00:00
jerome f597bba458 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. 2008-11-21 07:01:00 +00:00
moodlerobot 54d2128109 Updated the 19 build version to 20081121 2008-11-21 02:12:19 +00:00
moodlerobot eeae9616be Automatic installer.php lang files by installer_builder (20081121) 2008-11-21 02:05:15 +00:00
nicolasconnault 10b1faa27f MDL-17218 Copied the image where the css expects it to be. 2008-11-20 14:36:10 +00:00
moodlerobot 5cbd2c991b Updated the 19 build version to 20081120 2008-11-20 02:01:40 +00:00
skodak 5866dee70a MDL-17236 html block: proper cleanup of html; backported from HEAD 2008-11-19 16:47:13 +00:00
skodak c1ed31c01f MDL-17310 scorm: Install asks for scorm &auth questions on install rather than just front page settings - whitespace 2008-11-19 15:11:25 +00:00
skodak f92fbb037d MDL-17274 security: register globals not supported- now we are preventing upgrades and installs too; backported from HEAD 2008-11-19 09:46:38 +00:00
moodlerobot 934f6bd973 Updated the 19 build version to 20081119 2008-11-19 02:10:25 +00:00
moodlerobot 9be463a33b Automatic installer.php lang files by installer_builder (20081119) 2008-11-19 02:03:28 +00:00
stronk7 836bd9aad4 MDL-15534 Wiki 1.0: Allow to display "Site map for" using i18n Moodle strings 2008-11-19 01:25:49 +00:00
skodak 63e73da77b 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:43:34 +00:00
moodlerobot f3b83353e7 Updated the 19 build version to 20081118 2008-11-18 01:54:30 +00:00
moodlerobot f1855ba03b Automatic installer.php lang files by installer_builder (20081118) 2008-11-18 01:48:29 +00:00
stronk7 5979de1b0e MDL-15425 Coding style: Change some logical operator uses. Thanks Robert! 2008-11-18 00:08:39 +00:00
stronk7 d8f015100a MDL-17200 deprecated & front page: Fix deprecated get_course_users() and get_course_students() to work properly against front page. 2008-11-17 22:52:29 +00:00
moodlerobot b3bca79c74 Updated the 19 build version to 20081117 2008-11-17 02:08:40 +00:00
moodlerobot 465bd9f5be Automatic installer.php lang files by installer_builder (20081117) 2008-11-17 02:02:03 +00:00
stronk7 d3a94cbbe4 Mini-bump version 2008-11-16 23:38:27 +00:00
stronk7 de67f68127 MDL-16879 Backup & mnet: Avoid problems in sites missing mnet_host records being more flexible in backup (outer join). 2008-11-16 23:20:47 +00:00
stronk7 0329e38af7 MDL-17227 forum: seekey-ize forum prune (split) 2008-11-16 22:45:05 +00:00
moodlerobot b5c9d33a7f Updated the 19 build version to 20081116 2008-11-16 01:51:53 +00:00
iarenaza d430e7feb5 file resources: MDL-14541 Object tag embedding PDF's and nested Flash objects does not work reliably
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:22:32 +00:00
moodlerobot dd50f0d6da Updated the 19 build version to 20081115 2008-11-15 01:55:48 +00:00
moodlerobot 296da1a31b Automatic installer.php lang files by installer_builder (20081115) 2008-11-15 01:48:06 +00:00
stronk7 ef0d6a6a8f MDL-17227 forum: add sesskey to post/discussion deletion 2008-11-14 08:50:45 +00:00
moodlerobot 24050cd891 Updated the 19 build version to 20081114 2008-11-14 02:01:41 +00:00
moodlerobot c303dca672 Automatic installer.php lang files by installer_builder (20081114) 2008-11-14 01:54:57 +00:00
piers 9e7f70ddab MDL-16810 - Allow site configuration of scorm settings. Thanks Jason Hardin. Backport 1.9. 2008-11-14 00:14:49 +00:00
piers b40bf0bf58 MDL-16949 - fix wrong addition of times in SCORM API, thanks Xabi Martin. backport 1.9. 2008-11-14 00:06:22 +00:00
nicolasconnault a60ed2afc6 MDL-17226 Hiding the group show/hide settings and toggle for grader report 2008-11-13 15:43:19 +00:00
wildgirl cb03609eed lesson lang string: MDL-17209 typo fix 2008-11-13 14:59:43 +00:00
wildgirl 926da7c331 xmldb lang string: MDL-17209 typo fix 2008-11-13 14:58:09 +00:00
wildgirl 01edd51f1a qtype_datasetdependent lang string: MDL-17209 typo fix 2008-11-13 14:56:28 +00:00
wildgirl 0a3eb4efac wiki lang string: MDL-17209 typo fix 2008-11-13 14:54:17 +00:00
wildgirl 74ed9155a1 install lang string: MDL-17209 typo fix 2008-11-13 14:52:06 +00:00
wildgirl e6e54c85e9 auth lang string: MDL-17209 typo fix 2008-11-13 14:50:05 +00:00
wildgirl 79875473a4 mnet lang string: MDL-17209 typo fix 2008-11-13 14:47:57 +00:00
wildgirl fca0b1c6dd qtype_truefalse lang string: MDL-16942 typo fix 2008-11-13 14:24:01 +00:00
wildgirl f29dd7aac0 profilesforenrolledusersonly setting: MDL-17143 lang string rewording 2008-11-13 11:22:15 +00:00
tjhunt ac9c42de1f course settings: MDL-16327 when creating a course, the role renames were not saved. 2008-11-13 08:21:47 +00:00
moodlerobot eddf18d9f2 Updated the 19 build version to 20081113 2008-11-13 01:57:26 +00:00
moodlerobot fa44bc2fb8 Automatic installer.php lang files by installer_builder (20081113) 2008-11-13 01:51:23 +00:00
sam_marshall 2232f4fbd9 MDL-17164: Glossary autolinking doesn't work for entries similar to current entry 2008-11-12 17:02:23 +00:00
pichetp 6995ba729a MDL-14763 remove automatic numbering of multichoice vertical or horizontal display 2008-11-12 07:05:21 +00:00
danmarsden 49d62e0d49 scorm: MDL-16185 display warning when zlib_compression on - causes errors with certain browsers. merged from HEAD 2008-11-12 06:37:35 +00:00
moodlerobot bc6d265d16 Updated the 19 build version to 20081112 2008-11-12 02:12:13 +00:00
stronk7 aeaff0b308 MDL-17143 Bump version to force new profilesforenrolledusersonly setting 2008-11-11 19:09:10 +00:00
stronk7 b0a9e1c532 MDL-17143 Some improvements suggested by Petr applied. 2008-11-11 19:00:48 +00:00
mjollnir_ 802af00aea Merged from HEAD: MDL-17207 filter/tex reverting removal of $pathname in
http://cvs.moodle.org/moodle/filter/tex/texed.php?r1=1.8&r2=1.7

This fixes a security problem only triggered with register_globals ON and magic_quotes_gpc OFF which is a very uncommon case

CVS: ----------------------------------------------------------------------
CVS: Enter Log.  Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS: 	filter/tex/texed.php
CVS: ----------------------------------------------------------------------
2008-11-11 18:35:42 +00:00
stronk7 f77f4743e2 MDL-17143 deleting one line that shouldn't be in core. Sorry. 2008-11-11 18:34:50 +00:00
stronk7 e9a53fb1ba MDL-17143 Avoid notices caused by not existing profilesforenrolledusersonly setting 2008-11-11 18:31:07 +00:00
jerome 4847ef9b3a activities search: MDL-13987 remove AS from SQL 2008-11-11 07:55:30 +00:00
tjhunt 5e304e4900 role assign: MDL-13325 when assigning roles inside front page activites, list all users as potential users. 2008-11-11 07:23:36 +00:00
moodlerobot a98b19c219 Updated the 19 build version to 20081111 2008-11-11 02:07:48 +00:00
moodlerobot 4d5b31c269 Automatic installer.php lang files by installer_builder (20081111) 2008-11-11 02:01:21 +00:00
pichetp 2e9f0b00e4 MDL-14763 new lang strings and MDL-17134 merged from HEAD 2008-11-10 19:54:41 +00:00
pichetp 1bda18dfb0 MDL-14763 new help file merged from HEAD 2008-11-10 19:44:27 +00:00
stronk7 58cbd74d66 MDL-17122 lang files: Reverting last manual commit. Installer lang files must be
generated automatically (by inclusion of strings in stringnames.txt)
2008-11-10 09:24:54 +00:00
tjhunt 5e1fd88ecb random questions: MDL-17185 regression from MDL-17160 random questions were no longer randomising.
Backporting Jamie's fix to 1.9, and making a minor improvement along the way.
2008-11-10 07:56:43 +00:00
jerome 5b64744053 Installation: MDL-17122 add comment and link to the Moodle Docs in the postgresql installation database page 2008-11-10 04:57:20 +00:00
dongsheng 85f1f34c85 "MDL-17143, don't display the user description at all when user isn't enrolled in any courses" 2008-11-10 02:57:00 +00:00
tjhunt 5c4db861ab quiz reports overview: MDL-17168 Cancelling 'are you sure you want to delete this attempt' still deletes it.
Report and fix thanks to Federico Botti. This was already fixed in 2.0, and was not a problem in 1.8. Therefore no need to merge.
2008-11-10 02:43:35 +00:00
moodlerobot 1964efc04b Updated the 19 build version to 20081110 2008-11-10 01:56:03 +00:00
pichetp bcc1885779 Merge from HEAD MDL-17104 and MDL-17105 unused old questions are deleted more
correclty and take in account that the actual questiontype/save_question()
create a new question  when categorytomove is not set..
2008-11-09 23:44:36 +00:00
stronk7 5037cf7014 MDL-17171 Glossary: Correct breadcrumb when exporting glossary. 2008-11-09 22:55:39 +00:00
piers 2bb6c9fbe4 MDL-17178 - fix grade update so that it happens both when the lesson status, and the score changes. Backport to 1.9. Fix bad debug statement in code (sorry). 2008-11-09 22:39:20 +00:00
piers 172e3b12a2 MDL-17178 - fix grade update so that it happens both when the lesson status, and the score changes. Backport to 1.9. 2008-11-09 22:33:12 +00:00
moodlerobot ec5978ac13 Updated the 19 build version to 20081109 2008-11-09 01:56:46 +00:00
moodlerobot 4c4faf547f Updated the 19 build version to 20081108 2008-11-08 01:55:08 +00:00
ikawhero 418a1ffb39 MDL-17151: Missing code to check for uniqueness of values 2008-11-07 05:51:54 +00:00
tjhunt e87035545b random questions: MDL-17160 Adding random questions, maximum option.
When counting how many options to put in the add NN random questions dropdown, we should only count questions of types that are usable by random.
2008-11-07 05:50:08 +00:00
jerome 11a786d55e MDL-13987: fix navigation links for Activities Administration page: check that the course list is not empty 2008-11-07 05:40:04 +00:00
jerome cac15c9ff3 MDL-13987: fix bottom navigation links for Activities Administration page 2008-11-07 05:34:09 +00:00
moodler 69017ad364 auth/cas MDL-17121 Upgraded to latest version which is LGPL 2008-11-07 01:59:35 +00:00
ikawhero 34c01a4a02 MDL-17151: Fixed typo. 2008-11-07 01:58:16 +00:00
moodlerobot 20a594645a Updated the 19 build version to 20081107 2008-11-07 01:54:55 +00:00
jerome 0baeccfd24 MDL-13987: fix navigation links for Activities Administration page 2008-11-07 01:52:50 +00:00
tjhunt 557caae4eb quiz results block: MDL-17137 block_quiz_results: manager links to group/overview are wrong.
Eloy told me exactly what to change. I don't know why he did not commit the fix himself!
2008-11-06 06:14:12 +00:00
moodlerobot 2d2955bc70 Updated the 19 build version to 20081106 2008-11-06 02:20:11 +00:00
danmarsden 710e078327 MDL-17140 should check if $data->id isn't empty before sending to get_record merged from HEAD 2008-11-06 01:05:59 +00:00
skodak 7a80df2bbc MDL-17110 snoopy: added import info; backported from HEAD 2008-11-05 09:14:09 +00:00
skodak 577d9d6de6 file moodle_readme.txt was added on branch MOODLE_19_STABLE on 2008-11-05 09:14:09 +0000 2008-11-05 09:13:38 +00:00
danmarsden b92ef5be76 MDL-17071 fix misleading text - it's removing enrolments not assignments - merged from HEAD 2008-11-05 07:14:08 +00:00
danmarsden 26aa7a8db9 MDL-17128 SCORM backuplib generates invalid XML - causes backup to fail. thanks to Mark Nielsen for patch. merged from HEAD 2008-11-05 06:53:02 +00:00
moodlerobot 1866371731 Updated the 19 build version to 20081105 2008-11-05 02:20:24 +00:00
stronk7 1905721bee MDLSITE-548 - langconfig: Adding thousands separator. 2008-11-04 16:39:08 +00:00
stronk7 8dc2432c92 MDLSITE-548 - langconfig: Adding thousands separator. Backported from HEAD. 2008-11-04 16:27:57 +00:00
wildgirl 436294e18c MDL-13702 example replaced with simpler one 2008-11-04 12:25:58 +00:00
jerome cc99016319 MDL-10021: display iframe when the resource is on another domain 2008-11-04 05:09:42 +00:00
jerome 39889df28a MDL-10021: fix xhtml/javascript 2008-11-04 02:25:43 +00:00
moodlerobot ed7ba2f8bd Updated the 19 build version to 20081104 2008-11-04 02:07:28 +00:00
moodlerobot 19202892a7 Automatic installer.php lang files by installer_builder (20081104) 2008-11-04 01:59:54 +00:00
jerome 6ebb04cff6 MDL-10021: use build_navigation() instead a string into print_header() 2008-11-04 01:52:33 +00:00
skodak b97a5d97bd MDL-17110 snoopy: imported new version 1.2.4; backported from HEAD 2008-11-03 07:56:36 +00:00
dongsheng b7c8bfd263 "MDL-16954, use rebert\'s patch to clean notice/warning in cron job via php cli" 2008-11-03 05:21:45 +00:00
moodlerobot f0f28e3a4e Updated the 19 build version to 20081103 2008-11-03 01:50:27 +00:00
moodlerobot 78eac44451 Updated the 19 build version to 20081102 2008-11-02 01:47:06 +00:00
skodak 57bdd314e4 MDL-17027: protect user profile images if $CFG->forcelogin enabled 2008-11-01 22:28:54 +00:00
skodak 9f29866371 MDL-17065 user: profile iamges of deleted users are not accessible anymore 2008-11-01 19:35:46 +00:00
mudrd8mz f00e699477 MDL-17094 Automatic language update can be disabled via $CFG->skiplangupgrade settings. 2008-11-01 19:30:56 +00:00
skodak b29f0b5d59 MDL-11789 fixed regressions preventing file caching when default used 2008-11-01 19:27:36 +00:00
skodak c372f7bac5 CONTRIB-849 phpPgAdmin integration hook 2008-11-01 17:52:21 +00:00
moodlerobot 7aa5da8b2e Updated the 19 build version to 20081101 2008-11-01 01:45:06 +00:00
stronk7 2fe9a6d323 MDL-14952 - roles: 'moodle/legacy:guest' was preventing admins to post
new discussions in fron page if $CFG->defaultfrontpageroleid = guest.
2008-11-01 00:28:40 +00:00
piers fc89ab2433 MDL-7068 - SCORM 2004 compliance - fix mod/scorm to handle core data elements correctly - now passes test DMI. backport 1.9. 2008-10-31 22:59:17 +00:00
stronk7 fac8b5db4f MDL-14998 - roles: add mod/forum:viewdiscussion protection to forum_get_discussions() 2008-10-31 21:48:21 +00:00
mudrd8mz 97928e7e50 MDL-17094 Allow translators to disable automatic language update during Moodle upgrade.
One needs just add $CFG->skiplangupgrade = true; to their config.php and keep their language pack up-to-date manually. This is intended for lang pack maintainers with CVS access only.
2008-10-31 21:01:03 +00:00
stronk7 0dca43644d MDL-14998 - roles: User needs to have mod/forum:viewdiscussion to be able to see news block. 2008-10-31 19:04:03 +00:00
jerome a4e5cc84e0 MDL-10021: change frame into object tag when display a Link Resource with navigation bar 2008-10-31 05:55:56 +00:00
moodlerobot f8b220ec70 Updated the 19 build version to 20081031 2008-10-31 02:08:29 +00:00
danmarsden 5123fa76c8 MDL-17050 excorising $_POST - thanks to mikec for patch - also check groupmode before bothering to get groupstuff to save some trees. merged from HEAD 2008-10-31 00:56:05 +00:00
gbateson 0105dfc1f3 MDL-16300: use cache to minimize use of get_users_by_capability() 2008-10-30 07:27:00 +00:00
gbateson 75f484f534 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:23:41 +00:00
moodlerobot c9c457c268 Updated the 19 build version to 20081030 2008-10-30 01:53:03 +00:00
peterbulmer 8fca983968 MDL-15942 catch one more mnet update needing secure commit
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 01:42:17 +00:00
peterbulmer 1a445dc3fc MDL-17038 bugfixes
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 01:40:21 +00:00
peterbulmer 00959494a6 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 01:39:45 +00:00
peterbulmer d5942d6a6f MDL-17038 formatting correction
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 01:39:09 +00:00
peterbulmer 5b407159d5 MDL-17038 Change to use sensible variable names
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 01:38:39 +00:00
peterbulmer e3c3610af1 MDL-17038 - refine query to limit size of returned data.
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2008-10-30 01:21:15 +00:00
piers 10610a60bc MDL-17052 - remove use of $_POST. backport to 1.9. 2008-10-29 16:15:03 +00:00
moodlerobot f0abdc5c72 Updated the 19 build version to 20081029 2008-10-29 01:50:47 +00:00
moodlerobot 13069faafe Updated the 19 build version to 20081028 2008-10-28 01:53:08 +00:00
tjhunt 3f51bef08c qtype multichoice: MDL-17029 - followup - revert my overzealous copying and pasting. Thanks to Myles Carrick for noticing my mistake. 2008-10-27 23:36:04 +00:00
tjhunt f42636806d qtype multichoice: MDL-17029 answernumbering option was not being backed up or restored. 2008-10-27 04:23:08 +00:00
tjhunt 4043d93219 qtype match: MDL-16450 Change validation so it is possible to create matching questions with two stems and three answers.
Thanks to Oleg Sychev for implementing this.
2008-10-27 02:33:28 +00:00
moodlerobot 700ba226f7 Updated the 19 build version to 20081027 2008-10-27 01:46:06 +00:00
moodlerobot 1db7d40fc9 Automatic installer.php lang files by installer_builder (20081027) 2008-10-27 01:39:27 +00:00
moodlerobot 156a376c41 Updated the 19 build version to 20081026 2008-10-26 01:41:26 +00:00
moodlerobot 0ada42290c Updated the 19 build version to 20081025 2008-10-25 01:51:42 +00:00
robertall 4e96b320ec [MDL-15425] Search Filters are too persistant 2008-10-24 19:47:47 +00:00
skodak 6e91016520 MDL-16785 bogus grades inserted when formulas used - credit Michael Spall and Ann Adamcik 2008-10-24 17:47:56 +00:00
sam_marshall 20c30ac5e4 MDL-16756: Groups bugfixes and multiple select support for deletion 2008-10-24 13:34:12 +00:00
sam_marshall a240818cf3 file delete.php was added on branch MOODLE_19_STABLE on 2008-10-24 13:34:13 +0000 2008-10-24 13:31:49 +00:00
tjhunt ead49b0e44 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:54:16 +00:00
moodlerobot c457a17af4 Updated the 19 build version to 20081024 2008-10-24 01:56:23 +00:00
moodlerobot ba0f099ade Updated the 19 build version to 20081023 2008-10-23 02:04:36 +00:00
nicolasconnault b75bb79414 MDL-16962 New formslib element for dropdowns with a link to another page. Applied to outcome item and outcome edit pages. 2008-10-22 09:19:30 +00:00
nicolasconnault 2bc741e66a MDL-16962 New formslib element for dropdowns with a link to another page. Applied to outcome item and outcome edit pages. 2008-10-22 09:09:31 +00:00
fmarier 112de10a61 backuplib: MDL-16945 remove the uid alias since it's a reserved field on Oracle 2008-10-22 03:04:12 +00:00
fmarier d9b3406111 moodlelib/welcome message: MDL-16947 use the userid that was passed in for the profile URL 2008-10-22 02:33:11 +00:00
moodlerobot 21de218e57 Updated the 19 build version to 20081022 2008-10-22 01:56:54 +00:00
jerome 98cc1b062d MDL-16929: fix bulk user download function. (the shortname column title is now profile_field_"shortname") 2008-10-22 01:32:22 +00:00
stronk7 06306ddd94 Bumped to 1.9.3+ (before weekly build) 2008-10-21 23:06:55 +00:00
tjhunt 73de6ccc13 qtype description: MDL-16863 Put back edit icon next to descriptions for teachers. 2008-10-21 06:33:58 +00:00
tjhunt ec3d11dd00 quiz reports: MDL-16948 SQL does not work in Oracle - you are not allowed to refer to output column names in GROUP BY. Fix thanks to Francois Marier. 2008-10-21 05:45:28 +00:00
moodlerobot d7d10cd3d4 Updated the 19 build version to 20081021 2008-10-21 01:51:31 +00:00
arborrow af20b75c55 MDL-16939 - adding check type exists to avoid PHP notice in build_navigation function 2008-10-20 17:47:52 +00:00
nicolasconnault 1f02086d55 MDL-16892 Fixed bug in accesslib role_fix_names method 2008-10-20 13:43:12 +00:00
moodlerobot 44c64196fb Updated the 19 build version to 20081020 2008-10-20 01:54:27 +00:00
moodlerobot e1009af391 Updated the 19 build version to 20081019 2008-10-19 01:46:12 +00:00
moodlerobot 4a36974d3b Automatic installer.php lang files by installer_builder (20081019) 2008-10-19 01:40:08 +00:00
moodlerobot 523a5947a3 Updated the 19 build version to 20081018 2008-10-18 01:47:45 +00:00
arborrow bddc038848 fixed trivial typo in comment 2008-10-18 00:10:00 +00:00
stronk7 f81e0a1d06 Adding correct Office 2007 mime types. MDL-15987 2008-10-17 18:03:21 +00:00
nicolasconnault af4c52b849 MDL-13702 Added language help file 2008-10-17 14:55:10 +00:00
nicolasconnault 85db26a355 MDL-16917 small semantic change 2008-10-17 14:33:37 +00:00
nicolasconnault 9e9b288017 MDL-13259 Redirecting to creation of new scale when none exists. 2008-10-17 14:32:44 +00:00
nicolasconnault d3ee291624 MDL-16917 Fixed 2008-10-17 14:01:07 +00:00
moodlerobot abb176bfc0 Updated the 19 build version to 20081017 2008-10-17 01:54:43 +00:00
skodak f4d2786bb0 MDL-16903 mod/forum: undefined course context when forum subscription not allowed 2008-10-16 20:45:28 +00:00
nicolasconnault dfa5b89d74 MDL-16898 Extending include_path 2008-10-16 11:16:42 +00:00
moodlerobot dd4e8cbc7a Updated the 19 build version to 20081016 2008-10-16 02:02:13 +00:00
773 changed files with 29786 additions and 13368 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.
+19 -18
View File
@@ -40,7 +40,7 @@
}
if (!empty($CFG->showcrondebugging)) {
$CFG->debug = DEBUG_DEVELOPER;
$CFG->displaydebug = true;
$CFG->debugdisplay = true;
}
/// extra safety
@@ -245,7 +245,7 @@
while ($assign = rs_fetch_next_record($rs)) {
if ($context = get_context_instance(CONTEXT_COURSE, $assign->courseid)) {
if (role_unassign(0, $assign->userid, 0, $context->id)) {
mtrace("Deleted assignment for user $assign->userid from course $assign->courseid");
mtrace("removing user $assign->userid from course $assign->courseid as they have not accessed the course for over $CFG->longtimenosee days");
}
}
}
@@ -425,6 +425,23 @@
}
}
/// Run the auth cron, if any
/// before enrolments because it might add users that will be needed in enrol plugins
$auths = get_enabled_auth_plugins();
mtrace("Running auth crons if required...");
foreach ($auths as $auth) {
$authplugin = get_auth_plugin($auth);
if (method_exists($authplugin, 'cron')) {
mtrace("Running cron for auth/$auth...");
$authplugin->cron();
if (!empty($authplugin->log)) {
mtrace($authplugin->log);
}
}
unset($authplugin);
}
/// Run the enrolment cron, if any
if (!($plugins = explode(',', $CFG->enrol_plugins_enabled))) {
$plugins = array($CFG->enrol);
@@ -441,22 +458,6 @@
unset($enrol);
}
/// Run the auth cron, if any
$auths = get_enabled_auth_plugins();
mtrace("Running auth crons if required...");
foreach ($auths as $auth) {
$authplugin = get_auth_plugin($auth);
if (method_exists($authplugin, 'cron')) {
mtrace("Running cron for auth/$auth...");
$authplugin->cron();
if (!empty($authplugin->log)) {
mtrace($authplugin->log);
}
}
unset($authplugin);
}
if (!empty($CFG->enablestats) and empty($CFG->disablestatsprocessing)) {
require_once($CFG->dirroot.'/lib/statslib.php');
// check we're not before our runtime
+27 -10
View File
@@ -200,7 +200,7 @@
<ON_OK message="questioncwqpfsok" />
</FEEDBACK>
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/customcheckslib.php" function="php_check_register_globals" level="optional">
<CUSTOM_CHECK file="lib/customcheckslib.php" function="php_check_register_globals" level="required">
<FEEDBACK>
<ON_CHECK message="globalswarning" />
</FEEDBACK>
@@ -214,20 +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.4" level="required">
<PHP version="5.2.8" level="required">
</PHP>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="optional">
@@ -270,13 +270,30 @@
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
</PHP_EXTENSIONS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/customcheckslib.php" function="php_check_register_globals" level="optional">
<PHP_EXTENSION name="gd" level="optional">
<FEEDBACK>
<ON_CHECK message="globalswarning" />
<ON_CHECK message="gdrecommended" />
</FEEDBACK>
</CUSTOM_CHECK>
</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'];
}
}
?>
+9 -5
View File
@@ -363,7 +363,11 @@ class problem_000008 extends problem_base {
}
$oldmemlimit = get_real_size($oldmemlimit);
//now lets change the memory limit to something unique below 128M==134217728
@ini_set('memory_limit', 134217720);
if (empty($CFG->extramemorylimit)) {
raise_memory_limit('128M');
} else {
raise_memory_limit($CFG->extramemorylimit);
}
$testmemlimit = get_real_size(@ini_get('memory_limit'));
//verify the change had any effect at all
if ($oldmemlimit == $testmemlimit) {
@@ -374,7 +378,7 @@ class problem_000008 extends problem_base {
return false;
}
}
@ini_set('memory_limit', $oldmemlimit);
reduce_memory_limit($oldmemlimit);
return false;
}
function severity() {
@@ -660,10 +664,10 @@ class problem_000015 extends problem_base {
function solution() {
global $CFG;
return '<p>You can delete the empty categories by executing the following SQL:</p><pre>
DELETE FROM ' . $CFG->prefix . 'question_categories qc
DELETE FROM ' . $CFG->prefix . 'question_categories
WHERE
NOT EXISTS (SELECT * FROM ' . $CFG->prefix . 'question q WHERE q.category = qc.id)
AND NOT EXISTS (SELECT * FROM ' . $CFG->prefix . 'context con WHERE qc.contextid = con.id)
NOT EXISTS (SELECT * FROM ' . $CFG->prefix . 'question q WHERE q.category = ' . $CFG->prefix . 'question_categories.id)
AND NOT EXISTS (SELECT * FROM ' . $CFG->prefix . 'context con WHERE contextid = con.id)
</pre><p>Any remaining categories that contain questions will require more thought. ' .
'People in the <a href="http://moodle.org/mod/forum/view.php?f=121">Quiz forum</a> may be able to help.</p>';
}
+25 -13
View File
@@ -61,6 +61,10 @@
error("The PHP server variable 'file_uploads' is not turned On - $documentationlink");
}
if (is_float_problem()) {
print_error('phpfloatproblem', 'admin', '', $documentationlink);
}
if (empty($CFG->prefix) && $CFG->dbfamily != 'mysql') { //Enforce prefixes for everybody but mysql
error('$CFG->prefix can\'t be empty for your target DB (' . $CFG->dbtype . ')');
}
@@ -286,17 +290,22 @@
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');
print_box_end();
if (empty($CFG->skiplangupgrade)) {
print_box_start('generalbox', 'notice'); // MDL-8330
print_string('langpackwillbeupdated', 'admin');
print_box_end();
}
notice_yesno(get_string('environmenterrorupgrade', 'admin'),
'index.php?confirmupgrade=1&confirmrelease=1', 'index.php');
'index.php?confirmupgrade=1&amp;confirmrelease=1', 'index.php');
} else {
notify(get_string('environmentok', 'admin'), 'notifysuccess');
print_box_start('generalbox', 'notice'); // MDL-8330
print_string('langpackwillbeupdated', 'admin');
print_box_end();
if (empty($CFG->skiplangupgrade)) {
print_box_start('generalbox', 'notice'); // MDL-8330
print_string('langpackwillbeupdated', 'admin');
print_box_end();
}
echo '<form action="index.php"><div>';
echo '<input type="hidden" name="confirmupgrade" value="1" />';
echo '<input type="hidden" name="confirmrelease" value="1" />';
@@ -319,7 +328,7 @@
print_plugin_tables();
echo "<br />";
echo '<div class="continuebutton">';
print_single_button('index.php', array('confirmupgrade' => 1, 'confirmrelease' => 1), get_string('reload'), 'get');
echo '<a href="index.php?confirmupgrade=1&amp;confirmrelease=1" title="'.get_string('reload').'" ><img src="'.$CFG->pixpath.'/i/reload.gif" alt="" /> '.get_string('reload').'</a>';
echo '</div><br />';
echo '<form action="index.php"><div>';
echo '<input type="hidden" name="confirmupgrade" value="1" />';
@@ -344,7 +353,9 @@
upgrade_log_start();
/// Upgrade current language pack if we can
upgrade_language_pack();
if (empty($CFG->skiplangupgrade)) {
upgrade_language_pack();
}
print_heading($strdatabasechecking);
$db->debug=true;
@@ -467,6 +478,9 @@
/// Check all message output plugins and upgrade if necessary
upgrade_plugins('message','message/output',"$CFG->wwwroot/$CFG->admin/index.php");
/// Check all course report plugins and upgrade if necessary
upgrade_plugins('coursereport', 'course/report', "$CFG->wwwroot/$CFG->admin/index.php");
/// Check all admin report plugins and upgrade if necessary
upgrade_plugins('report', $CFG->admin.'/report', "$CFG->wwwroot/$CFG->admin/index.php");
@@ -540,10 +554,8 @@
set_config('adminblocks_initialised', 1);
}
/// Define the unique site ID code if it isn't already
if (empty($CFG->siteidentifier)) { // Unique site identification code
set_config('siteidentifier', random_string(32).$_SERVER['HTTP_HOST']);
}
/// Define the unique site ID code if it isn't already set. This getter does that as a side-effect.
get_site_identifier();
/// Check if the guest user exists. If not, create one.
if (! record_exists("user", "username", "guest")) {
+4 -4
View File
@@ -822,7 +822,7 @@
echo '<input type="hidden" name="sesskey" value="'.$USER->sesskey.'" />';
echo '<input type="hidden" name="currentfile" value="'.$currentfile.'" />';
echo '<input type="hidden" name="mode" value="helpfiles" />';
echo "<div align=\"center\">\n";
echo "<div class='mdl-align'>\n";
echo "<textarea rows=\"$fileeditorrows\" cols=\"$fileeditorcols\" name=\"filedata\">";
if (file_exists("$saveto/$currentfile")) {
echo htmlspecialchars(file_get_contents("$saveto/$currentfile"));
@@ -830,7 +830,7 @@
echo ($filetemplate);
}
echo "</textarea>\n</div>\n";
echo '<div align="center"><input type="submit" value="'.get_string('savechanges').'" /></div>';
echo '<div class="mdl-align"><input type="submit" value="'.get_string('savechanges').'" /></div>';
echo '</form>';
$preview_url = lang_help_preview_url($currentfile, !$uselocal);
if ($preview_url) {
@@ -842,7 +842,7 @@
if (is_readable("$altdir/$currentfile")) {
// show the content of the same help file in alternative location
echo '<fieldset><legend>'.$straltdirtitle.'</legend>';
echo "<div align=\"center\">\n";
echo "<div class='mdl-align'>\n";
echo "<textarea rows=\"$fileeditorrows\" cols=\"$fileeditorcols\" name=\"\">";
if (file_exists("$altdir/$currentfile")) {
echo htmlspecialchars(file_get_contents("$altdir/$currentfile"));
@@ -869,7 +869,7 @@
echo '<fieldset><legend>'.$strlangmasterenglish;
helpbutton('langpackages', $strlangmasterenglish);
echo '</legend>';
echo "<div align=\"center\">\n<textarea rows=\"$fileeditorrows\" cols=\"$fileeditorcols\" name=\"\">";
echo "<div class='mdl-align'>\n<textarea rows=\"$fileeditorrows\" cols=\"$fileeditorcols\" name=\"\">";
echo htmlspecialchars(file_get_contents($ensrc));
echo "</textarea>\n</div>\n";
$preview_url = lang_help_preview_url($currentfile, true, 'en_utf8'); // do not display en_utf8_local
+2 -2
View File
@@ -112,7 +112,7 @@
for ($a=0; $a < count($pathparts)-1 ; $a++) {
$checkpath .= "/".$pathparts[$a];
if(!file_exists($checkpath)){
if(!mkdir($checkpath)){
if(!mkdir($checkpath, $CFG->directorypermissions)){
echo ("Cannot create directory: $checkpath");
}
}
@@ -186,7 +186,7 @@ $langdir/$currentfile")."</font></p>";
if ($preview_url) {
link_to_popup_window($preview_url, 'popup', get_string('preview'));
}
echo '<div align="center"><input type="submit" value="'.get_string('savechanges').': lang/'.$currentlang.'/'.$currentfile.'" /></div>';
echo '<div class="mdl-align"><input type="submit" value="'.get_string('savechanges').': lang/'.$currentlang.'/'.$currentfile.'" /></div>';
echo '</form>';
}
+11 -4
View File
@@ -11,6 +11,13 @@
admin_externalpage_setup('langimport');
if (!empty($CFG->skiplangupgrade)) {
admin_externalpage_print_header();
print_box(get_string('langimportdisabled', 'admin'));
print_footer();
die;
}
$mode = optional_param('mode', 0, PARAM_INT); //phase
$pack = optional_param('pack', array(), PARAM_FILE); //pack to install
$displaylang = $pack;
@@ -43,8 +50,8 @@
if (confirm_sesskey() and !empty($pack)) {
set_time_limit(0);
@mkdir ($CFG->dataroot.'/temp/'); //make it in case it's a fresh install, it might not be there
@mkdir ($CFG->dataroot.'/lang/');
@mkdir ($CFG->dataroot.'/temp/', $CFG->directorypermissions); //make it in case it's a fresh install, it might not be there
@mkdir ($CFG->dataroot.'/lang/', $CFG->directorypermissions);
if (is_array($pack)) {
$packs = $pack;
@@ -160,8 +167,8 @@
}
}
@mkdir ($CFG->dataroot.'/temp/');
@mkdir ($CFG->dataroot.'/lang/');
@mkdir ($CFG->dataroot.'/temp/', $CFG->directorypermissions);
@mkdir ($CFG->dataroot.'/lang/', $CFG->directorypermissions);
foreach ($packs as $pack){ //for each of the remaining in the list, we
if ($pack == 'en_utf8') { // no update for en_utf8
continue;
+13 -4
View File
@@ -33,29 +33,36 @@
admin_externalpage_print_header();
print_heading(get_string('sitemaintenancemode', 'admin'));
print_box_start();
/// Print the appropriate form
if (file_exists($filename)) { // We are in maintenance mode
echo '<div style="margin-left:auto;margin-right:auto">';
echo '<div class="buttons">';
echo '<p>'.get_string('sitemaintenanceon', 'admin').'</p>';
echo '<form action="maintenance.php" method="post">';
echo '<div>';
echo '<input type="hidden" name="action" value="disable" />';
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
echo '<p><input type="submit" value="'.get_string('disable').'" /></p>';
echo '</div>';
echo '</form>';
echo '</div>';
} else { // We are not in maintenance mode
$usehtmleditor = can_use_html_editor();
echo '<div style="text-align:center;margin-left:auto;margin-right:auto">';
echo '<div class="buttons">';
echo '<form action="maintenance.php" method="post">';
echo '<div>';
echo '<input type="hidden" name="action" value="enable" />';
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
echo '<p><input type="submit" value="'.get_string('enable').'" /></p>';
echo '<p>'.get_string('optionalmaintenancemessage', 'admin').':</p>';
echo '<table><tr><td>';
echo '<div class="editor" style="width:600px;">'; // contains the editor
print_textarea($usehtmleditor, 20, 50, 600, 400, "text");
echo '</td></tr></table>';
echo '</div>';
echo '</div>';
echo '</form>';
echo '</div>';
@@ -65,5 +72,7 @@
}
}
print_box_end();
admin_externalpage_print_footer();
?>
+7
View File
@@ -123,6 +123,13 @@
if (!delete_records("course_modules", "module", $module->id)) {
notify("Error occurred while deleting all $strmodulename records in course_modules table");
}
if ($coursemods) {
foreach ($coursemods as $coursemod) {
if (!delete_context(CONTEXT_MODULE, $coursemod->id)) {
notify("Could not delete the context for $strmodulename with id = $coursemod->id");
}
}
}
// Then delete all the logs
if (!delete_records("log", "module", $module->name)) {
+39 -6
View File
@@ -20,8 +20,11 @@ page_map_class(PAGE_ADMIN, 'page_admin');
class page_admin extends page_base {
var $section;
var $section = '';
var $visiblepathtosection;
var $extraurlparams = array();
var $extrabutton = '';
var $url = '';
// hack alert!
// this function works around the inability to store the section name
@@ -62,6 +65,9 @@ class page_admin extends page_base {
function url_get_path() {
global $CFG;
if (!empty($this->url)) {
return $this->url;
}
$adminroot =& admin_get_root(false, false); //settings not required - only pages
@@ -73,8 +79,29 @@ class page_admin extends page_base {
}
}
/**
* Use this to pass extra HTML that is added after the turn blocks editing on/off button.
*
* @param string $extrabutton HTML code.
*/
function set_extra_button($extrabutton) {
$this->extrabutton = $extrabutton;
}
/**
* Use this to pass extra URL parameters that, for example, the blocks editing controls need to reload the current page accurately.
*
* @param array $extraurlparams paramname => value array.
*/
function set_extra_url_params($extraurlparams, $actualurl = '') {
$this->extraurlparams = $extraurlparams;
if (!empty($actualurl)) {
$this->url = $actualurl;
}
}
function url_get_parameters() { // only handles parameters relevant to the admin pagetype
return array('section' => (isset($this->section) ? $this->section : ''));
return array_merge($this->extraurlparams, array('section' => $this->section));
}
function blocks_get_positions() {
@@ -107,13 +134,19 @@ class page_admin extends page_base {
// The search page currently doesn't handle block editing
if ($this->section != 'search' and $this->user_allowed_editing()) {
$buttons = '<div><form '.$CFG->frametarget.' method="get" action="' . $this->url_get_path() . '">'.
'<div><input type="hidden" name="adminedit" value="'.($this->user_is_editing()?'off':'on').'" />'.
'<input type="hidden" name="section" value="'.$this->section.'" />'.
'<input type="submit" value="'.get_string($this->user_is_editing()?'blockseditoff':'blocksediton').'" /></div></form></div>';
$options = $this->url_get_parameters();
if ($this->user_is_editing()) {
$caption = get_string('blockseditoff');
$options['adminedit'] = 'off';
} else {
$caption = get_string('blocksediton');
$options['adminedit'] = 'on';
}
$buttons = print_single_button($this->url_get_path(), $options, $caption, 'get', '', true);
} else {
$buttons = '&nbsp;';
}
$buttons .= $this->extrabutton;
$navlinks = array();
foreach ($this->visiblepathtosection as $element) {
+1 -7
View File
@@ -23,13 +23,7 @@
$admin->country = $CFG->country;
}
if (empty($CFG->siteidentifier)) { // Unique site identification code
set_config('siteidentifier', random_string(32).$_SERVER['HTTP_HOST']);
}
/// Print headings
$stradministration = get_string("administration");
$strregistration = get_string("registration");
$strregistrationinfo = get_string("registrationinfo");
@@ -54,7 +48,7 @@
echo "<!-- Together they form a key. If any of these change between updates then the entry -->\n";
echo "<!-- is flagged as a new entry and will be manually checked by the list maintainer -->\n";
echo "<input type=\"hidden\" name=\"url\" value=\"$CFG->wwwroot\" />\n";
echo "<input type=\"hidden\" name=\"secret\" value=\"$CFG->siteidentifier\" />\n";
echo "<input type=\"hidden\" name=\"secret\" value=\"" . get_site_identifier() . "\" />\n";
echo "<input type=\"hidden\" name=\"host\" value=\"".$_SERVER["HTTP_HOST"]."\" />\n";
echo "<input type=\"hidden\" name=\"lang\" value=\"".current_language()."\" />\n";
+15 -1
View File
@@ -19,7 +19,7 @@ print_heading('Search and replace text throughout the whole database');
if (!data_submitted() or !$search or !$replace or !confirm_sesskey()) { /// Print a form
print_simple_box_start('center');
echo '<div align="center">';
echo '<div class="mdl-align">';
echo '<form action="replace.php" method="post">';
echo '<input type="hidden" name="sesskey" value="'.$USER->sesskey.'" />';
echo 'Search whole database for: <input type="text" name="search" /><br />';
@@ -40,6 +40,20 @@ if (!db_replace($search, $replace)) {
print_simple_box_end();
/// Try to replace some well-known serialised contents (html blocks)
notify('Replacing in html blocks...');
$sql = "SELECT bi.*
FROM {$CFG->prefix}block_instance bi
JOIN {$CFG->prefix}block b ON b.id = bi.blockid
WHERE b.name = 'html'";
if ($instances = get_records_sql($sql)) {
foreach ($instances as $instance) {
$blockobject = block_instance('html', $instance);
$blockobject->config->text = str_replace($search, $replace, $blockobject->config->text);
$blockobject->instance_config_commit($blockobject->pinned);
}
}
/// Rebuild course cache which might be incorrect now
notify('Rebuilding course cache...');
rebuild_course_cache();
+2 -5
View File
@@ -5,13 +5,10 @@
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot.'/backup/lib.php');
admin_externalpage_setup('reportbackups');
admin_externalpage_print_header();
$courseid = optional_param('courseid', 0, PARAM_INT);
require_capability('moodle/site:backup', get_context_instance(CONTEXT_SYSTEM));
admin_externalpage_setup('reportbackups');
admin_externalpage_print_header();
/// Scheduled backups are disabled by the server admin
if (!empty($CFG->disablescheduledbackups)) {
+3
View File
@@ -0,0 +1,3 @@
<?php // $Id$
$ADMIN->add('reports', new admin_externalpage('reportbackups', get_string('backups', 'admin'), "$CFG->wwwroot/$CFG->admin/report/backups/index.php",'moodle/site:backup'));
?>
+42
View File
@@ -0,0 +1,42 @@
<?php // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://moodle.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 //
// //
///////////////////////////////////////////////////////////////////////////
$report_courseoverview_capabilities = array(
'report/courseoverview:view' => array(
'riskbitmask' => RISK_PERSONAL,
'captype' => 'read',
'contextlevel' => CONTEXT_SYSTEM,
'legacy' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'admin' => CAP_ALLOW
),
'clonepermissionsfrom' => 'moodle/site:viewreports',
)
);
?>
+7 -6
View File
@@ -4,18 +4,19 @@
require_once($CFG->dirroot.'/lib/statslib.php');
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('reportcourseoverview');
admin_externalpage_print_header();
$report = optional_param('report', STATS_REPORT_ACTIVE_COURSES, PARAM_INT);
$time = optional_param('time', 0, PARAM_INT);
$numcourses = optional_param('numcourses', 20, PARAM_INT);
require_capability('moodle/site:viewreports', get_context_instance(CONTEXT_SYSTEM)); // needed?
admin_externalpage_setup('reportcourseoverview');
admin_externalpage_print_header();
if (empty($CFG->enablestats)) {
redirect("$CFG->wwwroot/$CFG->admin/settings.php?section=stats", get_string('mustenablestats', 'admin'), 3);
if (has_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM))) {
redirect("$CFG->wwwroot/$CFG->admin/settings.php?section=stats", get_string('mustenablestats', 'admin'), 3);
} else {
error("Stats is not enabled.");
}
}
$course = get_site();
+2 -2
View File
@@ -10,7 +10,7 @@
require_login();
require_capability('moodle/site:viewreports', get_context_instance(CONTEXT_SYSTEM));
require_capability('report/courseoverview:view', get_context_instance(CONTEXT_SYSTEM));
stats_check_uptodate();
@@ -29,7 +29,7 @@
$courses = get_records_sql($sql, 0, $numcourses);
if (empty($courses)) {
print_error('statsnodata', "", $CFG->wwwroot.'/'.$CFG->admin.'/report/course/index.php');
print_error('statsnodata', "", $CFG->wwwroot.'/'.$CFG->admin.'/report/courseoverview/index.php');
}
+3
View File
@@ -0,0 +1,3 @@
<?php // $Id$
$ADMIN->add('reports', new admin_externalpage('reportcourseoverview', get_string('courseoverview', 'admin'), "$CFG->wwwroot/$CFG->admin/report/courseoverview/index.php",'report/courseoverview:view'));
?>
+29
View File
@@ -0,0 +1,29 @@
<?PHP // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://moodle.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 //
// //
///////////////////////////////////////////////////////////////////////////
$plugin->version = 2007101503;
$plugin->requires = 2007101532;
?>
-31
View File
@@ -1,31 +0,0 @@
<?php // $Id$
require_once('../../../config.php');
require_once($CFG->dirroot.'/course/lib.php');
require_once($CFG->dirroot.'/course/report/log/lib.php');
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('reportlog');
admin_externalpage_print_header();
$course = get_site();
print_heading(get_string('chooselogs') .':');
print_mnet_log_selector_form($CFG->mnet_localhost_id, $course);
echo '<br />';
print_heading(get_string('chooselivelogs') .':');
$heading = link_to_popup_window('/course/report/log/live.php?id='. $course->id,
'livelog', get_string('livelogs'),
500, 800, '', 'none', true);
print_heading($heading, 'center', 3);
admin_externalpage_print_footer();
?>
+5
View File
@@ -0,0 +1,5 @@
<?php // $Id$
// just a link to course report
$ADMIN->add('reports', new admin_externalpage('reportlog', get_string('log', 'admin'), "$CFG->wwwroot/course/report/log/index.php?id=".SITEID, 'coursereport/log:view'));
$ADMIN->add('reports', new admin_externalpage('reportloglive', get_string('loglive', 'coursereport_log'), "$CFG->wwwroot/course/report/log/indexlive.php?id=".SITEID, 'coursereport/log:viewlive'));
?>
+1 -1
View File
@@ -5,8 +5,8 @@
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('reportquestion');
admin_externalpage_print_header();
print_heading(get_string('adminreport', 'question'));
$probstr = '';
+3
View File
@@ -0,0 +1,3 @@
<?php // $Id$
$ADMIN->add('reports', new admin_externalpage('reportquestion', get_string('question', 'admin'), "$CFG->wwwroot/$CFG->admin/report/question/index.php", 'moodle/site:config'));
?>
+36
View File
@@ -0,0 +1,36 @@
<?php // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://moodle.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 //
// //
///////////////////////////////////////////////////////////////////////////
$report_security_capabilities = array(
'report/security:view' => array(
'riskbitmask' => RISK_CONFIG,
'captype' => 'read',
'contextlevel' => CONTEXT_SYSTEM,
'legacy' => array(
'admin' => CAP_ALLOW
),
)
);
+127
View File
@@ -0,0 +1,127 @@
<?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.
admin_externalpage_setup('reportsecurity');
admin_externalpage_print_header();
print_heading(get_string('reportsecurity', 'report_security'));
echo '<div id="timewarning">'.get_string('timewarning', 'report_security').'</div>';
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))) {
report_security_hide_timearning();
$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 {
report_security_hide_timearning();
$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);
}
print_footer();
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
<?php //$Id$
$ADMIN->add('reports', new admin_externalpage('reportsecurity', get_string('reportsecurity', 'report_security'), "$CFG->wwwroot/$CFG->admin/report/security/index.php",'report/security:view'));
+29
View File
@@ -0,0 +1,29 @@
<?PHP // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://moodle.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 //
// //
///////////////////////////////////////////////////////////////////////////
$plugin->version = 2007101500;
$plugin->requires = 2007101533;
?>
+373
View File
@@ -0,0 +1,373 @@
<?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');
require_js(array('yui_dom-event', 'yui_connection', 'yui_json'));
$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();
admin_externalpage_setup('reportspamcleaner');
// 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 json_encode(true);
} else {
echo json_encode(false);
}
} else {
echo json_encode(false);
}
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 json_encode(true);
exit;
}
if (!empty($ignore)) {
unset($SESSION->users_result[$id]);
echo json_encode(true);
exit;
}
admin_externalpage_print_header();
// 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() {
$sesskey = sesskey();
?>
<script type="text/javascript">
//<![CDATA[
var row = null;
var delall_cb = {
success: function(o){
try {
var resp = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('<?php echo get_string('spaminvalidresult', 'report_spamcleaner');?>');
return;
}
if(resp == true){
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) {
try {
var resp = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('<?php echo get_string('spaminvalidresult', 'report_spamcleaner');?>');
return;
}
if(row) {
if(resp == true){
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){
try {
var resp = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('<?php echo get_string('spaminvalidresult', 'report_spamcleaner');?>');
return;
}
if(row) {
if(resp == true){
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);
}
YAHOO.util.Event.onDOMReady(init);
//]]>
</script>
<?php
}
admin_externalpage_print_footer();
?>
+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'));
-75
View File
@@ -1,75 +0,0 @@
<?php // $Id$
require_once('../../../config.php');
require_once($CFG->dirroot.'/lib/statslib.php');
require_once($CFG->dirroot.'/course/report/stats/lib.php');
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('reportstats');
admin_externalpage_print_header();
$courseid = optional_param('course', SITEID, PARAM_INT);
$report = optional_param('report', 0, PARAM_INT);
$time = optional_param('time', 0, PARAM_INT);
$mode = optional_param('mode', STATS_MODE_GENERAL, PARAM_INT);
$userid = optional_param('userid', 0, PARAM_INT);
$roleid = 0;
if ($report > 50) {
$roleid = substr($report,1);
$report = 5;
}
if ($report == STATS_REPORT_USER_LOGINS) {
$courseid = SITEID; //override
}
if ($mode == STATS_MODE_RANKED) {
redirect($CFG->wwwroot.'/'.$CFG->admin.'/report/stats/index.php?time='.$time, '', 3);
}
if (!$course = get_record("course","id",$courseid)) {
error("That's an invalid course id");
}
if (!empty($userid)) {
if (!$user = get_record('user','id',$userid)) {
error("That's an invalid user id");
}
}
require_login();
if (empty($CFG->enablestats)) {
redirect("$CFG->wwwroot/$CFG->admin/settings.php?section=stats", get_string('mustenablestats', 'admin'), 3);
}
require_capability('moodle/site:viewreports', get_context_instance(CONTEXT_SYSTEM));
add_to_log($course->id, "course", "report stats", "report/stats/index.php?course=$course->id", $course->id);
stats_check_uptodate($course->id);
// $strreports = get_string("reports");
// $strstats = get_string('stats');
//
// $menu = report_stats_mode_menu($course, $mode, $time); // add 4th $url parameter if uncommented!
//
//
// $crumb = "<a href=\"{$CFG->wwwroot}/admin\">".get_string('administration')."</a> ->
// <a href=\"{$CFG->wwwroot}/admin/report.php\">$strreports</a> ->
// $strstats";
// print_header("$course->shortname: $strstats", "$course->fullname",
// $crumb, '', '', true, '&nbsp;', $menu);
require_once($CFG->dirroot.'/course/report/stats/report.php');
admin_externalpage_print_footer();
?>
+4
View File
@@ -0,0 +1,4 @@
<?php // $Id$
// just a link to course report
$ADMIN->add('reports', new admin_externalpage('reportstats', get_string('stats', 'admin'), "$CFG->wwwroot/course/report/stats/index.php", 'coursereport/stats:view'));
?>
+40
View File
@@ -0,0 +1,40 @@
<?php // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://moodle.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 //
// //
///////////////////////////////////////////////////////////////////////////
$report_unittest_capabilities = array(
'report/unittest:view' => array(
'riskbitmask' => RISK_DATALOSS,
'captype' => 'read',
'contextlevel' => CONTEXT_SYSTEM,
'legacy' => array(
'admin' => CAP_ALLOW
),
'clonepermissionsfrom' => 'moodle/site:config',
)
);
?>
@@ -16,14 +16,6 @@ require_once($CFG->libdir.'/simpletestlib.php');
require_once('ex_simple_test.php');
require_once('ex_reporter.php');
require_login();
require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
/* The UNITTEST constant can be checked elsewhere if you need to know
* when your code is being run as part of a unit test. */
define('UNITTEST', true);
$langfile = 'simpletest';
// CGI arguments
$path = optional_param('path', null, PARAM_PATH);
$showpasses = optional_param('showpasses', false, PARAM_BOOL);
@@ -31,10 +23,17 @@ $showsearch = optional_param('showsearch', false, PARAM_BOOL);
$thorough = optional_param('thorough', false, PARAM_BOOL);
// Print the header.
admin_externalpage_setup('reportsimpletest');
$strtitle = get_string('unittests', $langfile);
admin_externalpage_setup('reportunittest', '', array('showpasses' => $showpasses,
'showsearch' => $showsearch, 'thorough' => $thorough));
admin_externalpage_print_header();
/* The UNITTEST constant can be checked elsewhere if you need to know
* when your code is being run as part of a unit test. */
define('UNITTEST', true);
$langfile = 'simpletest';
$strtitle = get_string('unittests', $langfile);
if (!is_null($path)) {
// Create the group of tests.
$test =& new AutoGroupTest($showsearch, $thorough);
+3
View File
@@ -0,0 +1,3 @@
<?php //$Id$
$ADMIN->add('reports', new admin_externalpage('reportunittest', get_string('simpletest', 'admin'), "$CFG->wwwroot/$CFG->admin/report/unittest/index.php", 'report/unittest:view'));
?>
+29
View File
@@ -0,0 +1,29 @@
<?PHP // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://moodle.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 //
// //
///////////////////////////////////////////////////////////////////////////
$plugin->version = 2007101501;
$plugin->requires = 2007101532;
?>
+1 -2
View File
@@ -10,8 +10,7 @@
require_once('../../config.php');
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('defineroles');
admin_externalpage_setup('defineroles', '', array(), $CFG->wwwroot . '/' . $CFG->admin . '/roles/allowassign.php');
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
require_capability('moodle/role:manage', $sitecontext);
+1 -2
View File
@@ -8,8 +8,7 @@
require_once('../../config.php');
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('defineroles');
admin_externalpage_setup('defineroles', '', array(), $CFG->wwwroot . '/' . $CFG->admin . '/roles/allowoverride.php');
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
require_capability('moodle/role:manage', $sitecontext);
+20 -9
View File
@@ -144,11 +144,11 @@
$currenttab = 'assign';
include_once($CFG->dirroot.'/user/tabs.php');
} else if ($context->contextlevel == CONTEXT_SYSTEM) {
admin_externalpage_setup('assignroles');
admin_externalpage_print_header();
admin_externalpage_setup('assignroles', '', array('contextid' => $contextid, 'roleid' => $roleid));
admin_externalpage_print_header('');
} else if ($context->contextlevel==CONTEXT_COURSE and $context->instanceid == SITEID) {
admin_externalpage_setup('frontpageroles');
admin_externalpage_print_header();
admin_externalpage_setup('frontpageroles', '', array('contextid' => $contextid, 'roleid' => $roleid));
admin_externalpage_print_header('');
$currenttab = 'assign';
include_once('tabs.php');
} else {
@@ -290,7 +290,7 @@
$selectsql = "";
}
if ($context->contextlevel > CONTEXT_COURSE) { // mod or block (or group?)
if ($context->contextlevel > CONTEXT_COURSE && !is_inside_frontpage($context)) { // mod or block (or group?)
/************************************************************************
* *
@@ -395,6 +395,12 @@
notify($msg);
print_simple_box_end();
}
//Back to Assign Roles button
echo "<br/>";
echo "<div class='continuebutton'>";
print_single_button('assign.php', array('contextid' => $contextid), get_string('assignrolesin', 'role', print_context_name($context)));
echo "</div>";
} else { // Print overview table
@@ -429,7 +435,8 @@
$rolehodlernames[$roleid] = '';
}
}
// Print overview table
$table->tablealign = 'center';
$table->cellpadding = 5;
@@ -452,10 +459,14 @@
}
$table->data[] = $row;
}
print_table($table);
//Continue to Course Button
echo "<br/>";
echo "<div class='continuebutton'>";
print_single_button($CFG->wwwroot.'/course/view.php', array('id' => $courseid), get_string('continuetocourse'));
echo "</div>";
}
print_footer($course);
?>
+3 -3
View File
@@ -24,7 +24,7 @@
<?php if ($action == 'view') { ?>
<tr valign="top">
<td align="right"><?php print_string('name') ?>:</td>
<td><?php p($role->name); ?></td>
<td><?php p(format_string($role->name)); ?></td>
</tr>
<tr valign="top">
<td align="right"><?php print_string('shortname') ?>:</td>
@@ -32,11 +32,11 @@
</tr>
<tr valign="top">
<td align="right"><?php print_string('description') ?>:</td>
<td><?php p($role->description); $usehtmleditor = false; ?></td>
<td><?php p(format_text($role->description, FORMAT_HTML)); $usehtmleditor = false; ?></td>
</tr>
<tr valign="top">
<td align="right"><?php print_string('legacytype', 'role') ?>:</td>
<td><?php
<td><?php
$usehtmleditor = false;
if (empty($role->legacytype)) {
print_string('none');
+3 -3
View File
@@ -4,8 +4,6 @@
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('defineroles');
$roleid = optional_param('roleid', 0, PARAM_INT); // if set, we are editing a role
$name = optional_param('name', '', PARAM_MULTILANG); // new role name
$shortname = optional_param('shortname', '', PARAM_RAW); // new role shortname, special cleaning before storage
@@ -14,6 +12,8 @@
$confirm = optional_param('confirm', 0, PARAM_BOOL);
$cancel = optional_param('cancel', 0, PARAM_BOOL);
admin_externalpage_setup('defineroles', '', array('roleid' => $roleid));
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
require_capability('moodle/role:manage', $sitecontext);
@@ -414,7 +414,7 @@
/// print UI now
admin_externalpage_print_header();
admin_externalpage_print_header('');
$currenttab = 'manage';
include_once('managetabs.php');
+1 -1
View File
@@ -171,7 +171,7 @@
include_once($CFG->dirroot.'/user/tabs.php');
} else if ($context->contextlevel==CONTEXT_COURSE and $context->instanceid == SITEID) {
require_once($CFG->libdir.'/adminlib.php');
admin_externalpage_setup('frontpageroles');
admin_externalpage_setup('frontpageroles', '', array('contextid' => $contextid, 'roleid' => $roleid), $CFG->wwwroot . '/' . $CFG->admin . '/roles/override.php');
admin_externalpage_print_header();
$currenttab = 'override';
include_once('tabs.php');
+1 -4
View File
@@ -48,16 +48,13 @@ if ($currenttab != 'update') {
require_login($course);
$navlinks[] = array('name' => get_string('roles'),
'link' => "$CFG->wwwroot/admin/roles/assign.php?contextid=$context->id",
'link' => "$CFG->wwwroot/$CFG->admin/roles/assign.php?contextid=$context->id",
'type' => 'misc');
$navigation = build_navigation($navlinks);
print_header($streditcoursesettings, $course->fullname, $navigation);
}
break;
case CONTEXT_GROUP:
break;
case CONTEXT_MODULE:
// get module type?
if (!$cm = get_record('course_modules','id',$context->instanceid)) {
+3
View File
@@ -44,6 +44,8 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp->add(new admin_setting_special_calendar_weekend());
$temp->add(new admin_setting_configtext('calendar_lookahead',get_string('configlookahead','admin'),get_string('helpupcominglookahead', 'admin'),21,PARAM_INT));
$temp->add(new admin_setting_configtext('calendar_maxevents',get_string('configmaxevents','admin'),get_string('helpupcomingmaxevents', 'admin'),10,PARAM_INT));
$temp->add(new admin_setting_configcheckbox('enablecalendarexport', get_string('enablecalendarexport', 'admin'), get_string('configenablecalendarexport','admin'), 1));
$temp->add(new admin_setting_configtext('calendar_exportsalt', get_string('calendarexportsalt','admin'), get_string('configcalendarexportsalt', 'admin'), random_string(60)));
$ADMIN->add('appearance', $temp);
// "htmleditor" settingpage
@@ -75,6 +77,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp = new admin_settingpage('mymoodle', get_string('mymoodle', 'admin'));
$temp->add(new admin_setting_configcheckbox('mymoodleredirect', get_string('mymoodleredirect', 'admin'), get_string('configmymoodleredirect', 'admin'), 0));
$temp->add(new admin_setting_configtext('mycoursesperpage', get_string('mycoursesperpage', 'admin'), get_string('configmycoursesperpage', 'admin'), 21, PARAM_INT));
$ADMIN->add('appearance', $temp);
// new CFG variable for coursemanager (what roles to display)
+49 -3
View File
@@ -4,19 +4,64 @@
if ($hassiteconfig
or has_capability('moodle/site:backup', $systemcontext)
or has_capability('moodle/category:update', $systemcontext)) { // speedup for non-admins, add all caps used on this page
or has_capability('moodle/category:manage', $systemcontext)
or has_capability('moodle/course:create', $systemcontext)
or has_capability('moodle/site:approvecourse', $systemcontext)) { // speedup for non-admins, add all caps used on this page
$ADMIN->add('courses', new admin_externalpage('coursemgmt', get_string('coursemgmt', 'admin'), $CFG->wwwroot . '/course/index.php?categoryedit=on','moodle/category:update'));
$ADMIN->add('courses', new admin_externalpage('coursemgmt', get_string('coursemgmt', 'admin'), $CFG->wwwroot . '/course/index.php?categoryedit=on',
array('moodle/category:manage', 'moodle/course:create')));
$ADMIN->add('courses', new admin_enrolment_page());
/// Course Default Settings Page
/// NOTE: these settings must be applied after all other settings because they depend on them
/// NOTE: these are a subset of the complete defaults available in 2.0
///general course settings
$temp = new admin_settingpage('coursesettings', get_string('coursesettings'));
$courseformats = get_list_of_plugins('course/format');
$formcourseformats = array();
foreach ($courseformats as $courseformat) {
$formcourseformats["$courseformat"] = get_string("format$courseformat","format_$courseformat");
if ($formcourseformats["$courseformat"]=="[[format$courseformat]]") {
$formcourseformats["$courseformat"] = get_string("format$courseformat");
}
}
$temp->add(new admin_setting_configselect('moodlecourse/format', get_string('format'), get_string('coursehelpformat'), 'weeks',$formcourseformats));
for ($i=1; $i<=52; $i++) {
$sectionmenu[$i] = "$i";
}
$temp->add(new admin_setting_configselect('moodlecourse/numsections', get_string('numberweeks'), get_string('coursehelpnumberweeks'), 10, $sectionmenu));
$choices = array();
$choices['0'] = get_string('hiddensectionscollapsed');
$choices['1'] = get_string('hiddensectionsinvisible');
$temp->add(new admin_setting_configselect('moodlecourse/hiddensections', get_string('hiddensections'), get_string('coursehelphiddensections'), 0,$choices));
$options = range(0, 10);
$temp->add(new admin_setting_configselect('moodlecourse/newsitems', get_string('newsitemsnumber'), get_string('coursehelpnewsitemsnumber'), 5,$options));
$temp->add(new admin_setting_configselect('moodlecourse/showgrades', get_string('showgrades'), get_string('coursehelpshowgrades'), 1,array(0 => get_string('no'), 1 => get_string('yes'))));
$temp->add(new admin_setting_configselect('moodlecourse/showreports', get_string('showreports'), '', 0,array(0 => get_string('no'), 1 => get_string('yes'))));
if (isset($CFG->maxbytes)) {
$choices = get_max_upload_sizes($CFG->maxbytes);
} else {
$choices = get_max_upload_sizes();
}
$temp->add(new admin_setting_configselect('moodlecourse/maxbytes', get_string('maximumupload'), get_string('coursehelpmaximumupload'), key($choices), $choices));
$temp->add(new admin_setting_configselect('moodlecourse/metacourse', get_string('metacourse'), get_string('coursehelpmetacourse'), 0,array(0 => get_string('no'), 1 => get_string('yes'))));
$ADMIN->add('courses', $temp);
// "courserequests" settingpage
$temp = new admin_settingpage('courserequest', get_string('courserequest'));
$temp->add(new admin_setting_configcheckbox('enablecourserequests', get_string('enablecourserequests', 'admin'), get_string('configenablecourserequests', 'admin'), 0));
$temp->add(new admin_settings_coursecat_select('defaultrequestcategory', get_string('defaultrequestcategory', 'admin'), get_string('configdefaultrequestcategory', 'admin'), 1));
$temp->add(new admin_setting_users_with_capability('courserequestnotify', get_string('courserequestnotify', 'admin'), get_string('configcourserequestnotify2', 'admin'), array(), 'moodle/site:approvecourse'));
$ADMIN->add('courses', $temp);
// Pending course requests.
if (!empty($CFG->enablecourserequests)) {
$ADMIN->add('courses', new admin_externalpage('coursespending', get_string('pendingrequests'),
$CFG->wwwroot . '/course/pending.php', array('moodle/site:approvecourse')));
}
// "backups" settingpage
if (!empty($CFG->backup_version)) {
$bi = array();
@@ -29,6 +74,7 @@ if ($hassiteconfig
$bi[] = new admin_setting_configcheckbox('backup_sche_userfiles', get_string('userfiles'), get_string('backupuserfileshelp'), 0);
$bi[] = new admin_setting_configcheckbox('backup_sche_coursefiles', get_string('coursefiles'), get_string('backupcoursefileshelp'), 0);
$bi[] = new admin_setting_configcheckbox('backup_sche_sitefiles', get_string('sitefiles'), get_string('backupsitefileshelp'), 0);
$bi[] = new admin_setting_configcheckbox('backup_sche_gradebook_history', get_string('gradebookhistories', 'grades'), get_string('backupgradebookhistoryhelp'), 0);
$bi[] = new admin_setting_configcheckbox('backup_sche_messages', get_string('messages', 'message'), get_string('backupmessageshelp','message'), 0);
$bi[] = new admin_setting_configcheckbox('backup_sche_blogs', get_string('blogs', 'blog'), get_string('backupblogshelp','blog'), 0);
$bi[] = new admin_setting_configselect('backup_sche_keep', get_string('keep'),
+8
View File
@@ -26,6 +26,14 @@ if (get_site()) { //do not use during installation
$temp->add(new admin_setting_special_frontpagedesc());
$temp->add(new admin_setting_courselist_frontpage(false)); // non-loggedin version of the setting (that's what the parameter is for :) )
$temp->add(new admin_setting_courselist_frontpage(true)); // loggedin version of the setting
$options = array();
$options[] = get_string('unlimited');
for ($i=1; $i<100; $i++) {
$options[$i] = $i;
}
$temp->add(new admin_setting_configselect('maxcategorydepth', get_string('configsitemaxcategorydepth','admin'), get_string('configsitemaxcategorydepthhelp','admin'), 0, $options));
$temp->add(new admin_setting_sitesetcheckbox('numsections', get_string('sitesection'), get_string('sitesectionhelp','admin'), 1));
$temp->add(new admin_setting_sitesetselect('newsitems', get_string('newsitemsnumber'), '', 3,
array('0' => '0',
+33 -11
View File
@@ -5,11 +5,23 @@
if (has_capability('moodle/grade:manage', $systemcontext)
or has_capability('moodle/grade:manageletters', $systemcontext)) { // speedup for non-admins, add all caps used on this page
require_once $CFG->libdir.'/grade/constants.php';
$display_types = array(GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'),
GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'),
GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'),
GRADE_DISPLAY_TYPE_REAL_PERCENTAGE => get_string('realpercentage', 'grades'),
GRADE_DISPLAY_TYPE_REAL_LETTER => get_string('realletter', 'grades'),
GRADE_DISPLAY_TYPE_LETTER_REAL => get_string('letterreal', 'grades'),
GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE => get_string('letterpercentage', 'grades'),
GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER => get_string('percentageletter', 'grades'),
GRADE_DISPLAY_TYPE_PERCENTAGE_REAL => get_string('percentagereal', 'grades')
);
asort($display_types);
// General settings
$temp = new admin_settingpage('gradessettings', get_string('generalsettings', 'grades'), 'moodle/grade:manage');
if ($ADMIN->fulltree) {
require_once $CFG->libdir.'/grade/constants.php';
// new CFG variable for gradebook (what roles to display)
$temp->add(new admin_setting_special_gradebookroles());
@@ -32,10 +44,7 @@ if (has_capability('moodle/grade:manage', $systemcontext)
$temp->add(new admin_setting_configcheckbox('gradepublishing', get_string('gradepublishing', 'grades'), get_string('configgradepublishing', 'grades'), 0));
$temp->add(new admin_setting_configselect('grade_export_displaytype', get_string('gradeexportdisplaytype', 'grades'),
get_string('configgradeexportdisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL,
array(GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'),
GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'),
GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'))));
get_string('configgradeexportdisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL, $display_types));
$temp->add(new admin_setting_configselect('grade_export_decimalpoints', get_string('gradeexportdecimalpoints', 'grades'),
get_string('configexportdecimalpoints', 'grades'), 2,
@@ -45,8 +54,14 @@ if (has_capability('moodle/grade:manage', $systemcontext)
'3' => '3',
'4' => '4',
'5' => '5')));
$temp->add(new admin_setting_configselect('grade_navmethod', get_string('navmethod', 'grades'), null, 0,
array(GRADE_NAVMETHOD_DROPDOWN => get_string('dropdown', 'grades'),
GRADE_NAVMETHOD_TABS => get_string('tabs', 'grades'),
GRADE_NAVMETHOD_COMBO => get_string('combo', 'grades'))));
$temp->add(new admin_setting_special_gradeexport());
$temp->add(new admin_setting_special_gradelimiting());
}
$ADMIN->add('grades', $temp);
@@ -67,9 +82,17 @@ if (has_capability('moodle/grade:manage', $systemcontext)
GRADE_AGGREGATE_MAX =>get_string('aggregatemax', 'grades'),
GRADE_AGGREGATE_MODE =>get_string('aggregatemode', 'grades'),
GRADE_AGGREGATE_SUM =>get_string('aggregatesum', 'grades'));
$defaultvisible = array(GRADE_AGGREGATE_MEAN, GRADE_AGGREGATE_WEIGHTED_MEAN, GRADE_AGGREGATE_WEIGHTED_MEAN2,
GRADE_AGGREGATE_EXTRACREDIT_MEAN, GRADE_AGGREGATE_MEDIAN, GRADE_AGGREGATE_MIN,
GRADE_AGGREGATE_MAX, GRADE_AGGREGATE_MODE, GRADE_AGGREGATE_SUM);
$defaults = array('value'=>GRADE_AGGREGATE_WEIGHTED_MEAN2, 'forced'=>false, 'adv'=>false);
$temp->add(new admin_setting_gradecat_combo('grade_aggregation', get_string('aggregation', 'grades'), get_string('aggregationhelp', 'grades'), $defaults, $options));
$temp->add(new admin_setting_configmultiselect('grade_aggregations_visible', get_string('aggregationsvisible', 'grades'),
get_string('aggregationsvisiblehelp', 'grades'), $defaultvisible, $options));
$options = array(0 => get_string('no'), 1 => get_string('yes'));
$defaults = array('value'=>1, 'forced'=>false, 'adv'=>true);
@@ -101,10 +124,7 @@ if (has_capability('moodle/grade:manage', $systemcontext)
$temp = new admin_settingpage('gradeitemsettings', get_string('gradeitemsettings', 'grades'), 'moodle/grade:manage');
if ($ADMIN->fulltree) {
$temp->add(new admin_setting_configselect('grade_displaytype', get_string('gradedisplaytype', 'grades'),
get_string('configgradedisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL,
array(GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'),
GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'),
GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'))));
get_string('configgradedisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL, $display_types));
$temp->add(new admin_setting_configselect('grade_decimalpoints', get_string('decimalpoints', 'grades'),
get_string('configdecimalpoints', 'grades'), 2,
@@ -142,8 +162,10 @@ if (has_capability('moodle/grade:manage', $systemcontext)
$scales = new admin_externalpage('scales', get_string('scales'), $CFG->wwwroot.'/grade/edit/scale/index.php', 'moodle/grade:manage');
$ADMIN->add('grades', $scales);
$outcomes = new admin_externalpage('outcomes', get_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage');
$ADMIN->add('grades', $outcomes);
if (!empty($CFG->enableoutcomes)) {
$outcomes = new admin_externalpage('outcomes', get_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage');
$ADMIN->add('grades', $outcomes);
}
$letters = new admin_externalpage('letters', get_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/edit.php', 'moodle/grade:manageletters');
$ADMIN->add('grades', $letters);
+4
View File
@@ -12,6 +12,10 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$item->set_updatedcallback('reset_text_filters_cache');
$temp->add($item);
$temp->add(new admin_setting_configcheckbox('enablegroupings', get_string('enablegroupings', 'admin'), get_string('configenablegroupings', 'admin'), 0));
$rqsetting = new admin_setting_configcheckbox('selectmanual', get_string('selectmanualquestions', 'qtype_random'), get_string('configselectmanualquestions', 'qtype_random'), 0);
$rqsetting->plugin = 'qtype_random';
$temp->add($rqsetting);
$temp->add(new admin_setting_configcheckbox('experimentalsplitrestore', get_string('experimentalsplitrestore', 'admin'), get_string('configexperimentalsplitrestore', 'admin'), 0));
$ADMIN->add('misc', $temp);
+21 -2
View File
@@ -138,9 +138,28 @@ if ($hassiteconfig) {
$ADMIN->add('filtersettings', $settings);
} else if (file_exists("$CFG->dirroot/$filterfull/filterconfig.html")) {
$ADMIN->add('filtersettings', new admin_externalpage('filtersetting'.str_replace('/', '', $filterfull), $strfiltername, "$CFG->wwwroot/$CFG->admin/filter.php?filter=$filterfull", !in_array($filterfull, $activefilters)));
$ADMIN->add('filtersettings', new admin_externalpage('filtersetting'.str_replace('/', '', $filterfull), $strfiltername, "$CFG->wwwroot/$CFG->admin/filter.php?filter=$filterfull", 'moodle/site:config', !in_array($filterfull, $activefilters)));
}
}
}
}
?>
/// Now add reports
foreach (get_list_of_plugins($CFG->admin.'/report') as $plugin) {
$settings_path = "$CFG->dirroot/$CFG->admin/report/$plugin/settings.php";
if (file_exists($settings_path)) {
include($settings_path);
continue;
}
$index_path = "$CFG->dirroot/$CFG->admin/report/$plugin/index.php";
if (!file_exists($index_path)) {
continue;
}
// old style 3rd party plugin without settings.php
$www_path = "$CFG->wwwroot/$CFG->admin/report/$plugin/index.php";
$reportname = get_string($plugin, 'report_' . $plugin);
$ADMIN->add('reports', new admin_externalpage('report'.$plugin, $reportname, $www_path, 'moodle/site:viewreports'));
}
+4
View File
@@ -40,6 +40,9 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
0 => get_string('disableblogs','blog'))));
$temp->add(new admin_setting_configcheckbox('usetags', get_string('usetags','admin'),get_string('configusetags', 'admin'),'1'));
$temp->add(new admin_setting_configcheckbox('keeptagnamecase', get_string('keeptagnamecase','admin'),get_string('configkeeptagnamecase', 'admin'),'1'));
$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_configpasswordunmask('cronremotepassword', get_string('cronremotepassword', 'admin'), get_string('configcronremotepassword', 'admin'), ''));
@@ -51,6 +54,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp->add(new admin_setting_configtext('minpasswordnonalphanum', get_string('minpasswordnonalphanum', 'admin'), get_string('configminpasswordnonalphanum', 'admin'), 1, PARAM_INT));
$temp->add(new admin_setting_configcheckbox('disableuserimages', get_string('disableuserimages', 'admin'), get_string('configdisableuserimages', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('emailchangeconfirmation', get_string('emailchangeconfirmation', 'admin'), get_string('configemailchangeconfirmation', 'admin'), 1));
$temp->add(new admin_setting_configcheckbox('enablenotes', get_string('enablenotes', 'notes'), get_string('configenablenotes', 'notes'), 1));
$ADMIN->add('security', $temp);
+23 -3
View File
@@ -89,6 +89,7 @@ $temp->add(new admin_setting_configselect('sessiontimeout', get_string('sessiont
300 => get_string('numminutes', '', 5))));
$temp->add(new admin_setting_configtext('sessioncookie', get_string('sessioncookie', 'admin'), get_string('configsessioncookie', 'admin'), '', PARAM_ALPHANUM));
$temp->add(new admin_setting_configtext('sessioncookiepath', get_string('sessioncookiepath', 'admin'), get_string('configsessioncookiepath', 'admin'), '/', PARAM_LOCALURL));
$temp->add(new admin_setting_configtext('sessioncookiedomain', get_string('sessioncookiedomain', 'admin'), get_string('configsessioncookiedomain', 'admin'), '', PARAM_TEXT, 50));
$ADMIN->add('server', $temp, 50);
@@ -211,7 +212,10 @@ $temp->add(new admin_setting_configselect('loglifetime', get_string('loglifetime
120 => get_string('numdays', '', 120),
90 => get_string('numdays', '', 90),
60 => get_string('numdays', '', 60),
35 => get_string('numdays', '', 35))));
35 => get_string('numdays', '', 35),
10 => get_string('numdays', '', 10),
5 => get_string('numdays', '', 5),
2 => get_string('numdays', '', 2))));
$temp->add(new admin_setting_configcheckbox('disablegradehistory', get_string('disablegradehistory', 'grades'),
@@ -238,6 +242,16 @@ $ADMIN->add('server', new admin_externalpage('phpinfo', get_string('phpinfo'), "
// "performance" settingpage
$temp = new admin_settingpage('performance', get_string('performance', 'admin'));
$temp->add(new admin_setting_configselect('extramemorylimit', get_string('extramemorylimit', 'admin'),
get_string('configextramemorylimit', 'admin'), '128M',
// if this option is set to 0, default 128M will be used
array( '64M' => '64M',
'128M' => '128M',
'256M' => '256M',
'512M' => '512M',
'1024M' => '1024M'
)));
$temp->add(new admin_setting_special_selectsetup('cachetype', get_string('cachetype', 'admin'),
get_string('configcachetype', 'admin'), '',
array( '' => get_string('none'),
@@ -261,8 +275,14 @@ $temp->add(new admin_setting_configselect('memcachedpconn', get_string('memcache
'1' => get_string('yes'))));
$ADMIN->add('server', $temp);
if (file_exists("$CFG->dirroot/$CFG->admin/mysql/frame.php")) {
$ADMIN->add('server', new admin_externalpage('database', get_string('managedatabase'), "$CFG->wwwroot/$CFG->admin/mysql/frame.php"));
if ($CFG->dbfamily === 'mysql') {
if (file_exists("$CFG->dirroot/$CFG->admin/mysql/frame.php")) {
$ADMIN->add('server', new admin_externalpage('database', get_string('managedatabase'), "$CFG->wwwroot/$CFG->admin/mysql/frame.php"));
}
} else if ($CFG->dbfamily === 'postgres') {
if (file_exists("$CFG->dirroot/$CFG->admin/pgsql/frame.php")) {
$ADMIN->add('server', new admin_externalpage('database', get_string('managedatabase'), "$CFG->wwwroot/$CFG->admin/pgsql/frame.php"));
}
}
} // end of speedup
-22
View File
@@ -23,35 +23,13 @@ $ADMIN->add('root', new admin_category('courses', get_string('courses','admin'))
$ADMIN->add('root', new admin_category('grades', get_string('grades')));
$ADMIN->add('root', new admin_category('location', get_string('location','admin')));
$ADMIN->add('root', new admin_category('language', get_string('language')));
$ADMIN->add('root', new admin_category('modules', get_string('plugins', 'admin')));
$ADMIN->add('root', new admin_category('security', get_string('security','admin')));
$ADMIN->add('root', new admin_category('appearance', get_string('appearance','admin')));
$ADMIN->add('root', new admin_category('frontpage', get_string('frontpage','admin')));
$ADMIN->add('root', new admin_category('server', get_string('server','admin')));
$ADMIN->add('root', new admin_category('mnet', get_string('net','mnet')));
$ADMIN->add('root', new admin_category('reports', get_string('reports')));
foreach (get_list_of_plugins($CFG->admin.'/report') as $plugin) {
/// This snippet is temporary until simpletest can be fixed to use xmldb. See MDL-7377 XXX TODO
if ($plugin == 'simpletest' && $CFG->dbfamily != 'mysql' && $CFG->dbfamily != 'postgres') {
continue;
}
/// End of removable snippet
$reportname = get_string($plugin, 'report_' . $plugin);
if ($reportname[1] == '[') {
$reportname = get_string($plugin, 'admin');
}
// ugly hack for special access control in reports
switch($plugin) {
case 'backups': $cap = 'moodle/site:backup'; break;
case 'simpletest': $cap = 'moodle/site:config'; break;
default: $cap = 'moodle/site:viewreports';
}
$ADMIN->add('reports', new admin_externalpage('report'.$plugin, $reportname, "$CFG->wwwroot/$CFG->admin/report/$plugin/index.php",$cap));
}
$ADMIN->add('root', new admin_category('misc', get_string('miscellaneous')));
// hidden unsupported category
+18 -11
View File
@@ -2,6 +2,10 @@
// This file defines settingpages and externalpages under the "users" category
$ADMIN->add('users', new admin_category('authsettings', get_string('authentication','admin')));
$ADMIN->add('users', new admin_category('accounts', get_string('accounts', 'admin')));
$ADMIN->add('users', new admin_category('roles', get_string('permissions', 'role')));
if ($hassiteconfig
or has_capability('moodle/site:uploadusers', $systemcontext)
or has_capability('moodle/user:create', $systemcontext)
@@ -11,8 +15,6 @@ if ($hassiteconfig
or has_capability('moodle/role:assign', $systemcontext)) { // speedup for non-admins, add all caps used on this page
$ADMIN->add('users', new admin_category('authsettings', get_string('authentication','admin')));
$temp = new admin_settingpage('manageauths', get_string('authsettings', 'admin'));
$temp->add(new admin_setting_manageauths());
$temp->add(new admin_setting_heading('manageauthscommonheading', get_string('commonsettings', 'admin'), ''));
@@ -39,10 +41,7 @@ if ($hassiteconfig
$authbyname = array();
foreach ($auths as $auth) {
$strauthname = get_string("auth_{$auth}title", "auth");
if ($strauthname == "[[auth_{$auth}title]]") {
$strauthname = get_string("auth_{$auth}title", "auth_{$auth}");
}
$strauthname = auth_get_plugin_title($auth);
$authbyname[$strauthname] = $auth;
}
ksort($authbyname);
@@ -70,7 +69,6 @@ if ($hassiteconfig
$securewwwroot = str_replace('http:','https:',$CFG->wwwroot);
}
// stuff under the "accounts" subcategory
$ADMIN->add('users', new admin_category('accounts', get_string('accounts', 'admin')));
$ADMIN->add('accounts', new admin_externalpage('editusers', get_string('userlist','admin'), "$CFG->wwwroot/$CFG->admin/user.php", array('moodle/user:update', 'moodle/user:delete')));
$ADMIN->add('accounts', new admin_externalpage('userbulk', get_string('userbulk','admin'), "$CFG->wwwroot/$CFG->admin/user/user_bulk.php", array('moodle/user:update', 'moodle/user:delete')));
$ADMIN->add('accounts', new admin_externalpage('addnewuser', get_string('addnewuser'), "$securewwwroot/user/editadvanced.php?id=-1", 'moodle/user:create'));
@@ -80,7 +78,6 @@ if ($hassiteconfig
// stuff under the "roles" subcategory
$ADMIN->add('users', new admin_category('roles', get_string('permissions', 'role')));
$ADMIN->add('roles', new admin_externalpage('defineroles', get_string('defineroles', 'role'), "$CFG->wwwroot/$CFG->admin/roles/manage.php", 'moodle/role:manage'));
$ADMIN->add('roles', new admin_externalpage('assignroles', get_string('assignglobalroles', 'role'), "$CFG->wwwroot/$CFG->admin/roles/assign.php?contextid=".$systemcontext->id, 'moodle/role:assign'));
@@ -113,7 +110,12 @@ if ($hassiteconfig
}
if (!$guestroles = get_roles_with_capability('moodle/legacy:guest', CAP_ALLOW)) {
$guestroles = array();
$defaultguestid = null;
} else {
$defaultguestid = reset($guestroles);
$defaultguestid = $defaultguestid->id;
}
// we must not use assignable roles here:
// 1/ unsetting roles as assignable for admin might bork the settings!
// 2/ default user role should not be assignable anyway
@@ -130,9 +132,9 @@ if ($hassiteconfig
}
$temp->add(new admin_setting_configselect('notloggedinroleid', get_string('notloggedinroleid', 'admin'),
get_string('confignotloggedinroleid', 'admin'), $guestrole->id, $allroles ));
get_string('confignotloggedinroleid', 'admin'), $defaultguestid, $allroles ));
$temp->add(new admin_setting_configselect('guestroleid', get_string('guestroleid', 'admin'),
get_string('configguestroleid', 'admin'), $guestrole->id, $allroles));
get_string('configguestroleid', 'admin'), $defaultguestid, $allroles));
$temp->add(new admin_setting_configselect('defaultuserroleid', get_string('defaultuserroleid', 'admin'),
get_string('configdefaultuserroleid', 'admin'), $userrole->id, $nonguestroles)); // guest role here breaks a lot of stuff
}
@@ -164,9 +166,14 @@ if ($hassiteconfig
'yahooid' => get_string('yahooid'),
'aimid' => get_string('aimid'),
'msnid' => get_string('msnid'),
'lastaccess' => get_string('lastaccess'))));
'firstaccess' => get_string('firstaccess'),
'lastaccess' => get_string('lastaccess'),
'mycourses' => get_string('mycourses'),
'groups' => get_string('groups'))));
}
$temp->add(new admin_setting_configcheckbox('allowuserswitchrolestheycantassign', get_string('allowuserswitchrolestheycantassign', 'admin'), get_string('configallowuserswitchrolestheycantassign', 'admin'), 0));
$ADMIN->add('roles', $temp);
} // end of speedup
+2 -2
View File
@@ -173,7 +173,7 @@ if ($formdata = $mform->is_cancelled()) {
}
unset($allowedroles);
// clear bilk selection
// clear bulk selection
if ($bulk) {
$SESSION->bulk_users = array();
}
@@ -961,7 +961,7 @@ function uu_allowed_auths() {
$plugins = get_enabled_auth_plugins();
$choices = array();
foreach ($plugins as $plugin) {
$choices[$plugin] = get_string('auth_'.$plugin.'title', 'auth');
$choices[$plugin] = auth_get_plugin_title ($plugin);
}
return $choices;
+1 -1
View File
@@ -39,7 +39,7 @@ if ($format) {
if ($extrafields = get_records_select('user_info_field')) {
foreach ($extrafields as $n=>$v){
$fields['profile_field_'.$v->shortname] = 'profile_field_'.$v->name;
$fields['profile_field_'.$v->shortname] = 'profile_field_'.$v->shortname;
}
}
@@ -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);
+1 -1
View File
@@ -657,7 +657,7 @@ class CASClient
*/
function setCacheTimesForAuthRequest($n)
{
$this->_cache_times_for_auth_recheck = n;
$this->_cache_times_for_auth_recheck = $n;
}
/**
File diff suppressed because it is too large Load Diff
+33 -4
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'.
@@ -409,7 +409,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
$result[$key] = $ldapval;
}
}
@ldap_close($ldapconnection);
$this->ldap_close($ldapconnection);
return $result;
}
/**
@@ -439,6 +439,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 == '') {
@@ -473,6 +483,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>";
@@ -481,6 +495,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
*
@@ -630,7 +656,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;
}
@@ -866,6 +892,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
} else {
print "No users to be added\n";
}
$this->ldap_close();
return true;
}
/**
@@ -1004,6 +1031,7 @@ if (!empty($this->config->attrcreators)) {
}
}
}
$this->ldap_close();
return $result;
}
/**
@@ -1043,6 +1071,7 @@ if (!empty($this->config->attrcreators)) {
array_push($fresult, ($users[$i][$this->config->user_attribute][0]) );
}
}
$this->ldap_close();
return $fresult;
}
/**
+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
*/
+101 -22
View File
@@ -141,7 +141,7 @@ class auth_plugin_ldap extends auth_plugin_base {
if ($this->ldap_find_userdn($ldapconnection, $extusername)) {
$validuser = true;
}
ldap_close($ldapconnection);
$this->ldap_close();
}
// Shortcut here - SSO confirmed
@@ -156,19 +156,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;
@@ -242,7 +242,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
}
@ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -383,7 +383,7 @@ class auth_plugin_ldap extends auth_plugin_base {
default:
print_error('auth_ldap_unsupportedusertype','auth','',$this->config->user_type);
}
ldap_close($ldapconnection);
$this->ldap_close();
return $uadd;
}
@@ -596,7 +596,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;
}
@@ -838,6 +838,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;
}
@@ -864,6 +867,7 @@ class auth_plugin_ldap extends auth_plugin_base {
} else {
print "No users to be added\n";
}
$this->ldap_close();
return true;
}
@@ -968,7 +972,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;
}
@@ -1003,7 +1007,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;
}*/
@@ -1188,11 +1192,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;
@@ -1316,7 +1320,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
@ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -1561,6 +1565,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 == '') {
@@ -1607,6 +1621,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;
}
@@ -1618,6 +1636,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
*
@@ -1813,16 +1843,55 @@ class auth_plugin_ldap extends auth_plugin_base {
*
*/
function loginpage_hook() {
global $CFG;
global $CFG, $SESSION;
if (($_SERVER['REQUEST_METHOD'] === 'GET' // Only on initial GET of loginpage
|| ($_SERVER['REQUEST_METHOD'] === 'POST'
&& (get_referer() != strip_querystring(qualified_me()))))
// Or when POSTed from another place
// See MDL-14071
&& !empty($this->config->ntlmsso_enabled) // SSO enabled
&& !empty($this->config->ntlmsso_subnet) // have a subnet to test for
&& empty($_GET['authldap_skipntlmsso']) // haven't failed it yet
&& (isguestuser() || !isloggedin()) // guestuser or not-logged-in users
&& address_in_subnet(getremoteaddr(), $this->config->ntlmsso_subnet)) {
if ($_SERVER['REQUEST_METHOD'] === 'GET' // Only on initial GET
// of loginpage
&&!empty($this->config->ntlmsso_enabled)// SSO enabled
&& !empty($this->config->ntlmsso_subnet)// have a subnet to test for
&& empty($_GET['authldap_skipntlmsso']) // haven't failed it yet
&& (isguestuser() || !isloggedin()) // guestuser or not-logged-in users
&& address_in_subnet($_SERVER['REMOTE_ADDR'],$this->config->ntlmsso_subnet)) {
redirect("{$CFG->wwwroot}/auth/ldap/ntlmsso_attempt.php");
// First, let's remember where we were trying to get to before we got here
if (empty($SESSION->wantsurl)) {
$SESSION->wantsurl = (array_key_exists('HTTP_REFERER', $_SERVER) &&
$_SERVER['HTTP_REFERER'] != $CFG->wwwroot &&
$_SERVER['HTTP_REFERER'] != $CFG->wwwroot.'/' &&
$_SERVER['HTTP_REFERER'] != $CFG->httpswwwroot.'/login/' &&
$_SERVER['HTTP_REFERER'] != $CFG->httpswwwroot.'/login/index.php')
? $_SERVER['HTTP_REFERER'] : NULL;
}
// Now start the whole NTLM machinery.
if(!empty($this->config->ntlmsso_ie_fastpath)) {
// Shortcut for IE browsers: skip the attempt page at all
if(check_browser_version('MSIE')) {
$sesskey = sesskey();
redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_magic.php?sesskey='.$sesskey);
} else {
redirect($CFG->httpswwwroot.'/login/index.php?authldap_skipntlmsso=1');
}
} else {
redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_attempt.php');
}
}
// No NTLM SSO, Use the normal login page instead.
// If $SESSION->wantsurl is empty and we have a 'Referer:' header, the login
// page insists on redirecting us to that page after user validation. If
// we clicked on the redirect link at the ntlmsso_finish.php page instead
// of waiting for the redirection to happen, then we have a 'Referer:' header
// we don't want to use at all. As we can't get rid of it, just point
// $SESSION->wantsurl to $CFG->wwwroot (after all, we came from there).
if (empty($SESSION->wantsurl)
&& (get_referer() == $CFG->httpswwwroot.'/auth/ldap/ntlmsso_finish.php')) {
$SESSION->wantsurl = $CFG->wwwroot;
}
}
@@ -1845,7 +1914,14 @@ class auth_plugin_ldap extends auth_plugin_base {
*/
function ntlmsso_magic($sesskey) {
if (isset($_SERVER['REMOTE_USER']) && !empty($_SERVER['REMOTE_USER'])) {
$username = $_SERVER['REMOTE_USER'];
// HTTP __headers__ seem to be sent in ISO-8859-1 encoding
// (according to my reading of RFC-1945, RFC-2616 and RFC-2617 and
// my local tests), so we need to convert the REMOTE_USER value
// (i.e., what we got from the HTTP WWW-Authenticate header) into UTF-8
$textlib = textlib_get_instance();
$username = $textlib->convert($_SERVER['REMOTE_USER'], 'iso-8859-1', 'utf-8');
$username = substr(strrchr($username, '\\'), 1); //strip domain info
$username = moodle_strtolower($username); //compatibility hack
set_cache_flag('auth/ldap/ntlmsess', $sesskey, $username, AUTH_NTLMTIMEOUT);
@@ -2002,6 +2078,8 @@ class auth_plugin_ldap extends auth_plugin_base {
{$config->ntlmsso_enabled = 0; }
if (!isset($config->ntlmsso_subnet))
{$config->ntlmsso_subnet = ''; }
if (!isset($config->ntlmsso_ie_fastpath))
{$config->ntlmsso_ie_fastpath = 0; }
// save settings
set_config('host_url', $config->host_url, 'auth/ldap');
@@ -2034,6 +2112,7 @@ class auth_plugin_ldap extends auth_plugin_base {
set_config('removeuser', $config->removeuser, 'auth/ldap');
set_config('ntlmsso_enabled', (int)$config->ntlmsso_enabled, 'auth/ldap');
set_config('ntlmsso_subnet', $config->ntlmsso_subnet, 'auth/ldap');
set_config('ntlmsso_ie_fastpath', (int)$config->ntlmsso_ie_fastpath, 'auth/ldap');
return true;
}
+13
View File
@@ -59,6 +59,8 @@
{$config->ntlmsso_enabled = 0; }
if (!isset($config->ntlmsso_subnet))
{$config->ntlmsso_subnet = ''; }
if (!isset($config->ntlmsso_ie_fastpath))
{$config->ntlmsso_ie_fastpath = 0; }
$yesno = array( get_string('no'), get_string('yes') );
@@ -468,6 +470,17 @@ if (!function_exists('ldap_connect')) { // Is php4-ldap really there?
<?php print_string('auth_ntlmsso_subnet','auth') ?>
</td>
</tr>
<tr valign="top">
<td align="right"><label for="menuntlmsso_ie_fastpath"><?php print_string('auth_ntlmsso_ie_fastpath_key','auth') ?></label></td>
<td>
<?php
choose_from_menu($yesno, 'ntlmsso_ie_fastpath', $config->ntlmsso_ie_fastpath, '0');
?>
</td>
<td>
<?php print_string('auth_ntlmsso_ie_fastpath','auth') ?>
</td>
</tr>
<?php
+10 -2
View File
@@ -22,7 +22,15 @@ if (empty($authplugin->config->ntlmsso_enabled)) {
$sesskey = sesskey();
//print_header("$site->fullname: $loginsite", $site->fullname, $loginsite, $focus, '', true);
// Display the page header. This makes redirect respect the timeout we specify
// here (and not add 3 more secs) which in turn prevents a bug in both IE 6.x
// and FF 3.x (Windows version at least) where javascript timers fire up even
// when we've already left the page that set the timer.
$loginsite = get_string("loginsite");
$navlinks = array(array('name' => $loginsite, 'link' => null, 'type' => 'misc'));
$navigation = build_navigation($navlinks);
print_header("$site->fullname: $loginsite", $site->fullname, $navigation, '', '', true);
$msg = '<p>'.get_string('ntlmsso_attempting','auth').'</p>'
. '<img width="1", height="1" '
. ' src="' . $CFG->wwwroot . '/auth/ldap/ntlmsso_magic.php?sesskey='
@@ -31,4 +39,4 @@ redirect($CFG->wwwroot . '/auth/ldap/ntlmsso_finish.php', $msg, 3);
?>
?>
+8 -2
View File
@@ -24,7 +24,13 @@ if (empty($authplugin->config->ntlmsso_enabled)) {
// so we only worry about failure.
if (!$authplugin->ntlmsso_finish()) {
// Redirect to login, saying "don't try again!"
redirect($CFG->wwwroot . '/login/index.php?authldap_skipntlmsso=1',
// Display the page header. This makes redirect respect the timeout we specify
// here (and not add 3 more secs).
$loginsite = get_string("loginsite");
$navlinks = array(array('name' => $loginsite, 'link' => null, 'type' => 'misc'));
$navigation = build_navigation($navlinks);
print_header("$site->fullname: $loginsite", $site->fullname, $navigation, '', '', true);
redirect($CFG->httpswwwroot . '/login/index.php?authldap_skipntlmsso=1',
get_string('ntlmsso_failed','auth'), 3);
}
?>
?>
+7 -1
View File
@@ -27,6 +27,12 @@ $file = $CFG->dirroot . '/pix/spacer.gif';
if ($authplugin->ntlmsso_magic($sesskey)
&& file_exists($file)) {
if (!empty($authplugin->config->ntlmsso_ie_fastpath)) {
if (check_browser_version('MSIE')) {
redirect($CFG->wwwroot . '/auth/ldap/ntlmsso_finish.php');
}
}
// Serve GIF
// Type
header('Content-Type: image/gif');
@@ -41,4 +47,4 @@ if ($authplugin->ntlmsso_magic($sesskey)
print_error('ntlmsso_iwamagicnotenabled','auth');
}
?>
?>
+83 -62
View File
@@ -208,7 +208,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$mnet_session->confirm_timeout = time() + $this->config->rpc_negotiation_timeout;
$mnet_session->expires = time() + (integer)ini_get('session.gc_maxlifetime');
$mnet_session->session_id = session_id();
if (! $mnet_session->id = insert_record('mnet_session', addslashes_object($mnet_session))) {
if (! $mnet_session->id = insert_record('mnet_session', addslashes_recursive($mnet_session))) {
print_error('databaseerror', 'mnet');
}
} else {
@@ -217,7 +217,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$mnet_session->confirm_timeout = time() + $this->config->rpc_negotiation_timeout;
$mnet_session->expires = time() + (integer)ini_get('session.gc_maxlifetime');
$mnet_session->session_id = session_id();
if (false == update_record('mnet_session', addslashes_object($mnet_session))) {
if (false == update_record('mnet_session', addslashes_recursive($mnet_session))) {
print_error('databaseerror', 'mnet');
}
}
@@ -294,7 +294,7 @@ class auth_plugin_mnet extends auth_plugin_base {
print_error('nolocaluser', 'mnet');
}
$remoteuser->mnethostid = $remotehost->id;
if (! insert_record('user', addslashes_object($remoteuser))) {
if (! insert_record('user', addslashes_recursive($remoteuser))) {
print_error('databaseerror', 'mnet');
}
$firsttime = true;
@@ -368,7 +368,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$localuser->mnethostid = $remotepeer->id;
$bool = update_record('user', addslashes_object($localuser));
$bool = update_record('user', addslashes_recursive($localuser));
if (!$bool) {
// TODO: Jonathan to clean up mess
// Actually, this should never happen (modulo race conditions) - ML
@@ -391,12 +391,12 @@ class auth_plugin_mnet extends auth_plugin_base {
$mnet_session->confirm_timeout = time();
$mnet_session->expires = time() + (integer)$session_gc_maxlifetime;
$mnet_session->session_id = session_id();
if (! $mnet_session->id = insert_record('mnet_session', addslashes_object($mnet_session))) {
if (! $mnet_session->id = insert_record('mnet_session', addslashes_recursive($mnet_session))) {
print_error('databaseerror', 'mnet');
}
} else {
$mnet_session->expires = time() + (integer)$session_gc_maxlifetime;
update_record('mnet_session', addslashes_object($mnet_session));
update_record('mnet_session', addslashes_recursive($mnet_session));
}
if (!$firsttime) {
@@ -540,7 +540,7 @@ class auth_plugin_mnet extends auth_plugin_base {
// First up - do we have a record for this course?
if (!array_key_exists($course['remoteid'], $currentcourses)) {
// No record - we must create it
$course['id'] = insert_record('mnet_enrol_course', addslashes_object((object)$course));
$course['id'] = insert_record('mnet_enrol_course', addslashes_recursive((object)$course));
$currentcourse = (object)$course;
} else {
// Pointer to current course:
@@ -558,7 +558,7 @@ class auth_plugin_mnet extends auth_plugin_base {
}
if ($saveflag) {
update_record('mnet_enrol_course', addslashes_object($currentcourse));
update_record('mnet_enrol_course', addslashes_recursive($currentcourse));
}
if (isset($currentcourse->assignmentid) && is_numeric($currentcourse->assignmentid)) {
@@ -581,7 +581,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$assignObj->hostid = (int)$MNET_REMOTE_CLIENT->id;
$assignObj->courseid = $course['id'];
$assignObj->rolename = $course['defaultrolename'];
$assignObj->id = insert_record('mnet_enrol_assignments', addslashes_object($assignObj));
$assignObj->id = insert_record('mnet_enrol_assignments', addslashes_recursive($assignObj));
}
}
@@ -772,76 +772,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) {
@@ -877,7 +877,7 @@ class auth_plugin_mnet extends auth_plugin_base {
if (isset($useridarray[$logEntryObj->username])) {
$logEntryObj->userid = $useridarray[$logEntryObj->username];
} else {
$logEntryObj->userid = get_field('user','id','username',$logEntryObj->username);
$logEntryObj->userid = get_field('user','id','username',$logEntryObj->username,'mnethostid',(int)$logEntryObj->hostid);
if ($logEntryObj->userid == false) {
$logEntryObj->userid = 0;
}
@@ -886,10 +886,12 @@ class auth_plugin_mnet extends auth_plugin_base {
unset($logEntryObj->username);
$insertok = insert_record('mnet_log', addslashes_object($logEntryObj), false);
$logEntryObj = $this->trim_logline($logEntryObj);
$insertok = insert_record('mnet_log', addslashes_recursive($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";
}
@@ -1352,6 +1354,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;
}
}
?>
+51 -1
View File
@@ -9,8 +9,10 @@
*
* Authenticates against a RADIUS server.
* Contributed by Clive Gould <clive@ce.bromley.ac.uk>
* CHAP support contributed by Stanislav Tsymbalov http://www.tsymbalov.net/
*
* 2006-08-31 File created.
* 2008-03-12 CHAP support added by Stanislav Tsymbalov.
*/
if (!defined('MOODLE_INTERNAL')) {
@@ -42,6 +44,7 @@ class auth_plugin_radius extends auth_plugin_base {
*/
function user_login ($username, $password) {
require_once 'Auth/RADIUS.php';
require_once 'Crypt/CHAP.php';
// Added by Clive on 7th May for test purposes
// printf("Username: $username <br/>");
@@ -50,9 +53,52 @@ class auth_plugin_radius extends auth_plugin_base {
// printf("nasport: $this->config->nasport <br/>");
// printf("secret: $this->config->secret <br/>");
$rauth = new Auth_RADIUS_PAP(stripslashes($username), stripslashes($password));
// Added by Stanislav Tsymbalov on 12th March 2008 only for test purposes
//$type = 'PAP';
//$type = 'CHAP_MD5';
//$type = 'MSCHAPv1';
//$type = 'MSCHAPv2';
$type = $this->config->radiustype;
if (empty($type)) {
$type = 'PAP';
}
$classname = 'Auth_RADIUS_' . $type;
$rauth = new $classname(stripslashes($username), stripslashes($password));
$rauth->addServer($this->config->host, $this->config->nasport, $this->config->secret);
$rauth->username = $username;
switch($type) {
case 'CHAP_MD5':
case 'MSCHAPv1':
$classname = $type == 'MSCHAPv1' ? 'Crypt_CHAP_MSv1' : 'Crypt_CHAP_MD5';
$crpt = new $classname;
$crpt->password = $password;
$rauth->challenge = $crpt->challenge;
$rauth->chapid = $crpt->chapid;
$rauth->response = $crpt->challengeResponse();
$rauth->flags = 1;
// If you must use deprecated and weak LAN-Manager-Responses use this:
// $rauth->lmResponse = $crpt->lmChallengeResponse();
// $rauth->flags = 0;
break;
case 'MSCHAPv2':
$crpt = new Crypt_CHAP_MSv2;
$crpt->username = $username;
$crpt->password = $password;
$rauth->challenge = $crpt->authChallenge;
$rauth->peerChallenge = $crpt->peerChallenge;
$rauth->chapid = $crpt->chapid;
$rauth->response = $crpt->challengeResponse();
break;
default:
$rauth->password = $password;
break;
}
if (!$rauth->start()) {
printf("Radius start: %s<br/>\n", $rauth->getError());
exit;
@@ -122,6 +168,9 @@ class auth_plugin_radius extends auth_plugin_base {
if (!isset ($config->nasport)) {
$config->nasport = '1812';
}
if (!isset($config->radiustype)) {
$config->radiustype = 'PAP';
}
if (!isset ($config->secret)) {
$config->secret = '';
}
@@ -134,6 +183,7 @@ class auth_plugin_radius extends auth_plugin_base {
set_config('nasport', $config->nasport, 'auth/radius');
set_config('secret', $config->secret, 'auth/radius');
set_config('changepasswordurl', $config->changepasswordurl, 'auth/radius');
set_config('radiustype', $config->radiustype, 'auth/radius');
return true;
}
+31 -4
View File
@@ -1,10 +1,12 @@
<?php
// TODO: this generates broken file errors, needs safer test -JH
// Is Auth/RADIUS really there?
if (!defined('Auth_RADIUS_PAP') or !class_exists(Auth_RADIUS_PAP) or !include_once('Auth/RADIUS.php')) {
print '<p style="text-align:center; color: red"><strong>Warning: The Auth_RADIUS module does not seem to be present. Please ensure it is installed and enabled.</strong></p>';
if (!extension_loaded('radius')) {
print '<div class="box errorbox errorboxcontent"><p class="errormessage"><strong>Warning: The PHP RADIUS extension is not present. Please ensure it is installed and enabled.</strong></p></div>';
}
include_once 'Auth/RADIUS.php';
if (!class_exists('Auth_RADIUS')) {
print '<div class="box errorbox errorboxcontent"><p class="errormessage"><strong>Warning: There is a problem with the PHP Pear Auth_RADIUS package. Please ensure it is installed correctly.</strong></p></div>';
}
// set to defaults if undefined
@@ -14,6 +16,9 @@ if (!isset($config->host)) {
if (!isset($config->nasport)) {
$config->nasport = '1812';
}
if (!isset($config->radiustype)) {
$config->radiustype = 'PAP';
}
if (!isset($config->secret)) {
$config->secret = '';
}
@@ -54,6 +59,28 @@ if (!isset($config->changepasswordurl)) {
<td><?php print_string('auth_radiusnasport', 'auth') ?></td>
</tr>
<tr valign="top" >
<td align="right"><?php print_string('auth_radiustype_key', 'auth') ?>: </td>
<td>
<?php
$radiustype = array();
$radiustype['PAP'] = get_string('auth_radiustypepap', 'auth');
$radiustype['CHAP_MD5'] = get_string('auth_radiustypechapmd5', 'auth');
$radiustype['MSCHAPv1'] = get_string('auth_radiustypemschapv1', 'auth');
$radiustype['MSCHAPv2'] = get_string('auth_radiustypemschapv2', 'auth');
choose_from_menu($radiustype, 'radiustype', $config->radiustype, '');
if (isset($err['radiustype'])) {
formerr($err['radiustype']);
}
?>
</td>
<td><?php print_string('auth_radiustype', 'auth') ?></td>
</tr>
<tr valign="top" >
<td align="right"><?php print_string('auth_radiussecret_key', 'auth') ?>: </td>
<td>
+118 -10
View File
@@ -2,8 +2,8 @@ Shibboleth Authentication for Moodle
-------------------------------------------------------------------------------
Requirements:
- Shibboleth target 1.1 or later. See documentation for your Shibboleth
federation on how to set up Shibboleth.
- Shibboleth Service Provider 1.3 or newer. Recommended is 2.1 or newer.
See documentation for your Shibboleth federation on how to set up Shibboleth.
Changes:
- 11. 2004: Created by Markus Hagman
@@ -20,6 +20,11 @@ Changes:
- 10. 2007: Removed the requirement for email address, surname and given name
attributes on request of Markus Hagman
- 11. 2007: Integrated WAYF Service in Moodle
- 12. 2008: Shibboleth 2.x and Single Logout support added
- 1. 2008: Added logout hook and moved Shibboleth config strings to utf8 auth
language files.
- 3. 2009: Added various improvements and bug fixes reported by Ina Müller from
university Tuebingen and Peter Ellis of University of Washington
Moodle Configuration with Dual login
-------------------------------------------------------------------------------
@@ -39,17 +44,30 @@ Moodle Configuration with Dual login
with something that fits your needs, e.g. 'require affiliation student'.
For IIS you have protect the auth/shibboleth directory directly in the
RequestMap of the Shibboleth configuration file (shibboleth.xml). See
RequestMap of the Shibboleth configuration file (shibboleth.xml or
shibboleth2.xml).
https://spaces.internet2.edu/display/SHIB/xmlaccesscontrol?topic=XMLAccessControl
--
<Path name="moodle" requireSession="false" >
<Path name="auth/shibboleth/index.php" requireSession="true" >
<AccessControl>
...
</AccessControl>
</Path>
</Path>
--
Also see:
https://spaces.internet2.edu/display/SHIB2/NativeSPRequestMapper and
https://spaces.internet2.edu/display/SHIB2/NativeSPAccessControl
2. As Moodle admin, go to the 'Administrations >> Users >> Authentication
Options' and click on the the 'Shibboleth' settings.
2. As Moodle admin, go to the 'Administrations >> Users >> Authentication' and
click on the the 'Shibboleth' settings.
3. Fill in the fields of the form. The fields 'Username', 'First name',
'Surname', etc. should contain the name of the environment variables of the
Shibboleth attributes that you want to map onto the corresponding Moodle
variable (e.g. 'HTTP_SHIB_PERSON_SURNAME' for the person's last name, refer
variable (e.g. 'Shib-Person-surname' for the person's last name, refer
the Shibboleth documentation or the documentation of your Shibboleth
federation for information on which attributes are available).
Especially the 'Username' field is of great importance because
@@ -72,14 +90,16 @@ Moodle Configuration with Dual login
to the the URL of the file 'moodle/auth/shibboleth/index.php'.
This will enforce Shibboleth login.
4.b If you want to use the Moodle internal WAYF service, you have to activate it
4.b If you want to use the Moodle integrated WAYF service, you have to activate it
in the Moodle Shibboleth authentication settings by checking the
'Moodle WAYF Service' checkbox and providing a list of entity IDs in the
'Identity Providers' textarea together with a name and an optional
SessionInitiator URL, which usually is an absolute or relative URL pointing
to the same host. If no SessionInitiator URL is given, the default one
'/Shibboleth.sso' will be used.
'/Shibboleth.sso' (only works for Shibboleth 1.3.x) will be used. For
Shibboleth 2.x you have to add '/Shibboleth.sso/DS' as a SessionInitiator.
Also see https://spaces.internet2.edu/display/SHIB/SessionInitiator
and https://spaces.internet2.edu/display/SHIB2/NativeSPSessionInitiator
Important Note: If you upgraded from a previous version of Moodle and now
want to use the integrated WAYF, you have to make sure that
@@ -87,7 +107,7 @@ Moodle Configuration with Dual login
moodle/auth/shibboleth/ is protected but *not* the other
scripts and especially not the login.php script.
5. Save the changes for the 'Shibboleth settings'. T
5. Save the changes for the 'Shibboleth settings'.
Important Note: If you went for 4.b (integrated WAYF service), saving the
settings will overwrite the Moodle Alternate Login URL
@@ -199,6 +219,94 @@ 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.
You find the attribute names in the file /etc/shibboleth/attribute-map.xml
listed as the 'id' value of an attribute definition.
4. If you are using the integrated WAYF, you may have to set the third parameter
of each entry to '/Shibboleth.sso/DS'
5. Test the login with a Shibboleth account
6. If all is working, disable manual authentication again
********************************************************************************
How to add logout support
--------------------------------------------------------------------------------
In order make Moodle support Shibboleth logout, one has to make the Shibboleth
Service Provider (SP) aware of the Moodle logout capability. Only then the SP
can trigger Moodle's front or back channel logout handler.
To make the SP aware of the Moodle logout, you have to add the following to the
Shibboleth main configuration file shibboleth2.xml (usually in /etc/shibboleth/)
just before the <MetadataProvider> element.
--
<Notify
Channel="back"
Location="https://#YOUR_MOODLE_HOSTNAME#/moodle/auth/shibboleth/logout.php" />
<!--
If possible, you should use only the back channel logout once it is working.
-->
<!--
<Notify
Channel="front"
Location="https://#YOUR_MOODLE_HOSTNAME#/moodle/auth/shibboleth/logout.php" />
-->
--
Then restart the Shibboleth daemon and check the log file for errors. If there
were no errors, you can test the logout feature by accessing Moodle,
authenticating via Shibboleth and the access the URL:
#YOUR_MOODLE_HOSTNAME#/Shibboleth.sso/Logout (assuming you have a standard
Shibboleth installation). If everything worked well, you should see a Shibboleth
page saying that you were successfully logged out and if you go back to Moodle
you also should be logged out from Moodle.
Requirements:
- PHP needs the Soap Extension, which maybe must installed manually:
More information is available here http://ch.php.net/soap
- Logout only works with Shibboleth Service Provider 2.1 or higher
Limitations:
Single Logout is only supported when SAML2 is used at the SP and the IdP.
As of December 2008, the Shibboleth Identity Provider 2.1.1 does not yet support
Single Logout (SLO). Therefore, the single logout feature cannot be used yet.
One of the reasons why SLO isn't supported yet is because there aren't many
applications yet that were adapted to support front and back channel
logout. Hopefully, the Moodle logout helps to motivate the developers to
implement SLO :)
Also see https://spaces.internet2.edu/display/SHIB2/SLOIssues and
https://spaces.internet2.edu/display/SHIB2/NativeSPLogoutInitiator for some
background information on this topic.
--------------------------------------------------------------------------------
In case of problems and questions with Shibboleth authentication, contact
Lukas Haemmerle <lukas.haemmerle@switch.ch> or Markus Hagman <hagman@hytti.uku.fi>
+59 -3
View File
@@ -51,9 +51,27 @@ class auth_plugin_shibboleth extends auth_plugin_base {
* @return bool Authentication success or failure.
*/
function user_login($username, $password) {
global $SESSION;
// If we are in the shibboleth directory then we trust the server var
if (!empty($_SERVER[$this->config->user_attribute])) {
// Associate Shibboleth session with user for SLO preparation
$sessionkey = '';
if (isset($_SERVER['Shib-Session-ID'])){
// This is only available for Shibboleth 2.x SPs
$sessionkey = $_SERVER['Shib-Session-ID'];
} else {
// Try to find out using the user's cookie
foreach ($_COOKIE as $name => $value){
if (eregi('_shibsession_', $name)){
$sessionkey = $value;
}
}
}
// Set shibboleth session ID for logout
$SESSION->shibboleth_session_id = $sessionkey;
return (strtolower($_SERVER[$this->config->user_attribute]) == strtolower($username));
} else {
// If we are not, the user has used the manual login and the login name is
@@ -165,6 +183,37 @@ class auth_plugin_shibboleth extends auth_plugin_base {
return;
}
/**
* Hook for logout page
*
*/
function logoutpage_hook() {
global $redirect;
// Only do this if logout handler is defined
if (
isset($this->config->logout_handler)
&& !empty($this->config->logout_handler)
){
// Check if there is an alternative logout return url defined
if (
isset($this->config->logout_return_url)
&& !empty($this->config->logout_return_url)
){
// Set temp_redirect to alternative return url
$temp_redirect = $this->config->logout_return_url;
} else {
// Backup old redirect url
$temp_redirect = $redirect;
}
// Overwrite redirect in order to send user to Shibboleth logout page and let him return back
$redirect = $this->config->logout_handler.'?return='.urlencode($temp_redirect);
}
}
/**
* Prints a form for configuring this authentication plugin.
@@ -225,17 +274,24 @@ class auth_plugin_shibboleth extends auth_plugin_base {
if (isset($config->organization_selection) && !empty($config->organization_selection)) {
set_config('organization_selection', $config->organization_selection, 'auth/shibboleth');
}
set_config('logout_handler', $config->logout_handler, 'auth/shibboleth');
set_config('logout_return_url', $config->logout_return_url, 'auth/shibboleth');
set_config('login_name', $config->login_name, 'auth/shibboleth');
set_config('convert_data', $config->convert_data, 'auth/shibboleth');
set_config('auth_instructions', $config->auth_instructions, 'auth/shibboleth');
set_config('changepasswordurl', $config->changepasswordurl, 'auth/shibboleth');
// Overwrite alternative login URL if integrated WAYF is used
if (isset($config->alt_login) && $config->alt_login == 'on'){
set_config('alt_login', $config->alt_login, 'auth/shibboleth');
set_config('alternateloginurl', $CFG->wwwroot.'/auth/shibboleth/login.php');
} else {
set_config('alt_login', 'off', 'auth/shibboleth');
set_config('alternateloginurl', '');
// Check if integrated WAYF was enabled and is now turned off
// If it was and only then, reset the Moodle alternate URL
if ($this->config->alt_login == 'on'){
set_config('alt_login', 'off', 'auth/shibboleth');
set_config('alternateloginurl', '');
}
$config->alt_login = 'off';
}
+32 -10
View File
@@ -45,7 +45,7 @@
</tr>
<tr valign="top">
<td align="right">Moodle WAYF Service:</td>
<td align="right"><?php print_string("auth_shib_integrated_wayf", "auth") ?>:</td>
<td>
<input name="alt_login" type="checkbox" <?php
if ( isset($config->alt_login) and $config->alt_login == 'on' ){
@@ -53,24 +53,24 @@
}
?> />
</td>
<td>If you check this, Moodle will use its own WAYF service instead of the one configured for Shibboleth. Moodle will display a drop-down list on this alternative login page where the user has to select his Identity Provider.</td>
<td><?php print_string("auth_shib_integrated_wayf_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right">Identity Providers:</td>
<td align="right"><?php print_string("auth_shib_idp_list", "auth") ?>:</td>
<td>
<textarea name="organization_selection" rows="10" cols="30" style="overflow: auto; white-space: nowrap;"
><?php
if (!isset($config->organization_selection)){
echo 'urn:mace:organization1:providerID, Example Organization 1
https://another.idp-id.com/shibboleth, Other Example Organization
https://another.idp-id.com/shibboleth, Other Example Organization, /Shibboleth.sso/DS/SWITCHaai
urn:mace:organization2:providerID, Example Organization 2, /Shibboleth.sso/WAYF/SWITCHaai';
} else {
echo $config->organization_selection;
}
?>
</textarea>
<?
<?php
if (isset($config->organization_selection) && empty($config->organization_selection) && isset($config->alt_login) && $config->alt_login == 'on') {
echo '<br/><font color="red">';
print_string("auth_shib_no_organizations_warning", "auth");
@@ -78,13 +78,35 @@ urn:mace:organization2:providerID, Example Organization 2, /Shibboleth.sso/WAYF/
}
?>
</td>
<td>Provide a list of Identity Provider entityIDs to let the user choose from on the login page.
On each line there must be a comma-separated tuple for entityID of the IdP (see the Shibboleth metadata file) and Name of IdP as it shall be displayed in the drow-down list.
As an optional third parameter you can add the location of a Shibboleth session initiator that shall be used in case your Moodle installation is part of a multi federation setup.</td>
<td><?php print_string("auth_shib_idp_list_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right">Authentication Method Name:</td>
<td align="right"><?php print_string("auth_shib_logout_url", "auth") ?>:</td>
<td>
<input name="logout_handler" type="text" size="30" value="<?php
if ( isset($config->logout_handler) and !empty($config->logout_handler)){
echo $config->logout_handler;
}
?>" />
</td>
<td><?php print_string("auth_shib_logout_url_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right"><?php print_string("auth_shib_logout_return_url", "auth") ?>:</td>
<td>
<input name="logout_return_url" type="text" size="30" value="<?php
if ( isset($config->logout_return_url) and !empty($config->logout_return_url)){
echo $config->logout_return_url;
}
?>" />
</td>
<td><?php print_string("auth_shib_logout_return_url_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right"><?php print_string("auth_shib_auth_method", "auth") ?>:</td>
<td>
<input name="login_name" type="text" size="30" value="<?php
if ( isset($config->login_name) and !empty($config->login_name)){
@@ -94,7 +116,7 @@ As an optional third parameter you can add the location of a Shibboleth session
}
?>" />
</td>
<td>Provide a name for the Shibboleth authentication method that is familiar to your users. This could be the name of your Shibboleth federation, e.g. "SWITCHaai Login" or "InCommon Login" and so on.</td>
<td><?php print_string("auth_shib_auth_method_description", "auth") ?></td>
</tr>
<tr valign="top">
+1 -1
View File
@@ -87,7 +87,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'])) {
print_error('shib_no_attributes_error', 'auth' , '', '\''.$pluginconfig->user_attribute.'\', \''.$pluginconfig->field_map_firstname.'\', \''.$pluginconfig->field_map_lastname.'\' and \''.$pluginconfig->field_map_email.'\'');
} else {
print_error('shib_not_set_up_error', 'auth');
+2 -1
View File
@@ -1,6 +1,5 @@
<?php // $Id$
require_once("../../config.php");
require_once($CFG->dirroot."/auth/shibboleth/auth.php");
@@ -61,6 +60,8 @@ httpsrequired();
if (isset($IdPs[$selectedIdP][1]) && !empty($IdPs[$selectedIdP][1])){
header('Location: '.$IdPs[$selectedIdP][1].'?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
} else {
// TODO: This has to be changed to /Shibboleth.sso/DS?entityId= for
// Shibbolet 2.x sometime...
header('Location: /Shibboleth.sso?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
}
} elseif (isset($_POST['idp']) && !isset($IdPs[$_POST['idp']])) {
+208
View File
@@ -0,0 +1,208 @@
<?php // $Id$
// Implements logout for Shibboleth authenticated users according to:
// - https://spaces.internet2.edu/display/SHIB2/NativeSPLogoutInitiator
// - https://spaces.internet2.edu/display/SHIB2/NativeSPNotify
require_once("../../config.php");
require_once($CFG->dirroot."/auth/shibboleth/auth.php");
// Find out whether host supports https
$protocol = 'http://';
if ( isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
$protocol = 'https://';
}
// Front channel logout
if (
isset($_GET['return'])
&& isset($_GET['action'])
&& $_GET['action'] == 'logout'
){
// Logout out user from application
// E.g. destroy application session/cookie etc
require_logout();
// Finally, send user to the return URL
redirect($_GET['return']);
}
// Back channel logout
elseif (!empty($HTTP_RAW_POST_DATA)) {
// Requires PHP 5
// Set SOAP header
$server = new SoapServer($protocol.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'/LogoutNotification.wsdl');
$server->addFunction("LogoutNotification");
$server->handle();
}
// Return WSDL
else {
header('Content-Type: text/xml');
echo <<<WSDL
<?xml version ="1.0" encoding ="UTF-8" ?>
<definitions name="LogoutNotification"
targetNamespace="urn:mace:shibboleth:2.0:sp:notify"
xmlns:notify="urn:mace:shibboleth:2.0:sp:notify"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<!--
This page either has to be called with the GET arguments 'action' and 'return' via
a redirect from the Shibboleth Service Provider logout handler (front-channel
logout) or via a SOAP request by a Shibboleth Service Provider (back-channel
logout).
Because neither of these two variants seems to be the case, the WSDL file for
the web service is returned.
For more information see:
- https://spaces.internet2.edu/display/SHIB2/NativeSPLogoutInitiator
- https://spaces.internet2.edu/display/SHIB2/NativeSPNotify
-->
<types>
<schema targetNamespace="urn:mace:shibboleth:2.0:sp:notify"
xmlns="http://www.w3.org/2000/10/XMLSchema"
xmlns:notify="urn:mace:shibboleth:2.0:sp:notify">
<simpleType name="string">
<restriction base="string">
<minLength value="1"/>
</restriction>
</simpleType>
<element name="OK" type="notify:OKType"/>
<complexType name="OKType">
<sequence/>
</complexType>
</schema>
</types>
<message name="getLogoutNotificationRequest">
<part name="SessionID" type="notify:string" />
</message>
<message name="getLogoutNotificationResponse" >
<part name="OK"/>
</message>
<portType name="LogoutNotificationPortType">
<operation name="LogoutNotification">
<input message="getLogoutNotificationRequest"/>
<output message="getLogoutNotificationResponse"/>
</operation>
</portType>
<binding name="LogoutNotificationBinding" type="notify:LogoutNotificationPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="LogoutNotification">
<soap:operation soapAction="urn:xmethods-logout-notification#LogoutNotification"/>
</operation>
</binding>
<service name="LogoutNotificationService">
<port name="LogoutNotificationPort" binding="notify:LogoutNotificationBinding">
<soap:address location="{$protocol}{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"/>
</port>
</service>
</definitions>
WSDL;
exit;
}
/******************************************************************************/
function LogoutNotification($SessionID){
global $CFG, $SESSION;
// Delete session of user using $SessionID
if(empty($CFG->dbsessions)) {
// File session
$dir = $CFG->dataroot .'/sessions';
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
// Read all session files
while (($file = readdir($dh)) !== false) {
// Check if it is a file
if (is_file($dir.'/'.$file)){
$session_key = ereg_replace('sess_', '', $file);
// Read session file data
$data = file($dir.'/'.$file);
if (isset($data[0])){
$user_session = unserializesession($data[0]);
// Check if we have found session that shall be deleted
if (isset($user_session['SESSION']) && isset($user_session['SESSION']->shibboleth_session_id)){
// If there is a match, delete file
if ($user_session['SESSION']->shibboleth_session_id == $SessionID){
// Delete session file
if (!unlink($dir.'/'.$file)){
return new SoapFault('LogoutError', 'Could not delete Moodle session file.');
}
}
}
}
}
}
closedir($dh);
}
}
} else {
// DB Session
if (!empty($CFG->sessiontimeout)) {
$ADODB_SESS_LIFE = $CFG->sessiontimeout;
}
if ($user_session_data = get_records_sql('SELECT sesskey, sessdata FROM '. $CFG->prefix .'sessions2 WHERE expiry > NOW()')) {
foreach ($user_session_data as $session_data) {
// Get user session
$user_session = adodb_unserialize( urldecode($session_data->sessdata) );
if (isset($user_session['SESSION']) && isset($user_session['SESSION']->shibboleth_session_id)){
// If there is a match, delete file
if ($user_session['SESSION']->shibboleth_session_id == $SessionID){
// Delete this session entry
if (ADODB_Session::destroy($session_data->sesskey) !== true){
return new SoapFault('LogoutError', 'Could not delete Moodle session entry in database.');
}
}
}
}
}
}
// If now SoapFault was thrown the function will return OK as the SP assumes
}
/*****************************************************************************/
// Same function as in adodb, but cannot be used for file session for some reason...
function unserializesession( $serialized_string ){
$variables = array( );
$a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
for( $i = 0; $i < count( $a ); $i = $i+2 ) {
$variables[$a[$i]] = unserialize( $a[$i+1] );
}
return( $variables );
}
?>
+4
View File
@@ -337,6 +337,9 @@ function schedule_backup_course_configure($course,$starttime = 0) {
if (!isset($backup_config->backup_sche_sitefiles)) {
$backup_config->backup_sche_sitefiles = 1;
}
if (!isset($backup_config->backup_sche_gradebook_history)) {
$backup_config->backup_sche_gradebook_history = 0;
}
if (!isset($backup_config->backup_sche_messages)) {
$backup_config->backup_sche_messages = 0;
}
@@ -439,6 +442,7 @@ function schedule_backup_course_configure($course,$starttime = 0) {
$preferences->backup_user_files = $backup_config->backup_sche_userfiles;
$preferences->backup_course_files = $backup_config->backup_sche_coursefiles;
$preferences->backup_site_files = $backup_config->backup_sche_sitefiles;
$preferences->backup_gradebook_history = $backup_config->backup_sche_gradebook_history;
$preferences->backup_messages = $backup_config->backup_sche_messages;
$preferences->backup_blogs = $backup_config->backup_sche_blogs;
$preferences->backup_course = $course->id;
+176 -111
View File
@@ -235,7 +235,7 @@
}
rs_close($backup_users);
//Gets the user data
$info[0][0] = get_string("userswithfiles");
$info[0][0] = get_string('userswithfiles', 'moodle');
$info[0][1] = $count;
return $info;
@@ -483,6 +483,8 @@
fwrite ($bf,full_tag("DATE",2,false,$preferences->backup_unique_code));
//The original site wwwroot
fwrite ($bf,full_tag("ORIGINAL_WWWROOT",2,false,$CFG->wwwroot));
//The original site identifier. MD5 hashed for security.
fwrite ($bf,full_tag("ORIGINAL_SITE_IDENTIFIER_HASH",2,false,md5(get_site_identifier())));
//The zip method used
if (!empty($CFG->zip)) {
$zipmethod = 'external';
@@ -587,7 +589,7 @@
fwrite ($bf,full_tag("SITEFILES",3,false,"false"));
}
//The gradebook histories
if ($preferences->backup_gradebook_history == 1) {
if (empty($CFG->disablegradehistory) && $preferences->backup_gradebook_history == 1) {
fwrite ($bf,full_tag("GRADEBOOKHISTORIES",3,false,"true"));
} else {
fwrite ($bf,full_tag("GRADEBOOKHISTORIES",3,false,"false"));
@@ -1272,11 +1274,16 @@
// Use a recordset to for the memory handling on to
// the DB and run faster
// Note the outer join with mnet_host: It shouldn't be neccesary
// but there are some sites having mnet_host records missing
// and that causes backup to fail (no users). Being a bit more
// flexible here (outer joing) we bypass the problem and doesn't
// cause more troubles. Eloy - MDL-16879
$users = get_recordset_sql("SELECT b.old_id, b.table_name, b.info,
u.*, m.wwwroot
FROM {$CFG->prefix}backup_ids b
JOIN {$CFG->prefix}user u ON b.old_id=u.id
JOIN {$CFG->prefix}mnet_host m ON u.mnethostid=m.id
LEFT JOIN {$CFG->prefix}mnet_host m ON u.mnethostid=m.id
WHERE b.backup_code = '$preferences->backup_unique_code' AND
b.table_name = 'user'");
@@ -1333,7 +1340,7 @@
fwrite ($bf,full_tag("AJAX",4,false,$user->ajax));
fwrite ($bf,full_tag("AUTOSUBSCRIBE",4,false,$user->autosubscribe));
fwrite ($bf,full_tag("TRACKFORUMS",4,false,$user->trackforums));
if ($user->mnethostid != $CFG->mnet_localhost_id) {
if ($user->mnethostid != $CFG->mnet_localhost_id && !empty($user->wwwroot)) {
fwrite ($bf,full_tag("MNETHOSTURL",4,false,$user->wwwroot));
}
fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$user->timemodified));
@@ -1370,11 +1377,11 @@
fwrite ($bf,end_tag("ROLES",4,true));
//Check if we have custom profile fields to backup
if ($cpfields = get_records_sql("SELECT uif.shortname, uif.datatype, uid.data
if ($cpfields = get_records_sql("SELECT uif.shortname, uif.datatype, uidata.data
FROM {$CFG->prefix}user_info_field uif,
{$CFG->prefix}user_info_data uid
WHERE uif.id = uid.fieldid
AND uid.userid = $user->id")) {
{$CFG->prefix}user_info_data uidata
WHERE uif.id = uidata.fieldid
AND uidata.userid = $user->id")) {
//Start USER_CUSTOM_PROFILE_FIELDS tag
fwrite ($bf,start_tag("USER_CUSTOM_PROFILE_FIELDS",4,true));
//Write custom profile fields
@@ -1564,8 +1571,8 @@
$status = backup_gradebook_item_info($bf,$preferences, $backupall);
// backup gradebook histories
if ($preferences->backup_gradebook_history) {
// backup gradebook histories (only if grade history is enabled and selected)
if (empty($CFG->disablegradehistory) && $preferences->backup_gradebook_history) {
$status = backup_gradebook_outcomes_history($bf, $preferences);
$status = backup_gradebook_categories_history_info($bf, $preferences);
$status = backup_gradebook_items_history_info($bf, $preferences);
@@ -1827,28 +1834,28 @@
// find all grade categories history
if ($chs = get_records('grade_categories_history', 'courseid', $preferences->backup_course)) {
fwrite ($bf,start_tag("GRADE_CATEGORIES_HISTORIES",5,true));
fwrite ($bf,start_tag("GRADE_CATEGORIES_HISTORIES",3,true));
foreach ($chs as $ch) {
fwrite ($bf,start_tag("GRADE_CATEGORIES_HISTORY",6,true));
fwrite ($bf,full_tag("ID",7,false,$ch->id));
fwrite ($bf,full_tag("ACTION",7,false,$ch->action));
fwrite ($bf,full_tag("OLDID",7,false,$ch->oldid));
fwrite ($bf,full_tag("SOURCE",7,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",7,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",7,false,$ch->loggeduser));
fwrite ($bf,full_tag("PARENT",7,false,$ch->parent));
fwrite ($bf,full_tag("DEPTH",7,false,$ch->depth));
fwrite ($bf,full_tag("PATH",7,false,$ch->path));
fwrite ($bf,full_tag("FULLNAME",7,false,$ch->fullname));
fwrite ($bf,full_tag("AGGRETGATION",7,false,$ch->aggregation));
fwrite ($bf,full_tag("KEEPHIGH",7,false,$ch->keephigh));
fwrite ($bf,full_tag("DROPLOW",7,false,$ch->droplow));
fwrite ($bf,full_tag("AGGREGATEONLYGRADED",7,false,$ch->aggregateonlygraded));
fwrite ($bf,full_tag("AGGREGATEOUTCOMES",7,false,$ch->aggregateoutcomes));
fwrite ($bf,full_tag("AGGREGATESUBCATS",7,false,$ch->aggregatesubcats));
fwrite ($bf,end_tag("GRADE_CATEGORIES_HISTORY",6,true));
fwrite ($bf,start_tag("GRADE_CATEGORIES_HISTORY",4,true));
fwrite ($bf,full_tag("ID",5,false,$ch->id));
fwrite ($bf,full_tag("ACTION",5,false,$ch->action));
fwrite ($bf,full_tag("OLDID",5,false,$ch->oldid));
fwrite ($bf,full_tag("SOURCE",5,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",5,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",5,false,$ch->loggeduser));
fwrite ($bf,full_tag("PARENT",5,false,$ch->parent));
fwrite ($bf,full_tag("DEPTH",5,false,$ch->depth));
fwrite ($bf,full_tag("PATH",5,false,$ch->path));
fwrite ($bf,full_tag("FULLNAME",5,false,$ch->fullname));
fwrite ($bf,full_tag("AGGRETGATION",5,false,$ch->aggregation));
fwrite ($bf,full_tag("KEEPHIGH",5,false,$ch->keephigh));
fwrite ($bf,full_tag("DROPLOW",5,false,$ch->droplow));
fwrite ($bf,full_tag("AGGREGATEONLYGRADED",5,false,$ch->aggregateonlygraded));
fwrite ($bf,full_tag("AGGREGATEOUTCOMES",5,false,$ch->aggregateoutcomes));
fwrite ($bf,full_tag("AGGREGATESUBCATS",5,false,$ch->aggregatesubcats));
fwrite ($bf,end_tag("GRADE_CATEGORIES_HISTORY",4,true));
}
$status = fwrite ($bf,end_tag("GRADE_CATEGORIES_HISTORIES",5,true));
$status = fwrite ($bf,end_tag("GRADE_CATEGORIES_HISTORIES",3,true));
}
return $status;
}
@@ -1864,39 +1871,39 @@
JOIN {$CFG->prefix}grade_items gi
ON gi.id = ggh.itemid
WHERE gi.courseid = $preferences->backup_course")) {
fwrite ($bf,start_tag("GRADE_GRADES_HISTORIES",5,true));
fwrite ($bf,start_tag("GRADE_GRADES_HISTORIES",3,true));
foreach ($chs as $ch) {
/// Grades are only sent to backup if the user is one target user
if (backup_getid($preferences->backup_unique_code, 'user', $ch->userid)) {
fwrite ($bf,start_tag("GRADE_GRADES_HISTORY",6,true));
fwrite ($bf,full_tag("ID",7,false,$ch->id));
fwrite ($bf,full_tag("ACTION",7,false,$ch->action));
fwrite ($bf,full_tag("OLDID",7,false,$ch->oldid));
fwrite ($bf,full_tag("SOURCE",7,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",7,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",7,false,$ch->loggeduser));
fwrite ($bf,full_tag("ITEMID",7,false,$ch->itemid));
fwrite ($bf,full_tag("USERID",7,false,$ch->userid));
fwrite ($bf,full_tag("RAWGRADE",7,false,$ch->rawgrade));
fwrite ($bf,full_tag("RAWGRADEMAX",7,false,$ch->rawgrademax));
fwrite ($bf,full_tag("RAWGRADEMIN",7,false,$ch->rawgrademin));
fwrite ($bf,full_tag("RAWSCALEID",7,false,$ch->rawscaleid));
fwrite ($bf,full_tag("USERMODIFIED",7,false,$ch->usermodified));
fwrite ($bf,full_tag("FINALGRADE",7,false,$ch->finalgrade));
fwrite ($bf,full_tag("HIDDEN",7,false,$ch->hidden));
fwrite ($bf,full_tag("LOCKED",7,false,$ch->locked));
fwrite ($bf,full_tag("LOCKTIME",7,false,$ch->locktime));
fwrite ($bf,full_tag("EXPORTED",7,false,$ch->exported));
fwrite ($bf,full_tag("OVERRIDDEN",7,false,$ch->overridden));
fwrite ($bf,full_tag("EXCLUDED",7,false,$ch->excluded));
fwrite ($bf,full_tag("FEEDBACK",7,false,$ch->feedback));
fwrite ($bf,full_tag("FEEDBACKFORMAT",7,false,$ch->feedbackformat));
fwrite ($bf,full_tag("INFORMATION",7,false,$ch->information));
fwrite ($bf,full_tag("INFORMATIONFORMAT",7,false,$ch->informationformat));
fwrite ($bf,end_tag("GRADE_GRADES_HISTORY",6,true));
fwrite ($bf,start_tag("GRADE_GRADES_HISTORY",4,true));
fwrite ($bf,full_tag("ID",5,false,$ch->id));
fwrite ($bf,full_tag("ACTION",5,false,$ch->action));
fwrite ($bf,full_tag("OLDID",5,false,$ch->oldid));
fwrite ($bf,full_tag("SOURCE",5,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",5,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",5,false,$ch->loggeduser));
fwrite ($bf,full_tag("ITEMID",5,false,$ch->itemid));
fwrite ($bf,full_tag("USERID",5,false,$ch->userid));
fwrite ($bf,full_tag("RAWGRADE",5,false,$ch->rawgrade));
fwrite ($bf,full_tag("RAWGRADEMAX",5,false,$ch->rawgrademax));
fwrite ($bf,full_tag("RAWGRADEMIN",5,false,$ch->rawgrademin));
fwrite ($bf,full_tag("RAWSCALEID",5,false,$ch->rawscaleid));
fwrite ($bf,full_tag("USERMODIFIED",5,false,$ch->usermodified));
fwrite ($bf,full_tag("FINALGRADE",5,false,$ch->finalgrade));
fwrite ($bf,full_tag("HIDDEN",5,false,$ch->hidden));
fwrite ($bf,full_tag("LOCKED",5,false,$ch->locked));
fwrite ($bf,full_tag("LOCKTIME",5,false,$ch->locktime));
fwrite ($bf,full_tag("EXPORTED",5,false,$ch->exported));
fwrite ($bf,full_tag("OVERRIDDEN",5,false,$ch->overridden));
fwrite ($bf,full_tag("EXCLUDED",5,false,$ch->excluded));
fwrite ($bf,full_tag("FEEDBACK",5,false,$ch->feedback));
fwrite ($bf,full_tag("FEEDBACKFORMAT",5,false,$ch->feedbackformat));
fwrite ($bf,full_tag("INFORMATION",5,false,$ch->information));
fwrite ($bf,full_tag("INFORMATIONFORMAT",5,false,$ch->informationformat));
fwrite ($bf,end_tag("GRADE_GRADES_HISTORY",4,true));
}
}
$status = fwrite ($bf,end_tag("GRADE_GRADES_HISTORIES",5,true));
$status = fwrite ($bf,end_tag("GRADE_GRADES_HISTORIES",3,true));
}
return $status;
}
@@ -1908,43 +1915,43 @@
// find all grade categories history
if ($chs = get_records('grade_items_history','courseid', $preferences->backup_course)) {
fwrite ($bf,start_tag("GRADE_ITEM_HISTORIES",5,true));
fwrite ($bf,start_tag("GRADE_ITEM_HISTORIES",3,true));
foreach ($chs as $ch) {
fwrite ($bf,start_tag("GRADE_ITEM_HISTORY",6,true));
fwrite ($bf,full_tag("ID",7,false,$ch->id));
fwrite ($bf,full_tag("ACTION",7,false,$ch->action));
fwrite ($bf,full_tag("OLDID",7,false,$ch->oldid));
fwrite ($bf,full_tag("SOURCE",7,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",7,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",7,false,$ch->loggeduser));
fwrite ($bf,full_tag("CATEGORYID",7,false,$ch->categoryid));
fwrite ($bf,full_tag("ITEMNAME",7,false,$ch->itemname));
fwrite ($bf,full_tag("ITEMTYPE",7,false,$ch->itemtype));
fwrite ($bf,full_tag("ITEMMODULE",7,false,$ch->itemmodule));
fwrite ($bf,full_tag("ITEMINSTANCE",7,false,$ch->iteminstance));
fwrite ($bf,full_tag("ITEMNUMBER",7,false,$ch->itemnumber));
fwrite ($bf,full_tag("ITEMINFO",7,false,$ch->iteminfo));
fwrite ($bf,full_tag("IDNUMBER",7,false,$ch->idnumber));
fwrite ($bf,full_tag("CALCULATION",7,false,$ch->calculation));
fwrite ($bf,full_tag("GRADETYPE",7,false,$ch->gradetype));
fwrite ($bf,full_tag("GRADEMAX",7,false,$ch->grademax));
fwrite ($bf,full_tag("GRADEMIN",7,false,$ch->grademin));
fwrite ($bf,full_tag("SCALEID",7,false,$ch->scaleid));
fwrite ($bf,full_tag("OUTCOMEID",7,false,$ch->outcomeid));
fwrite ($bf,full_tag("GRADEPASS",7,false,$ch->gradepass));
fwrite ($bf,full_tag("MULTFACTOR",7,false,$ch->multfactor));
fwrite ($bf,full_tag("PLUSFACTOR",7,false,$ch->plusfactor));
fwrite ($bf,full_tag("AGGREGATIONCOEF",7,false,$ch->aggregationcoef));
fwrite ($bf,full_tag("SORTORDER",7,false,$ch->sortorder));
fwrite ($bf,start_tag("GRADE_ITEM_HISTORY",4,true));
fwrite ($bf,full_tag("ID",5,false,$ch->id));
fwrite ($bf,full_tag("ACTION",5,false,$ch->action));
fwrite ($bf,full_tag("OLDID",5,false,$ch->oldid));
fwrite ($bf,full_tag("SOURCE",5,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",5,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",5,false,$ch->loggeduser));
fwrite ($bf,full_tag("CATEGORYID",5,false,$ch->categoryid));
fwrite ($bf,full_tag("ITEMNAME",5,false,$ch->itemname));
fwrite ($bf,full_tag("ITEMTYPE",5,false,$ch->itemtype));
fwrite ($bf,full_tag("ITEMMODULE",5,false,$ch->itemmodule));
fwrite ($bf,full_tag("ITEMINSTANCE",5,false,$ch->iteminstance));
fwrite ($bf,full_tag("ITEMNUMBER",5,false,$ch->itemnumber));
fwrite ($bf,full_tag("ITEMINFO",5,false,$ch->iteminfo));
fwrite ($bf,full_tag("IDNUMBER",5,false,$ch->idnumber));
fwrite ($bf,full_tag("CALCULATION",5,false,$ch->calculation));
fwrite ($bf,full_tag("GRADETYPE",5,false,$ch->gradetype));
fwrite ($bf,full_tag("GRADEMAX",5,false,$ch->grademax));
fwrite ($bf,full_tag("GRADEMIN",5,false,$ch->grademin));
fwrite ($bf,full_tag("SCALEID",5,false,$ch->scaleid));
fwrite ($bf,full_tag("OUTCOMEID",5,false,$ch->outcomeid));
fwrite ($bf,full_tag("GRADEPASS",5,false,$ch->gradepass));
fwrite ($bf,full_tag("MULTFACTOR",5,false,$ch->multfactor));
fwrite ($bf,full_tag("PLUSFACTOR",5,false,$ch->plusfactor));
fwrite ($bf,full_tag("AGGREGATIONCOEF",5,false,$ch->aggregationcoef));
fwrite ($bf,full_tag("SORTORDER",5,false,$ch->sortorder));
//fwrite ($bf,full_tag("DISPLAY",7,false,$ch->display));
//fwrite ($bf,full_tag("DECIMALS",7,false,$ch->decimals));
fwrite ($bf,full_tag("HIDDEN",7,false,$ch->hidden));
fwrite ($bf,full_tag("LOCKED",7,false,$ch->locked));
fwrite ($bf,full_tag("LOCKTIME",7,false,$ch->locktime));
fwrite ($bf,full_tag("NEEDSUPDATE",7,false,$ch->needsupdate));
fwrite ($bf,end_tag("GRADE_ITEM_HISTORY",6,true));
fwrite ($bf,full_tag("HIDDEN",5,false,$ch->hidden));
fwrite ($bf,full_tag("LOCKED",5,false,$ch->locked));
fwrite ($bf,full_tag("LOCKTIME",5,false,$ch->locktime));
fwrite ($bf,full_tag("NEEDSUPDATE",5,false,$ch->needsupdate));
fwrite ($bf,end_tag("GRADE_ITEM_HISTORY",4,true));
}
$status = fwrite ($bf,end_tag("GRADE_ITEM_HISTORIES",5,true));
$status = fwrite ($bf,end_tag("GRADE_ITEM_HISTORIES",3,true));
}
return $status;
@@ -1956,22 +1963,22 @@
// find all grade categories history
if ($chs = get_records('grade_outcomes_history','courseid', $preferences->backup_course)) {
fwrite ($bf,start_tag("GRADE_OUTCOME_HISTORIES",5,true));
fwrite ($bf,start_tag("GRADE_OUTCOME_HISTORIES",3,true));
foreach ($chs as $ch) {
fwrite ($bf,start_tag("GRADE_OUTCOME_HISTORY",6,true));
fwrite ($bf,full_tag("ID",7,false,$ch->id));
fwrite ($bf,full_tag("OLDID",7,false,$ch->oldid));
fwrite ($bf,full_tag("ACTION",7,false,$ch->action));
fwrite ($bf,full_tag("SOURCE",7,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",7,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",7,false,$ch->loggeduser));
fwrite ($bf,full_tag("SHORTNAME",7,false,$ch->shortname));
fwrite ($bf,full_tag("FULLNAME",7,false,$ch->fullname));
fwrite ($bf,full_tag("SCALEID",7,false,$ch->scaleid));
fwrite ($bf,full_tag("DESCRIPTION",7,false,$ch->description));
fwrite ($bf,end_tag("GRADE_OUTCOME_HISTORY",6,true));
fwrite ($bf,start_tag("GRADE_OUTCOME_HISTORY",4,true));
fwrite ($bf,full_tag("ID",5,false,$ch->id));
fwrite ($bf,full_tag("OLDID",5,false,$ch->oldid));
fwrite ($bf,full_tag("ACTION",5,false,$ch->action));
fwrite ($bf,full_tag("SOURCE",5,false,$ch->source));
fwrite ($bf,full_tag("TIMEMODIFIED",5,false,$ch->timemodified));
fwrite ($bf,full_tag("LOGGEDUSER",5,false,$ch->loggeduser));
fwrite ($bf,full_tag("SHORTNAME",5,false,$ch->shortname));
fwrite ($bf,full_tag("FULLNAME",5,false,$ch->fullname));
fwrite ($bf,full_tag("SCALEID",5,false,$ch->scaleid));
fwrite ($bf,full_tag("DESCRIPTION",5,false,$ch->description));
fwrite ($bf,end_tag("GRADE_OUTCOME_HISTORY",4,true));
}
$status = fwrite ($bf,end_tag("GRADE_OUTCOME_HISTORIES",5,true));
$status = fwrite ($bf,end_tag("GRADE_OUTCOME_HISTORIES",3,true));
}
return $status;
}
@@ -2290,7 +2297,7 @@
//It does this conversions:
// - $CFG->wwwroot/file.php/courseid ------------------> $@FILEPHP@$ (slasharguments links)
// - $CFG->wwwroot/file.php?file=/courseid ------------> $@FILEPHP@$ (non-slasharguments links)
// - Every module xxxx_encode_content_links() is executed too
// - Every module/block/course_format xxxx_encode_content_links() is executed too
//
function backup_encode_absolute_links($content) {
@@ -2316,6 +2323,12 @@
$includedfiles = array();
}
//Check if we support unicode modifiers in regular expressions. Cache it.
static $unicoderegexp;
if (!isset($unicoderegexp)) {
$unicoderegexp = @preg_match('/\pL/u', 'a'); // This will fail silenty, returning false,
} // if regexp libraries don't support unicode
//Check if preferences is ok. If it isn't set, we are
//in a scheduled_backup to we are able to get a copy
//from CFG->backup_preferences
@@ -2325,15 +2338,28 @@
//We are in manual backups so global preferences must exist!!
$mypreferences = $preferences;
}
//First, we check for every call to file.php inside the course
$search = array($CFG->wwwroot.'/file.php/'.$mypreferences->backup_course,
$CFG->wwwroot.'/file.php?file=/'.$mypreferences->backup_course);
$CFG->wwwroot.'/file.php?file=/'.$mypreferences->backup_course,
$CFG->wwwroot.'/file.php?file=%2f'.$mypreferences->backup_course,
$CFG->wwwroot.'/file.php?file=%2F'.$mypreferences->backup_course);
$replace = array('$@FILEPHP@$','$@FILEPHP@$');
$replace = array('$@FILEPHP@$', '$@FILEPHP@$', '$@FILEPHP@$', '$@FILEPHP@$');
$result = str_replace($search,$replace,$content);
// Now we look for any '$@FILEPHP@$' URLs, replacing:
// - slashes and %2F by $@SLASH@$
// - &forcedownload=1 &amp;forcedownload=1 and ?forcedownload=1 by $@FORCEDOWNLOAD@$
// This way, backup contents will be neutral and independent of slasharguments configuration. MDL-18799
// Based in $unicoderegexp, decide the regular expression to use
if ($unicoderegexp) { //We can use unicode modifiers
$search = '/(\$@FILEPHP@\$)((?:(?:\/|%2f|%2F))(?:(?:\([-;:@#&=\pL0-9\$~_.+!*\',]*?\))|[-;:@#&=\pL0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*)?(\?(?:(?:(?:\([-;:@#&=\pL0-9\$~_.+!*\',]*?\))|[-;:@#&=?\pL0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*))?(?<![,.;])/';
} else { //We cannot ue unicode modifiers
$search = '/(\$@FILEPHP@\$)((?:(?:\/|%2f|%2F))(?:(?:\([-;:@#&=a-zA-Z0-9\$~_.+!*\',]*?\))|[-;:@#&=a-zA-Z0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*)?(\?(?:(?:(?:\([-;:@#&=a-zA-Z0-9\$~_.+!*\',]*?\))|[-;:@#&=?a-zA-Z0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*))?(?<![,.;])/';
}
$result = preg_replace_callback($search, 'backup_process_filephp_uses', $result);
foreach ($mypreferences->mods as $name => $info) {
/// We only include the corresponding backuplib.php if it hasn't been included before
/// This will save some load under PHP5. MDL-8700.
@@ -2349,6 +2375,25 @@
}
}
// For the current course format call its encode_content_links method (if it exists)
static $format_function_name;
if (!isset($format_function_name)) {
$format_function_name = false;
if ($format = get_field('course', 'format', 'id', $mypreferences->backup_course)) {
if (file_exists("$CFG->dirroot/course/format/$format/backuplib.php")) {
include_once("$CFG->dirroot/course/format/$format/backuplib.php");
$function_name = $format.'_encode_format_content_links';
if (function_exists($function_name)) {
$format_function_name = $function_name;
}
}
}
}
// If the above worked - then we have a function to call
if ($format_function_name) {
$result = $format_function_name($result, $mypreferences);
}
// For each block, call its encode_content_links method.
// This encodes forexample links to blocks/something/viewphp?id=666
// that are stored in other activities.
@@ -2375,6 +2420,21 @@
return $result;
}
/**
* Callback preg_replace function used by backup_encode_absolute_links()
* to process $@FILEPHP@$ URLs to get slasharguments independent URLs
*/
function backup_process_filephp_uses($matches) {
// Replace slashes (plain and encoded) and forcedownload=1 parameter
$search = array('/', '%2f', '%2F', '?forcedownload=1', '&forcedownload=1', '&amp;forcedownload=1');
$replace = array('$@SLASH@$', '$@SLASH@$', '$@SLASH@$', '$@FORCEDOWNLOAD@$', '$@FORCEDOWNLOAD@$', '$@FORCEDOWNLOAD@$');
$result = $matches[1] . (isset($matches[2]) ? str_replace($search, $replace, $matches[2]) : '') . (isset($matches[3]) ? str_replace($search, $replace, $matches[3]) : '');
return $result;
}
//This function copies all the needed files under the "user" directory to the "user_files"
//directory under temp/backup
function backup_copy_user_files ($preferences) {
@@ -2783,9 +2843,14 @@
}
}
// foreach context, call get_roles_on_exact_context insert into array
// foreach context, call get_roles_on_exact_context + get_roles_with_override_on_context() and insert into array
foreach ($contexts as $context) {
if ($proles = get_roles_on_exact_context($context)) {
if ($proles = get_roles_on_exact_context($context)) { // Look for roles assignments
foreach ($proles as $prole) {
$roles[$prole->id] = $prole;
}
}
if ($proles = get_roles_with_override_on_context($context)) { // Look for roles overrides
foreach ($proles as $prole) {
$roles[$prole->id] = $prole;
}
+1 -1
View File
@@ -74,7 +74,7 @@ function blackboard_convert($dir){
// Copy the Blackboard course files into the moodle course_files structure
$subdirs = get_subdirs($dir."/");
mkdir("$dir/course_files");
mkdir("$dir/course_files", $CFG->directorypermissions);
foreach ($subdirs as $subdir){
rename($subdir, "course_files/$subdir");
}
+57 -9
View File
@@ -435,6 +435,25 @@
upgrade_log_finish();
}
/**
* Are we restoring a backup that was made on the same site that we are restoring to?
* This relies on some information that was only added to backup files in January 2009.
* For older backup files, fall back to guessing based on wwwroot. MDL-16614 explains
* when this guess could give the wrong answer.
* @return boolean true if the backup was made on the same site we are restoring to.
*/
function backup_is_same_site(&$restore) {
global $CFG;
static $hashedsiteid = null;
if (is_null($hashedsiteid)) {
$hashedsiteid = md5(get_site_identifier());
}
if (!empty($restore->original_siteidentifier)) {
return $restore->original_siteidentifier == $hashedsiteid;
} else {
return $restore->original_wwwroot == $CFG->wwwroot;
}
}
//This function is used to insert records in the backup_ids table
//If the info field is greater than max_db_storage, then its info
@@ -630,12 +649,10 @@
function import_backup_file_silently($pathtofile,$destinationcourse,$emptyfirst=false,$userdata=false, $preferences=array()) {
global $CFG,$SESSION,$USER; // is there such a thing on cron? I guess so..
global $restore; // ick
if (empty($USER)) {
$USER = get_admin();
$USER->admin = 1; // not sure why, but this doesn't get set
}
define('RESTORE_SILENTLY',true); // don't output all the stuff to us.
if (!defined('RESTORE_SILENTLY')) {
define('RESTORE_SILENTLY',true); // don't output all the stuff to us.
}
$debuginfo = 'import_backup_file_silently: ';
$cleanupafter = false;
@@ -684,9 +701,12 @@
mtrace($debuginfo.'Required function check failed (see backup_required_functions)');
return false;
}
@ini_set("max_execution_time","3000");
raise_memory_limit("192M");
if (empty($CFG->extramemorylimit)) {
raise_memory_limit('128M');
} else {
raise_memory_limit($CFG->extramemorylimit);
}
if (!$backup_unique_code = restore_precheck($destinationcourse,$pathtofile,$errorstr,true)) {
mtrace($debuginfo.'Failed restore_precheck (error was '.$errorstr.')');
@@ -699,14 +719,17 @@
$SESSION->restore->metacourse = $restore->metacourse = (isset($preferences['restore_metacourse']) ? $preferences['restore_metacourse'] : 0);
$SESSION->restore->restoreto = $restore->restoreto = 1;
$SESSION->restore->users = $restore->users = $userdata;
$SESSION->restore->groups = $restore->groups = (isset($preferences['restore_groups']) ? $preferences['restore_groups'] : RESTORE_GROUPS_NONE);
$SESSION->restore->logs = $restore->logs = (isset($preferences['restore_logs']) ? $preferences['restore_logs'] : 0);
$SESSION->restore->user_files = $restore->user_files = $userdata;
$SESSION->restore->messages = $restore->messages = (isset($preferences['restore_messages']) ? $preferences['restore_messages'] : 0);
$SESSION->restore->blogs = $restore->blogs = (isset($preferences['restore_blogs']) ? $preferences['restore_blogs'] : 0);
$SESSION->restore->course_id = $restore->course_id = $destinationcourse;
$SESSION->restore->restoreto = 1;
$SESSION->restore->course_id = $destinationcourse;
$SESSION->restore->deleting = $emptyfirst;
$SESSION->restore->restore_course_files = $restore->course_files = (isset($preferences['restore_course_files']) ? $preferences['restore_course_files'] : 0);
$SESSION->restore->restore_site_files = $restore->site_files = (isset($preferences['restore_site_files']) ? $preferences['restore_site_files'] : 0);
$SESSION->restore->backup_version = $SESSION->info->backup_backup_version;
$SESSION->restore->course_startdateoffset = $course->startdate - $SESSION->course_header->course_startdate;
@@ -749,7 +772,9 @@
*/
function backup_course_silently($courseid, $prefs, &$errorstring) {
global $CFG, $preferences; // global preferences here because something else wants it :(
define('BACKUP_SILENTLY', 1);
if (!defined('BACKUP_SILENTLY')) {
define('BACKUP_SILENTLY', 1);
}
if (!$course = get_record('course', 'id', $courseid)) {
debugging("Couldn't find course with id $courseid in backup_course_silently");
return false;
@@ -783,6 +808,7 @@
global $CFG;
$preferences = new StdClass;
$preferences->backup_unique_code = time();
$preferences->backup_users = (isset($prefs['backup_users']) ? $prefs['backup_users'] : 0);
$preferences->backup_name = backup_get_zipfile_name($course, $preferences->backup_unique_code);
$count = 0;
@@ -800,6 +826,7 @@
if (!function_exists($modbackup) || !function_exists($modcheckbackup)) {
continue;
}
$modcheckbackup($course->id, $preferences->backup_users, $preferences->backup_unique_code);
$var = "exists_".$modname;
$preferences->$var = true;
$count++;
@@ -841,7 +868,6 @@
//Check other parameters
$preferences->backup_metacourse = (isset($prefs['backup_metacourse']) ? $prefs['backup_metacourse'] : 0);
$preferences->backup_users = (isset($prefs['backup_users']) ? $prefs['backup_users'] : 0);
$preferences->backup_logs = (isset($prefs['backup_logs']) ? $prefs['backup_logs'] : 0);
$preferences->backup_user_files = (isset($prefs['backup_user_files']) ? $prefs['backup_user_files'] : 0);
$preferences->backup_course_files = (isset($prefs['backup_course_files']) ? $prefs['backup_course_files'] : 0);
@@ -850,6 +876,28 @@
$preferences->backup_gradebook_history = (isset($prefs['backup_gradebook_history']) ? $prefs['backup_gradebook_history'] : 0);
$preferences->backup_blogs = (isset($prefs['backup_blogs']) ? $prefs['backup_blogs'] : 0);
$preferences->backup_course = $course->id;
//Check users
user_check_backup($course->id,$preferences->backup_unique_code,$preferences->backup_users,$preferences->backup_messages, $preferences->backup_blogs);
//Check logs
log_check_backup($course->id);
//Check user files
user_files_check_backup($course->id,$preferences->backup_unique_code);
//Check course files
course_files_check_backup($course->id,$preferences->backup_unique_code);
//Check site files
site_files_check_backup($course->id,$preferences->backup_unique_code);
//Role assignments
$roles = get_records('role', '', '', 'sortorder');
foreach ($roles as $role) {
$preferences->backuproleassignments[$role->id] = $role;
}
backup_add_static_preferences($preferences);
return $preferences;
}
+17 -6
View File
@@ -23,6 +23,18 @@
$method = optional_param( 'method' );
$backup_unique_code = optional_param('backup_unique_code',0,PARAM_INT);
//Get and check course
if (! $course = get_record("course", "id", $id)) {
error("Course ID was incorrect (can't find it)");
}
// To some reasons, course_startdateoffset value was lost during restoring
// See MDL-17469
if (!empty($course->startdate) && !empty($SESSION->course_header->course_startdate)) {
$SESSION->restore->course_startdateoffset = $course->startdate - $SESSION->course_header->course_startdate;
} else {
$SESSION->restore->course_startdateoffset = 0;
}
//Check login
require_login();
@@ -116,11 +128,6 @@
//We are here, so me have a file.
//Get and check course
if (! $course = get_record("course", "id", $id)) {
error("Course ID was incorrect (can't find it)");
}
//Print header
if (has_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM))) {
$navlinks[] = array('name' => basename($file), 'link' => null, 'type' => 'misc');
@@ -140,7 +147,11 @@
//Adjust some php variables to the execution of this script
@ini_set("max_execution_time","3000");
raise_memory_limit("192M");
if (empty($CFG->extramemorylimit)) {
raise_memory_limit('128M');
} else {
raise_memory_limit($CFG->extramemorylimit);
}
//Call the form, depending the step we are
+78 -53
View File
@@ -1,4 +1,5 @@
<?php //$Id$
//This page receive all the restore_form data. Then, if existing course
//has been selected, shows a list of courses to select one.
//It cheks that the parammeter from restore_form are coherent.
@@ -22,8 +23,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;
@@ -202,50 +203,56 @@
error("Site not found!");
}
//Depending the selected restoreto:
// If user is a teacher (and not creator) or we are restoring from within SITEID:
// 0-Current course, deleting: Put $restore->course_id and $restore->deleting (true), create the restore object
// 1-Current course, adding: Put $restore->course_id and $restore->deleting (false), create the restore object
// If the uses is a creator:
// 0-Existing course, deleting: Select the destination course and launch the check again, then
// put $restore->course_id and $restore->deleting (true), create the restore object.
// 1-Existing course, adding: Select the destination course and launch the check again, then
// put $restore->course_id and $restore->deleting (false), create the restore object.
// 2-New course: Create the restore object and launch the execute.
//If the user is a teacher and not a creator or we are restoring from within SITEID
if (!user_can_create_courses() || $id == SITEID) {
$restore->course_id = $id;
if ($restore->restoreto == 0) {
$restore->deleting = true;
} else {
$restore->deleting = false;
}
}
//If the user is a creator (or admin)
if (user_can_create_courses()) {
//Set restore->deleting as needed
if ($restore->restoreto == 0) {
$restore->deleting = true;
} else {
$restore->deleting = false;
}
}
// Non-cached - get accessinfo
if (isset($USER->access)) {
$accessinfo = $USER->access;
} else {
$accessinfo = get_user_access_sitewide($USER->id);
}
// Get all the courses the user is able to restore to
$mycourses = get_user_courses_bycap($USER->id, 'moodle/site:restore', $accessinfo, true, 'c.sortorder ASC', array('id', 'fullname', 'shortname', 'visible'));
// Calculate if the user can create courses
$cancreatecourses = user_can_create_courses();
//Depending the selected restoreto:
// A) If user has 'moodle/site:restore' in more than one course and cannot create courses and he isn't restoring from SITEID:
// 0-Existing course, deleting: Select the destination course and launch the check again, then
// put $restore->course_id and $restore->deleting (true), create the restore object.
// 1-Existing course, adding: Select the destination course and launch the check again, then
// put $restore->course_id and $restore->deleting (false), create the restore object.
// B) Else, if user cannot create courses or he is restoring from within SITEID:
// 0-Current course, deleting: Put $restore->course_id and $restore->deleting (true), create the restore object
// 1-Current course, adding: Put $restore->course_id and $restore->deleting (false), create the restore object
// C) If the user is a creator:
// 0-Existing course, deleting: Select the destination course and launch the check again, then
// put $restore->course_id and $restore->deleting (true), create the restore object.
// 1-Existing course, adding: Select the destination course and launch the check again, then
// put $restore->course_id and $restore->deleting (false), create the restore object.
// 2-New course: Create the restore object and launch the execute.
// NOTE: SITEID is prevented as a source for restoring because it's public area and we must encourage admins
// to avoid using it as a "repository" for courses storage.
// A) If user has 'moodle/site:restore' in more than one course, cannot create courses and he isn't restoring from SITEID
if (count($mycourses) > 1 && !$cancreatecourses && $id != SITEID) {
/// Nothing to do, process continues and C) will show the list of courses
// B) Else, if the user is a teacher and not a creator or we are restoring from within SITEID
} else if (!$cancreatecourses || $id == SITEID) {
$restore->course_id = $id; /// Force restore to current course, disabling pick course from list
}
// C) Arrived here, we have preprocessed all the changes needed by A) and B). Continue with the process
//Set restore->deleting as needed
if ($restore->restoreto == 0) {
$restore->deleting = true;
} else {
$restore->deleting = false;
}
//Now, select the course if needed
//if (($restore->restoreto == 0 or $restore->restoreto == 1) and ($restore->course_id == 0) and get_capability_courses('moodle/site:restore')) {
if (($restore->restoreto == 0 or $restore->restoreto == 1) and ($restore->course_id == 0) && count($mycourses) > 1) {
if ($courses = $mycourses) {
@@ -270,12 +277,14 @@
//Checks everything and execute restore
} else if ((($restore->restoreto == 0 or $restore->restoreto == 1) and ($restore->course_id != 0)) or ($restore->restoreto == 2)) {
//Final access control check
if ($restore->course_id == 0 and !user_can_create_courses()) {
if ($restore->course_id == 0 and !$cancreatecourses) {
error("You need to be a creator or admin to restore into new course!");
} else if ($restore->course_id != 0 and !has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $restore->course_id))) {
error("You need to be an edit teacher or admin to restore into selected course!");
}
$show_continue_button = true;
$messages = array();
//Check if we've selected any mod's user info and restore->users
//is set to none. Change it to course and inform.
if ($restore->users == 2) {
@@ -291,36 +300,52 @@
$changed = 1;
}
if ($changed) {
echo get_string ("noteuserschangednonetocourse");
echo "<hr noshade size=\"1\">";
$messages[] = get_string ("noteuserschangednonetocourse");
$restore->users = 1;
}
}
/// If restoring users and backup has mnet remote users and we are restoring to different site, forbid restore to non-admins. MDL-17009
if ($restore->users != 2 && /// If restoring users
!empty($info->mnet_remoteusers) && $info->mnet_remoteusers === 'true' && /// and backup contains remote users
!backup_is_same_site($info)) { /// and backup is being restored to different site
/// If user is admin (by 'moodle/user:create' cap), warn about conversion to local auth if missing mnet hosts and continue restore
if (has_capability('moodle/user:create', get_context_instance(CONTEXT_SYSTEM))) {
$messages[] = get_string('mnetrestore_extusers_admin', 'admin');
$show_continue_button = true;
/// else, notify about the thing (suggesting to ask admin) and stop restore
} else {
$messages[] = get_string('mnetrestore_extusers_noadmin', 'admin');
$show_continue_button = false;
}
}
//Save the restore session object
$SESSION->restore = $restore;
echo "<div style='text-align:center'>";
/// Printout messages
foreach ($messages as $message) {
echo '<p>' . $message . '</p>';
}
/// Warning and button
if ($show_continue_button) {
//Print the continue button to execute the restore NOW !!!!
//All is prepared !!!
echo "<div style='text-align:center'>";
$hidden["launch"] = "execute";
$hidden["file"] = $file;
$hidden["id"] = $id;
print_string('longtimewarning','admin');
if ($restore->users && !empty($info->mnet_externalusers)
&& $info->mnet_externalusers === 'true') {
if ($info->original_wwwroot === $CFG->wwwroot) {
print '<p>'.get_string('mnetrestore_extusers','admin').'</p>';
} else {
print '<p>'. get_string('mnetrestore_extusers_mismatch','admin').'</p>';
}
}
/// Restore button
print_single_button("restore.php", $hidden, get_string("restorecoursenow"),"post");
echo "</div>";
} else {
//Show error
error ("Something was wrong checking restore preferences");
}
echo "</div>";
//If we are here. Something must be wrong. Debug !!!
} else {
+4
View File
@@ -13,6 +13,10 @@
//Add info->original_wwwroot to $restore to be able to use it in all the restore process
//(mainly when decoding internal links)
$restore->original_wwwroot = $info->original_wwwroot;
// Copy $info->original_siteidentifier, is present, so backup_is_same_site can work.
if (isset($info->original_siteidentifier)) {
$restore->original_siteidentifier = $info->original_siteidentifier;
}
//Add info->backup_version to $restore to be able to detect versions in the restore process
//(to decide when to convert wiki texts to markdown...)
$restore->backup_version = $info->backup_backup_version;
+18 -12
View File
@@ -109,8 +109,9 @@
$restore_blogs = 1;
}
$cancreatecourses = user_can_create_courses();
if (!isset($restore_restoreto)) {
if (!user_can_create_courses()) {
if (!$cancreatecourses) {
$restore_restoreto = 1;
} else {
$restore_restoreto = 2;
@@ -206,7 +207,7 @@ function selectItemInCheckboxByName(formId, checkName, checked ) {
* if user has course:create in any category, we show
* newcourse
*/
// Non-cached - get accessinfo
if (isset($USER->access)) {
$accessinfo = $USER->access;
@@ -229,7 +230,7 @@ function selectItemInCheckboxByName(formId, checkName, checked ) {
}
// if user can create any course at all, give the option
if (user_can_create_courses()) {
if ($cancreatecourses) {
$restore_restoreto_options[2] = get_string("newcourse");
}
@@ -238,7 +239,7 @@ function selectItemInCheckboxByName(formId, checkName, checked ) {
choose_from_menu($restore_restoreto_options, "restore_restoreto", $restore_restoreto, "");
echo "</td></tr>";
if (user_can_create_courses()) { //display these fields conditionally
if ($cancreatecourses) { //display these fields conditionally
// find the list of cates user can edit
echo "<tr valign=\"top\" >";
@@ -291,6 +292,11 @@ function selectItemInCheckboxByName(formId, checkName, checked ) {
echo '<input type="hidden" name="startday" value="0" />';
}
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>";
@@ -529,7 +535,7 @@ function selectItemInCheckboxByName(formId, checkName, checked ) {
echo "<input type=\"hidden\" id=\"menurestore_site_files\" name=\"restore_site_files\" value=\"0\" />";
}
echo "</td></tr>";
// do you want grade histories to be restored?
if (empty($CFG->disablegradehistory)) {
echo "<tr>";
@@ -661,7 +667,7 @@ if ($info->backup_moodle_version < 2006092801) {
$mappableroles = $siteroleschoicearray;
echo ('<tr><td align="right">');
echo '<label for="menuroles_'.$roleid.'">'.$role->name." (".($role->shortname).")".'</label>';
echo '<label for="menuroles_'.$roleid.'">'.format_string($role->name)." (".($role->shortname).")".'</label>';
echo ('</td><td align="left">');
/// first, we see if any exact role definition is found
@@ -671,7 +677,7 @@ if ($info->backup_moodle_version < 2006092801) {
$matchrole = $samerole->id;
// if an exact role is found, it does not matter whether this user can assign this role or not,
// this will be presented as a valid option regardless
$mappableroles[$samerole->id] = $allroles[$samerole->id]->name." (". $allroles[$samerole->id]->shortname.")";
$mappableroles[$samerole->id] = format_string($allroles[$samerole->id]->name)." (". $allroles[$samerole->id]->shortname.")";
} else {
// no exact role found, let's try to match shortname
// this is useful in situations where basic roles differ slightly in definition
@@ -712,9 +718,9 @@ echo ('</table>'); // end of role mappings table
/**
* Look for a role in the database with exactly the same definition as the one in the backup file.
*
*
* @param integer $roleid the id that the role in the backup files had on the old server.
* @param object $role the rest of the definition of the role from the backup file.
* @param object $role the rest of the definition of the role from the backup file.
*/
function restore_samerole($roleid, $rolefromxml) {
global $CFG;
@@ -724,13 +730,13 @@ function restore_samerole($roleid, $rolefromxml) {
// First guess, try let's use the id
if (restore_is_samerole($roleid, $rolefromxml)) {
return get_record('role', 'id', $roleid);
return get_record('role', 'id', $roleid);
}
// Second guess, try the shortname
$testroleid = get_field('role', 'id', 'shortname', $rolefromxml->shortname);
if ($testroleid && restore_is_samerole($testroleid, $rolefromxml)) {
return get_record('role', 'id', $testroleid);
return get_record('role', 'id', $testroleid);
}
// Finally, search all other roles. In orter to speed things up, we exclude the ones we have
@@ -765,7 +771,7 @@ function restore_samerole($roleid, $rolefromxml) {
*/
function restore_is_samerole($testroleid, $rolefromxml) {
// Load the role definition from the databse.
$rolefromdb = get_records('role_capabilities', 'roleid', $testroleid, '', 'capability,permission');
$rolefromdb = get_records('role_capabilities', 'roleid', $testroleid, '', 'capability,permission');
if (!$rolefromdb) {
return false;
}
+472 -62
View File
@@ -81,7 +81,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
//This function makes all the necessary calls to xxxx_decode_content_links_caller()
//function in each module, passing them the desired contents to be decoded
//function in each module/block/course format..., passing them the desired contents to be decoded
//from backup format to destination site/course in order to mantain inter-activities
//working in the backup/restore process
function restore_decode_content_links($restore) {
@@ -98,7 +98,8 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
echo '<li>' . get_string('from') . ' ' . get_string('course');
}
$course = get_record('course', 'id', $restore->course_id, '', '', '', '', 'id,summary');
$coursesummary = restore_decode_content_links_worker($course->summary, $restore);
$coursesummary = backup_todb($course->summary,false); // Exception: Process FILEPHP (not available when restored) MDL-18222
$coursesummary = restore_decode_content_links_worker($coursesummary, $restore);
if ($coursesummary != $course->summary) {
$course->summary = addslashes($coursesummary);
if (!update_record('course', $course)) {
@@ -148,6 +149,23 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
}
// For the course format call its decode_content_links method (if it exists)
$format = get_field('course', 'format', 'id', $restore->course_id);
if (file_exists("$CFG->dirroot/course/format/$format/restorelib.php")) {
include_once("$CFG->dirroot/course/format/$format/restorelib.php");
$function_name = $format.'_decode_format_content_links_caller';
if (function_exists($function_name)) {
if (!defined('RESTORE_SILENTLY')) {
echo "<li>".get_string ("from")." ".get_string("format").' '.$format;
}
$status = $function_name($restore);
if (!defined('RESTORE_SILENTLY')) {
echo '</li>';
}
}
}
// Process all html text also in blocks too
if (!defined('RESTORE_SILENTLY')) {
echo '<li>'.get_string ('from').' '.get_string('blocks');
@@ -186,6 +204,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//its task is to ask all modules (maybe other linkable objects) to restore
//links to them.
function restore_decode_content_links_worker($content,$restore) {
global $CFG;
foreach($restore->mods as $name => $info) {
$function_name = $name."_decode_content_links";
if (function_exists($function_name)) {
@@ -193,6 +212,25 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
}
// For the current format, call decode_format_content_links if it exists
static $format_function_name;
if (!isset($format_function_name)) {
$format_function_name = false;
if ($format = get_field('course', 'format', 'id', $restore->course_id)) {
if (file_exists("$CFG->dirroot/course/format/$format/restorelib.php")) {
include_once("$CFG->dirroot/course/format/$format/restorelib.php");
$function_name = $format.'_decode_format_content_links';
if (function_exists($function_name)) {
$format_function_name = $function_name;
}
}
}
}
// If the above worked - then we have a function to call
if ($format_function_name) {
$content = $format_function_name($content, $restore);
}
// For each block, call its encode_content_links method
static $blockobjects = null;
if (!isset($blockobjects)) {
@@ -486,6 +524,15 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//The backup date
$tab[3][0] = "<b>".get_string("backupdate").":</b>";
$tab[3][1] = userdate($info->backup_date);
//Is this the same Moodle install?
if (!empty($info->original_siteidentifier)) {
$tab[4][0] = "<b>".get_string("backupfromthissite").":</b>";
if (backup_is_same_site($info)) {
$tab[4][1] = get_string('yes');
} else {
$tab[4][1] = get_string('no');
}
}
//Print title
print_heading(get_string("backup").":");
$table->data = $tab;
@@ -725,7 +772,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$course->shortname = addslashes($course_header->course_shortname);
$course->idnumber = addslashes($course_header->course_idnumber);
$course->idnumber = ''; //addslashes($course_header->course_idnumber); // we don't want this at all.
$course->summary = backup_todb($course_header->course_summary);
$course->summary = addslashes($course_header->course_summary);
$course->format = addslashes($course_header->course_format);
$course->showgrades = addslashes($course_header->course_showgrades);
$course->newsitems = addslashes($course_header->course_newsitems);
@@ -824,7 +871,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
global $CFG;
$status = true;
delete_records('block_instance', 'pageid', $restore->course_id, 'pagetype', PAGE_COURSE_VIEW);
blocks_delete_all_on_page(PAGE_COURSE_VIEW, $restore->course_id);
if (empty($backup_block_format)) { // This is a backup from Moodle < 1.5
if (empty($blockinfo)) {
// Looks like it's from Moodle < 1.3. Let's give the course default blocks...
@@ -1067,6 +1114,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//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) {
@@ -1260,7 +1312,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$dbmetacourse = false;
//Check if child course exists in destination server
//(by id in the same server or by idnumber and shortname in other server)
if ($restore->original_wwwroot == $CFG->wwwroot) {
if (backup_is_same_site($restore)) {
//Same server, lets see by id
$dbcourse = get_record('course','id',$child->id);
} else {
@@ -1292,7 +1344,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$dbmetacourse = false;
//Check if parent course exists in destination server
//(by id in the same server or by idnumber and shortname in other server)
if ($restore->original_wwwroot == $CFG->wwwroot) {
if (backup_is_same_site($restore)) {
//Same server, lets see by id
$dbcourse = get_record('course','id',$parent->id);
} else {
@@ -2421,6 +2473,9 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
/// Iterate over all users loaded from xml
$counter = 0;
/// Init trailing messages
$messages = array();
foreach ($info->users as $userid) {
$rec = backup_getid($restore->backup_unique_code,"user",$userid);
$user = $rec->info;
@@ -2471,17 +2526,45 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//Has role teacher or student or needed
$is_course_user = ($is_teacher or $is_student or $is_needed);
//Calculate mnethostid
if (empty($user->mnethosturl) || $user->mnethosturl===$CFG->wwwroot) {
$user->mnethostid = $CFG->mnet_localhost_id;
} else {
// fast url-to-id lookups
if (isset($mnethosts[$user->mnethosturl])) {
$user->mnethostid = $mnethosts[$user->mnethosturl]->id;
// in case we are restoring to same server, look for user by id
// it should return record always, but in sites rebuilt from scratch
// and being reconstructed using course backups
$user_data = false;
if (backup_is_same_site($restore)) {
$user_data = get_record('user', 'id', $user->id);
}
// Only try to perform mnethost/auth modifications if restoring to another server
// or if, while restoring to same server, the user doesn't exists yet (rebuilt site)
//
// So existing user data in same server *won't be modified by restore anymore*,
// under any circumpstance. If somehting is wrong with existing data, it's server fault.
if (!backup_is_same_site($restore) || (backup_is_same_site($restore) && !$user_data)) {
//Calculate mnethostid
if (empty($user->mnethosturl) || $user->mnethosturl===$CFG->wwwroot) {
$user->mnethostid = $CFG->mnet_localhost_id;
} else {
// should not happen, as we check in restore_chech.php
// but handle the error if it does
error("This backup file contains external Moodle Network Hosts that are not configured locally.");
// fast url-to-id lookups
if (isset($mnethosts[$user->mnethosturl])) {
$user->mnethostid = $mnethosts[$user->mnethosturl]->id;
} else {
$user->mnethostid = $CFG->mnet_localhost_id;
}
}
//Arriving here, any user with mnet auth and using $CFG->mnet_localhost_id is wrong
//as own server cannot be accesed over mnet. Change auth to manual and inform about the switch
if ($user->auth == 'mnet' && $user->mnethostid == $CFG->mnet_localhost_id) {
// Respect registerauth
if ($CFG->registerauth == 'email') {
$user->auth = 'email';
} else {
$user->auth = 'manual';
}
// inform about the automatic switch of authentication/host
if(empty($user->mnethosturl)) {
$user->mnethosturl = '----';
}
$messages[] = get_string('mnetrestore_extusers_switchuserauth', 'admin', $user);
}
}
unset($user->mnethosturl);
@@ -2490,8 +2573,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$newid=null;
//check if it exists (by username) and get its id
$user_exists = true;
$user_data = get_record("user","username",addslashes($user->username),
'mnethostid', $user->mnethostid);
if (!backup_is_same_site($restore)) { /// Restoring to another server, look for existing user based on fields
/// If restoring to same server, look has been performed some lines above (by id)
$user_data = get_record('user', 'username', addslashes($user->username), 'mnethostid', $user->mnethostid);
}
if (!$user_data) {
$user_exists = false;
} else {
@@ -2553,7 +2639,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
// - if the destination site is different (by wwwroot) reset it.
// - if the destination site is the same (by wwwroot), leave it unmodified
if ($restore->original_wwwroot != $CFG->wwwroot) {
if (!backup_is_same_site($restore)) {
$user->policyagreed = 0;
} else {
//Nothing to do, we are in the same server
@@ -2618,7 +2704,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
// - if we are in the same server (by wwwroot), maintain it unmodified.
if (empty($user->roles['teacher']->enrol)) {
$user->roles['teacher']->enrol = $CFG->enrol;
} else if ($restore->original_wwwroot != $CFG->wwwroot) {
} else if (!backup_is_same_site($restore)) {
$user->roles['teacher']->enrol = $CFG->enrol;
} else {
//Nothing to do. Leave it unmodified
@@ -2664,7 +2750,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
// - if we are in the same server (by wwwroot), maintain it unmodified.
if (empty($user->roles['student']->enrol)) {
$user->roles['student']->enrol = $CFG->enrol;
} else if ($restore->original_wwwroot != $CFG->wwwroot) {
} else if (!backup_is_same_site($restore)) {
$user->roles['student']->enrol = $CFG->enrol;
} else {
//Nothing to do. Leave it unmodified
@@ -2749,6 +2835,17 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
backup_flush(300);
}
} /// End of loop over all the users loaded from xml
/// Inform about all the messages geerated while restoring users
if (!defined('RESTORE_SILENTLY')) {
if ($messages) {
echo '<ul>';
foreach ($messages as $message) {
echo '<li>' . $message . '</li>';
}
echo '</ul>';
}
}
}
return $status;
@@ -3194,9 +3291,10 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
// scale is not course unique, use get_record_sql to suppress warning
//Going to compare LOB columns so, use the cross-db sql_compare_text() in both sides.
$compare_scale_clause = sql_compare_text('scale') . "=" . sql_compare_text("'" . $sca->scale . "'");
$sca_db = get_record_sql("SELECT * FROM {$CFG->prefix}scale
WHERE scale = '$sca->scale'
WHERE $compare_scale_clause
AND courseid = $course_to_search", true);
//If it doesn't exist, create
@@ -3398,7 +3496,9 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$group_member->userid = $user->new_id;
//The structure is equal to the db, so insert the groups_members
if (!insert_record ("groups_members", $group_member)) {
if (record_exists("groups_members", 'groupid', $group_member->groupid, 'userid', $group_member->userid)) {
// user already member
} else if (!insert_record ("groups_members", $group_member)) {
$status = false;
continue;
}
@@ -3598,8 +3698,10 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//Now search if that event exists (by name, description, timestart fields) in
//restore->course_id course
//Going to compare LOB columns so, use the cross-db sql_compare_text() in both sides.
$compare_description_clause = sql_compare_text('description') . "=" . sql_compare_text("'" . $eve->description . "'");
$eve_db = get_record_select("event",
"courseid={$eve->courseid} AND name='{$eve->name}' AND description='{$eve->description}' AND timestart=$eve->timestart");
"courseid={$eve->courseid} AND name='{$eve->name}' AND $compare_description_clause AND timestart=$eve->timestart");
//If it doesn't exist, create
if (!$eve_db) {
$create_event = true;
@@ -3666,6 +3768,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
// - $@FILEPHP@$ ---|------------> $CFG->wwwroot/file.php/courseid (slasharguments on)
// |------------> $CFG->wwwroot/file.php?file=/courseid (slasharguments off)
//
// - $@SLASH@$ --|---------------> / (slasharguments on)
// |---------------> %2F (slasharguments off)
//
// - $@FORCEDOWNLOAD@$ --|-------> ?forcedownload=1 (slasharguments on)
// |-------> &amp;forcedownload=1(slasharguments off)
//Note: Inter-activities linking is being implemented as a final
//step in the restore execution, because we need to have it
//finished to know all the oldid, newid equivaleces
@@ -3689,6 +3796,15 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$replace = array(get_file_url($restore->course_id));
$result = str_replace($search,$replace,$content);
//Now $@SLASH@$ and $@FORCEDOWNLOAD@$ MDL-18799
$search = array('$@SLASH@$', '$@FORCEDOWNLOAD@$');
if ($CFG->slasharguments) {
$replace = array('/', '?forcedownload=1');
} else {
$replace = array('%2F', '&amp;forcedownload=1');
}
$result = str_replace($search, $replace, $result);
if ($result != $content && debugging()) { //Debug
if (!defined('RESTORE_SILENTLY')) {
echo '<br /><hr />'.s($content).'<br />changed to<br />'.s($result).'<hr /><br />'; //Debug
@@ -3903,6 +4019,10 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//Iterate
$counter = 0;
foreach ($list as $dir) {
//Avoid copying maintenance.html. MDL-18594
if ($dir == 'maintenance.html') {
continue;
}
//Copy the dir to its new location
//Only if destination file/dir doesn exists
if (!file_exists($dest_dir."/".$dir)) {
@@ -4432,6 +4552,217 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//== ==
//=====================================================================================
/// This is the class used to split, in first instance, the monolithic moodle.xml into
/// smaller xml files allowing the MoodleParser later to process only the required info
/// based in each TODO, instead of processing the whole xml for each TODO. In theory
/// processing time can be reduced upto 1/20th of original time (depending of the
/// number of TODOs in the original moodle.xml file)
///
/// Anyway, note it's a general splitter parser, and only needs to be instantiated
/// with the proper destination dir and the tosplit configuration. Be careful when
/// using it because it doesn't support XML attributes nor real cdata out from tags.
/// (both not used in the target Moodle backup files)
class moodle_splitter_parser {
var $level = 0; /// Level we are
var $tree = array(); /// Array of levels we are
var $cdata = ''; /// Raw storage for character data
var $content = ''; /// Content buffer to be printed to file
var $trailing= ''; /// Content of the trailing tree for each splited file
var $savepath = null; /// Path to store splited files
var $fhandler = null; /// Current file we are writing to
var $tosplit = array(); /// Array defining the files we want to split, in this format:
/// array( level/tag/level/tag => filename)
var $splitwords = array(); /// Denormalised array containing the potential tags
/// being a split point. To speed up check_split_point()
var $maxsplitlevel = 0; /// Precalculated max level where any split happens. To speed up check_split_point()
var $buffersize = 65536; /// 64KB is a good write buffer. Don't expect big benefits by increasing this.
var $repectformat = false; /// With this setting enabled, the splited files will look like the original one
/// with all the indentations 100% copied from original (character data outer tags).
/// But this is a waste of time from our perspective, and splited xml files are completely
/// functional without that, so we disable this for production, generating a more compact
/// XML quicker
/// PHP4 constructor
function moodle_splitter_parser($savepath, $tosplit = null) {
return $this->__construct($savepath, $tosplit);
}
/// PHP5 constructor
function __construct($savepath, $tosplit = null) {
$this->savepath = $savepath;
if (!empty($tosplit)) {
$this->tosplit = $tosplit;
} else { /// No tosplit list passed, process all the possible parts in one moodle.xml file
$this->tosplit = array(
'1/MOODLE_BACKUP/2/INFO' => 'split_info.xml',
'1/MOODLE_BACKUP/2/ROLES' => 'split_roles.xml',
'2/COURSE/3/HEADER' => 'split_course_header.xml',
'2/COURSE/3/BLOCKS' => 'split_blocks.xml',
'2/COURSE/3/SECTIONS' => 'split_sections.xml',
'2/COURSE/3/FORMATDATA' => 'split_formatdata.xml',
'2/COURSE/3/METACOURSE' => 'split_metacourse.xml',
'2/COURSE/3/GRADEBOOK' => 'split_gradebook.xml',
'2/COURSE/3/USERS' => 'split_users.xml',
'2/COURSE/3/MESSAGES' => 'split_messages.xml',
'2/COURSE/3/BLOGS' => 'split_blogs.xml',
'2/COURSE/3/QUESTION_CATEGORIES'=> 'split_questions.xml',
'2/COURSE/3/SCALES' => 'split_scales.xml',
'2/COURSE/3/GROUPS' => 'split_groups.xml',
'2/COURSE/3/GROUPINGS' => 'split_groupings.xml',
'2/COURSE/3/GROUPINGSGROUPS' => 'split_groupingsgroups.xml',
'2/COURSE/3/EVENTS' => 'split_events.xml',
'2/COURSE/3/MODULES' => 'split_modules.xml',
'2/COURSE/3/LOGS' => 'split_logs.xml'
);
}
/// Precalculate some info used to speedup checks
foreach ($this->tosplit as $key=>$value) {
$this->splitwords[basename($key)] = true;
if (((int) basename(dirname($key))) > $this->maxsplitlevel) {
$this->maxsplitlevel = (int) basename(dirname($key));
}
}
}
/// Given one tag being opened, check if it's one split point.
/// Return false or split filename
function check_split_point($tag) {
/// Quick check. Level < 2 cannot be a split point
if ($this->level < 2) {
return false;
}
/// Quick check. Current tag against potential splitwords
if (!isset($this->splitwords[$tag])) {
return false;
}
/// Prev test passed, take a look to 2-level tosplit
$keytocheck = ($this->level - 1) . '/' . $this->tree[$this->level - 1] . '/' . $this->level . '/' . $this->tree[$this->level];
if (!isset($this->tosplit[$keytocheck])) {
return false;
}
/// Prev test passed, we are in a split point, return new filename
return $this->tosplit[$keytocheck];
}
/// To append data (xml-escaped) to contents buffer
function character_data($parser, $data) {
///$this->content .= preg_replace($this->entity_find, $this->entity_replace, $data); ///40% slower
///$this->content .= str_replace($this->entity_find, $this->entity_replace, $data); ///25% slower
///$this->content .= htmlspecialchars($data); ///the best
/// Instead of htmlspecialchars() each chunk of character data, we are going to
/// concat it without transformation and will apply the htmlspecialchars() when
/// that character data is, efectively, going to be added to contents buffer. This
/// makes the number of transformations to be reduced (speedup) and avoid potential
/// problems with transformations being applied "in the middle" of multibyte chars.
$this->cdata .= $data;
}
/// To detect start of tags, keeping level, tree and fhandle updated.
/// Also handles creation of split files
function start_tag($parser, $tag, $attrs) {
/// Update things before processing
$this->level++;
$this->tree[$this->level] = $tag;
/// Check if we need to start a new split file,
/// Speedup: we only do that if we haven't a fhandler and if level <= $maxsplitlevel
if ($this->level <= $this->maxsplitlevel && !$this->fhandler && $newfilename = $this->check_split_point($tag)) {
/// Open new file handler, init everything
$this->fhandler = fopen($this->savepath . '/' . $newfilename, 'w');
$this->content = '';
$this->cdata = '';
$this->trailing = '';
/// Build the original leading tree (and calculate the original trailing one)
for ($l = 1; $l < $this->level; $l++) {
$this->content .= "<{$this->tree[$l]}>\n";
$this->trailing = "\n</{$this->tree[$l]}>" . $this->trailing;
}
}
/// Perform xml-entities transformation and add to contents buffer together with opening tag.
/// Speedup. We lose nice formatting of the split XML but avoid 50% of transformations and XML is 100% equivalent
$this->content .= ($this->repectformat ? htmlspecialchars($this->cdata) : '') . "<$tag>";
$this->cdata = '';
}
/// To detect end of tags, keeping level, tree and fhandle updated, writting contents buffer to split file.
/// Also handles closing of split files
function end_tag($parser, $tag) {
/// Perform xml-entities transformation and add to contents buffer together with closing tag, repecting (or no) format
$this->content .= ($this->repectformat ? htmlspecialchars($this->cdata) : htmlspecialchars(trim($this->cdata))) . "</$tag>";
$this->cdata = '';
/// Check if we need to close current split file
/// Speedup: we only do that if we have a fhandler and if level <= $maxsplitlevel
if ($this->level <= $this->maxsplitlevel && $this->fhandler && $newfilename = $this->check_split_point($tag)) {
/// Write pending contents buffer before closing. It's a must
fwrite($this->fhandler, $this->content);
$this->content = "";
/// Write the original trailing tree for fhandler
fwrite($this->fhandler, $this->trailing);
fclose($this->fhandler);
$this->fhandler = null;
} else {
/// Normal write of contents (use one buffer to improve speed)
if ($this->fhandler && strlen($this->content) > $this->buffersize) {
fwrite($this->fhandler, $this->content);
$this->content = "";
}
}
/// Update things after processing
$this->tree[$this->level] = "";
$this->level--;
}
}
/// This function executes the moodle_splitter_parser, causing the monolithic moodle.xml
/// file to be splitted in n smaller files for better treatament by the MoodleParser in restore_read_xml()
function restore_split_xml ($xml_file, $preferences) {
$status = true;
$xml_parser = xml_parser_create('UTF-8');
$split_parser = new moodle_splitter_parser(dirname($xml_file));
xml_set_object($xml_parser,$split_parser);
xml_set_element_handler($xml_parser, 'start_tag', 'end_tag');
xml_set_character_data_handler($xml_parser, 'character_data');
$doteach = filesize($xml_file) / 20;
$fromdot = 0;
$fp = fopen($xml_file,"r")
or $status = false;
if ($status) {
$lasttime = time();
while ($data = fread($fp, 8192)) {
if (!defined('RESTORE_SILENTLY')) {
$fromdot += 8192;
if ($fromdot > $doteach) {
echo ".";
backup_flush(300);
$fromdot = 0;
}
if ((time() - $lasttime) > 10) {
$lasttime = time();
backup_flush(300);
}
}
xml_parse($xml_parser, $data, feof($fp))
or die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
fclose($fp);
}
xml_parser_free($xml_parser);
return $status;
}
//This is the class used to do all the xml parse
class MoodleParser {
@@ -4943,8 +5274,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
case "ORIGINAL_WWWROOT":
$this->info->original_wwwroot = $this->getContents();
break;
case "MNET_EXTERNALUSERS":
$this->info->mnet_externalusers = $this->getContents();
case "ORIGINAL_SITE_IDENTIFIER_HASH":
$this->info->original_siteidentifier = $this->getContents();
break;
case "MNET_REMOTEUSERS":
$this->info->mnet_remoteusers = $this->getContents();
break;
}
}
@@ -5030,7 +5364,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
function endElementRoles($parser, $tagName) {
//Check if we are into INFO zone
//Check if we are into ROLES zone
if ($this->tree[2] == "ROLES") {
if ($this->tree[3] == "ROLE") {
@@ -5071,7 +5405,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
}
//Stop parsing if todo = INFO and tagName = INFO (en of the tag, of course)
//Stop parsing if todo = ROLES and tagName = ROLES (en of the tag, of course)
//Speed up a lot (avoid parse all)
if ($tagName == "ROLES") {
$this->finished = true;
@@ -6972,38 +7306,58 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$this->temp .= htmlspecialchars(trim($this->content))."</".$tagName.">";
//If we've finished a mod, xmlize it an save to db
if (($this->level == 4) and ($tagName == "MOD")) {
//Prepend XML standard header to info gathered
$xml_data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".$this->temp;
//Call to xmlize for this portion of xml data (one MOD)
//echo "-XMLIZE: ".strftime ("%X",time()),"-"; //Debug
$data = xmlize($xml_data,0);
//echo strftime ("%X",time())."<p>"; //Debug
//traverse_xmlize($data); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//Now, save data to db. We'll use it later
//Get id and modtype from data
$mod_id = $data["MOD"]["#"]["ID"]["0"]["#"];
$mod_type = $data["MOD"]["#"]["MODTYPE"]["0"]["#"];
//Only if we've selected to restore it
if (!empty($this->preferences->mods[$mod_type]->restore)) {
//Save to db
$status = backup_putid($this->preferences->backup_unique_code,$mod_type,$mod_id,
null,$data);
//echo "<p>id: ".$mod_id."-".$mod_type." len.: ".strlen($sla_mod_temp)." to_db: ".$status."<p>"; //Debug
//Create returning info
$ret_info = new object();
$ret_info->id = $mod_id;
$ret_info->modtype = $mod_type;
$this->info[] = $ret_info;
//Only process the module if efectively it has been selected for restore. MDL-18482
if (empty($this->preferences->mods[$this->temp_mod_type]->granular) // We don't care about per instance, i.e. restore all instances.
or (array_key_exists($this->temp_mod_id, $this->preferences->mods[$this->temp_mod_type]->instances)
and
!empty($this->preferences->mods[$this->temp_mod_type]->instances[$this->temp_mod_id]->restore))) {
//Prepend XML standard header to info gathered
$xml_data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".$this->temp;
//Call to xmlize for this portion of xml data (one MOD)
//echo "-XMLIZE: ".strftime ("%X",time()),"-"; //Debug
$data = xmlize($xml_data,0);
//echo strftime ("%X",time())."<p>"; //Debug
//traverse_xmlize($data); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//Now, save data to db. We'll use it later
//Get id and modtype from data
$mod_id = $data["MOD"]["#"]["ID"]["0"]["#"];
$mod_type = $data["MOD"]["#"]["MODTYPE"]["0"]["#"];
//Only if we've selected to restore it
if (!empty($this->preferences->mods[$mod_type]->restore)) {
//Save to db
$status = backup_putid($this->preferences->backup_unique_code,$mod_type,$mod_id,
null,$data);
//echo "<p>id: ".$mod_id."-".$mod_type." len.: ".strlen($sla_mod_temp)." to_db: ".$status."<p>"; //Debug
//Create returning info
$ret_info = new object();
$ret_info->id = $mod_id;
$ret_info->modtype = $mod_type;
$this->info[] = $ret_info;
}
} else {
debugging("Info: skipping $this->temp_mod_type activity with mod id: $this->temp_mod_id. Not selected for restore", DEBUG_DEVELOPER);
}
//Reset current mod_type and mod_id
unset($this->temp_mod_type);
unset($this->temp_mod_id);
//Reset temp
unset($this->temp);
}
/// Grab current mod id and type when available
if ($this->level == 5) {
if ($tagName == 'ID') {
$this->temp_mod_id = trim($this->content);
} else if ($tagName == 'MODTYPE') {
$this->temp_mod_type = trim($this->content);
}
}
}
//Stop parsing if todo = MODULES and tagName = MODULES (en of the tag, of course)
//Speed up a lot (avoid parse all)
if ($tagName == "MODULES" and $this->level == 3) {
@@ -7101,8 +7455,31 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
//This function executes the MoodleParser
function restore_read_xml ($xml_file,$todo,$preferences) {
global $CFG;
$status = true;
/// If enabled in the site, use split files instead of original moodle.xml file
/// This will speed parsing speed upto 20x.
if (!empty($CFG->experimentalsplitrestore)) {
/// Use splite file, else nothing to process (saves one full parsing for each non-existing todo)
$splitfile= dirname($xml_file) . '/' . strtolower('split_' . $todo . '.xml');
if (file_exists($splitfile)) {
$xml_file = $splitfile;
debugging("Info: todo=$todo, using split file", DEBUG_DEVELOPER);
} else {
/// For some todos, that are used in earlier restore steps (restore_precheck(), restore_form...
/// allow fallback to monolithic moodle.xml. Those todos are at the beggining of the xml, so
/// it doesn't hurts too much.
if ($todo == 'INFO' || $todo == 'COURSE_HEADER' || $todo == 'ROLES') {
debugging("Info: todo=$todo, no split file. Fallback to moodle.xml", DEBUG_DEVELOPER);
} else {
debugging("Info: todo=$todo, no split file. Parse skipped", DEBUG_DEVELOPER);
return true;
}
}
}
$xml_parser = xml_parser_create('UTF-8');
$moodle_parser = new MoodleParser();
$moodle_parser->todo = $todo;
@@ -7161,7 +7538,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
if ($status) {
// MDL-9290 performance improvement on reading large xml
$lasttime = time(); // crmas
while ($data = fread($fp, 4096) and !$moodle_parser->finished) {
while ($data = fread($fp, 8192) and !$moodle_parser->finished) {
if ((time() - $lasttime) > 5) {
$lasttime = time();
@@ -7383,7 +7760,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
else {
if (empty($noredirect)) {
redirect($CFG->wwwroot.'/backup/restore.php?backup_unique_code='.$backup_unique_code.'&launch=form&file='.$file.'&id='.$id);
// in 2.0 we must not print "Continue" redirect link here, because ppl click on it and the execution gets interrupted on next page!!!
// imo RESTORE_SILENTLY is an ugly hack :-P
$sillystr = get_string('donotclickcontinue');
redirect($CFG->wwwroot.'/backup/restore.php?backup_unique_code='.$backup_unique_code.'&launch=form&file='.$file.'&id='.$id, $sillystr, 0);
} else {
return $backup_unique_code;
}
@@ -7485,9 +7866,26 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
echo "<ul>";
}
//Localtion of the xml file
//Location of the xml file
$xml_file = $CFG->dataroot."/temp/backup/".$restore->backup_unique_code."/moodle.xml";
//Preprocess the moodle.xml file spliting into smaller chucks (modules, users, logs...)
//for optimal parsing later in the restore process.
if (!empty($CFG->experimentalsplitrestore)) {
if (!defined('RESTORE_SILENTLY')) {
echo '<li>'.get_string('preprocessingbackupfile') . '</li>';
}
//First of all, split moodle.xml into handy files
if (!restore_split_xml ($xml_file, $restore)) {
if (!defined('RESTORE_SILENTLY')) {
notify("Error proccessing moodle.xml file. Process ended.");
} else {
$errorstr = "Error proccessing moodle.xml file. Process ended.";
}
return false;
}
}
//If we've selected to restore into new course
//create it (course)
//Saving conversion id variables into backup_tables
@@ -7521,7 +7919,9 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
}
if ($status = restore_open_html($restore,$course_header)){
echo "<li>Creating the Restorelog.html in the course backup folder</li>";
if (!defined('RESTORE_SILENTLY')) {
echo "<li>Creating the Restorelog.html in the course backup folder</li>";
}
}
} else {
@@ -8135,9 +8535,9 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
echo '</li>';
}
}
/// force full refresh of grading data after all items are created
grade_force_full_regrading($restore->course_id);
grade_grab_course_grades($restore->course_id);
/// force full refresh of grading data after all items are created
grade_force_full_regrading($restore->course_id);
grade_grab_course_grades($restore->course_id);
}
/*******************************************************************************
@@ -8561,6 +8961,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$oldinstance = backup_getid($restore->backup_unique_code,$table,$oldid);
}
// new instance id not found (not restored module/block/user)... skip any assignment
if (!$oldinstance || empty($oldinstance->new_id)) {
continue;
}
$newcontext = get_context_instance($contextlevel, $oldinstance->new_id);
$assignment->contextid = $newcontext->id; // new context id
// might already have same assignment
@@ -8591,6 +8996,11 @@ define('RESTORE_GROUPS_GROUPINGS', 3);
$oldinstance = backup_getid($restore->backup_unique_code,$table,$oldid);
}
// new instance id not found (not restored module/block/user)... skip any override
if (!$oldinstance || empty($oldinstance->new_id)) {
continue;
}
$newcontext = get_context_instance($contextlevel, $oldinstance->new_id);
$override->contextid = $newcontext->id; // new context id
// use assign capability instead so we can add context to context_rel
+5 -1
View File
@@ -19,7 +19,11 @@
//Adjust some php variables to the execution of this script
@ini_set("max_execution_time","3000");
raise_memory_limit("192M");
if (empty($CFG->extramemorylimit)) {
raise_memory_limit('128M');
} else {
raise_memory_limit($CFG->extramemorylimit);
}
echo "<pre>\n";
+2 -2
View File
@@ -6,7 +6,7 @@
/// database (backup_version) to determine whether upgrades should
/// be performed (see db/backup_*.php)
$backup_version = 2008030300; // The current version is a date (YYYYMMDDXX)
$backup_release = '1.9'; // User-friendly version number
$backup_version = 2008030301; // The current version is a date (YYYYMMDDXX)
$backup_release = '1.9.4'; // User-friendly version number
?>
@@ -24,6 +24,10 @@ class block_activity_modules extends block_list {
$course = get_record('course', 'id', $this->instance->pageid);
}
if (empty($course)) {
return '';
}
require_once($CFG->dirroot.'/course/lib.php');
$modinfo = get_fast_modinfo($course);
+9 -3
View File
@@ -19,6 +19,12 @@ class block_admin extends block_list {
$this->content->icons = array();
$this->content->footer = '';
if (empty($this->instance->pageid)) { // sticky
if (!empty($COURSE)) {
$this->instance->pageid = $COURSE->id;
}
}
if (empty($this->instance)) {
return $this->content = '';
} else if ($this->instance->pageid == SITEID) {
@@ -154,7 +160,7 @@ class block_admin extends block_list {
}
/// View course reports
if ($course->id !== SITEID and has_capability('moodle/site:viewreports', $context)) {
if ($course->id !== SITEID and has_capability('moodle/site:viewreports', $context)) { // basic capability for listing of reports
$this->content->items[]='<a href="'.$CFG->wwwroot.'/course/report.php?id='.$this->instance->pageid.'">'.get_string('reports').'</a>';
$this->content->icons[]='<img src="'.$CFG->pixpath.'/i/stats.gif" class="icon" alt="" />';
}
@@ -209,10 +215,10 @@ class block_admin extends block_list {
/// Unenrol link
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) and get_user_roles($context, $USER->id, 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
@@ -41,6 +41,8 @@ class block_calendar_month extends block_base {
calendar_set_referring_course(0);
} else {
//MDL-14693: fix calendar on resource page
$courseshown = optional_param( 'id', $COURSE->id, PARAM_INT );
// Forcibly filter events to include only those from the particular course we are in.
$filtercourse = array($courseshown => $COURSE);
$groupeventsfrom = array($courseshown => 1);
View File

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