Fixed some notices, thanks Eloy!
[moodle.git] / lib / moodlelib.php
CommitLineData
f9903ed0 1<?PHP // $Id$
2
9fa49e22 3///////////////////////////////////////////////////////////////////////////
4// //
5// moodlelib.php //
6// //
7// Main library file of miscellaneous general-purpose Moodle functions //
8// //
9// Other main libraries: //
10// //
11// weblib.php - functions that produce web output //
12// datalib.php - functions that access the database //
13// //
14///////////////////////////////////////////////////////////////////////////
15// //
16// NOTICE OF COPYRIGHT //
17// //
18// Moodle - Modular Object-Oriented Dynamic Learning Environment //
abc3b857 19// http://moodle.org //
9fa49e22 20// //
abc3b857 21// Copyright (C) 1999-2004 Martin Dougiamas http://dougiamas.com //
9fa49e22 22// //
23// This program is free software; you can redistribute it and/or modify //
24// it under the terms of the GNU General Public License as published by //
25// the Free Software Foundation; either version 2 of the License, or //
26// (at your option) any later version. //
27// //
28// This program is distributed in the hope that it will be useful, //
29// but WITHOUT ANY WARRANTY; without even the implied warranty of //
30// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
31// GNU General Public License for more details: //
32// //
33// http://www.gnu.org/copyleft/gpl.html //
34// //
35///////////////////////////////////////////////////////////////////////////
65ccdd8c 36
f374fb10 37/// CONSTANTS /////////////////////////////////////////////////////////////
38
d8ba183c 39define('NOGROUPS', 0);
f374fb10 40define('SEPARATEGROUPS', 1);
41define('VISIBLEGROUPS', 2);
42
f9903ed0 43
9fa49e22 44/// PARAMETER HANDLING ////////////////////////////////////////////////////
6b174680 45
9fa49e22 46function require_variable($var) {
47/// Variable must be present
48 if (! isset($var)) {
49 error("A required parameter was missing");
6b174680 50 }
51}
52
9fa49e22 53function optional_variable(&$var, $default=0) {
54/// Variable may be present, if not then set a default
55 if (! isset($var)) {
56 $var = $default;
6b174680 57 }
58}
59
60
9fa49e22 61function set_config($name, $value) {
62/// No need for get_config because they are usually always available in $CFG
70812e39 63
42282810 64 global $CFG;
65
66 $CFG->$name = $value; // So it's defined for this invocation at least
dfc9ba9b 67
9fa49e22 68 if (get_field("config", "name", "name", $name)) {
69 return set_field("config", "value", $value, "name", $name);
d897cae4 70 } else {
9fa49e22 71 $config->name = $name;
72 $config->value = $value;
73 return insert_record("config", $config);
39917a09 74 }
39917a09 75}
76
39917a09 77
70812e39 78function reload_user_preferences() {
79/// Refresh current USER with all their current preferences
80
81 global $USER;
82
d8ba183c 83 unset($USER->preference);
70812e39 84
85 if ($preferences = get_records('user_preferences', 'userid', $USER->id)) {
86 foreach ($preferences as $preference) {
87 $USER->preference[$preference->name] = $preference->value;
88 }
89 }
90}
91
92function set_user_preference($name, $value) {
93/// Sets a preference for the current user
94
95 global $USER;
96
97 if (empty($name)) {
98 return false;
99 }
100
101 if ($preference = get_record('user_preferences', 'userid', $USER->id, 'name', $name)) {
066af654 102 if (set_field("user_preferences", "value", $value, "id", $preference->id)) {
103 $USER->preference[$name] = $value;
104 return true;
105 } else {
106 return false;
107 }
70812e39 108
109 } else {
110 $preference->userid = $USER->id;
111 $preference->name = $name;
112 $preference->value = (string)$value;
066af654 113 if (insert_record('user_preferences', $preference)) {
70812e39 114 $USER->preference[$name] = $value;
115 return true;
116 } else {
117 return false;
118 }
119 }
120}
121
122function set_user_preferences($prefarray) {
123/// Sets a whole array of preferences for the current user
124
125 if (!is_array($prefarray) or empty($prefarray)) {
126 return false;
127 }
128
129 $return = true;
130 foreach ($prefarray as $name => $value) {
131 // The order is important; if the test for return is done first,
132 // then if one function call fails all the remaining ones will
133 // be "optimized away"
134 $return = set_user_preference($name, $value) and $return;
135 }
136 return $return;
137}
138
139function get_user_preferences($name=NULL, $default=NULL) {
140/// Without arguments, returns all the current user preferences
d8ba183c 141/// as an array. If a name is specified, then this function
142/// attempts to return that particular preference value. If
70812e39 143/// none is found, then the optional value $default is returned,
144/// otherwise NULL.
145
146 global $USER;
147
148 if (empty($USER->preference)) {
149 return $default; // Default value (or NULL)
150 }
151 if (empty($name)) {
152 return $USER->preference; // Whole array
153 }
154 if (!isset($USER->preference[$name])) {
155 return $default; // Default value (or NULL)
156 }
157 return $USER->preference[$name]; // The single value
158}
159
160
9fa49e22 161/// FUNCTIONS FOR HANDLING TIME ////////////////////////////////////////////
39917a09 162
3db75c62 163function make_timestamp($year, $month=1, $day=1, $hour=0, $minute=0, $second=0, $timezone=99) {
9fa49e22 164/// Given date parts in user time, produce a GMT timestamp
39917a09 165
f30fe8d0 166 $timezone = get_user_timezone($timezone);
94e34118 167
168 if (abs($timezone) > 13) {
03c17ddf 169 return mktime((int)$hour,(int)$minute,(int)$second,(int)$month,(int)$day,(int)$year);
170 } else {
171 $time = gmmktime((int)$hour,(int)$minute,(int)$second,(int)$month,(int)$day,(int)$year);
172 return usertime($time, $timezone); // This is GMT
173 }
39917a09 174}
175
8dbed6be 176function format_time($totalsecs, $str=NULL) {
9fa49e22 177/// Given an amount of time in seconds, returns string
178/// formatted nicely as months, days, hours etc as needed
c7e3ac2a 179
6b174680 180 $totalsecs = abs($totalsecs);
c7e3ac2a 181
8dbed6be 182 if (!$str) { // Create the str structure the slow way
183 $str->day = get_string("day");
184 $str->days = get_string("days");
185 $str->hour = get_string("hour");
186 $str->hours = get_string("hours");
187 $str->min = get_string("min");
188 $str->mins = get_string("mins");
189 $str->sec = get_string("sec");
190 $str->secs = get_string("secs");
191 }
192
193 $days = floor($totalsecs/86400);
6b174680 194 $remainder = $totalsecs - ($days*86400);
8dbed6be 195 $hours = floor($remainder/3600);
6b174680 196 $remainder = $remainder - ($hours*3600);
8dbed6be 197 $mins = floor($remainder/60);
198 $secs = $remainder - ($mins*60);
199
200 $ss = ($secs == 1) ? $str->sec : $str->secs;
201 $sm = ($mins == 1) ? $str->min : $str->mins;
202 $sh = ($hours == 1) ? $str->hour : $str->hours;
203 $sd = ($days == 1) ? $str->day : $str->days;
204
9c9f7d77 205 $odays = "";
206 $ohours = "";
207 $omins = "";
208 $osecs = "";
209
8dbed6be 210 if ($days) $odays = "$days $sd";
211 if ($hours) $ohours = "$hours $sh";
212 if ($mins) $omins = "$mins $sm";
213 if ($secs) $osecs = "$secs $ss";
6b174680 214
215 if ($days) return "$odays $ohours";
216 if ($hours) return "$ohours $omins";
217 if ($mins) return "$omins $osecs";
218 if ($secs) return "$osecs";
219 return get_string("now");
220}
f9903ed0 221
61ae5d36 222function userdate($date, $format="", $timezone=99, $fixday = true) {
9fa49e22 223/// Returns a formatted string that represents a date in user time
224/// WARNING: note that the format is for strftime(), not date().
d8ba183c 225/// Because of a bug in most Windows time libraries, we can't use
9fa49e22 226/// the nicer %e, so we have to use %d which has leading zeroes.
d8ba183c 227/// A lot of the fuss below is just getting rid of these leading
9fa49e22 228/// zeroes as efficiently as possible.
61ae5d36 229///
d8ba183c 230/// If parammeter fixday = true (default), then take off leading
61ae5d36 231/// zero from %d, else mantain it.
7a302afc 232
5fa51a39 233 if ($format == "") {
dcde9f02 234 $format = get_string("strftimedaydatetime");
5fa51a39 235 }
035cdbff 236
dcde9f02 237 $formatnoday = str_replace("%d", "DD", $format);
61ae5d36 238 if ($fixday) {
239 $fixday = ($formatnoday != $format);
240 }
dcde9f02 241
f30fe8d0 242 $timezone = get_user_timezone($timezone);
90207a06 243
0431bd7c 244 if (abs($timezone) > 13) {
035cdbff 245 if ($fixday) {
246 $datestring = strftime($formatnoday, $date);
247 $daystring = str_replace(" 0", "", strftime(" %d", $date));
248 $datestring = str_replace("DD", $daystring, $datestring);
249 } else {
250 $datestring = strftime($format, $date);
251 }
bea7a51e 252 } else {
70d4cf82 253 $date = $date + (int)($timezone * 3600);
035cdbff 254 if ($fixday) {
70d4cf82 255 $datestring = gmstrftime($formatnoday, $date);
9fa49e22 256 $daystring = str_replace(" 0", "", gmstrftime(" %d", $date));
035cdbff 257 $datestring = str_replace("DD", $daystring, $datestring);
258 } else {
70d4cf82 259 $datestring = gmstrftime($format, $date);
035cdbff 260 }
873960de 261 }
bea7a51e 262
035cdbff 263 return $datestring;
873960de 264}
265
5fa51a39 266function usergetdate($date, $timezone=99) {
d8ba183c 267/// Given a $date timestamp in GMT, returns an array
9fa49e22 268/// that represents the date in user time
6b174680 269
f30fe8d0 270 $timezone = get_user_timezone($timezone);
a36166d3 271
0431bd7c 272 if (abs($timezone) > 13) {
873960de 273 return getdate($date);
274 }
d2d6171f 275 //There is no gmgetdate so I have to fake it...
276 $date = $date + (int)($timezone * 3600);
277 $getdate["seconds"] = gmstrftime("%S", $date);
278 $getdate["minutes"] = gmstrftime("%M", $date);
279 $getdate["hours"] = gmstrftime("%H", $date);
280 $getdate["mday"] = gmstrftime("%d", $date);
281 $getdate["wday"] = gmstrftime("%u", $date);
282 $getdate["mon"] = gmstrftime("%m", $date);
283 $getdate["year"] = gmstrftime("%Y", $date);
284 $getdate["yday"] = gmstrftime("%j", $date);
285 $getdate["weekday"] = gmstrftime("%A", $date);
286 $getdate["month"] = gmstrftime("%B", $date);
287 return $getdate;
d552ead0 288}
289
290function usertime($date, $timezone=99) {
d8ba183c 291/// Given a GMT timestamp (seconds since epoch), offsets it by
9fa49e22 292/// the timezone. eg 3pm in India is 3pm GMT - 7 * 3600 seconds
a36166d3 293
f30fe8d0 294 $timezone = get_user_timezone($timezone);
0431bd7c 295 if (abs($timezone) > 13) {
d552ead0 296 return $date;
297 }
298 return $date - (int)($timezone * 3600);
299}
300
edf7fe8c 301function usergetmidnight($date, $timezone=99) {
9fa49e22 302/// Given a time, return the GMT timestamp of the most recent midnight
303/// for the current user.
edf7fe8c 304
f30fe8d0 305 $timezone = get_user_timezone($timezone);
edf7fe8c 306 $userdate = usergetdate($date, $timezone);
4606d9bb 307
0431bd7c 308 if (abs($timezone) > 13) {
4606d9bb 309 return mktime(0, 0, 0, $userdate["mon"], $userdate["mday"], $userdate["year"]);
310 }
311
edf7fe8c 312 $timemidnight = gmmktime (0, 0, 0, $userdate["mon"], $userdate["mday"], $userdate["year"]);
313 return usertime($timemidnight, $timezone); // Time of midnight of this user's day, in GMT
314
315}
316
d552ead0 317function usertimezone($timezone=99) {
9fa49e22 318/// Returns a string that prints the user's timezone
d552ead0 319
f30fe8d0 320 $timezone = get_user_timezone($timezone);
321
0431bd7c 322 if (abs($timezone) > 13) {
d552ead0 323 return "server time";
324 }
325 if (abs($timezone) < 0.5) {
326 return "GMT";
327 }
328 if ($timezone > 0) {
329 return "GMT+$timezone";
330 } else {
331 return "GMT$timezone";
332 }
f9903ed0 333}
334
f30fe8d0 335function get_user_timezone($tz = 99) {
336// Returns a float which represents the user's timezone difference from GMT in hours
337// Checks various settings and picks the most dominant of those which have a value
338
339 // Variables declared explicitly global here so that if we add
340 // something later we won't forget to global it...
341 $timezones = array(
342 isset($GLOBALS['USER']->timezone) ? $GLOBALS['USER']->timezone : 99,
343 isset($GLOBALS['CFG']->timezone) ? $GLOBALS['CFG']->timezone : 99,
344 );
345 while($tz == 99 && $next = each($timezones)) {
346 $tz = (float)$next['value'];
347 }
348
349 return $tz;
350}
f9903ed0 351
9fa49e22 352/// USER AUTHENTICATION AND LOGIN ////////////////////////////////////////
f9903ed0 353
8e8d0524 354function require_login($courseid=0, $autologinguest=true) {
9fa49e22 355/// This function checks that the current user is logged in, and optionally
356/// whether they are "logged in" or allowed to be in a particular course.
357/// If not, then it redirects them to the site login or course enrolment.
8e8d0524 358/// $autologinguest determines whether visitors should automatically be
359/// logged in as guests provide $CFG->autologinguests is set to 1
f9903ed0 360
73047f2f 361 global $CFG, $SESSION, $USER, $FULLME, $MoodleSession;
d8ba183c 362
da5c172a 363 // First check that the user is logged in to the site.
c21c671d 364 if (! (isset($USER->loggedin) and $USER->confirmed and ($USER->site == $CFG->wwwroot)) ) { // They're not
f9903ed0 365 $SESSION->wantsurl = $FULLME;
9f44d972 366 if (!empty($_SERVER["HTTP_REFERER"])) {
367 $SESSION->fromurl = $_SERVER["HTTP_REFERER"];
368 }
c21c671d 369 $USER = NULL;
8e8d0524 370 if ($autologinguest and $CFG->autologinguests and $courseid and get_field('course','guest','id',$courseid)) {
371 $loginguest = '?loginguest=true';
372 } else {
373 $loginguest = '';
a2ebe6a5 374 }
8a33e371 375 if (empty($CFG->loginhttps)) {
fe657136 376 redirect("$CFG->wwwroot/login/index.php$loginguest");
8a33e371 377 } else {
378 $wwwroot = str_replace('http','https',$CFG->wwwroot);
fe657136 379 redirect("$wwwroot/login/index.php$loginguest");
8a33e371 380 }
f9903ed0 381 die;
f9903ed0 382 }
808a3baa 383
384 // Check that the user account is properly set up
385 if (user_not_fully_set_up($USER)) {
386 $site = get_site();
387 redirect("$CFG->wwwroot/user/edit.php?id=$USER->id&course=$site->id");
388 die;
389 }
d8ba183c 390
da5c172a 391 // Next, check if the user can be in a particular course
392 if ($courseid) {
9c9f7d77 393 if (!empty($USER->student[$courseid]) or !empty($USER->teacher[$courseid]) or !empty($USER->admin)) {
cb909d74 394 if (isset($USER->realuser)) { // Make sure the REAL person can also access this course
395 if (!isteacher($courseid, $USER->realuser)) {
396 print_header();
319b4729 397 notice(get_string("studentnotallowed", "", fullname($USER, true)), "$CFG->wwwroot/");
cb909d74 398 }
399
400 } else { // just update their last login time
3ce2f1e0 401 update_user_in_db();
402 }
da5c172a 403 return; // user is a member of this course.
404 }
405 if (! $course = get_record("course", "id", $courseid)) {
406 error("That course doesn't exist");
407 }
1efa27fd 408 if (!$course->visible) {
409 print_header();
319b4729 410 notice(get_string("studentnotallowed", "", fullname($USER, true)), "$CFG->wwwroot/");
1efa27fd 411 }
7363ff91 412 if ($USER->username == "guest") {
413 switch ($course->guest) {
414 case 0: // Guests not allowed
415 print_header();
416 notice(get_string("guestsnotallowed", "", $course->fullname));
417 break;
418 case 1: // Guests allowed
419 update_user_in_db();
420 return;
421 case 2: // Guests allowed with key (drop through)
422 break;
423 }
da5c172a 424 }
f9903ed0 425
7363ff91 426 // Currently not enrolled in the course, so see if they want to enrol
da5c172a 427 $SESSION->wantsurl = $FULLME;
428 redirect("$CFG->wwwroot/course/enrol.php?id=$courseid");
429 die;
430 }
f9903ed0 431}
432
1d881d92 433function update_user_login_times() {
434 global $USER;
435
436 $USER->lastlogin = $user->lastlogin = $USER->currentlogin;
437 $USER->currentlogin = $user->currentlogin = time();
1d881d92 438
439 $user->id = $USER->id;
440
441 return update_record("user", $user);
442}
443
808a3baa 444function user_not_fully_set_up($user) {
ac5d88eb 445 return ($user->username != "guest" and (empty($user->firstname) or empty($user->lastname) or empty($user->email)));
808a3baa 446}
f9903ed0 447
f9903ed0 448function update_login_count() {
9fa49e22 449/// Keeps track of login attempts
450
f9903ed0 451 global $SESSION;
452
453 $max_logins = 10;
454
455 if (empty($SESSION->logincount)) {
456 $SESSION->logincount = 1;
457 } else {
458 $SESSION->logincount++;
459 }
460
461 if ($SESSION->logincount > $max_logins) {
9fa49e22 462 unset($SESSION->wantsurl);
1d881d92 463 error(get_string("errortoomanylogins"));
d578afc8 464 }
465}
466
9fa49e22 467function reset_login_count() {
468/// Resets login attempts
469 global $SESSION;
d578afc8 470
9fa49e22 471 $SESSION->logincount = 0;
d578afc8 472}
473
cb98d312 474function check_for_restricted_user($username=NULL, $redirect="") {
475 global $CFG, $USER;
476
477 if (!$username) {
478 if (!empty($USER->username)) {
479 $username = $USER->username;
480 } else {
481 return false;
482 }
483 }
484
485 if (!empty($CFG->restrictusers)) {
486 $names = explode(',', $CFG->restrictusers);
487 if (in_array($username, $names)) {
9b591be6 488 error(get_string("restricteduser", "error", fullname($USER)), $redirect);
cb98d312 489 }
490 }
491}
492
581d7b49 493function isadmin($userid=0) {
9fa49e22 494/// Is the user an admin?
f9903ed0 495 global $USER;
aa095969 496 static $admins = array();
497 static $nonadmins = array();
f9903ed0 498
581d7b49 499 if (!$userid){
500 if (empty($USER->id)) {
501 return false;
502 }
503 $userid = $USER->id;
9bd2c874 504 }
505
581d7b49 506 if (in_array($userid, $admins)) {
aa095969 507 return true;
581d7b49 508 } else if (in_array($userid, $nonadmins)) {
aa095969 509 return false;
581d7b49 510 } else if (record_exists("user_admins", "userid", $userid)){
511 $admins[] = $userid;
aa095969 512 return true;
513 } else {
581d7b49 514 $nonadmins[] = $userid;
aa095969 515 return false;
f9903ed0 516 }
f9903ed0 517}
518
9d3c795c 519function isteacher($courseid=0, $userid=0, $includeadmin=true) {
9fa49e22 520/// Is the user a teacher or admin?
f9903ed0 521 global $USER;
522
9788367b 523 if ($includeadmin and isadmin($userid)) { // admins can do anything the teacher can
d115a57f 524 return true;
525 }
526
f9903ed0 527 if (!$userid) {
9bd2c874 528 return !empty($USER->teacher[$courseid]);
f9903ed0 529 }
530
9d3c795c 531 if (!$courseid) {
532 return record_exists("user_teachers","userid",$userid);
533 }
534
ebc3bd2b 535 return record_exists("user_teachers", "userid", $userid, "course", $courseid);
f9903ed0 536}
537
73047f2f 538function isteacheredit($courseid, $userid=0) {
539/// Is the user allowed to edit this course?
540 global $USER;
541
d8ba183c 542 if (isadmin($userid)) { // admins can do anything
73047f2f 543 return true;
544 }
545
546 if (!$userid) {
547 return !empty($USER->teacheredit[$courseid]);
548 }
549
550 return get_field("user_teachers", "editall", "userid", $userid, "course", $courseid);
551}
552
1924074c 553function iscreator ($userid=0) {
554/// Can user create new courses?
555 global $USER;
8a205861 556 if (empty($USER->id)) {
557 return false;
558 }
1924074c 559 if (isadmin($userid)) { // admins can do anything
560 return true;
561 }
8a205861 562 if (empty($userid)) {
1924074c 563 return record_exists("user_coursecreators", "userid", $USER->id);
564 }
565
566 return record_exists("user_coursecreators", "userid", $userid);
567}
568
8a9e3fd7 569function isstudent($courseid, $userid=0) {
9fa49e22 570/// Is the user a student in this course?
2cc72e84 571/// If course is site, is the user a confirmed user on the site?
f9903ed0 572 global $USER;
573
7064e18f 574 if (empty($USER->id)) {
575 return false;
576 }
577
2cc72e84 578 $site = get_site();
579 if ($courseid == $site->id) {
580 if (!$userid) {
581 $userid = $USER->id;
582 }
583 if (isguest($userid)) {
584 return false;
585 }
586 return record_exists('user', 'id', $userid, 'confirmed', 1, 'deleted', 0);
587 }
588
f9903ed0 589 if (!$userid) {
346b1a24 590 return !empty($USER->student[$courseid]);
f9903ed0 591 }
592
ebc3bd2b 593 // $timenow = time(); // todo: add time check below
f9903ed0 594
ebc3bd2b 595 return record_exists("user_students", "userid", $userid, "course", $courseid);
f9903ed0 596}
597
da5c172a 598function isguest($userid=0) {
9fa49e22 599/// Is the user a guest?
da5c172a 600 global $USER;
601
602 if (!$userid) {
b35e8568 603 if (empty($USER->username)) {
604 return false;
605 }
da5c172a 606 return ($USER->username == "guest");
607 }
608
9fa49e22 609 return record_exists("user", "id", $userid, "username", "guest");
da5c172a 610}
611
9fa49e22 612
2c309dc2 613function isediting($courseid, $user=NULL) {
9fa49e22 614/// Is the current user in editing mode?
2c309dc2 615 global $USER;
616 if (!$user){
617 $user = $USER;
618 }
9c9f7d77 619 if (empty($user->editing)) {
620 return false;
621 }
2c309dc2 622 return ($user->editing and isteacher($courseid, $user->id));
623}
624
7977cffd 625function ismoving($courseid) {
626/// Is the current user currently moving an activity?
627 global $USER;
628
629 if (!empty($USER->activitycopy)) {
630 return ($USER->activitycopycourse == $courseid);
631 }
632 return false;
633}
634
e2cd5065 635function fullname($user, $override=false) {
b5cbb64d 636/// Given an object containing firstname and lastname
d8ba183c 637/// values, this function returns a string with the
b5cbb64d 638/// full name of the person.
e2cd5065 639/// The result may depend on system settings
b5cbb64d 640/// or language. 'override' will force both names
e2cd5065 641/// to be used even if system settings specify one.
b5cbb64d 642
f374fb10 643 global $CFG, $SESSION;
644
645 if (!empty($SESSION->fullnamedisplay)) {
646 $CFG->fullnamedisplay = $SESSION->fullnamedisplay;
647 }
e2cd5065 648
b5cbb64d 649 if ($CFG->fullnamedisplay == 'firstname lastname') {
650 return "$user->firstname $user->lastname";
651
652 } else if ($CFG->fullnamedisplay == 'lastname firstname') {
653 return "$user->lastname $user->firstname";
e2cd5065 654
b5cbb64d 655 } else if ($CFG->fullnamedisplay == 'firstname') {
656 if ($override) {
657 return get_string('fullnamedisplay', '', $user);
658 } else {
659 return $user->firstname;
660 }
661 }
e2cd5065 662
b5cbb64d 663 return get_string('fullnamedisplay', '', $user);
e2cd5065 664}
665
f9903ed0 666
667function set_moodle_cookie($thing) {
9fa49e22 668/// Sets a moodle cookie with an encrypted string
7185e073 669 global $CFG;
482b6e6e 670
671 $cookiename = 'MOODLEID_'.$CFG->sessioncookie;
f9903ed0 672
673 $days = 60;
674 $seconds = 60*60*24*$days;
675
7185e073 676 setCookie($cookiename, "", time() - 3600, "/");
677 setCookie($cookiename, rc4encrypt($thing), time()+$seconds, "/");
f9903ed0 678}
679
680
681function get_moodle_cookie() {
9fa49e22 682/// Gets a moodle cookie with an encrypted string
7185e073 683 global $CFG;
684
482b6e6e 685 $cookiename = 'MOODLEID_'.$CFG->sessioncookie;
7185e073 686
1079c8a8 687 if (empty($_COOKIE[$cookiename])) {
688 return "";
689 } else {
690 return rc4decrypt($_COOKIE[$cookiename]);
691 }
f9903ed0 692}
693
ba7166c3 694function is_internal_auth() {
695/// Returns true if an internal authentication method is being used.
696
697 global $CFG;
698
699 return ($CFG->auth == "email" || $CFG->auth == "none" || $CFG->auth == "manual");
700}
f9903ed0 701
faebaf0f 702function create_user_record($username, $password) {
d8ba183c 703/// Creates a bare-bones user record
e858f9da 704 global $REMOTE_ADDR, $CFG;
1e22bc9c 705 //just in case check text case
706 $username = trim(moodle_strtolower($username));
6ae24de0 707 if (function_exists(auth_get_userinfo)) {
e858f9da 708 if ($newinfo = auth_get_userinfo($username)) {
34daec9b 709 foreach ($newinfo as $key => $value){
9f44d972 710 $newuser->$key = addslashes(stripslashes($value)); // Just in case
e858f9da 711 }
712 }
713 }
f9903ed0 714
faebaf0f 715 $newuser->username = $username;
716 $newuser->password = md5($password);
a0bac19d 717 $newuser->lang = $CFG->lang;
faebaf0f 718 $newuser->confirmed = 1;
719 $newuser->lastIP = $REMOTE_ADDR;
720 $newuser->timemodified = time();
f9903ed0 721
faebaf0f 722 if (insert_record("user", $newuser)) {
723 return get_user_info_from_db("username", $username);
724 }
725 return false;
726}
727
0609562b 728
729function guest_user() {
730 global $CFG;
731
732 if ($newuser = get_record("user", "username", "guest")) {
733 $newuser->loggedin = true;
734 $newuser->confirmed = 1;
735 $newuser->site = $CFG->wwwroot;
736 $newuser->lang = $CFG->lang;
737 }
738
739 return $newuser;
740}
741
faebaf0f 742function authenticate_user_login($username, $password) {
d8ba183c 743/// Given a username and password, this function looks them
9fa49e22 744/// up using the currently selected authentication mechanism,
d8ba183c 745/// and if the authentication is successful, it returns a
9fa49e22 746/// valid $user object from the 'user' table.
747///
748/// Uses auth_ functions from the currently active auth module
faebaf0f 749
750 global $CFG;
751
466558e3 752 $md5password = md5($password);
753
14217044 754 if (empty($CFG->auth)) {
faebaf0f 755 $CFG->auth = "email"; // Default authentication module
756 }
757
466558e3 758 if ($username == "guest") {
759 $CFG->auth = "none"; // Guest account always internal
760 }
761
762 // If this is the admin, then just use internal methods
d8ba183c 763 // Doing this first (even though it's less efficient) because
764 // the chosen authentication method might hang and lock the
92710226 765 // admin out.
9fa49e22 766 if (adminlogin($username, $md5password)) {
466558e3 767 return get_user_info_from_db("username", $username);
768 }
769
92710226 770 // OK, the user is a normal user, so try and authenticate them
e858f9da 771 require_once("$CFG->dirroot/auth/$CFG->auth/lib.php");
faebaf0f 772
773 if (auth_user_login($username, $password)) { // Successful authentication
faebaf0f 774 if ($user = get_user_info_from_db("username", $username)) {
92710226 775 if ($md5password <> $user->password) { // Update local copy of password for reference
466558e3 776 set_field("user", "password", $md5password, "username", $username);
faebaf0f 777 }
faebaf0f 778 } else {
e582b65e 779 $user = create_user_record($username, $password);
faebaf0f 780 }
89b54325 781
e582b65e 782 if (function_exists('auth_iscreator')) { // Check if the user is a creator
783 if (auth_iscreator($username)) {
784 if (! record_exists("user_coursecreators", "userid", $user->id)) {
785 $cdata['userid']=$user->id;
786 $creator = insert_record("user_coursecreators",$cdata);
787 if (! $creator) {
788 error("Cannot add user to course creators.");
789 }
790 }
791 } else {
792 if ( record_exists("user_coursecreators", "userid", $user->id)) {
f5cdd4d1 793 $creator = delete_records("user_coursecreators", "userid", $user->id);
e582b65e 794 if (! $creator) {
795 error("Cannot remove user from course creators.");
796 }
797 }
798 }
799 }
d8ba183c 800
e582b65e 801 return $user;
9d3c795c 802
e582b65e 803 } else {
9d3c795c 804 add_to_log(0, "login", "error", $_SERVER['HTTP_REFERER'], $username);
805 $date = date('Y-m-d H:i:s');
806 error_log("$date\tfailed login\t".$_SERVER['REMOTE_ADDR']."\t".$_SERVER['HTTP_USER_AGENT']."\t$username");
e582b65e 807 return false;
808 }
f9903ed0 809}
810
b40bc478 811function enrol_student($userid, $courseid, $timestart=0, $timeend=0) {
9fa49e22 812/// Enrols a student in a given course
f9903ed0 813
b40bc478 814 $course = get_record("course", "id", $courseid);
815
4d312bbe 816 if (!record_exists("user_students", "userid", $userid, "course", $courseid)) {
3041b0f8 817 if (record_exists("user", "id", $userid)) {
818 $student->userid = $userid;
819 $student->course = $courseid;
b40bc478 820 $student->timestart = $timestart;
821 $student->timeend = $timeend;
3041b0f8 822 $student->time = time();
823 return insert_record("user_students", $student);
824 }
825 return false;
4d312bbe 826 }
827 return true;
d7facad8 828}
829
9fa62805 830function unenrol_student($userid, $courseid=0) {
9fa49e22 831/// Unenrols a student from a given course
d7facad8 832
9fa62805 833 if ($courseid) {
9fa49e22 834 /// First delete any crucial stuff that might still send mail
9fa62805 835 if ($forums = get_records("forum", "course", $courseid)) {
9fa49e22 836 foreach ($forums as $forum) {
9fa62805 837 delete_records("forum_subscriptions", "forum", $forum->id, "userid", $userid);
838 }
839 }
840 if ($groups = get_groups($courseid, $userid)) {
841 foreach ($groups as $group) {
842 delete_records("groups_members", "groupid", $group->id, "userid", $userid);
bb09fb11 843 }
f9903ed0 844 }
9fa62805 845 return delete_records("user_students", "userid", $userid, "course", $courseid);
9fa49e22 846
f9903ed0 847 } else {
9fa62805 848 delete_records("forum_subscriptions", "userid", $userid);
84bbca53 849 delete_records("groups_members", "userid", $userid);
9fa62805 850 return delete_records("user_students", "userid", $userid);
f9903ed0 851 }
852}
853
b40bc478 854function add_teacher($userid, $courseid, $editall=1, $role="", $timestart=0, $timeend=0) {
3041b0f8 855/// Add a teacher to a given course
856
61451a36 857 if ($teacher = get_record('user_teachers', 'userid', $userid, 'course', $courseid)) {
b40bc478 858 $newteacher = NULL;
859 $newteacher->id = $teacher->id;
860 $newteacher->editall = $editall;
861 if ($role) {
862 $newteacher->role = $role;
863 }
864 if ($timestart) {
865 $newteacher->timestart = $timestart;
3041b0f8 866 }
b40bc478 867 if ($timeend) {
868 $newteacher->timeend = $timeend;
869 }
870 return update_record('user_teachers', $newteacher);
3041b0f8 871 }
61451a36 872
873 if (!record_exists("user", "id", $userid)) {
874 return false; // no such user
875 }
876
877 if (!record_exists("course", "id", $courseid)) {
878 return false; // no such course
879 }
880
881 $teacher = NULL;
882 $teacher->userid = $userid;
883 $teacher->course = $courseid;
884 $teacher->editall = $editall;
885 $teacher->role = $role;
886
887 if (record_exists("user_teachers", "course", $courseid)) {
888 $teacher->authority = 2;
889 } else {
890 $teacher->authority = 1;
891 }
892 delete_records("user_students", "userid", $userid, "course", $courseid); // Unenrol as student
893
894 return insert_record("user_teachers", $teacher);
895
3041b0f8 896}
897
898function remove_teacher($userid, $courseid=0) {
9fa49e22 899/// Removes a teacher from a given course (or ALL courses)
900/// Does not delete the user account
3041b0f8 901 if ($courseid) {
9fa49e22 902 /// First delete any crucial stuff that might still send mail
3041b0f8 903 if ($forums = get_records("forum", "course", $courseid)) {
9fa49e22 904 foreach ($forums as $forum) {
3041b0f8 905 delete_records("forum_subscriptions", "forum", $forum->id, "userid", $userid);
9fa49e22 906 }
907 }
3041b0f8 908 return delete_records("user_teachers", "userid", $userid, "course", $courseid);
57507290 909 } else {
3041b0f8 910 delete_records("forum_subscriptions", "userid", $userid);
911 return delete_records("user_teachers", "userid", $userid);
57507290 912 }
f9903ed0 913}
914
3041b0f8 915
916function add_creator($userid) {
917/// Add a creator to the site
918
919 if (!record_exists("user_admins", "userid", $userid)) {
920 if (record_exists("user", "id", $userid)) {
921 $creator->userid = $userid;
922 return insert_record("user_coursecreators", $creator);
923 }
924 return false;
925 }
926 return true;
927}
928
929function remove_creator($userid) {
930/// Removes a creator from a site
931 global $db;
932
933 return delete_records("user_coursecreators", "userid", $userid);
934}
935
936function add_admin($userid) {
937/// Add an admin to the site
938
939 if (!record_exists("user_admins", "userid", $userid)) {
940 if (record_exists("user", "id", $userid)) {
941 $admin->userid = $userid;
942 return insert_record("user_admins", $admin);
943 }
944 return false;
945 }
946 return true;
947}
948
949function remove_admin($userid) {
9fa49e22 950/// Removes an admin from a site
951 global $db;
f9903ed0 952
3041b0f8 953 return delete_records("user_admins", "userid", $userid);
f9903ed0 954}
955
f9903ed0 956
07aeb7b0 957function remove_course_contents($courseid, $showfeedback=true) {
958/// Clear a course out completely, deleting all content
959/// but don't delete the course itself
960
ee23f384 961 global $CFG, $THEME, $USER, $SESSION;
07aeb7b0 962
963 $result = true;
964
965 if (! $course = get_record("course", "id", $courseid)) {
966 error("Course ID was incorrect (can't find it)");
967 }
968
969 $strdeleted = get_string("deleted");
970
971 // First delete every instance of every module
d8ba183c 972
07aeb7b0 973 if ($allmods = get_records("modules") ) {
974 foreach ($allmods as $mod) {
975 $modname = $mod->name;
976 $modfile = "$CFG->dirroot/mod/$modname/lib.php";
ca952b03 977 $moddelete = $modname."_delete_instance"; // Delete everything connected to an instance
978 $moddeletecourse = $modname."_delete_course"; // Delete other stray stuff (uncommon)
07aeb7b0 979 $count=0;
980 if (file_exists($modfile)) {
981 include_once($modfile);
982 if (function_exists($moddelete)) {
983 if ($instances = get_records($modname, "course", $course->id)) {
984 foreach ($instances as $instance) {
985 if ($moddelete($instance->id)) {
986 $count++;
987 } else {
988 notify("Could not delete $modname instance $instance->id ($instance->name)");
989 $result = false;
990 }
991 }
992 }
993 } else {
994 notify("Function $moddelete() doesn't exist!");
995 $result = false;
996 }
997
ca952b03 998 if (function_exists($moddeletecourse)) {
999 $moddeletecourse($course);
1000 }
07aeb7b0 1001 }
1002 if ($showfeedback) {
1003 notify("$strdeleted $count x $modname");
1004 }
1005 }
1006 } else {
1007 error("No modules are installed!");
1008 }
1009
1010 // Delete any user stuff
1011
1012 if (delete_records("user_students", "course", $course->id)) {
1013 if ($showfeedback) {
1014 notify("$strdeleted user_students");
1015 }
1016 } else {
1017 $result = false;
1018 }
1019
1020 if (delete_records("user_teachers", "course", $course->id)) {
1021 if ($showfeedback) {
1022 notify("$strdeleted user_teachers");
1023 }
1024 } else {
1025 $result = false;
1026 }
1027
082e3ebc 1028 // Delete any groups
1029
1030 if ($groups = get_records("groups", "courseid", $course->id)) {
1031 foreach ($groups as $group) {
1032 if (delete_records("groups_members", "groupid", $group->id)) {
1033 if ($showfeedback) {
1034 notify("$strdeleted groups_members");
1035 }
1036 } else {
1037 $result = false;
1038 }
1039 if (delete_records("groups", "id", $group->id)) {
1040 if ($showfeedback) {
1041 notify("$strdeleted groups");
1042 }
1043 } else {
1044 $result = false;
1045 }
1046 }
1047 }
1048
1049 // Delete events
1050
1051 if (delete_records("event", "courseid", $course->id)) {
1052 if ($showfeedback) {
1053 notify("$strdeleted event");
1054 }
1055 } else {
1056 $result = false;
1057 }
1058
07aeb7b0 1059 // Delete logs
1060
1061 if (delete_records("log", "course", $course->id)) {
1062 if ($showfeedback) {
1063 notify("$strdeleted log");
1064 }
1065 } else {
1066 $result = false;
1067 }
1068
1069 // Delete any course stuff
1070
1071 if (delete_records("course_sections", "course", $course->id)) {
1072 if ($showfeedback) {
1073 notify("$strdeleted course_sections");
1074 }
1075 } else {
1076 $result = false;
1077 }
1078
1079 if (delete_records("course_modules", "course", $course->id)) {
1080 if ($showfeedback) {
1081 notify("$strdeleted course_modules");
1082 }
1083 } else {
1084 $result = false;
1085 }
1086
1087 return $result;
1088
1089}
1090
f9903ed0 1091
f374fb10 1092/// GROUPS /////////////////////////////////////////////////////////
d8ba183c 1093
f374fb10 1094
1095/**
1096* Returns a boolean: is the user a member of the given group?
d8ba183c 1097*
dcd338ff 1098* @param type description
f374fb10 1099*/
1100function ismember($groupid, $userid=0) {
1101 global $USER;
1102
8a2c9076 1103 if (!$groupid) { // No point doing further checks
1104 return false;
1105 }
1106
f374fb10 1107 if (!$userid) {
0d67c514 1108 if (empty($USER->groupmember)) {
1109 return false;
1110 }
1111 foreach ($USER->groupmember as $courseid => $mgroupid) {
1112 if ($mgroupid == $groupid) {
1113 return true;
1114 }
1115 }
1116 return false;
f374fb10 1117 }
1118
0da33e07 1119 return record_exists("groups_members", "groupid", $groupid, "userid", $userid);
f374fb10 1120}
1121
0d67c514 1122/**
1123* Returns the group ID of the current user in the given course
d8ba183c 1124*
dcd338ff 1125* @param type description
0d67c514 1126*/
1127function mygroupid($courseid) {
1128 global $USER;
1129
1130 if (empty($USER->groupmember[$courseid])) {
1131 return 0;
1132 } else {
1133 return $USER->groupmember[$courseid];
1134 }
1135}
1136
f374fb10 1137/**
d8ba183c 1138* For a given course, and possibly course module, determine
f374fb10 1139* what the current default groupmode is:
1140* NOGROUPS, SEPARATEGROUPS or VISIBLEGROUPS
d8ba183c 1141*
dcd338ff 1142* @param type description
f374fb10 1143*/
1144function groupmode($course, $cm=null) {
1145
1146 if ($cm and !$course->groupmodeforce) {
1147 return $cm->groupmode;
1148 }
1149 return $course->groupmode;
1150}
1151
1152
1153/**
1154* Sets the current group in the session variable
d8ba183c 1155*
dcd338ff 1156* @param type description
f374fb10 1157*/
1158function set_current_group($courseid, $groupid) {
1159 global $SESSION;
1160
1161 return $SESSION->currentgroup[$courseid] = $groupid;
1162}
1163
1164
1165/**
1166* Gets the current group for the current user as an id or an object
d8ba183c 1167*
dcd338ff 1168* @param type description
f374fb10 1169*/
1170function get_current_group($courseid, $full=false) {
1171 global $SESSION, $USER;
1172
1173 if (empty($SESSION->currentgroup[$courseid])) {
1174 if (empty($USER->groupmember[$courseid])) {
8a2c9076 1175 return 0;
f374fb10 1176 } else {
1177 $SESSION->currentgroup[$courseid] = $USER->groupmember[$courseid];
1178 }
1179 }
1180
1181 if ($full) {
0da33e07 1182 return get_record('groups', 'id', $SESSION->currentgroup[$courseid]);
f374fb10 1183 } else {
1184 return $SESSION->currentgroup[$courseid];
1185 }
1186}
1187
0d67c514 1188/**
1189* A combination function to make it easier for modules
1190* to set up groups.
1191*
1192* It will use a given "groupid" parameter and try to use
1193* that to reset the current group for the user.
1194*
dcd338ff 1195* @param type description
0d67c514 1196*/
eb6147a8 1197function get_and_set_current_group($course, $groupmode, $groupid=-1) {
0d67c514 1198
1199 if (!$groupmode) { // Groups don't even apply
d8ba183c 1200 return false;
0d67c514 1201 }
1202
1203 $currentgroupid = get_current_group($course->id);
1204
eb6147a8 1205 if ($groupid < 0) { // No change was specified
1206 return $currentgroupid;
1207 }
1208
1209 if ($groupid) { // Try to change the current group to this groupid
0d67c514 1210 if ($group = get_record('groups', 'id', $groupid, 'courseid', $course->id)) { // Exists
1211 if (isteacheredit($course->id)) { // Sets current default group
1212 $currentgroupid = set_current_group($course->id, $group->id);
1213
1214 } else if ($groupmode == VISIBLEGROUPS) { // All groups are visible
1215 $currentgroupid = $group->id;
1216 }
1217 }
eb6147a8 1218 } else { // When groupid = 0 it means show ALL groups
1219 if (isteacheredit($course->id)) { // Sets current default group
1220 $currentgroupid = set_current_group($course->id, 0);
1221
1222 } else if ($groupmode == VISIBLEGROUPS) { // All groups are visible
1223 $currentgroupid = 0;
1224 }
0d67c514 1225 }
1226
1227 return $currentgroupid;
1228}
1229
1230
c3cbfe7f 1231/**
1232* A big combination function to make it easier for modules
1233* to set up groups.
1234*
1235* Terminates if the current user shouldn't be looking at this group
1236* Otherwise returns the current group if there is one
1237* Otherwise returns false if groups aren't relevant
1238*
dcd338ff 1239* @param type description
c3cbfe7f 1240*/
1241function setup_and_print_groups($course, $groupmode, $urlroot) {
1242
eb6147a8 1243 if (isset($_GET['group'])) {
1244 $changegroup = $_GET['group']; /// 0 or higher
1245 } else {
1246 $changegroup = -1; /// This means no group change was specified
1247 }
1248
1249 $currentgroup = get_and_set_current_group($course, $groupmode, $changegroup);
c3cbfe7f 1250
eb6147a8 1251 if ($currentgroup === false) {
c3cbfe7f 1252 return false;
1253 }
1254
4b6d8dd5 1255 if ($groupmode == SEPARATEGROUPS and !isteacheredit($course->id) and !$currentgroup) {
1256 print_heading(get_string('notingroup'));
c3cbfe7f 1257 print_footer($course);
1258 exit;
1259 }
1260
1261 if ($groupmode == VISIBLEGROUPS or ($groupmode and isteacheredit($course->id))) {
1262 if ($groups = get_records_menu("groups", "courseid", $course->id, "name ASC", "id,name")) {
eb6147a8 1263 echo '<div align="center">';
c3cbfe7f 1264 print_group_menu($groups, $groupmode, $currentgroup, $urlroot);
eb6147a8 1265 echo '</div>';
c3cbfe7f 1266 }
1267 }
1268
1269 return $currentgroup;
1270}
0d67c514 1271
f374fb10 1272
1273
f9903ed0 1274/// CORRESPONDENCE ////////////////////////////////////////////////
1275
6e506bf9 1276function email_to_user($user, $from, $subject, $messagetext, $messagehtml="", $attachment="", $attachname="", $usetrueaddress=true) {
9fa49e22 1277/// user - a user record as an object
1278/// from - a user record as an object
1279/// subject - plain text subject line of the email
1280/// messagetext - plain text version of the message
1281/// messagehtml - complete html version of the message (optional)
1282/// attachment - a file on the filesystem, relative to $CFG->dataroot
1283/// attachname - the name of the file (extension indicates MIME)
a402bdcb 1284/// usetrueaddress - determines whether $from email address should be sent out.
6e506bf9 1285/// Will be overruled by user profile setting for maildisplay
f9903ed0 1286
4216daa6 1287 global $CFG, $_SERVER;
f9903ed0 1288
0cc6fa6a 1289 global $course; // This is a bit of an ugly hack to be gotten rid of later
1290 if (!empty($course->lang)) { // Course language is defined
1291 $CFG->courselang = $course->lang;
1292 }
1293
136dabd8 1294 include_once("$CFG->libdir/phpmailer/class.phpmailer.php");
f9903ed0 1295
cadb96f2 1296 if (empty($user)) {
1297 return false;
1298 }
1299
1300 if (!empty($user->emailstop)) {
f9903ed0 1301 return false;
1302 }
d8ba183c 1303
f9903ed0 1304 $mail = new phpmailer;
1305
d8ba183c 1306 $mail->Version = "Moodle $CFG->version"; // mailer version
136dabd8 1307 $mail->PluginDir = "$CFG->libdir/phpmailer/"; // plugin directory (eg smtp plugin)
562bbe90 1308
98c4eae3 1309
d483bcd3 1310 if (current_language() != "en") {
1311 $mail->CharSet = get_string("thischarset");
98c4eae3 1312 }
1313
62740736 1314 if ($CFG->smtphosts == "qmail") {
1315 $mail->IsQmail(); // use Qmail system
1316
1317 } else if (empty($CFG->smtphosts)) {
1318 $mail->IsMail(); // use PHP mail() = sendmail
1319
1320 } else {
1e411ffc 1321 $mail->IsSMTP(); // use SMTP directly
57ef3480 1322 if ($CFG->debug > 7) {
1323 echo "<pre>\n";
1324 $mail->SMTPDebug = true;
1325 }
1e411ffc 1326 $mail->Host = "$CFG->smtphosts"; // specify main and backup servers
9f58537a 1327
1328 if ($CFG->smtpuser) { // Use SMTP authentication
1329 $mail->SMTPAuth = true;
1330 $mail->Username = $CFG->smtpuser;
1331 $mail->Password = $CFG->smtppass;
1332 }
7f86ce17 1333 }
f9903ed0 1334
2b97bd71 1335 $adminuser = get_admin();
1336
1337 $mail->Sender = "$adminuser->email";
1338
a402bdcb 1339 if (is_string($from)) { // So we can pass whatever we want if there is need
1340 $mail->From = $CFG->noreplyaddress;
0d8a590a 1341 $mail->FromName = $from;
a402bdcb 1342 } else if ($usetrueaddress and $from->maildisplay) {
6e506bf9 1343 $mail->From = "$from->email";
1344 $mail->FromName = fullname($from);
1345 } else {
1346 $mail->From = "$CFG->noreplyaddress";
0d8a590a 1347 $mail->FromName = fullname($from);
6e506bf9 1348 }
136dabd8 1349 $mail->Subject = stripslashes($subject);
f9903ed0 1350
d8ba183c 1351 $mail->AddAddress("$user->email", fullname($user) );
f9903ed0 1352
58d24720 1353 $mail->WordWrap = 79; // set word wrap
f9903ed0 1354
b68dca19 1355 if (!empty($from->precedence)) {
1356 $mail->Precedence = $from->precedence; // set precedence level eg "bulk" "list" or "junk"
1357 }
1358
136dabd8 1359 if ($messagehtml) {
1360 $mail->IsHTML(true);
125898af 1361 $mail->Encoding = "quoted-printable"; // Encoding to use
136dabd8 1362 $mail->Body = $messagehtml;
78681899 1363 $mail->AltBody = "\n$messagetext\n";
136dabd8 1364 } else {
1365 $mail->IsHTML(false);
78681899 1366 $mail->Body = "\n$messagetext\n";
f9903ed0 1367 }
1368
136dabd8 1369 if ($attachment && $attachname) {
1370 if (ereg( "\\.\\." ,$attachment )) { // Security check for ".." in dir path
0b4c5822 1371 $mail->AddAddress("$adminuser->email", fullname($adminuser) );
4216daa6 1372 $mail->AddStringAttachment("Error in attachment. User attempted to attach a filename with a unsafe name.", "error.txt", "8bit", "text/plain");
136dabd8 1373 } else {
1374 include_once("$CFG->dirroot/files/mimetypes.php");
1375 $mimetype = mimeinfo("type", $attachname);
1376 $mail->AddAttachment("$CFG->dataroot/$attachment", "$attachname", "base64", "$mimetype");
1377 }
f9903ed0 1378 }
1379
136dabd8 1380 if ($mail->Send()) {
1381 return true;
1382 } else {
4216daa6 1383 echo "ERROR: $mail->ErrorInfo\n";
1384 $site = get_site();
1385 add_to_log($site->id, "library", "mailer", $_SERVER["REQUEST_URI"], "ERROR: $mail->ErrorInfo");
f9903ed0 1386 return false;
1387 }
f9903ed0 1388}
1389
1d881d92 1390function reset_password_and_mail($user) {
1391
1392 global $CFG;
1393
1394 $site = get_site();
1395 $from = get_admin();
1396
1397 $newpassword = generate_password();
1398
1399 if (! set_field("user", "password", md5($newpassword), "id", $user->id) ) {
1400 error("Could not set user password!");
1401 }
1402
1403 $a->firstname = $user->firstname;
1404 $a->sitename = $site->fullname;
1405 $a->username = $user->username;
1406 $a->newpassword = $newpassword;
1407 $a->link = "$CFG->wwwroot/login/change_password.php";
0b4c5822 1408 $a->signoff = fullname($from, true)." ($from->email)";
1d881d92 1409
1410 $message = get_string("newpasswordtext", "", $a);
1411
1412 $subject = "$site->fullname: ".get_string("changedpassword");
1413
1414 return email_to_user($user, $from, $subject, $message);
1415
1416}
1417
1418function send_confirmation_email($user) {
1419
1420 global $CFG;
1421
1422 $site = get_site();
1423 $from = get_admin();
1424
1425 $data->firstname = $user->firstname;
1426 $data->sitename = $site->fullname;
1427 $data->link = "$CFG->wwwroot/login/confirm.php?p=$user->secret&s=$user->username";
0b4c5822 1428 $data->admin = fullname($from)." ($from->email)";
1d881d92 1429
1430 $message = get_string("emailconfirmation", "", $data);
eb347b6b 1431 $subject = get_string("emailconfirmationsubject", "", $site->fullname);
1d881d92 1432
58d24720 1433 $messagehtml = text_to_html($message, false, false, true);
1434
1435 return email_to_user($user, $from, $subject, $message, $messagehtml);
1d881d92 1436
1437}
1438
eb347b6b 1439function send_password_change_confirmation_email($user) {
1440
1441 global $CFG;
1442
1443 $site = get_site();
1444 $from = get_admin();
1445
1446 $data->firstname = $user->firstname;
1447 $data->sitename = $site->fullname;
1448 $data->link = "$CFG->wwwroot/login/forgot_password.php?p=$user->secret&s=$user->username";
0b4c5822 1449 $data->admin = fullname($from)." ($from->email)";
eb347b6b 1450
1451 $message = get_string("emailpasswordconfirmation", "", $data);
1452 $subject = get_string("emailpasswordconfirmationsubject", "", $site->fullname);
1453
1454 return email_to_user($user, $from, $subject, $message);
1455
1456}
1457
1458
1d881d92 1459
136dabd8 1460
f9903ed0 1461/// FILE HANDLING /////////////////////////////////////////////
1462
1e03c552 1463
6b174680 1464function make_upload_directory($directory) {
9fa49e22 1465/// $directory = a string of directory names under $CFG->dataroot
1466/// eg stuff/assignment/1
1467/// Returns full directory if successful, false if not
6b174680 1468
1469 global $CFG;
1470
1471 $currdir = $CFG->dataroot;
fe287429 1472
2e6d4273 1473 umask(0000);
1474
6b174680 1475 if (!file_exists($currdir)) {
2e6d4273 1476 if (! mkdir($currdir, $CFG->directorypermissions)) {
6b174680 1477 notify("ERROR: You need to create the directory $currdir with web server write access");
1478 return false;
1479 }
1480 }
1481
1e03c552 1482 $dirarray = explode("/", $directory);
6b174680 1483
1484 foreach ($dirarray as $dir) {
1485 $currdir = "$currdir/$dir";
1486 if (! file_exists($currdir)) {
2e6d4273 1487 if (! mkdir($currdir, $CFG->directorypermissions)) {
6b174680 1488 notify("ERROR: Could not find or create a directory ($currdir)");
1489 return false;
1490 }
feffa4e6 1491 @chmod($currdir, $CFG->directorypermissions); // Just in case mkdir didn't do it
6b174680 1492 }
1493 }
1494
1495 return $currdir;
1496}
1e03c552 1497
1498
ca4f8eb8 1499function make_mod_upload_directory($courseid) {
9fa49e22 1500/// Makes an upload directory for a particular module
ca4f8eb8 1501 global $CFG;
1502
1503 if (! $moddata = make_upload_directory("$courseid/$CFG->moddata")) {
1504 return false;
1505 }
1506
1507 $strreadme = get_string("readme");
1508
1509 if (file_exists("$CFG->dirroot/lang/$CFG->lang/docs/module_files.txt")) {
1510 copy("$CFG->dirroot/lang/$CFG->lang/docs/module_files.txt", "$moddata/$strreadme.txt");
1511 } else {
1512 copy("$CFG->dirroot/lang/en/docs/module_files.txt", "$moddata/$strreadme.txt");
1513 }
1514 return $moddata;
1515}
1516
6b174680 1517
44e2d2bb 1518function valid_uploaded_file($newfile) {
9fa49e22 1519/// Returns current name of file on disk if true
9c9f7d77 1520 if (empty($newfile)) {
1521 return "";
1522 }
44e2d2bb 1523 if (is_uploaded_file($newfile['tmp_name']) and $newfile['size'] > 0) {
1524 return $newfile['tmp_name'];
1525 } else {
1526 return "";
1527 }
1528}
1529
4909e176 1530function get_max_upload_file_size($sitebytes=0, $coursebytes=0, $modulebytes=0) {
9fa49e22 1531/// Returns the maximum size for uploading files
316ebf78 1532/// There are seven possible upload limits:
4909e176 1533///
1534/// 1) in Apache using LimitRequestBody (no way of checking or changing this)
1535/// 2) in php.ini for 'upload_max_filesize' (can not be changed inside PHP)
1536/// 3) in .htaccess for 'upload_max_filesize' (can not be changed inside PHP)
316ebf78 1537/// 4) in php.ini for 'post_max_size' (can not be changed inside PHP)
1538/// 5) by the Moodle admin in $CFG->maxbytes
1539/// 6) by the teacher in the current course $course->maxbytes
1540/// 7) by the teacher for the current module, eg $assignment->maxbytes
4909e176 1541///
1542/// These last two are passed to this function as arguments (in bytes).
1543/// Anything defined as 0 is ignored.
1544/// The smallest of all the non-zero numbers is returned.
1545
44e2d2bb 1546 if (! $filesize = ini_get("upload_max_filesize")) {
1547 $filesize = "5M";
1548 }
4909e176 1549 $minimumsize = get_real_size($filesize);
1550
316ebf78 1551 if ($postsize = ini_get("post_max_size")) {
1552 $postsize = get_real_size($postsize);
1553 if ($postsize < $minimumsize) {
1554 $minimumsize = $postsize;
1555 }
1556 }
1557
4909e176 1558 if ($sitebytes and $sitebytes < $minimumsize) {
1559 $minimumsize = $sitebytes;
1560 }
1561
1562 if ($coursebytes and $coursebytes < $minimumsize) {
1563 $minimumsize = $coursebytes;
1564 }
1565
1566 if ($modulebytes and $modulebytes < $minimumsize) {
1567 $minimumsize = $modulebytes;
1568 }
1569
1570 return $minimumsize;
1571}
1572
1573function get_max_upload_sizes($sitebytes=0, $coursebytes=0, $modulebytes=0) {
d8ba183c 1574/// Related to the above function - this function returns an
1575/// array of possible sizes in an array, translated to the
4909e176 1576/// local language.
1577
1578 if (!$maxsize = get_max_upload_file_size($sitebytes, $coursebytes, $modulebytes)) {
1579 return array();
1580 }
1581
1582 $filesize[$maxsize] = display_size($maxsize);
1583
d8ba183c 1584 $sizelist = array(10240, 51200, 102400, 512000, 1048576, 2097152,
4909e176 1585 5242880, 10485760, 20971520, 52428800, 104857600);
1586
1587 foreach ($sizelist as $sizebytes) {
1588 if ($sizebytes < $maxsize) {
1589 $filesize[$sizebytes] = display_size($sizebytes);
1590 }
1591 }
1592
1593 krsort($filesize, SORT_NUMERIC);
1594
1595 return $filesize;
44e2d2bb 1596}
1597
16a5602c 1598function get_directory_list($rootdir, $excludefile="", $descend=true, $getdirs=false, $getfiles=true) {
d8ba183c 1599/// Returns an array with all the filenames in
9fa49e22 1600/// all subdirectories, relative to the given rootdir.
1601/// If excludefile is defined, then that file/directory is ignored
16a5602c 1602/// If getdirs is true, then (sub)directories are included in the output
1603/// If getfiles is true, then files are included in the output
1604/// (at least one of these must be true!)
f9903ed0 1605
1606 $dirs = array();
f9903ed0 1607
16a5602c 1608 if (!$getdirs and !$getfiles) { // Nothing to show
12407705 1609 return $dirs;
1610 }
1611
16a5602c 1612 if (!is_dir($rootdir)) { // Must be a directory
1613 return $dirs;
1614 }
1615
1616 if (!$dir = opendir($rootdir)) { // Can't open it for some reason
d897cae4 1617 return $dirs;
1618 }
1619
81fcd0f0 1620 while (false !== ($file = readdir($dir))) {
b35e8568 1621 $firstchar = substr($file, 0, 1);
1622 if ($firstchar == "." or $file == "CVS" or $file == $excludefile) {
1623 continue;
1624 }
55fd8177 1625 $fullfile = "$rootdir/$file";
bf5c2e84 1626 if (filetype($fullfile) == "dir") {
16a5602c 1627 if ($getdirs) {
55fd8177 1628 $dirs[] = $file;
1629 }
bf5c2e84 1630 if ($descend) {
16a5602c 1631 $subdirs = get_directory_list($fullfile, $excludefile, $descend, $getdirs, $getfiles);
bf5c2e84 1632 foreach ($subdirs as $subdir) {
1633 $dirs[] = "$file/$subdir";
1634 }
f9903ed0 1635 }
16a5602c 1636 } else if ($getfiles) {
b35e8568 1637 $dirs[] = $file;
f9903ed0 1638 }
1639 }
44e2d2bb 1640 closedir($dir);
f9903ed0 1641
774ab660 1642 asort($dirs);
1643
f9903ed0 1644 return $dirs;
1645}
1646
16a5602c 1647function get_directory_size($rootdir, $excludefile="") {
1648/// Adds up all the files in a directory and works out the size
1649
1650 $size = 0;
1651
1652 if (!is_dir($rootdir)) { // Must be a directory
1653 return $dirs;
1654 }
1655
b5b90f26 1656 if (!$dir = @opendir($rootdir)) { // Can't open it for some reason
16a5602c 1657 return $dirs;
1658 }
1659
1660 while (false !== ($file = readdir($dir))) {
1661 $firstchar = substr($file, 0, 1);
1662 if ($firstchar == "." or $file == "CVS" or $file == $excludefile) {
1663 continue;
1664 }
1665 $fullfile = "$rootdir/$file";
1666 if (filetype($fullfile) == "dir") {
1667 $size += get_directory_size($fullfile, $excludefile);
1668 } else {
1669 $size += filesize($fullfile);
1670 }
1671 }
1672 closedir($dir);
1673
1674 return $size;
1675}
1676
989bfa9d 1677function get_real_size($size=0) {
9fa49e22 1678/// Converts numbers like 10M into bytes
989bfa9d 1679 if (!$size) {
d8ba183c 1680 return 0;
989bfa9d 1681 }
1682 $scan['MB'] = 1048576;
64efda84 1683 $scan['Mb'] = 1048576;
989bfa9d 1684 $scan['M'] = 1048576;
266a416e 1685 $scan['m'] = 1048576;
989bfa9d 1686 $scan['KB'] = 1024;
64efda84 1687 $scan['Kb'] = 1024;
989bfa9d 1688 $scan['K'] = 1024;
266a416e 1689 $scan['k'] = 1024;
989bfa9d 1690
1691 while (list($key) = each($scan)) {
1692 if ((strlen($size)>strlen($key))&&(substr($size, strlen($size) - strlen($key))==$key)) {
1693 $size = substr($size, 0, strlen($size) - strlen($key)) * $scan[$key];
1694 break;
1695 }
1696 }
1697 return $size;
1698}
1699
44e2d2bb 1700function display_size($size) {
9fa49e22 1701/// Converts bytes into display form
4909e176 1702
1703 static $gb,$mb,$kb,$b;
1704
1705 if (empty($gb)) {
1706 $gb = get_string('sizegb');
1707 $mb = get_string('sizemb');
1708 $kb = get_string('sizekb');
1709 $b = get_string('sizeb');
1710 }
1711
44e2d2bb 1712 if ($size >= 1073741824) {
4909e176 1713 $size = round($size / 1073741824 * 10) / 10 . $gb;
44e2d2bb 1714 } else if ($size >= 1048576) {
4909e176 1715 $size = round($size / 1048576 * 10) / 10 . $mb;
44e2d2bb 1716 } else if ($size >= 1024) {
4909e176 1717 $size = round($size / 1024 * 10) / 10 . $kb;
d8ba183c 1718 } else {
4909e176 1719 $size = $size ." $b";
44e2d2bb 1720 }
1721 return $size;
1722}
1723
6b174680 1724function clean_filename($string) {
9fa49e22 1725/// Cleans a given filename by removing suspicious or troublesome characters
bbf4d8e6 1726/// Only these are allowed:
a402bdcb 1727/// alphanumeric _ - .
bbf4d8e6 1728
1729 $string = eregi_replace("\.\.+", "", $string);
8644437d 1730 $string = preg_replace('/[^\.a-zA-Z\d\_-]/','_', $string ); // only allowed chars
bbf4d8e6 1731 $string = eregi_replace("_+", "_", $string);
1732 return $string;
6b174680 1733}
1734
1735
1180c6dc 1736/// STRING TRANSLATION ////////////////////////////////////////
1737
4bfa92e7 1738function current_language() {
9fa49e22 1739/// Returns the code for the current language
3db3acfb 1740 global $CFG, $USER, $SESSION;
4bfa92e7 1741
e5415d58 1742 if (!empty($CFG->courselang)) { // Course language can override all other settings for this page
b3153e4b 1743 return $CFG->courselang;
1744
e5415d58 1745 } else if (!empty($SESSION->lang)) { // Session language can override other settings
3db3acfb 1746 return $SESSION->lang;
1747
e5415d58 1748 } else if (!empty($USER->lang)) { // User language can override site language
4bfa92e7 1749 return $USER->lang;
3db3acfb 1750
4bfa92e7 1751 } else {
1752 return $CFG->lang;
1753 }
1754}
bcc83c41 1755
9fa49e22 1756function print_string($identifier, $module="", $a=NULL) {
1757/// Given a string to translate - prints it out.
1758 echo get_string($identifier, $module, $a);
1759}
1760
a83fded1 1761function get_string($identifier, $module="", $a=NULL) {
d8ba183c 1762/// Return the translated string specified by $identifier as
9fa49e22 1763/// for $module. Uses the same format files as STphp.
1764/// $a is an object, string or number that can be used
1765/// within translation strings
1766///
1767/// eg "hello \$a->firstname \$a->lastname"
1768/// or "hello \$a"
1180c6dc 1769
4bfa92e7 1770 global $CFG;
1180c6dc 1771
e11dc9b6 1772 global $course; /// Not a nice hack, but quick
ac8abb5f 1773 if (empty($CFG->courselang)) {
1774 if (!empty($course->lang)) {
1775 $CFG->courselang = $course->lang;
1776 }
e11dc9b6 1777 }
1778
4bfa92e7 1779 $lang = current_language();
1180c6dc 1780
058eec18 1781 if ($module == "") {
1782 $module = "moodle";
1180c6dc 1783 }
1784
058eec18 1785 $langpath = "$CFG->dirroot/lang";
1786 $langfile = "$langpath/$lang/$module.php";
1180c6dc 1787
b947c69a 1788 // Look for the string - if found then return it
1789
1790 if (file_exists($langfile)) {
1791 if ($result = get_string_from_file($identifier, $langfile, "\$resultstring")) {
1792 eval($result);
1793 return $resultstring;
1180c6dc 1794 }
1795 }
1796
cdac797c 1797 // If it's a module, then look within the module pack itself mod/xxxx/lang/en/module.php
1798
1799 if ($module != "moodle") {
1800 $modlangpath = "$CFG->dirroot/mod/$module/lang";
1801 $langfile = "$modlangpath/$lang/$module.php";
1802 if (file_exists($langfile)) {
1803 if ($result = get_string_from_file($identifier, $langfile, "\$resultstring")) {
1804 eval($result);
1805 return $resultstring;
1806 }
1807 }
1808 }
1180c6dc 1809
cdac797c 1810 // If the preferred language was English we can abort now
d8ba183c 1811 if ($lang == "en") {
b947c69a 1812 return "[[$identifier]]";
1813 }
1180c6dc 1814
b947c69a 1815 // Is a parent language defined? If so, try it.
d8ba183c 1816
b947c69a 1817 if ($result = get_string_from_file("parentlanguage", "$langpath/$lang/moodle.php", "\$parentlang")) {
1818 eval($result);
1819 if (!empty($parentlang)) {
1820 $langfile = "$langpath/$parentlang/$module.php";
1821 if (file_exists($langfile)) {
1822 if ($result = get_string_from_file($identifier, $langfile, "\$resultstring")) {
1823 eval($result);
1824 return $resultstring;
1825 }
1180c6dc 1826 }
1827 }
1828 }
b947c69a 1829
1830 // Our only remaining option is to try English
1831
1832 $langfile = "$langpath/en/$module.php";
1833 if (!file_exists($langfile)) {
1834 return "ERROR: No lang file ($langpath/en/$module.php)!";
1835 }
1836 if ($result = get_string_from_file($identifier, $langfile, "\$resultstring")) {
1837 eval($result);
1838 return $resultstring;
1839 }
1840
cdac797c 1841 // If it's a module, then look within the module pack itself mod/xxxx/lang/en/module.php
1842
1843 if ($module != "moodle") {
1844 $langfile = "$modlangpath/en/$module.php";
1845 if (file_exists($langfile)) {
1846 if ($result = get_string_from_file($identifier, $langfile, "\$resultstring")) {
1847 eval($result);
1848 return $resultstring;
1849 }
1850 }
1851 }
1852
b947c69a 1853 return "[[$identifier]]"; // Last resort
1180c6dc 1854}
1855
1856
1180c6dc 1857function get_string_from_file($identifier, $langfile, $destination) {
9fa49e22 1858/// This function is only used from get_string().
2b32bddd 1859
1860 static $strings; // Keep the strings cached in memory.
1861
1862 if (empty($strings[$langfile])) {
a32c99e2 1863 $string = array();
2b32bddd 1864 include ($langfile);
1865 $strings[$langfile] = $string;
1866 } else {
1867 $string = &$strings[$langfile];
1868 }
1180c6dc 1869
1870 if (!isset ($string[$identifier])) {
1871 return false;
1872 }
1873
a83fded1 1874 return "$destination = sprintf(\"".$string[$identifier]."\");";
1180c6dc 1875}
f9903ed0 1876
9d3c795c 1877function get_strings($array, $module='') {
1878/// Converts an array of strings
1879
1880 $string = NULL;
1881 foreach ($array as $item) {
1882 $string->$item = get_string($item, $module);
1883 }
1884 return $string;
1885}
f9903ed0 1886
1a72314d 1887function get_list_of_languages() {
1888/// Returns a list of language codes and their full names
1889 global $CFG;
1890
984a8bf3 1891 $languages = array();
1892
1893 if (!empty($CFG->langlist)) { // use admin's list of languages
1894 $langlist = explode(',', $CFG->langlist);
1895 foreach ($langlist as $lang) {
1896 if (file_exists("$CFG->dirroot/lang/$lang/moodle.php")) {
1897 include("$CFG->dirroot/lang/$lang/moodle.php");
1898 $languages[$lang] = $string["thislanguage"]." ($lang)";
1899 unset($string);
1900 }
1901 }
1902 } else {
1903 if (!$langdirs = get_list_of_plugins("lang")) {
1904 return false;
1905 }
1906 foreach ($langdirs as $lang) {
1907 include("$CFG->dirroot/lang/$lang/moodle.php");
1908 $languages[$lang] = $string["thislanguage"]." ($lang)";
1909 unset($string);
1910 }
1a72314d 1911 }
1912
1a72314d 1913 return $languages;
1914}
1915
5833a6c8 1916function get_list_of_countries() {
1917/// Returns a list of country names in the current language
1918 global $CFG, $USER;
1919
1920 $lang = current_language();
1921
1922 if (!file_exists("$CFG->dirroot/lang/$lang/countries.php")) {
aa3eb050 1923 if ($parentlang = get_string("parentlanguage")) {
1924 if (file_exists("$CFG->dirroot/lang/$parentlang/countries.php")) {
1925 $lang = $parentlang;
1926 } else {
1927 $lang = "en"; // countries.php must exist in this pack
1928 }
1929 } else {
1930 $lang = "en"; // countries.php must exist in this pack
1931 }
5833a6c8 1932 }
1933
d8ba183c 1934 include("$CFG->dirroot/lang/$lang/countries.php");
5833a6c8 1935
f8dbffb1 1936 if (!empty($string)) {
1937 asort($string);
1938 }
5833a6c8 1939
1940 return $string;
1941}
1942
82196932 1943function get_list_of_pixnames() {
1944/// Returns a list of picture names in the current language
1945 global $CFG;
1946
1947 $lang = current_language();
1948
1949 if (!file_exists("$CFG->dirroot/lang/$lang/pix.php")) {
1950 if ($parentlang = get_string("parentlanguage")) {
1951 if (file_exists("$CFG->dirroot/lang/$parentlang/pix.php")) {
1952 $lang = $parentlang;
1953 } else {
1954 $lang = "en"; // countries.php must exist in this pack
1955 }
1956 } else {
1957 $lang = "en"; // countries.php must exist in this pack
1958 }
1959 }
1960
d8ba183c 1961 include_once("$CFG->dirroot/lang/$lang/pix.php");
82196932 1962
1963 return $string;
1964}
1965
9bd2c874 1966function document_file($file, $include=true) {
1967/// Can include a given document file (depends on second
1968/// parameter) or just return info about it
1969
c9d4e6da 1970 global $CFG;
9bd2c874 1971
db356340 1972 $file = clean_filename($file);
1973
9bd2c874 1974 if (empty($file)) {
9bd2c874 1975 return false;
1976 }
1977
db356340 1978 $langs = array(current_language(), get_string("parentlanguage"), "en");
9bd2c874 1979
db356340 1980 foreach ($langs as $lang) {
1981 $info->filepath = "$CFG->dirroot/lang/$lang/docs/$file";
1982 $info->urlpath = "$CFG->wwwroot/lang/$lang/docs/$file";
9bd2c874 1983
db356340 1984 if (file_exists($info->filepath)) {
1985 if ($include) {
1986 include($info->filepath);
1987 }
1988 return $info;
0c106cd3 1989 }
9bd2c874 1990 }
1991
db356340 1992 return false;
9bd2c874 1993}
1994
1a72314d 1995
f9903ed0 1996/// ENCRYPTION ////////////////////////////////////////////////
1997
1998function rc4encrypt($data) {
1999 $password = "nfgjeingjk";
2000 return endecrypt($password, $data, "");
2001}
2002
2003function rc4decrypt($data) {
2004 $password = "nfgjeingjk";
2005 return endecrypt($password, $data, "de");
2006}
2007
2008function endecrypt ($pwd, $data, $case) {
9fa49e22 2009/// Based on a class by Mukul Sabharwal [mukulsabharwal@yahoo.com]
f9903ed0 2010
2011 if ($case == 'de') {
2012 $data = urldecode($data);
2013 }
2014
2015 $key[] = "";
2016 $box[] = "";
2017 $temp_swap = "";
2018 $pwd_length = 0;
2019
2020 $pwd_length = strlen($pwd);
2021
2022 for ($i = 0; $i <= 255; $i++) {
2023 $key[$i] = ord(substr($pwd, ($i % $pwd_length), 1));
2024 $box[$i] = $i;
2025 }
2026
2027 $x = 0;
2028
2029 for ($i = 0; $i <= 255; $i++) {
2030 $x = ($x + $box[$i] + $key[$i]) % 256;
2031 $temp_swap = $box[$i];
2032 $box[$i] = $box[$x];
2033 $box[$x] = $temp_swap;
2034 }
2035
2036 $temp = "";
2037 $k = "";
2038
2039 $cipherby = "";
2040 $cipher = "";
2041
2042 $a = 0;
2043 $j = 0;
2044
2045 for ($i = 0; $i < strlen($data); $i++) {
2046 $a = ($a + 1) % 256;
2047 $j = ($j + $box[$a]) % 256;
2048 $temp = $box[$a];
2049 $box[$a] = $box[$j];
2050 $box[$j] = $temp;
2051 $k = $box[(($box[$a] + $box[$j]) % 256)];
2052 $cipherby = ord(substr($data, $i, 1)) ^ $k;
2053 $cipher .= chr($cipherby);
2054 }
2055
2056 if ($case == 'de') {
2057 $cipher = urldecode(urlencode($cipher));
2058 } else {
2059 $cipher = urlencode($cipher);
2060 }
2061
2062 return $cipher;
2063}
2064
2065
5fba04fb 2066/// CALENDAR MANAGEMENT ////////////////////////////////////////////////////////////////
2067
2068
2069function add_event($event) {
2070/// call this function to add an event to the calendar table
2071/// and to call any calendar plugins
2072/// The function returns the id number of the resulting record
2073/// The object event should include the following:
2074/// $event->name Name for the event
2075/// $event->description Description of the event (defaults to '')
2076/// $event->courseid The id of the course this event belongs to (0 = all courses)
2077/// $event->groupid The id of the group this event belongs to (0 = no group)
2078/// $event->userid The id of the user this event belongs to (0 = no user)
2079/// $event->modulename Name of the module that creates this event
2080/// $event->instance Instance of the module that owns this event
2081/// $event->eventtype The type info together with the module info could
2082/// be used by calendar plugins to decide how to display event
2083/// $event->timestart Timestamp for start of event
2084/// $event->timeduration Duration (defaults to zero)
2085
2086 global $CFG;
2087
2088 $event->timemodified = time();
d8ba183c 2089
5fba04fb 2090 if (!$event->id = insert_record("event", $event)) {
2091 return false;
2092 }
d8ba183c 2093
5fba04fb 2094 if (!empty($CFG->calendar)) { // call the add_event function of the selected calendar
2095 if (file_exists("$CFG->dirroot/calendar/$CFG->calendar/lib.php")) {
2096 include_once("$CFG->dirroot/calendar/$CFG->calendar/lib.php");
2097 $calendar_add_event = $CFG->calendar.'_add_event';
2098 if (function_exists($calendar_add_event)) {
2099 $calendar_add_event($event);
2100 }
2101 }
2102 }
d8ba183c 2103
5fba04fb 2104 return $event->id;
2105}
2106
2107
2108function update_event($event) {
2109/// call this function to update an event in the calendar table
2110/// the event will be identified by the id field of the $event object
2111
2112 global $CFG;
2113
2114 $event->timemodified = time();
d8ba183c 2115
5fba04fb 2116 if (!empty($CFG->calendar)) { // call the update_event function of the selected calendar
2117 if (file_exists("$CFG->dirroot/calendar/$CFG->calendar/lib.php")) {
2118 include_once("$CFG->dirroot/calendar/$CFG->calendar/lib.php");
2119 $calendar_update_event = $CFG->calendar.'_update_event';
2120 if (function_exists($calendar_update_event)) {
2121 $calendar_update_event($event);
2122 }
2123 }
2124 }
2125 return update_record("event", $event);
2126}
2127
2128
2129function delete_event($id) {
2130/// call this function to delete the event with id $id from calendar table
2131
2132 global $CFG;
2133
2134 if (!empty($CFG->calendar)) { // call the delete_event function of the selected calendar
2135 if (file_exists("$CFG->dirroot/calendar/$CFG->calendar/lib.php")) {
2136 include_once("$CFG->dirroot/calendar/$CFG->calendar/lib.php");
2137 $calendar_delete_event = $CFG->calendar.'_delete_event';
2138 if (function_exists($calendar_delete_event)) {
2139 $calendar_delete_event($id);
2140 }
2141 }
2142 }
2143 return delete_records("event", 'id', $id);
2144}
2145
2146
dcd338ff 2147function hide_event($event) {
2148/// call this function to hide an event in the calendar table
2149/// the event will be identified by the id field of the $event object
2150
2151 global $CFG;
2152
2153 if (!empty($CFG->calendar)) { // call the update_event function of the selected calendar
2154 if (file_exists("$CFG->dirroot/calendar/$CFG->calendar/lib.php")) {
2155 include_once("$CFG->dirroot/calendar/$CFG->calendar/lib.php");
2156 $calendar_hide_event = $CFG->calendar.'_hide_event';
2157 if (function_exists($calendar_hide_event)) {
2158 $calendar_hide_event($event);
2159 }
2160 }
2161 }
2162 return set_field('event', 'visible', 0, 'id', $event->id);
2163}
2164
2165
2166function show_event($event) {
2167/// call this function to unhide an event in the calendar table
2168/// the event will be identified by the id field of the $event object
2169
2170 global $CFG;
2171
2172 if (!empty($CFG->calendar)) { // call the update_event function of the selected calendar
2173 if (file_exists("$CFG->dirroot/calendar/$CFG->calendar/lib.php")) {
2174 include_once("$CFG->dirroot/calendar/$CFG->calendar/lib.php");
2175 $calendar_show_event = $CFG->calendar.'_show_event';
2176 if (function_exists($calendar_show_event)) {
2177 $calendar_show_event($event);
2178 }
2179 }
2180 }
2181 return set_field('event', 'visible', 1, 'id', $event->id);
2182}
5fba04fb 2183
2184
9fa49e22 2185/// ENVIRONMENT CHECKING ////////////////////////////////////////////////////////////
1e3e716f 2186
0cb77f5a 2187function get_list_of_plugins($plugin="mod", $exclude="") {
1d881d92 2188/// Lists plugin directories within some directory
2189
2190 global $CFG;
2191
2192 $basedir = opendir("$CFG->dirroot/$plugin");
2193 while ($dir = readdir($basedir)) {
b35e8568 2194 $firstchar = substr($dir, 0, 1);
0cb77f5a 2195 if ($firstchar == "." or $dir == "CVS" or $dir == "_vti_cnf" or $dir == $exclude) {
1d881d92 2196 continue;
2197 }
2198 if (filetype("$CFG->dirroot/$plugin/$dir") != "dir") {
2199 continue;
2200 }
2201 $plugins[] = $dir;
2202 }
2203 if ($plugins) {
2204 asort($plugins);
2205 }
2206 return $plugins;
2207}
2208
b0cb5e22 2209function check_php_version($version="4.1.0") {
9fa49e22 2210/// Returns true is the current version of PHP is greater that the specified one
b0cb5e22 2211 $minversion = intval(str_replace(".", "", $version));
2212 $curversion = intval(str_replace(".", "", phpversion()));
2213 return ($curversion >= $minversion);
2214}
2215
0095d5cd 2216function check_browser_version($brand="MSIE", $version=5.5) {
9fa49e22 2217/// Checks to see if is a browser matches the specified
2218/// brand and is equal or better version.
0095d5cd 2219
4c46c425 2220 $agent = $_SERVER["HTTP_USER_AGENT"];
2221
2222 if (empty($agent)) {
0095d5cd 2223 return false;
2224 }
4c46c425 2225
2226 switch ($brand) {
2227
2228 case "Gecko": /// Gecko based browsers
2229
2230 if (substr_count($agent, "Camino")) { // MacOS X Camino not supported.
2231 return false;
2232 }
2233
2234 // the proper string - Gecko/CCYYMMDD Vendor/Version
2235 if (ereg("^([a-zA-Z]+)/([0-9]+\.[0-9]+) \((.*)\) (.*)$", $agent, $match)) {
2236 if (ereg("^([Gecko]+)/([0-9]+)",$match[4], $reldate)) {
2237 if ($reldate[2] > $version) {
2238 return true;
2239 }
2240 }
2241 }
2242 break;
2243
2244
2245 case "MSIE": /// Internet Explorer
2246
0e2585ac 2247 if (strpos($agent, 'Opera')) { // Reject Opera
2248 return false;
2249 }
4c46c425 2250 $string = explode(";", $agent);
2251 if (!isset($string[1])) {
2252 return false;
2253 }
2254 $string = explode(" ", trim($string[1]));
2255 if (!isset($string[0]) and !isset($string[1])) {
2256 return false;
2257 }
2258 if ($string[0] == $brand and (float)$string[1] >= $version ) {
2259 return true;
2260 }
2261 break;
2262
0095d5cd 2263 }
4c46c425 2264
0095d5cd 2265 return false;
2266}
2267
c39c66a5 2268function ini_get_bool($ini_get_arg) {
2269/// This function makes the return value of ini_get consistent if you are
2270/// setting server directives through the .htaccess file in apache.
2271/// Current behavior for value set from php.ini On = 1, Off = [blank]
2272/// Current behavior for value set from .htaccess On = On, Off = Off
2273/// Contributed by jdell@unr.edu
2274
2275 $temp = ini_get($ini_get_arg);
2276
2277 if ($temp == "1" or strtolower($temp) == "on") {
2278 return true;
2279 }
2280 return false;
2281}
2282
0095d5cd 2283function can_use_richtext_editor() {
47037513 2284/// Compatibility stub to provide backward compatibility
2285 return can_use_html_editor();
2286}
2287
2288function can_use_html_editor() {
4c46c425 2289/// Is the HTML editor enabled? This depends on site and user
2290/// settings, as well as the current browser being used.
47037513 2291/// Returns false is editor is not being used, otherwise
2292/// returns "MSIE" or "Gecko"
4c46c425 2293
0095d5cd 2294 global $USER, $CFG;
4c46c425 2295
ce78926d 2296 if (!empty($USER->htmleditor) and !empty($CFG->htmleditor)) {
4c46c425 2297 if (check_browser_version("MSIE", 5.5)) {
47037513 2298 return "MSIE";
2299 } else if (check_browser_version("Gecko", 20030516)) {
2300 return "Gecko";
4c46c425 2301 }
7ce20f09 2302 }
2303 return false;
0095d5cd 2304}
2305
47037513 2306
74944b73 2307function check_gd_version() {
9fa49e22 2308/// Hack to find out the GD version by parsing phpinfo output
aa095969 2309 $gdversion = 0;
74944b73 2310
aa095969 2311 if (function_exists('gd_info')){
2312 $gd_info = gd_info();
3ee23682 2313 if (substr_count($gd_info['GD Version'], "2.")) {
aa095969 2314 $gdversion = 2;
3ee23682 2315 } else if (substr_count($gd_info['GD Version'], "1.")) {
2316 $gdversion = 1;
aa095969 2317 }
3ee23682 2318
aa095969 2319 } else {
2320 ob_start();
2321 phpinfo(8);
2322 $phpinfo = ob_get_contents();
2323 ob_end_clean();
74944b73 2324
aa095969 2325 $phpinfo = explode("\n",$phpinfo);
74944b73 2326
92a4b0f1 2327
aa095969 2328 foreach ($phpinfo as $text) {
2329 $parts = explode('</td>',$text);
2330 foreach ($parts as $key => $val) {
2331 $parts[$key] = trim(strip_tags($val));
2332 }
2333 if ($parts[0] == "GD Version") {
2334 if (substr_count($parts[1], "2.0")) {
2335 $parts[1] = "2.0";
2336 }
2337 $gdversion = intval($parts[1]);
92a4b0f1 2338 }
74944b73 2339 }
2340 }
2341
2342 return $gdversion; // 1, 2 or 0
2343}
f9903ed0 2344
0095d5cd 2345
9fa49e22 2346function moodle_needs_upgrading() {
2347/// Checks version numbers of Main code and all modules to see
2348/// if there are any mismatches ... returns true or false
2349 global $CFG;
2350
2351 include_once("$CFG->dirroot/version.php"); # defines $version and upgrades
d8ba183c 2352 if ($CFG->version) {
9fa49e22 2353 if ($version > $CFG->version) {
2354 return true;
2355 }
2356 if ($mods = get_list_of_plugins("mod")) {
2357 foreach ($mods as $mod) {
2358 $fullmod = "$CFG->dirroot/mod/$mod";
2359 unset($module);
1079c8a8 2360 if (!is_readable("$fullmod/version.php")) {
2361 notify("Module '$mod' is not readable - check permissions");
2362 continue;
2363 }
9fa49e22 2364 include_once("$fullmod/version.php"); # defines $module with version etc
2365 if ($currmodule = get_record("modules", "name", $mod)) {
2366 if ($module->version > $currmodule->version) {
2367 return true;
2368 }
2369 }
2370 }
2371 }
2372 } else {
2373 return true;
2374 }
2375 return false;
2376}
2377
2378
2379/// MISCELLANEOUS ////////////////////////////////////////////////////////////////////
2380
9d3c795c 2381function notify_login_failures() {
b40bc478 2382 global $CFG, $db;
9d3c795c 2383
2384 // notify admin users or admin user of any failed logins (since last notification).
2385 switch ($CFG->notifyloginfailures) {
2386 case 'mainadmin' :
2387 $recip = array(get_admin());
2388 break;
2389 case 'alladmins':
2390 $recip = get_admins();
2391 break;
2392 }
2393
2394 if (empty($CFG->lastnotifyfailure)) {
2395 $CFG->lastnotifyfailure=0;
2396 }
2397
2398 // we need to deal with the threshold stuff first.
27106bac 2399 if (empty($CFG->notifyloginthreshold)) {
2400 $CFG->notifyloginthreshold = 10; // default to something sensible.
9d3c795c 2401 }
2402
2403 $notifyipsrs = $db->Execute("SELECT ip FROM {$CFG->prefix}log WHERE time > {$CFG->lastnotifyfailure}
27106bac 2404 AND module='login' AND action='error' GROUP BY ip HAVING count(*) > $CFG->notifyloginthreshold");
9d3c795c 2405
2406 $notifyusersrs = $db->Execute("SELECT info FROM {$CFG->prefix}log WHERE time > {$CFG->lastnotifyfailure}
27106bac 2407 AND module='login' AND action='error' GROUP BY info HAVING count(*) > $CFG->notifyloginthreshold");
9d3c795c 2408
2409 if ($notifyipsrs) {
b40bc478 2410 $ipstr = '';
9d3c795c 2411 while ($row = $notifyipsrs->FetchRow()) {
2412 $ipstr .= "'".$row['ip']."',";
2413 }
2414 $ipstr = substr($ipstr,0,strlen($ipstr)-1);
2415 }
2416 if ($notifyusersrs) {
b40bc478 2417 $userstr = '';
9d3c795c 2418 while ($row = $notifyusersrs->FetchRow()) {
2419 $userstr .= "'".$row['info']."',";
2420 }
2421 $userstr = substr($userstr,0,strlen($userstr)-1);
2422 }
2423
2424 if (strlen($userstr) > 0 || strlen($ipstr) > 0) {
2425 $count = 0;
2426 $logs = get_logs("time > {$CFG->lastnotifyfailure} AND module='login' AND action='error' "
2427 .((strlen($ipstr) > 0 && strlen($userstr) > 0) ? " AND ( ip IN ($ipstr) OR info IN ($userstr) ) "
2428 : ((strlen($ipstr) != 0) ? " AND ip IN ($ipstr) " : " AND info IN ($userstr) ")),"l.time DESC","","",$count);
2429
2430 // if we haven't run in the last hour and we have something useful to report and we are actually supposed to be reporting to somebody
b40bc478 2431 if (is_array($recip) and count($recip) > 0 and ((time() - (60 * 60)) > $CFG->lastnotifyfailure)
9d3c795c 2432 and is_array($logs) and count($logs) > 0) {
b40bc478 2433
2434 $message = '';
9d3c795c 2435 $site = get_site();
2436 $subject = get_string('notifyloginfailuressubject','',$site->fullname);
2437 $message .= get_string('notifyloginfailuresmessagestart','',$CFG->wwwroot)
2438 .(($CFG->lastnotifyfailure != 0) ? '('.userdate($CFG->lastnotifyfailure).')' : '')."\n\n";
2439 foreach ($logs as $log) {
2440 $message .= userdate($log->time) .get_string('notifyloginfailuresmessagefromip').$log->ip
2441 .get_string('notifyloginfailuresmessagewithuser').$log->info."\n";
2442 }
2443 $message .= "\n\n".get_string('notifyloginfailuresmessageend','',$CFG->wwwroot)."\n\n";
2444 foreach ($recip as $admin) {
2445 echo "Emailing $admin->username about ".count($logs)." failed login attempts\n";
2446 email_to_user($admin,get_admin(),$subject,$message);
2447 }
2448 $conf->name = "lastnotifyfailure";
2449 $conf->value = time();
2450 if ($current = get_record("config", "name", "lastnotifyfailure")) {
2451 $conf->id = $current->id;
2452 if (! update_record("config", $conf)) {
2453 echo "Could not update last notify time";
2454 }
2455
2456 } else if (! insert_record("config", $conf)) {
2457 echo "Could not set last notify time";
2458 }
2459 }
2460 }
2461}
2462
a2fa19d8 2463function moodle_setlocale($locale='') {
2464
2465 global $SESSION, $USER, $CFG;
2466
2467 if ($locale) {
2468 $CFG->locale = $locale;
2469 } else if (!empty($CFG->courselang) and ($CFG->courselang != $CFG->lang) ) {
2470 $CFG->locale = get_string('locale');
2471 } else if (!empty($SESSION->lang) and ($SESSION->lang != $CFG->lang) ) {
2472 $CFG->locale = get_string('locale');
2473 } else if (!empty($USER->lang) and ($USER->lang != $CFG->lang) ) {
2474 $CFG->locale = get_string('locale');
2475 } else if (empty($CFG->locale)) {
2476 $CFG->locale = get_string('locale');
2477 set_config('locale', $CFG->locale); // cache it to save lookups in future
2478 }
2479 setlocale (LC_TIME, $CFG->locale);
2480 setlocale (LC_COLLATE, $CFG->locale);
2481
2482 if ($CFG->locale != 'tr_TR') { // To workaround a well-known PHP bug with Turkish
2483 setlocale (LC_CTYPE, $CFG->locale);
2484 }
2485}
2486
7d6cac54 2487function moodle_strtolower ($string, $encoding='') {
2488/// Converts string to lowercase using most compatible function available
2489 if (function_exists('mb_strtolower')) {
2490 if($encoding===''){
2491 return mb_strtolower($string); //use multibyte support with default encoding
2492 } else {
dbe0be00 2493 return mb_strtolower($string,$encoding); //use given encoding
d8ba183c 2494 }
7d6cac54 2495 } else {
2496 return strtolower($string); // use common function what rely on current locale setting
d8ba183c 2497 }
7d6cac54 2498}
2499
9fa49e22 2500function count_words($string) {
2501/// Words are defined as things between whitespace
2502 $string = strip_tags($string);
2503 return count(preg_split("/\w\b/", $string)) - 1;
2504}
2505
1d881d92 2506function random_string ($length=15) {
2507 $pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
2508 $pool .= "abcdefghijklmnopqrstuvwxyz";
2509 $pool .= "0123456789";
2510 $poollen = strlen($pool);
2511 mt_srand ((double) microtime() * 1000000);
2512 $string = "";
2513 for ($i = 0; $i < $length; $i++) {
2514 $string .= substr($pool, (mt_rand()%($poollen)), 1);
2515 }
2516 return $string;
2517}
2518
2519
9fa49e22 2520function getweek ($startdate, $thedate) {
2521/// Given dates in seconds, how many weeks is the date from startdate
d8ba183c 2522/// The first week is 1, the second 2 etc ...
2523
9fa49e22 2524 if ($thedate < $startdate) { // error
d8ba183c 2525 return 0;
9fa49e22 2526 }
2527
2528 return floor(($thedate - $startdate) / 604800.0) + 1;
2529}
2530
2531function generate_password($maxlen=10) {
2532/// returns a randomly generated password of length $maxlen. inspired by
d8ba183c 2533/// http://www.phpbuilder.com/columns/jesus19990502.php3
9fa49e22 2534
2535 global $CFG;
2536
2537 $fillers = "1234567890!$-+";
2538 $wordlist = file($CFG->wordlist);
2539
2540 srand((double) microtime() * 1000000);
2541 $word1 = trim($wordlist[rand(0, count($wordlist) - 1)]);
2542 $word2 = trim($wordlist[rand(0, count($wordlist) - 1)]);
2543 $filler1 = $fillers[rand(0, strlen($fillers) - 1)];
2544
2545 return substr($word1 . $filler1 . $word2, 0, $maxlen);
2546}
2547
12659521 2548function format_float($num, $places=1) {
9fa49e22 2549/// Given a float, prints it nicely
2550 return sprintf("%.$places"."f", $num);
2551}
2552
ee0e5d57 2553function swapshuffle($array) {
2554/// Given a simple array, this shuffles it up just like shuffle()
2555/// Unlike PHP's shuffle() ihis function works on any machine.
2556
2557 srand ((double) microtime() * 10000000);
2558 $last = count($array) - 1;
2559 for ($i=0;$i<=$last;$i++) {
2560 $from = rand(0,$last);
2561 $curr = $array[$i];
2562 $array[$i] = $array[$from];
2563 $array[$from] = $curr;
d8ba183c 2564 }
ee0e5d57 2565 return $array;
2566}
2567
bc700e65 2568function swapshuffle_assoc($array) {
2569/// Like swapshuffle, but works on associative arrays
2570
2571 $newkeys = swapshuffle(array_keys($array));
2572 foreach ($newkeys as $newkey) {
2573 $newarray[$newkey] = $array[$newkey];
2574 }
2575 return $newarray;
2576}
2577
ee0e5d57 2578function draw_rand_array($array, $draws) {
d8ba183c 2579/// Given an arbitrary array, and a number of draws,
2580/// this function returns an array with that amount
ee0e5d57 2581/// of items. The indexes are retained.
2582
2583 srand ((double) microtime() * 10000000);
2584
2585 $return = array();
2586
2587 $last = count($array);
2588
2589 if ($draws > $last) {
2590 $draws = $last;
2591 }
2592
2593 while ($draws > 0) {
2594 $last--;
2595
2596 $keys = array_keys($array);
2597 $rand = rand(0, $last);
2598
2599 $return[$keys[$rand]] = $array[$keys[$rand]];
2600 unset($array[$keys[$rand]]);
d8ba183c 2601
ee0e5d57 2602 $draws--;
2603 }
2604
2605 return $return;
d8ba183c 2606}
9fa49e22 2607
f5e82bc7 2608function microtime_diff($a, $b) {
2609 list($a_dec, $a_sec) = explode(" ", $a);
2610 list($b_dec, $b_sec) = explode(" ", $b);
2611 return $b_sec - $a_sec + $b_dec - $a_dec;
2612}
2613
02ebf404 2614function make_menu_from_list($list, $separator=",") {
d8ba183c 2615/// Given a list (eg a,b,c,d,e) this function returns
02ebf404 2616/// an array of 1->a, 2->b, 3->c etc
2617
2618 $array = array_reverse(explode($separator, $list), true);
2619 foreach ($array as $key => $item) {
2620 $outarray[$key+1] = trim($item);
2621 }
2622 return $outarray;
2623}
2624
fdc47ee6 2625function make_grades_menu($gradingtype) {
2626/// Creates an array that represents all the current grades that
2627/// can be chosen using the given grading type. Negative numbers
2628/// are scales, zero is no grade, and positive numbers are maximum
2629/// grades.
2630
2631 $grades = array();
2632 if ($gradingtype < 0) {
2633 if ($scale = get_record("scale", "id", - $gradingtype)) {
2634 return make_menu_from_list($scale->scale);
2635 }
2636 } else if ($gradingtype > 0) {
2637 for ($i=$gradingtype; $i>=0; $i--) {
62ca135d 2638 $grades[$i] = "$i / $gradingtype";
fdc47ee6 2639 }
2640 return $grades;
2641 }
2642 return $grades;
2643}
2644
2127fedd 2645function course_scale_used($courseid,$scaleid) {
2646////This function returns the nummber of activities
2647////using scaleid in a courseid
2648
2649 global $CFG;
a402bdcb 2650
2127fedd 2651 $return = 0;
2652
2653 if (!empty($scaleid)) {
2654 if ($cms = get_course_mods($courseid)) {
2655 foreach ($cms as $cm) {
2656 //Check cm->name/lib.php exists
2657 if (file_exists($CFG->dirroot.'/mod/'.$cm->modname.'/lib.php')) {
2658 include_once($CFG->dirroot.'/mod/'.$cm->modname.'/lib.php');
2659 $function_name = $cm->modname.'_scale_used';
2660 if (function_exists($function_name)) {
2661 if ($function_name($cm->instance,$scaleid)) {
2662 $return++;
2663 }
2664 }
2665 }
2666 }
2667 }
2668 }
2669 return $return;
2670}
2671
2672function site_scale_used($scaleid) {
a402bdcb 2673////This function returns the nummber of activities
2127fedd 2674////using scaleid in the entire site
2675
2676 global $CFG;
2677
2678 $return = 0;
2679
2680 if (!empty($scaleid)) {
2681 if ($courses = get_courses()) {
2682 foreach ($courses as $course) {
2683 $return += course_scale_used($course->id,$scaleid);
2684 }
2685 }
2686 }
2687 return $return;
2688}
2689
757a0abd 2690function make_unique_id_code($extra="") {
280faf9f 2691
2692 $hostname = "unknownhost";
2693 if (!empty($_SERVER["HTTP_HOST"])) {
2694 $hostname = $_SERVER["HTTP_HOST"];
2695 } else if (!empty($_ENV["HTTP_HOST"])) {
2696 $hostname = $_ENV["HTTP_HOST"];
2697 } else if (!empty($_SERVER["SERVER_NAME"])) {
2698 $hostname = $_SERVER["SERVER_NAME"];
2699 } else if (!empty($_ENV["SERVER_NAME"])) {
2700 $hostname = $_ENV["SERVER_NAME"];
2701 }
2702
1ccc73ac 2703 $date = gmdate("ymdHis");
280faf9f 2704
2705 $random = random_string(6);
2706
757a0abd 2707 if ($extra) {
2708 return "$hostname+$date+$random+$extra";
2709 } else {
2710 return "$hostname+$date+$random";
2711 }
280faf9f 2712}
2713
0095d5cd 2714
47efbb04 2715/**
2716* Function to check the passed address is within the passed subnet
2717*
2718* The parameter is a comma separated string of subnet definitions.
2719* Subnet strings can be in one of two formats:
2720* 1: xxx.xxx.xxx.xxx/xx
2721* 2: xxx.xxx
2722* Return boolean
2723* Code for type 1 modified from user posted comments by mediator at
2724* http://au.php.net/manual/en/function.ip2long.php
2725*
2726* @param addr the address you are checking
2727* @param subnetstr the string of subnet addresses
2728*/
2729
2730function address_in_subnet($addr, $subnetstr) {
2731
2732 $subnets = explode(",", $subnetstr);
2733 $found = false;
2734 $addr = trim($addr);
2735
2736 foreach ($subnets as $subnet) {
2737 $subnet = trim($subnet);
2738 if (strpos($subnet, "/") !== false) { /// type 1
2739
2740 list($ip, $mask) = explode('/', $subnet);
2741 $mask = 0xffffffff << (32 - $mask);
2742 $found = ((ip2long($addr) & $mask) == (ip2long($ip) & $mask));
2743
2744 } else { /// type 2
2745 $found = (strpos($addr, $subnet) === 0);
2746 }
2747
2748 if ($found) {
2749 continue;
2750 }
2751 }
2752
2753 return $found;
2754}
2755
9d5b689c 2756// vim:autoindent:expandtab:shiftwidth=4:tabstop=4:tw=140:
f9903ed0 2757?>