/** * Handle a user being created . * * Does the following: * - Check if user is using OpenID Connect auth plugin. * - If so, gets additional information from Azure AD and updates the user. * * @param \core\event\user_created $event The triggered event. * @return bool Success/Failure. */ public static function handle_user_created(\core\event\user_created $event) { global $DB; $eventdata = $event->get_data(); if (empty($eventdata['objectid'])) { return false; } $createduserid = $eventdata['objectid']; $user = $DB->get_record('user', ['id' => $createduserid]); if (!empty($user) && isset($user->auth) && $user->auth === 'oidc') { static::get_additional_user_info($createduserid); } return true; }
/** * Creates a user * * @throws moodle_exception * @param stdClass $user user to create * @param bool $updatepassword if true, authentication plugin will update password. * @param bool $triggerevent set false if user_created event should not be triggred. * This will not affect user_password_updated event triggering. * @return int id of the newly created user */ function user_create_user($user, $updatepassword = true, $triggerevent = true) { global $CFG, $DB; // Set the timecreate field to the current time. if (!is_object($user)) { $user = (object) $user; } /* GWL : For Phone Field Remove Check */ /* // Check username. if ($user->username !== core_text::strtolower($user->username)) { throw new moodle_exception('usernamelowercase'); } else { if ($user->username !== clean_param($user->username, PARAM_USERNAME)) { throw new moodle_exception('invalidusername'); } } */ /* GWL : For Phone Field Remove Check */ // Save the password in a temp value for later. if ($updatepassword && isset($user->password)) { // Check password toward the password policy. if (!check_password_policy($user->password, $errmsg)) { throw new moodle_exception($errmsg); } $userpassword = $user->password; unset($user->password); } // Make sure calendartype, if set, is valid. if (!empty($user->calendartype)) { $availablecalendartypes = \core_calendar\type_factory::get_list_of_calendar_types(); if (empty($availablecalendartypes[$user->calendartype])) { $user->calendartype = $CFG->calendartype; } } else { $user->calendartype = $CFG->calendartype; } $user->timecreated = time(); $user->timemodified = $user->timecreated; // Insert the user into the database. $newuserid = $DB->insert_record('user', $user); // Create USER context for this user. $usercontext = context_user::instance($newuserid); // Update user password if necessary. if (isset($userpassword)) { // Get full database user row, in case auth is default. $newuser = $DB->get_record('user', array('id' => $newuserid)); $authplugin = get_auth_plugin($newuser->auth); $authplugin->user_update_password($newuser, $userpassword); } // Trigger event If required. if ($triggerevent) { \core\event\user_created::create_from_userid($newuserid)->trigger(); } return $newuserid; }
/** * Creates a user * * @param stdClass $user user to create * @param bool $updatepassword if true, authentication plugin will update password. * @return int id of the newly created user */ function user_create_user($user, $updatepassword = true) { global $DB; // Set the timecreate field to the current time. if (!is_object($user)) { $user = (object) $user; } // Check username. if ($user->username !== core_text::strtolower($user->username)) { throw new moodle_exception('usernamelowercase'); } else { if ($user->username !== clean_param($user->username, PARAM_USERNAME)) { throw new moodle_exception('invalidusername'); } } // Save the password in a temp value for later. if ($updatepassword && isset($user->password)) { // Check password toward the password policy. if (!check_password_policy($user->password, $errmsg)) { throw new moodle_exception($errmsg); } $userpassword = $user->password; unset($user->password); } $user->timecreated = time(); $user->timemodified = $user->timecreated; // Insert the user into the database. $newuserid = $DB->insert_record('user', $user); // Create USER context for this user. $usercontext = context_user::instance($newuserid); // Update user password if necessary. if (isset($userpassword)) { // Get full database user row, in case auth is default. $newuser = $DB->get_record('user', array('id' => $newuserid)); $authplugin = get_auth_plugin($newuser->auth); $authplugin->user_update_password($newuser, $userpassword); } // Trigger event. $event = \core\event\user_created::create(array('objectid' => $newuserid, 'context' => $usercontext)); $event->trigger(); return $newuserid; }
function application_user_signup($user) { // Derived from email->user_signup global $CFG, $PAGE, $OUTPUT; $user->password = hash_internal_user_password($user->password); if (empty($user->calendartype)) { $user->calendartype = $CFG->calendartype; } $user->id = user_create_user($user, false, false); // Save any custom profile field information profile_save_data($user); // Save contact information write_contact_details($user->id, $user); // Trigger event \core\event\user_created::create_from_userid($user->id)->trigger(); if (!send_application_confirmation_email($user)) { print_error('auth_emailnoemail', 'auth_email'); } $PAGE->set_title($CFG->pageheading . ': ' . get_string('emailconfirm')); echo $OUTPUT->header(); notice(get_string('emailconfirmsent', '', $user->email), $CFG->wwwroot . '/local/obu_application/login.php'); }
/** * Create a user, role and token. Return the created token id. * @param string $rolename the role to create/use - will be assign to the user * @param string $servicename service to link to the new token * @param string $username user to link to the new token * @param array $capabilities list of capabilities to add to the role * @return object created token */ function create_hub_token($rolename, $servicename, $username, $capabilities) { global $CFG, $DB; //requires libraries require_once $CFG->dirroot . '/user/lib.php'; //check the hidden service //because we cannot know the id of the service, we consider that hidden services have unique name! $services = $DB->get_records('external_services', array('name' => $servicename)); //if ever we have two hidden service with the same name, it's due to a programmation error if (count($services) > 1) { throw new moodle_exception('hiddenservicewithsamename'); } if (count($services) < 1) { throw new moodle_exception('unknownservicename'); } $role = $DB->get_record('role', array('name' => $rolename)); if (empty($role)) { $roleid = create_role($rolename, clean_param($rolename, PARAM_ALPHAEXT), get_string('hubwsroledescription', 'local_hub'), '', true); } else { $roleid = $role->id; } //check and create a user $user = $DB->get_record('user', array('username' => $username, 'idnumber' => $username)); if (empty($user)) { $user = new stdClass(); $user->username = $username; $user->firstname = $username; $user->lastname = get_string('donotdeleteormodify', 'local_hub'); $user->password = ''; //login no authorised with webservice authentication $user->auth = 'webservice'; $user->confirmed = 1; //need to be confirmed otherwise got deleted $user->idnumber = $username; $user->mnethostid = 1; $user->description = get_string('hubwsuserdescription', 'local_hub'); $user->timecreated = time(); $user->timemodified = $user->timecreated; // Add extra fields to prevent a debug notice. $userfields = get_all_user_name_fields(); foreach ($userfields as $key => $field) { if (!isset($user->{$key})) { $user->{$key} = null; } } // Insert the "site" user into the database. $user->id = $DB->insert_record('user', $user); \core\event\user_created::create_from_userid($user->id)->trigger(); add_to_log(SITEID, 'user', get_string('create'), '/view.php?id=' . $user->id, fullname($user)); } //check and assign the role to user $context = context_system::instance(); $existingroleassign = $DB->get_records('role_assignments', array('roleid' => $roleid, 'contextid' => $context->id, 'userid' => $user->id), 'id'); if (empty($existingroleassign)) { role_assign($roleid, $user->id, $context->id); } //check and assign capabilities to role $capabilities[] = 'webservice/xmlrpc:use'; if (empty($role)) { $role = new stdClass(); $role->id = $roleid; } $rolecapabilities = get_capabilities_from_role_on_context($role, $context); if (!empty($capabilities)) { foreach ($capabilities as $capability) { $capabilityassigned = false; foreach ($rolecapabilities as $rolecapability) { if ($rolecapability->capability == $capability) { $capabilityassigned = true; break; } } if (!$capabilityassigned) { assign_capability($capability, CAP_ALLOW, $roleid, $context->id); } } } //enable the hidden service and assign it to the user foreach ($services as $service) { //there should be only one service into the array!!! //checked at beginning of the function $serviceid = $service->id; //if no hidden token was created for this service, we need to enable it if (!$service->enabled) { $service->enabled = 1; $DB->update_record('external_services', $service); } $serviceuser = $DB->get_record('external_services_users', array('externalserviceid' => $serviceid, 'userid' => $user->id)); if (empty($serviceuser)) { $serviceuser = new stdClass(); $serviceuser->externalserviceid = $serviceid; $serviceuser->userid = $user->id; $serviceuser->timecreated = time(); $DB->insert_record('external_services_users', $serviceuser); } } //check and create a token $resulttoken = new stdClass(); $resulttoken->userid = $user->id; $resulttoken->tokentype = EXTERNAL_TOKEN_PERMANENT; $resulttoken->externalserviceid = $serviceid; $resulttoken->contextid = $context->id; $resulttoken->creatorid = $user->id; $token = $DB->get_record('external_tokens', (array) $resulttoken); if (empty($token)) { $resulttoken->timecreated = time(); $resulttoken->token = md5(uniqid(rand(), 1)); $tokenid = $DB->insert_record('external_tokens', $resulttoken); $resulttoken->id = $tokenid; } else { //throw new moodle_exception('hiddentokenalreadyexist'); // Just return the found token instead of throwing an error. $resulttoken = $token; } return $resulttoken; }
/** * Test sql_reader::get_events_select_iterator. * @return void */ public function test_events_traversable() { global $DB; $this->resetAfterTest(); $this->preventResetByRollback(); $this->setAdminUser(); set_config('enabled_stores', 'logstore_standard', 'tool_log'); $manager = get_log_manager(true); $stores = $manager->get_readers(); $store = $stores['logstore_standard']; $events = $store->get_events_select_iterator('', array(), '', 0, 0); $this->assertFalse($events->valid()); // Here it should be already closed, but we should be allowed to // over-close it without exception. $events->close(); $user = $this->getDataGenerator()->create_user(); for ($i = 0; $i < 1000; $i++) { \core\event\user_created::create_from_userid($user->id)->trigger(); } $store->flush(); // Check some various sizes get the right number of elements. $this->assertEquals(1, iterator_count($store->get_events_select_iterator('', array(), '', 0, 1))); $this->assertEquals(2, iterator_count($store->get_events_select_iterator('', array(), '', 0, 2))); $iterator = $store->get_events_select_iterator('', array(), '', 0, 500); $this->assertInstanceOf('\\core\\event\\base', $iterator->current()); $this->assertEquals(500, iterator_count($iterator)); $iterator->close(); // Look for non-linear memory usage for the iterator version. $mem = memory_get_usage(); $events = $store->get_events_select('', array(), '', 0, 0); $arraymemusage = memory_get_usage() - $mem; $mem = memory_get_usage(); $eventsit = $store->get_events_select_iterator('', array(), '', 0, 0); $eventsit->close(); $itmemusage = memory_get_usage() - $mem; $this->assertInstanceOf('\\Traversable', $eventsit); $this->assertLessThan($arraymemusage / 10, $itmemusage); set_config('enabled_stores', '', 'tool_log'); get_log_manager(true); }
// Update mail bounces. useredit_update_bounces($user, $usernew); // Update forum track preference. useredit_update_trackforums($user, $usernew); // Save custom profile fields data. profile_save_data($usernew); // Reload from db. $usernew = $DB->get_record('user', array('id' => $usernew->id)); if ($createpassword) { setnew_password_and_mail($usernew); unset_user_preference('create_password', $usernew); set_user_preference('auth_forcepasswordchange', 1, $usernew); } // Trigger update/create event, after all fields are stored. if ($usercreated) { \core\event\user_created::create_from_userid($usernew->id)->trigger(); } else { \core\event\user_updated::create_from_userid($usernew->id)->trigger(); } if ($user->id == $USER->id) { // Override old $USER session variable. foreach ((array) $usernew as $variable => $value) { if ($variable === 'description' or $variable === 'password') { // These are not set for security nad perf reasons. continue; } $USER->{$variable} = $value; } // Preload custom fields. profile_load_custom_fields($USER); if (!empty($USER->newadminuser)) {
/** * Sign up a new user ready for confirmation. * Password is passed in plaintext. * * @param object $user new user object * @param boolean $notify print notice with link and terminate * @return boolean success */ function user_signup($user, $notify = true) { global $CFG, $DB, $PAGE, $OUTPUT; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; if ($this->user_exists($user->username)) { print_error('auth_ldap_user_exists', 'auth_ldap'); } $plainslashedpassword = $user->password; unset($user->password); if (!$this->user_create($user, $plainslashedpassword)) { print_error('auth_ldap_create_error', 'auth_ldap'); } $user->id = user_create_user($user, false, false); user_add_password_history($user->id, $plainslashedpassword); // Save any custom profile field information profile_save_data($user); $this->update_user_record($user->username); // This will also update the stored hash to the latest algorithm // if the existing hash is using an out-of-date algorithm (or the // legacy md5 algorithm). update_internal_user_password($user, $plainslashedpassword); $user = $DB->get_record('user', array('id' => $user->id)); \core\event\user_created::create_from_userid($user->id)->trigger(); if (!send_confirmation_email($user)) { print_error('noemail', 'auth_ldap'); } if ($notify) { $emailconfirm = get_string('emailconfirm'); $PAGE->set_url('/auth/ldap/auth.php'); $PAGE->navbar->add($emailconfirm); $PAGE->set_title($emailconfirm); $PAGE->set_heading($emailconfirm); echo $OUTPUT->header(); notice(get_string('emailconfirmsent', '', $user->email), "{$CFG->wwwroot}/index.php"); } else { return true; } }
/** * Create one or more users. * * @throws invalid_parameter_exception * @param array $users An array of users to create. * @return array An array of arrays * @since Moodle 2.2 */ public static function create_users($users) { global $CFG, $DB; require_once $CFG->dirroot . "/lib/weblib.php"; require_once $CFG->dirroot . "/user/lib.php"; require_once $CFG->dirroot . "/user/profile/lib.php"; // Required for customfields related function. // Ensure the current user is allowed to run this function. $context = context_system::instance(); self::validate_context($context); require_capability('moodle/user:create', $context); // Do basic automatic PARAM checks on incoming data, using params description. // If any problems are found then exceptions are thrown with helpful error messages. $params = self::validate_parameters(self::create_users_parameters(), array('users' => $users)); $availableauths = core_component::get_plugin_list('auth'); unset($availableauths['mnet']); // These would need mnethostid too. unset($availableauths['webservice']); // We do not want new webservice users for now. $availablethemes = core_component::get_plugin_list('theme'); $availablelangs = get_string_manager()->get_list_of_translations(); $transaction = $DB->start_delegated_transaction(); $userids = array(); $createpassword = false; foreach ($params['users'] as $user) { // Make sure that the username doesn't already exist. if ($DB->record_exists('user', array('username' => $user['username'], 'mnethostid' => $CFG->mnet_localhost_id))) { throw new invalid_parameter_exception('Username already exists: ' . $user['username']); } // Make sure auth is valid. if (empty($availableauths[$user['auth']])) { throw new invalid_parameter_exception('Invalid authentication type: ' . $user['auth']); } // Make sure lang is valid. if (empty($availablelangs[$user['lang']])) { throw new invalid_parameter_exception('Invalid language code: ' . $user['lang']); } // Make sure lang is valid. if (!empty($user['theme']) && empty($availablethemes[$user['theme']])) { // Theme is VALUE_OPTIONAL, // so no default value // We need to test if the client sent it // => !empty($user['theme']). throw new invalid_parameter_exception('Invalid theme: ' . $user['theme']); } // Make sure we have a password or have to create one. if (empty($user['password']) && empty($user['createpassword'])) { throw new invalid_parameter_exception('Invalid password: you must provide a password, or set createpassword.'); } $user['confirmed'] = true; $user['mnethostid'] = $CFG->mnet_localhost_id; // Start of user info validation. // Make sure we validate current user info as handled by current GUI. See user/editadvanced_form.php func validation(). if (!validate_email($user['email'])) { throw new invalid_parameter_exception('Email address is invalid: ' . $user['email']); } else { if (empty($CFG->allowaccountssameemail) && $DB->record_exists('user', array('email' => $user['email'], 'mnethostid' => $CFG->mnet_localhost_id))) { throw new invalid_parameter_exception('Email address already exists: ' . $user['email']); } } // End of user info validation. $createpassword = !empty($user['createpassword']); unset($user['createpassword']); if ($createpassword) { $user['password'] = ''; $updatepassword = false; } else { $updatepassword = true; } // Create the user data now! $user['id'] = user_create_user($user, $updatepassword, false); // Custom fields. if (!empty($user['customfields'])) { foreach ($user['customfields'] as $customfield) { // Profile_save_data() saves profile file it's expecting a user with the correct id, // and custom field to be named profile_field_"shortname". $user["profile_field_" . $customfield['type']] = $customfield['value']; } profile_save_data((object) $user); } if ($createpassword) { $userobject = (object) $user; setnew_password_and_mail($userobject); unset_user_preference('create_password', $userobject); set_user_preference('auth_forcepasswordchange', 1, $userobject); } // Trigger event. \core\event\user_created::create_from_userid($user['id'])->trigger(); // Preferences. if (!empty($user['preferences'])) { foreach ($user['preferences'] as $preference) { set_user_preference($preference['type'], $preference['value'], $user['id']); } } $userids[] = array('id' => $user['id'], 'username' => $user['username']); } $transaction->allow_commit(); return $userids; }
} if (isset($usernew->userdepartment) || isset($usernew->usertitle)) { $department = isset($usernew->userdepartment) ? $usernew->userdepartment : 0; $title = isset($usernew->usertitle) ? $usernew->usertitle : 0; assign_department_and_title_to_user($companyid, $department, $title, $usernew->id); } } // Reload from db. $usernew = $DB->get_record('user', array('id' => $usernew->id)); // Trigger events. if ($usercreated) { // Set default message preferences. if (!message_set_default_message_preferences($usernew)) { print_error('cannotsavemessageprefs', 'message'); } $event = \core\event\user_created::create_from_userid($usernew->id); $event->trigger(); } else { $event = \core\event\user_updated::create(array('context' => $systemcontext, 'userid' => $usernew->id, 'relateduserid' => $USER->id)); $event->trigger(); } if ($user->id == $USER->id) { // Override old $USER session variable. foreach ((array) $usernew as $variable => $value) { $USER->{$variable} = $value; } if (!empty($USER->newadminuser)) { unset($USER->newadminuser); // Apply defaults again - some of them might depend on admin user info, backup, roles, etc.. admin_apply_default_settings(null, false); // Redirect to admin/ to continue with installation.
/** * Sign up a new user ready for confirmation. * Password is passed in plaintext. * * @param object $user new user object * @param boolean $notify print notice with link and terminate */ public function user_signup($user, $notify = true) { global $CFG, $DB; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; $plainpassword = $user->password; $user->password = hash_internal_user_password($user->password); $user->mnethostid = $CFG->mnet_localhost_id; if (empty($user->secret)) { $user->secret = ''; } if (empty($user->calendartype)) { $user->calendartype = $CFG->calendartype; } $firstname = strtolower($user->firstname); $lastname = strtolower($user->lastname); $initials = $firstname[0] . $lastname[0]; try { $transaction = $DB->start_delegated_transaction(); do { $username = sprintf($initials . "%04d", rand(1, 9999)); } while ($DB->get_record('user', array("username" => $username), 'id', IGNORE_MISSING)); $user->username = $username; $userdetailstext = "Username: {$username}<br />Password: {$plainpassword}"; $user->id = user_create_user($user, false, false); user_add_password_history($user->id, $plainpassword); // Save any custom profile field information. $user->profile_field_typeofaccount = empty($user->profile_field_typeofaccount) ? 'student' : $user->profile_field_typeofaccount; $user->profile_field_yearlevel = empty($user->profile_field_yearlevel) ? 'N/A' : $user->profile_field_yearlevel; $user->profile_field_yearofbirth = empty($user->profile_field_yearofbirth) ? 'N/A' : $user->profile_field_yearofbirth; $user->profile_field_whereareyoufrom = empty($user->profile_field_whereareyoufrom) ? 'Perth' : $user->profile_field_whereareyoufrom; profile_save_data($user); $record = new stdClass(); $record->studentuserid = $user->id; $record->teacheruserid = $user->id; switch ($user->profile_field_typeofaccount) { case 'wceteacher': $this->add_teacher($user->id); break; case 'adult': case 'student': default: $this->add_student($user->id); break; } // Trigger event. \core\event\user_created::create_from_userid($user->id)->trigger(); // Assuming the both inserts work, we get to the following line. $transaction->allow_commit(); } catch (Exception $e) { $transaction->rollback($e); return false; } if (!send_confirmation_email($user)) { print_error('auth_emailnoemail, auth_email'); } if ($notify) { global $CFG, $PAGE, $OUTPUT; $emailconfirm = get_string('emailconfirm'); $PAGE->navbar->add($emailconfirm); $PAGE->set_title($emailconfirm); $PAGE->set_heading($PAGE->course->fullname); echo $OUTPUT->header(); notice(get_string('signup:emailconfirmsent:text', 'auth_watercorped', $userdetailstext), "{$CFG->wwwroot}/index.php"); } else { return true; } }
function user_signup($user, $notify = false) { global $CFG, $DB, $SESSION; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/enrol/token/lib.php'; $lang = empty($user->lang) ? $CFG->lang : $user->lang; $site = get_site(); $supportuser = core_user::get_support_user(); $newpassword = generate_password(); // the token the user entered (which is now validated) $tokenValue = $user->token; $newuser = new stdClass(); $newuser->auth = 'token'; // since technially this auth plugin is a skin $newuser->firstname = $user->firstname; $newuser->lastname = $user->lastname; $newuser->password = hash_internal_user_password($newpassword, false); $newuser->policyagreed = 1; // might need to put this in somewhere $newuser->username = $user->email; $newuser->email = $user->email; $newuser->lastip = getremoteaddr(); $newuser->timecreated = time(); $newuser->timemodified = $newuser->timecreated; $newuser->mnethostid = $CFG->mnet_localhost_id; $newuser = self::truncate_user_obj($newuser); if (($newuser->id = $DB->insert_record('user', $newuser)) === false) { notice(get_string('signupfailure', 'auth_token'), $CFG->wwwroot); return false; } $user = get_complete_user_data('id', $newuser->id); \core\event\user_created::create_from_userid($user->id)->trigger(); // just the query part of post-login redirect $params = empty($SESSION->wantsurl) === true ? '' : parse_url($SESSION->wantsurl, PHP_URL_QUERY); $a = new stdClass(); $a->firstname = $user->firstname; $a->lastname = $user->lastname; $a->username = $user->username; $a->password = $newpassword; $a->sitename = format_string($site->fullname); $a->link = $CFG->wwwroot . '/auth/token/login.php?' . $params; $a->signoff = generate_email_signoff(); $message = (string) new lang_string('signup_userregoemail', 'auth_token', $a, $lang); $subject = format_string($site->fullname) . ': ' . (string) new lang_string('newusernewpasswordsubj', '', $a, $lang); // Directly email rather than using the messaging system to ensure its not routed to a popup or jabber. email_to_user($user, $supportuser, $subject, $message); // log the user in immediately if (($user = authenticate_user_login($user->username, $newpassword)) === false || complete_user_login($user) == null) { notice(get_string('autologinfailure', 'auth_token'), $CFG->wwwroot); return false; } // now, actually DO the enrolment for this course / user $token_plugin = new enrol_token_plugin(); $courseId = 0; $return_to_url = empty($SESSION->wantsurl) === true ? $CFG->wwwroot : $SESSION->wantsurl; $enrolled_ok = $token_plugin->doEnrolment($tokenValue, $courseId, $return_to_url); if ($enrolled_ok == true) { redirect($return_to_url); } return $enrolled_ok == true; }
public static function user_created(\core\event\user_created $event) { global $CFG, $DB; $sync_to_joomla = get_config('auth/joomdle', 'sync_to_joomla'); if (!$sync_to_joomla) { return true; } $user = $event->get_record_snapshot('user', $event->objectid); if ($user->auth != 'joomdle') { return true; } $auth_joomdle = new auth_plugin_joomdle(); /* $password_clear = ''; if (array_key_exists ('password', $_POST)) $password_clear = $_POST['password']; //Self registration if ((array_key_exists ('newpassword', $_POST)) && (!$password_clear)) $password_clear = $_POST['newpassword']; //admin form */ /* Create user in Joomla */ $userinfo['username'] = $user->username; /* $userinfo['password'] = $password_clear; $userinfo['password2'] = $password_clear; */ $userinfo['password'] = $user->password; $userinfo['password2'] = $user->password; $userinfo['name'] = $user->firstname . " " . $user->lastname; $userinfo['email'] = $user->email; $userinfo['firstname'] = $user->firstname; $userinfo['lastname'] = $user->lastname; $userinfo['city'] = $user->city; $userinfo['country'] = $user->country; $userinfo['lang'] = $user->lang; $userinfo['timezone'] = $user->timezone; $userinfo['phone1'] = $user->phone1; $userinfo['phone2'] = $user->phone2; $userinfo['address'] = $user->address; $userinfo['description'] = $user->description; $userinfo['institution'] = $user->institution; $userinfo['url'] = $user->url; $userinfo['icq'] = $user->icq; $userinfo['skype'] = $user->skype; $userinfo['aim'] = $user->aim; $userinfo['yahoo'] = $user->yahoo; $userinfo['msn'] = $user->msn; $userinfo['idnumber'] = $user->idnumber; $userinfo['department'] = $user->department; $userinfo['picture'] = $user->picture; $userinfo['lastnamephonetic'] = $user->lastnamephonetic; $userinfo['firstnamephonetic'] = $user->firstnamephonetic; $userinfo['middlename'] = $user->middlename; $userinfo['alternatename'] = $user->alternatename; $id = $user->id; $usercontext = context_user::instance($id); $context_id = $usercontext->id; if ($user->picture) { $userinfo['pic_url'] = $CFG->wwwroot . "/pluginfile.php/{$context_id}/user/icon/f1"; } $userinfo['block'] = 0; /* Custom fields */ $query = "SELECT f.id, d.data \n FROM {$CFG->prefix}user_info_field as f, {$CFG->prefix}user_info_data d \n WHERE f.id=d.fieldid and userid = ?"; $params = array($id); $records = $DB->get_records_sql($query, $params); $i = 0; $userinfo['custom_fields'] = array(); foreach ($records as $field) { $userinfo['custom_fields'][$i]['id'] = $field->id; $userinfo['custom_fields'][$i]['data'] = $field->data; $i++; } $auth_joomdle->call_method("createUser", $userinfo); return true; }
/** * Sign up a new user ready for confirmation. * Password is passed in plaintext. * * @param object $user new user object * @param boolean $notify print notice with link and terminate */ function user_signup($user, $notify = true) { global $CFG, $DB, $SESSION; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; if (isset($SESSION->wantsurl)) { $wantsurl = $SESSION->wantsurl; } $plainpassword = $user->password; $user->password = hash_internal_user_password($user->password); if (empty($user->calendartype)) { $user->calendartype = $CFG->calendartype; } $user->confirmed = 1; $user->id = user_create_user($user, false, false); user_add_password_history($user->id, $plainpassword); // Save any custom profile field information. profile_save_data($user); // Trigger event. \core\event\user_created::create_from_userid($user->id)->trigger(); $thisuser = authenticate_user_login($user->username, $plainpassword, false, $errorcode); if ($thisuser == false) { print_error('authfailure'); } else { complete_user_login($thisuser); if (isset($wantsurl)) { $urltogo = $wantsurl; if (isset($_SESSION["fiaction"]) && isset($_SESSION["ficourseid"]) && is_numeric($_SESSION["ficourseid"]) && $_SESSION["fiaction"] == "enroll") { $urltogo = $CFG->wwwroot . '/course/enrol.php?id=' . $_SESSION["ficourseid"]; unset($_SESSION['fiaction']); unset($_SESSION['ficourseid']); unset($SESSION->wantsurl); } } else { $urltogo = $CFG->wwwroot . '/'; } redirect($urltogo); } // if ($notify) { // global $CFG, $PAGE, $OUTPUT; // $emailconfirm = get_string('emailconfirm'); // $PAGE->navbar->add($emailconfirm); // $PAGE->set_title($emailconfirm); // $PAGE->set_heading($PAGE->course->fullname); // echo $OUTPUT->header(); // notice(get_string('emailconfirmsent', '', $user->email), "$CFG->wwwroot/index.php"); // } else { // return true; // } }
/** * Creates a user * * @throws moodle_exception * @param stdClass $user user to create * @param bool $updatepassword if true, authentication plugin will update password. * @param bool $triggerevent set false if user_created event should not be triggred. * This will not affect user_password_updated event triggering. * @return int id of the newly created user */ function user_create_user($user, $updatepassword = true, $triggerevent = true) { global $DB; // Set the timecreate field to the current time. if (!is_object($user)) { $user = (object) $user; } // Check username. if ($user->username !== core_text::strtolower($user->username)) { throw new moodle_exception('usernamelowercase'); } else { if ($user->username !== core_user::clean_field($user->username, 'username')) { throw new moodle_exception('invalidusername'); } } // Save the password in a temp value for later. if ($updatepassword && isset($user->password)) { // Check password toward the password policy. if (!check_password_policy($user->password, $errmsg)) { throw new moodle_exception($errmsg); } $userpassword = $user->password; unset($user->password); } // Apply default values for user preferences that are stored in users table. if (!isset($user->calendartype)) { $user->calendartype = core_user::get_property_default('calendartype'); } if (!isset($user->maildisplay)) { $user->maildisplay = core_user::get_property_default('maildisplay'); } if (!isset($user->mailformat)) { $user->mailformat = core_user::get_property_default('mailformat'); } if (!isset($user->maildigest)) { $user->maildigest = core_user::get_property_default('maildigest'); } if (!isset($user->autosubscribe)) { $user->autosubscribe = core_user::get_property_default('autosubscribe'); } if (!isset($user->trackforums)) { $user->trackforums = core_user::get_property_default('trackforums'); } if (!isset($user->lang)) { $user->lang = core_user::get_property_default('lang'); } $user->timecreated = time(); $user->timemodified = $user->timecreated; // Validate user data object. $uservalidation = core_user::validate($user); if ($uservalidation !== true) { foreach ($uservalidation as $field => $message) { debugging("The property '{$field}' has invalid data and has been cleaned.", DEBUG_DEVELOPER); $user->{$field} = core_user::clean_field($user->{$field}, $field); } } // Insert the user into the database. $newuserid = $DB->insert_record('user', $user); // Create USER context for this user. $usercontext = context_user::instance($newuserid); // Update user password if necessary. if (isset($userpassword)) { // Get full database user row, in case auth is default. $newuser = $DB->get_record('user', array('id' => $newuserid)); $authplugin = get_auth_plugin($newuser->auth); $authplugin->user_update_password($newuser, $userpassword); } // Trigger event If required. if ($triggerevent) { \core\event\user_created::create_from_userid($newuserid)->trigger(); } return $newuserid; }
/** * Synchronizes user from external db to moodle user table. * * Sync should be done by using idnumber attribute, not username. * You need to pass firstsync parameter to function to fill in * idnumbers if they don't exists in moodle user table. * * Syncing users removes (disables) users that don't exists anymore in external db. * Creates new users and updates coursecreator status of users. * * This implementation is simpler but less scalable than the one found in the LDAP module. * * @param progress_trace $trace * @param bool $do_updates Optional: set to true to force an update of existing accounts * @return int 0 means success, 1 means failure */ function sync_users(progress_trace $trace, $do_updates = false) { global $CFG, $DB; // List external users. $userlist = $this->get_userlist(); // Delete obsolete internal users. if (!empty($this->config->removeuser)) { $suspendselect = ""; if ($this->config->removeuser == AUTH_REMOVEUSER_SUSPEND) { $suspendselect = "AND u.suspended = 0"; } // Find obsolete users. if (count($userlist)) { list($notin_sql, $params) = $DB->get_in_or_equal($userlist, SQL_PARAMS_NAMED, 'u', false); $params['authtype'] = $this->authtype; $sql = "SELECT u.*\n FROM {user} u\n WHERE u.auth=:authtype AND u.deleted=0 AND u.mnethostid=:mnethostid {$suspendselect} AND u.username {$notin_sql}"; } else { $sql = "SELECT u.*\n FROM {user} u\n WHERE u.auth=:authtype AND u.deleted=0 AND u.mnethostid=:mnethostid {$suspendselect}"; $params = array(); $params['authtype'] = $this->authtype; } $params['mnethostid'] = $CFG->mnet_localhost_id; $remove_users = $DB->get_records_sql($sql, $params); if (!empty($remove_users)) { require_once $CFG->dirroot . '/user/lib.php'; $trace->output(get_string('auth_dbuserstoremove', 'auth_db', count($remove_users))); foreach ($remove_users as $user) { if ($this->config->removeuser == AUTH_REMOVEUSER_FULLDELETE) { delete_user($user); $trace->output(get_string('auth_dbdeleteuser', 'auth_db', array('name' => $user->username, 'id' => $user->id)), 1); } else { if ($this->config->removeuser == AUTH_REMOVEUSER_SUSPEND) { $updateuser = new stdClass(); $updateuser->id = $user->id; $updateuser->suspended = 1; user_update_user($updateuser, false); $trace->output(get_string('auth_dbsuspenduser', 'auth_db', array('name' => $user->username, 'id' => $user->id)), 1); } } } } unset($remove_users); } if (!count($userlist)) { // Exit right here, nothing else to do. $trace->finished(); return 0; } // Update existing accounts. if ($do_updates) { // Narrow down what fields we need to update. $all_keys = array_keys(get_object_vars($this->config)); $updatekeys = array(); foreach ($all_keys as $key) { if (preg_match('/^field_updatelocal_(.+)$/', $key, $match)) { if ($this->config->{$key} === 'onlogin') { array_push($updatekeys, $match[1]); // The actual key name. } } } unset($all_keys); unset($key); // Only go ahead if we actually have fields to update locally. if (!empty($updatekeys)) { list($in_sql, $params) = $DB->get_in_or_equal($userlist, SQL_PARAMS_NAMED, 'u', true); $params['authtype'] = $this->authtype; $sql = "SELECT u.id, u.username\n FROM {user} u\n WHERE u.auth=:authtype AND u.deleted=0 AND u.username {$in_sql}"; if ($update_users = $DB->get_records_sql($sql, $params)) { $trace->output("User entries to update: " . count($update_users)); foreach ($update_users as $user) { if ($this->update_user_record($user->username, $updatekeys)) { $trace->output(get_string('auth_dbupdatinguser', 'auth_db', array('name' => $user->username, 'id' => $user->id)), 1); } else { $trace->output(get_string('auth_dbupdatinguser', 'auth_db', array('name' => $user->username, 'id' => $user->id)) . " - " . get_string('skipped'), 1); } } unset($update_users); } } } // Create missing accounts. // NOTE: this is very memory intensive and generally inefficient. $suspendselect = ""; if ($this->config->removeuser == AUTH_REMOVEUSER_SUSPEND) { $suspendselect = "AND u.suspended = 0"; } $sql = "SELECT u.id, u.username\n FROM {user} u\n WHERE u.auth=:authtype AND u.deleted='0' AND mnethostid=:mnethostid {$suspendselect}"; $users = $DB->get_records_sql($sql, array('authtype' => $this->authtype, 'mnethostid' => $CFG->mnet_localhost_id)); // Simplify down to usernames. $usernames = array(); if (!empty($users)) { foreach ($users as $user) { array_push($usernames, $user->username); } unset($users); } $add_users = array_diff($userlist, $usernames); unset($usernames); if (!empty($add_users)) { $trace->output(get_string('auth_dbuserstoadd', 'auth_db', count($add_users))); // Do not use transactions around this foreach, we want to skip problematic users, not revert everything. foreach ($add_users as $user) { $username = $user; if ($this->config->removeuser == AUTH_REMOVEUSER_SUSPEND) { if ($old_user = $DB->get_record('user', array('username' => $username, 'deleted' => 0, 'suspended' => 1, 'mnethostid' => $CFG->mnet_localhost_id, 'auth' => $this->authtype))) { $DB->set_field('user', 'suspended', 0, array('id' => $old_user->id)); $trace->output(get_string('auth_dbreviveduser', 'auth_db', array('name' => $username, 'id' => $old_user->id)), 1); // Trigger user_updated event. \core\event\user_updated::create_from_userid($old_user->id)->trigger(); continue; } } // Do not try to undelete users here, instead select suspending if you ever expect users will reappear. // Prep a few params. $user = $this->get_userinfo_asobj($user); $user->username = $username; $user->confirmed = 1; $user->auth = $this->authtype; $user->mnethostid = $CFG->mnet_localhost_id; if (empty($user->lang)) { $user->lang = $CFG->lang; } if (empty($user->calendartype)) { $user->calendartype = $CFG->calendartype; } $user->timecreated = time(); $user->timemodified = $user->timecreated; if ($collision = $DB->get_record_select('user', "username = :username AND mnethostid = :mnethostid AND auth <> :auth", array('username' => $user->username, 'mnethostid' => $CFG->mnet_localhost_id, 'auth' => $this->authtype), 'id,username,auth')) { $trace->output(get_string('auth_dbinsertuserduplicate', 'auth_db', array('username' => $user->username, 'auth' => $collision->auth)), 1); continue; } try { $id = $DB->insert_record('user', $user); // it is truly a new user // Trigger user_created event. \core\event\user_created::create_from_userid($id)->trigger(); $trace->output(get_string('auth_dbinsertuser', 'auth_db', array('name' => $user->username, 'id' => $id)), 1); } catch (moodle_exception $e) { $trace->output(get_string('auth_dbinsertusererror', 'auth_db', $user->username), 1); continue; } // If relevant, tag for password generation. if ($this->is_internal()) { set_user_preference('auth_forcepasswordchange', 1, $id); set_user_preference('create_password', 1, $id); } // Make sure user context is present. context_user::instance($id); } unset($add_users); } $trace->finished(); return 0; }
/** * Cron function for sync grades * @return void */ function local_ltiprovider_cron() { global $DB, $CFG; require_once $CFG->dirroot . "/local/ltiprovider/locallib.php"; require_once $CFG->dirroot . "/local/ltiprovider/ims-blti/OAuth.php"; require_once $CFG->dirroot . "/local/ltiprovider/ims-blti/OAuthBody.php"; require_once $CFG->libdir . '/gradelib.php'; require_once $CFG->dirroot . '/grade/querylib.php'; // TODO - Add a global setting for this $synctime = 60 * 60; // Every 1 hour grades are sync $timenow = time(); mtrace('Running cron for ltiprovider'); mtrace('Deleting LTI tools assigned to deleted courses'); if ($tools = $DB->get_records('local_ltiprovider')) { foreach ($tools as $tool) { local_ltiprovider_check_missing_course($tool); } } // Grades service. if ($tools = $DB->get_records_select('local_ltiprovider', 'disabled = ? AND sendgrades = ?', array(0, 1))) { foreach ($tools as $tool) { if ($tool->lastsync + $synctime < $timenow) { mtrace(" Starting sync tool for grades id {$tool->id} course id {$tool->courseid}"); if ($tool->requirecompletion) { mtrace(" Grades require activity or course completion"); } $user_count = 0; $send_count = 0; $error_count = 0; $completion = new completion_info(get_course($tool->courseid)); if ($users = $DB->get_records('local_ltiprovider_user', array('toolid' => $tool->id))) { foreach ($users as $user) { $user_count = $user_count + 1; // This can happen is the sync process has an unexpected error if (strlen($user->serviceurl) < 1) { mtrace(" Empty serviceurl"); continue; } if (strlen($user->sourceid) < 1) { mtrace(" Empty sourceid"); continue; } if ($user->lastsync > $tool->lastsync) { mtrace(" Skipping user {$user->id} due to recent sync"); continue; } $grade = false; if ($context = $DB->get_record('context', array('id' => $tool->contextid))) { if ($context->contextlevel == CONTEXT_COURSE) { if ($tool->requirecompletion and !$completion->is_course_complete($user->userid)) { mtrace(" Skipping user {$user->userid} since he didn't complete the course"); continue; } if ($grade = grade_get_course_grade($user->userid, $tool->courseid)) { $grademax = floatval($grade->item->grademax); $grade = $grade->grade; } } else { if ($context->contextlevel == CONTEXT_MODULE) { $cm = get_coursemodule_from_id(false, $context->instanceid, 0, false, MUST_EXIST); if ($tool->requirecompletion) { $data = $completion->get_data($cm, false, $user->userid); if ($data->completionstate != COMPLETION_COMPLETE_PASS and $data->completionstate != COMPLETION_COMPLETE) { mtrace(" Skipping user {$user->userid} since he didn't complete the activity"); continue; } } $grades = grade_get_grades($cm->course, 'mod', $cm->modname, $cm->instance, $user->userid); if (empty($grades->items[0]->grades)) { $grade = false; } else { $grade = reset($grades->items[0]->grades); if (!empty($grade->item)) { $grademax = floatval($grade->item->grademax); } else { $grademax = floatval($grades->items[0]->grademax); } $grade = $grade->grade; } } } if ($grade === false || $grade === NULL || strlen($grade) < 1) { mtrace(" Invalid grade {$grade}"); continue; } // No need to be dividing by zero if ($grademax == 0.0) { $grademax = 100.0; } // TODO: Make lastgrade should be float or string - but it is integer so we truncate // TODO: Then remove those intval() calls // Don't double send if (intval($grade) == $user->lastgrade) { mtrace(" Skipping, last grade send is equal to current grade"); continue; } // We sync with the external system only when the new grade differs with the previous one // TODO - Global setting for check this if ($grade >= 0 and $grade <= $grademax) { $float_grade = $grade / $grademax; $body = local_ltiprovider_create_service_body($user->sourceid, $float_grade); try { $response = ltiprovider\sendOAuthBodyPOST('POST', $user->serviceurl, $user->consumerkey, $user->consumersecret, 'application/xml', $body); } catch (Exception $e) { mtrace(" " . $e->getMessage()); $error_count = $error_count + 1; continue; } // TODO - Check for errors in $retval in a correct way (parsing xml) if (strpos(strtolower($response), 'success') !== false) { $DB->set_field('local_ltiprovider_user', 'lastsync', $timenow, array('id' => $user->id)); $DB->set_field('local_ltiprovider_user', 'lastgrade', intval($grade), array('id' => $user->id)); mtrace(" User grade sent to remote system. userid: {$user->userid} grade: {$float_grade}"); $send_count = $send_count + 1; } else { mtrace(" User grade send failed. userid: {$user->userid} grade: {$float_grade}: " . $response); $error_count = $error_count + 1; } } else { mtrace(" User grade for user {$user->userid} out of range: grade = " . $grade); $error_count = $error_count + 1; } } else { mtrace(" Invalid context: contextid = " . $tool->contextid); } } } mtrace(" Completed sync tool id {$tool->id} course id {$tool->courseid} users={$user_count} sent={$send_count} errors={$error_count}"); $DB->set_field('local_ltiprovider', 'lastsync', $timenow, array('id' => $tool->id)); } } } $timenow = time(); // Automatic course restaurations. if ($croncourses = get_config('local_ltiprovider', 'croncourses')) { $croncourses = unserialize($croncourses); if (is_array($croncourses)) { mtrace('Starting restauration of pending courses'); foreach ($croncourses as $key => $course) { mtrace('Starting restoration of ' . $key); // We limit the backups to 1 hour, then retry. if ($course->restorestart and $timenow < $course->restorestart + 3600) { mtrace('Skipping restoration in process for: ' . $key); continue; } $course->restorestart = time(); $croncourses[$key] = $course; $croncoursessafe = serialize($croncourses); set_config('croncourses', $croncoursessafe, 'local_ltiprovider'); if ($destinationcourse = $DB->get_record('course', array('id' => $course->destinationid))) { // Duplicate course + users. local_ltiprovider_duplicate_course($course->id, $destinationcourse, 1, $options = array(array('name' => 'users', 'value' => 1)), $course->userrestoringid, $course->context); mtrace('Restoration for ' . $key . ' finished'); } else { mtrace('Restoration for ' . $key . ' finished (destination course not exists)'); } unset($croncourses[$key]); $croncoursessafe = serialize($croncourses); set_config('croncourses', $croncoursessafe, 'local_ltiprovider'); } } } // Membership service. $timenow = time(); $userphotos = array(); if ($tools = $DB->get_records('local_ltiprovider', array('disabled' => 0, 'syncmembers' => 1))) { mtrace('Starting sync of member using the memberships service'); $consumers = array(); foreach ($tools as $tool) { $lastsync = get_config('local_ltiprovider', 'membershipslastsync-' . $tool->id); if (!$lastsync) { $lastsync = 0; } if ($lastsync + $tool->syncperiod < $timenow) { mtrace('Starting sync of tool: ' . $tool->id); // We check for all the users, notice that users can access the same tool from different consumers. if ($users = $DB->get_records('local_ltiprovider_user', array('toolid' => $tool->id), 'lastaccess DESC')) { $response = ""; foreach ($users as $user) { if (!$user->membershipsurl or !$user->membershipsid) { continue; } $consumer = md5($user->membershipsurl . ':' . $user->membershipsid . ':' . $user->consumerkey . ':' . $user->consumersecret); if (in_array($consumer, $consumers)) { // We had syncrhonized with this consumer yet. continue; } $consumers[] = $consumer; $params = array('lti_message_type' => 'basic-lis-readmembershipsforcontext', 'id' => $user->membershipsid, 'lti_version' => 'LTI-1p0'); mtrace('Calling memberships url: ' . $user->membershipsurl . ' with body: ' . json_encode($params)); try { $response = ltiprovider\sendOAuthParamsPOST('POST', $user->membershipsurl, $user->consumerkey, $user->consumersecret, 'application/x-www-form-urlencoded', $params); } catch (Exception $e) { mtrace("Exception: " . $e->getMessage()); $response = false; } if ($response) { $data = new SimpleXMLElement($response); if (!empty($data->statusinfo)) { if (strpos(strtolower($data->statusinfo->codemajor), 'success') !== false) { $members = $data->memberships->member; mtrace(count($members) . ' members received'); $currentusers = array(); foreach ($members as $member) { $username = local_ltiprovider_create_username($user->consumerkey, $member->user_id); $userobj = $DB->get_record('user', array('username' => $username)); if (!$userobj) { // Old format. $oldusername = '******' . md5($user->consumerkey . ':' . $member->user_id); $userobj = $DB->get_record('user', array('username' => $oldusername)); if ($userobj) { $DB->set_field('user', 'username', $username, array('id' => $userobj->id)); } $userobj = $DB->get_record('user', array('username' => $username)); } if ($userobj) { $currentusers[] = $userobj->id; $userobj->firstname = clean_param($member->person_name_given, PARAM_TEXT); $userobj->lastname = clean_param($member->person_name_family, PARAM_TEXT); $userobj->email = clean_param($member->person_contact_email_primary, PARAM_EMAIL); $userobj->timemodified = time(); $DB->update_record('user', $userobj); $userphotos[$userobj->id] = $member->user_image; // Trigger event. $event = \core\event\user_updated::create(array('objectid' => $userobj->id, 'relateduserid' => $userobj->id, 'context' => context_user::instance($userobj->id))); $event->trigger(); } else { // New members. if ($tool->syncmode == 1 or $tool->syncmode == 2) { // We have to enrol new members so we have to create it. $userobj = new stdClass(); // clean_param , email username text $auth = get_config('local_ltiprovider', 'defaultauthmethod'); if ($auth) { $userobj->auth = $auth; } else { $userobj->auth = 'nologin'; } $username = local_ltiprovider_create_username($user->consumerkey, $member->user_id); $userobj->username = $username; $userobj->password = md5(uniqid(rand(), 1)); $userobj->firstname = clean_param($member->person_name_given, PARAM_TEXT); $userobj->lastname = clean_param($member->person_name_family, PARAM_TEXT); $userobj->email = clean_param($member->person_contact_email_primary, PARAM_EMAIL); $userobj->city = $tool->city; $userobj->country = $tool->country; $userobj->institution = $tool->institution; $userobj->timezone = $tool->timezone; $userobj->maildisplay = $tool->maildisplay; $userobj->mnethostid = $CFG->mnet_localhost_id; $userobj->confirmed = 1; $userobj->lang = $tool->lang; $userobj->timecreated = time(); if (!$userobj->lang) { // TODO: This should be changed for detect the course lang $userobj->lang = current_language(); } $userobj->id = $DB->insert_record('user', $userobj); // Reload full user $userobj = $DB->get_record('user', array('id' => $userobj->id)); $userphotos[$userobj->id] = $member->user_image; // Trigger event. $event = \core\event\user_created::create(array('objectid' => $userobj->id, 'relateduserid' => $userobj->id, 'context' => context_user::instance($userobj->id))); $event->trigger(); $currentusers[] = $userobj->id; } } // 1 -> Enrol and unenrol, 2 -> enrol if ($tool->syncmode == 1 or $tool->syncmode == 2) { // Enroll the user in the course. We don't know if it was previously unenrolled. $roles = explode(',', strtolower($member->roles)); local_ltiprovider_enrol_user($tool, $userobj, $roles, true); } } // Now we check if we have to unenrol users for keep both systems sync. if ($tool->syncmode == 1 or $tool->syncmode == 3) { // Unenrol users also. $context = context_course::instance($tool->courseid); $eusers = get_enrolled_users($context); foreach ($eusers as $euser) { if (!in_array($euser->id, $currentusers)) { local_ltiprovider_unenrol_user($tool, $euser); } } } } else { mtrace('Error recived from the remote system: ' . $data->statusinfo->codemajor . ' ' . $data->statusinfo->severity . ' ' . $data->statusinfo->codeminor); } } else { mtrace('Error parsing the XML received' . substr($response, 0, 125) . '... (Displaying only 125 chars)'); } } else { mtrace('No response received from ' . $user->membershipsurl); } } } set_config('membershipslastsync-' . $tool->id, $timenow, 'local_ltiprovider'); } else { $last = format_time(time() - $lastsync); mtrace("Tool {$tool->id} synchronized {$last} ago"); } mtrace('Finished sync of member using the memberships service'); } } // Sync of user photos. mtrace("Sync user profile images"); $counter = 0; if ($userphotos) { foreach ($userphotos as $userid => $url) { if ($url) { $result = local_ltiprovider_update_user_profile_image($userid, $url); if ($result === true) { $counter++; mtrace("Profile image succesfully downloaded and created from {$url}"); } else { mtrace($result); } } } } mtrace("{$counter} profile images updated"); }
/** * Create a Moodle user from Azure AD user data. * * @param array $aaddata Array of Azure AD user data. * @return \stdClass An object representing the created Moodle user. */ public function create_user_from_aaddata($aaddata) { global $CFG; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; $newuser = (object) ['auth' => 'oidc', 'username' => trim(\core_text::strtolower($aaddata['userPrincipalName'])), 'email' => isset($aaddata['mail']) ? $aaddata['mail'] : '', 'firstname' => isset($aaddata['givenName']) ? $aaddata['givenName'] : '', 'lastname' => isset($aaddata['surname']) ? $aaddata['surname'] : '', 'city' => isset($aaddata['city']) ? $aaddata['city'] : '', 'country' => isset($aaddata['country']) ? $aaddata['country'] : '', 'department' => isset($aaddata['department']) ? $aaddata['department'] : '', 'lang' => isset($aaddata['preferredLanguage']) ? substr($aaddata['preferredLanguage'], 0, 2) : 'en', 'confirmed' => 1, 'timecreated' => time(), 'mnethostid' => $CFG->mnet_localhost_id]; $password = null; $newuser->idnumber = $newuser->username; if (!empty($newuser->email)) { if (email_is_not_allowed($newuser->email)) { unset($newuser->email); } } if (empty($newuser->lang) || !get_string_manager()->translation_exists($newuser->lang)) { $newuser->lang = $CFG->lang; } $newuser->timemodified = $newuser->timecreated; $newuser->id = user_create_user($newuser, false, false); // Save user profile data. profile_save_data($newuser); $user = get_complete_user_data('id', $newuser->id); if (!empty($CFG->{'auth_' . $newuser->auth . '_forcechangepassword'})) { set_user_preference('auth_forcepasswordchange', 1, $user); } // Set the password. update_internal_user_password($user, $password); // Trigger event. \core\event\user_created::create_from_userid($newuser->id)->trigger(); return $user; }
public static function create_player(\core\event\user_created $event) { $pl = block_playlyfe_sdk::get_pl(); $user = $event->get_record_snapshot('user', $event->objectid); $pl->post('/admin/players', array(), array('id' => $user->id, 'alias' => $user->firstname . ' ' . $user->lastname)); }
/** * Creates a bare-bones user record * * @todo Outline auth types and provide code example * * @param string $username New user's username to add to record * @param string $password New user's password to add to record * @param string $auth Form of authentication required * @return stdClass A complete user object */ function create_user_record($username, $password, $auth = 'manual') { global $CFG, $DB; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; // Just in case check text case. $username = trim(core_text::strtolower($username)); $authplugin = get_auth_plugin($auth); $customfields = $authplugin->get_custom_user_profile_fields(); $newuser = new stdClass(); if ($newinfo = $authplugin->get_userinfo($username)) { $newinfo = truncate_userinfo($newinfo); foreach ($newinfo as $key => $value) { if (in_array($key, $authplugin->userfields) || in_array($key, $customfields)) { $newuser->{$key} = $value; } } } if (!empty($newuser->email)) { if (email_is_not_allowed($newuser->email)) { unset($newuser->email); } } if (!isset($newuser->city)) { $newuser->city = ''; } $newuser->auth = $auth; $newuser->username = $username; // Fix for MDL-8480 // user CFG lang for user if $newuser->lang is empty // or $user->lang is not an installed language. if (empty($newuser->lang) || !get_string_manager()->translation_exists($newuser->lang)) { $newuser->lang = $CFG->lang; } $newuser->confirmed = 1; $newuser->lastip = getremoteaddr(); $newuser->timecreated = time(); $newuser->timemodified = $newuser->timecreated; $newuser->mnethostid = $CFG->mnet_localhost_id; $newuser->id = user_create_user($newuser, false, false); // Save user profile data. profile_save_data($newuser); $user = get_complete_user_data('id', $newuser->id); if (!empty($CFG->{'auth_' . $newuser->auth . '_forcechangepassword'})) { set_user_preference('auth_forcepasswordchange', 1, $user); } // Set the password. update_internal_user_password($user, $password); // Trigger event. \core\event\user_created::create_from_userid($newuser->id)->trigger(); return $user; }
/** * Create a Moodle user from Azure AD user data. * * @param array $aaddata Array of Azure AD user data. * @return \stdClass An object representing the created Moodle user. */ public function create_user_from_aaddata($aaddata) { global $CFG; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; $creationallowed = $this->check_usercreationrestriction($aaddata); if ($creationallowed !== true) { mtrace('Cannot create user because they do not meet the configured user creation restrictions.'); return false; } // Locate country code. if (isset($aaddata['country'])) { $countries = get_string_manager()->get_list_of_countries(); foreach ($countries as $code => $name) { if ($aaddata['country'] == $name) { $aaddata['country'] = $code; } } if (strlen($aaddata['country']) > 2) { // Limit string to 2 chars to prevent sql error. $aaddata['country'] = substr($aaddata['country'], 0, 2); } } $newuser = (object) ['auth' => 'oidc', 'username' => trim(\core_text::strtolower($aaddata['userPrincipalName'])), 'lang' => 'en', 'confirmed' => 1, 'timecreated' => time(), 'mnethostid' => $CFG->mnet_localhost_id]; $newuser = static::apply_configured_fieldmap($aaddata, $newuser, 'create'); $password = null; $newuser->idnumber = $newuser->username; if (!empty($newuser->email)) { if (email_is_not_allowed($newuser->email)) { unset($newuser->email); } } if (empty($newuser->lang) || !get_string_manager()->translation_exists($newuser->lang)) { $newuser->lang = $CFG->lang; } $newuser->timemodified = $newuser->timecreated; $newuser->id = user_create_user($newuser, false, false); // Save user profile data. profile_save_data($newuser); $user = get_complete_user_data('id', $newuser->id); if (!empty($CFG->{'auth_' . $newuser->auth . '_forcechangepassword'})) { set_user_preference('auth_forcepasswordchange', 1, $user); } // Set the password. update_internal_user_password($user, $password); // Trigger event. \core\event\user_created::create_from_userid($newuser->id)->trigger(); return $user; }
/** * Sign up a new user ready for confirmation. * Password is passed in plaintext. * * @param object $user new user object * @param boolean $notify print notice with link and terminate */ public function user_signup($user, $notify = true) { global $CFG, $DB; require_once $CFG->dirroot . '/user/profile/lib.php'; require_once $CFG->dirroot . '/user/lib.php'; $plainpassword = $user->password; $user->password = hash_internal_user_password($user->password); if (empty($user->calendartype)) { $user->calendartype = $CFG->calendartype; } $user->id = user_create_user($user, false, false); user_add_password_history($user->id, $plainpassword); // Save any custom profile field information. profile_save_data($user); // Trigger event. \core\event\user_created::create_from_userid($user->id)->trigger(); if (!send_confirmation_email($user)) { print_error('auth_emailnoemail, auth_email'); } if ($notify) { global $CFG, $PAGE, $OUTPUT; $emailconfirm = get_string('emailconfirm'); $PAGE->navbar->add($emailconfirm); $PAGE->set_title($emailconfirm); $PAGE->set_heading($PAGE->course->fullname); echo $OUTPUT->header(); notice(get_string('emailconfirmsent', '', $user->email), "{$CFG->wwwroot}/index.php"); } else { return true; } }
$user = new stdClass(); // clean_param , email username text $auth = get_config('local_ltiprovider', 'defaultauthmethod'); if ($auth) { $user->auth = $auth; } else { $user->auth = 'nologin'; } $user->username = $username; $user->password = md5(uniqid(rand(), 1)); local_ltiprovider_populate($user, $context, $tool); $user->id = $DB->insert_record('user', $user); // Reload full user $user = $DB->get_record('user', array('id' => $user->id)); // Trigger event. $event = \core\event\user_created::create(array('objectid' => $user->id, 'relateduserid' => $user->id, 'context' => context_user::instance($user->id))); $event->trigger(); } else { $user = new stdClass(); local_ltiprovider_populate($user, $context, $tool); if (local_ltiprovider_user_match($user, $dbuser)) { $user = $dbuser; } else { $user = $dbuser; $userprofileupdate = get_config('local_ltiprovider', 'userprofileupdate'); if ($userprofileupdate == -1) { // Check the tool setting. $userprofileupdate = $tool->userprofileupdate; } if ($userprofileupdate) { local_ltiprovider_populate($user, $context, $tool);