diff --git a/lib/classes/event/user_created.php b/lib/classes/event/user_created.php index 265eff22b8c..bd991deefd5 100644 --- a/lib/classes/event/user_created.php +++ b/lib/classes/event/user_created.php @@ -97,4 +97,24 @@ class user_created extends base { protected function get_legacy_logdata() { return array(SITEID, 'user', 'add', '/view.php?id='.$this->objectid, fullname($this->get_legacy_eventdata())); } + + /** + * Create instance of event. + * + * @since Moodle 2.6.4, 2.7.1 + * + * @param int $userid id of user + * @return user_created + */ + public static function create_from_userid($userid) { + $data = array( + 'objectid' => $userid, + 'relateduserid' => $userid, + 'context' => \context_user::instance($userid) + ); + + // Create user_created event. + $event = self::create($data); + return $event; + } } diff --git a/lib/classes/event/user_updated.php b/lib/classes/event/user_updated.php index ad2940b6cda..59b9f2c8346 100644 --- a/lib/classes/event/user_updated.php +++ b/lib/classes/event/user_updated.php @@ -97,4 +97,24 @@ class user_updated extends base { protected function get_legacy_logdata() { return array(SITEID, 'user', 'update', 'view.php?id='.$this->objectid, ''); } + + /** + * Create instance of event. + * + * @since Moodle 2.6.4, 2.7.1 + * + * @param int $userid id of user + * @return user_updated + */ + public static function create_from_userid($userid) { + $data = array( + 'objectid' => $userid, + 'relateduserid' => $userid, + 'context' => \context_user::instance($userid) + ); + + // Create user_updated event. + $event = self::create($data); + return $event; + } } diff --git a/lib/upgrade.txt b/lib/upgrade.txt index d7caeca1337..012a4bb3908 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -1,6 +1,13 @@ This files describes API changes in core libraries and APIs, information provided here is intended especially for developers. +=== 2.6.4 / 2.7.1 === + +* update_internal_user_password() accepts optional boolean $fasthash for fast + hashing. +* user_update_user() and user_create_user() api's accept optional param + $triggerevent to avoid respective events to be triggred from the api's. + === 2.5.5 / 2.6.2 / 2.7 === * New "Time spent waiting for the database" performance metric displayed along with the diff --git a/user/editadvanced.php b/user/editadvanced.php index 5c808731e5d..c5d77d838de 100644 --- a/user/editadvanced.php +++ b/user/editadvanced.php @@ -156,6 +156,7 @@ $userform = new user_editadvanced_form(null, array( $userform->set_data($user); if ($usernew = $userform->get_data()) { + $usercreated = false; if (empty($usernew->auth)) { //user editing self @@ -182,7 +183,7 @@ if ($usernew = $userform->get_data()) { } else { $usernew->password = hash_internal_user_password($usernew->newpassword); } - $usernew->id = user_create_user($usernew, false); + $usernew->id = user_create_user($usernew, false, false); } else { $usernew = file_postupdate_standard_editor($usernew, 'description', $editoroptions, $usercontext, 'user', 'profile', 0); // Pass a true old $user here. @@ -190,7 +191,7 @@ if ($usernew = $userform->get_data()) { // Auth update failed. print_error('cannotupdateuseronexauth', '', '', $user->auth); } - user_update_user($usernew, false); + user_update_user($usernew, false, false); //set new password if specified if (!empty($usernew->newpassword)) { diff --git a/user/externallib.php b/user/externallib.php index 6cc2e04a6dd..0de43b32d12 100644 --- a/user/externallib.php +++ b/user/externallib.php @@ -158,8 +158,8 @@ class core_user_external extends external_api { } // End of user info validation. - // create the user data now! - $user['id'] = user_create_user($user); + // Create the user data now! + $user['id'] = user_create_user($user, true, false); // custom fields if(!empty($user['customfields'])) { @@ -171,6 +171,9 @@ class core_user_external extends external_api { profile_save_data((object) $user); } + // Trigger event. + \core\event\user_created::create_from_userid($user['id'])->trigger(); + //preferences if (!empty($user['preferences'])) { foreach($user['preferences'] as $preference) { @@ -341,10 +344,9 @@ class core_user_external extends external_api { $transaction = $DB->start_delegated_transaction(); foreach ($params['users'] as $user) { - user_update_user($user); + user_update_user($user, true, false); //update user custom fields if(!empty($user['customfields'])) { - foreach($user['customfields'] as $customfield) { $user["profile_field_".$customfield['type']] = $customfield['value']; //profile_save_data() saves profile file //it's expecting a user with the correct id, @@ -352,6 +354,9 @@ class core_user_external extends external_api { } profile_save_data((object) $user); } + + // Trigger event. + \core\event\user_updated::create_from_userid($user['id'])->trigger(); //preferences if (!empty($user['preferences'])) { diff --git a/user/lib.php b/user/lib.php index 62d21452e14..4d1359901f0 100644 --- a/user/lib.php +++ b/user/lib.php @@ -30,9 +30,10 @@ * * @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. * @return int id of the newly created user */ -function user_create_user($user, $updatepassword = true) { +function user_create_user($user, $updatepassword = true, $triggerevent = true) { global $CFG, $DB; // Set the timecreate field to the current time. @@ -88,14 +89,10 @@ function user_create_user($user, $updatepassword = true) { $authplugin->user_update_password($newuser, $userpassword); } - // Trigger event. - $event = \core\event\user_created::create( - array( - 'objectid' => $newuserid, - 'context' => $usercontext - ) - ); - $event->trigger(); + // Trigger event If required. + if ($triggerevent) { + \core\event\user_created::create_from_userid($newuserid)->trigger(); + } return $newuserid; } @@ -105,8 +102,9 @@ function user_create_user($user, $updatepassword = true) { * * @param stdClass $user the user to update * @param bool $updatepassword if true, authentication plugin will update password. + * @param bool $triggerevent set false if user_updated event should not be triggred. */ -function user_update_user($user, $updatepassword = true) { +function user_update_user($user, $updatepassword = true, $triggerevent = true) { global $DB; // set the timecreate field to the current time @@ -164,15 +162,10 @@ function user_update_user($user, $updatepassword = true) { } } } - - // Trigger event. - $event = \core\event\user_updated::create( - array( - 'objectid' => $user->id, - 'context' => context_user::instance($user->id) - ) - ); - $event->trigger(); + // Trigger event if required. + if ($triggerevent) { + \core\event\user_updated::create_from_userid($user->id)->trigger(); + } } /** diff --git a/user/tests/userlib_test.php b/user/tests/userlib_test.php index 9959d0fe49d..204428d5e79 100644 --- a/user/tests/userlib_test.php +++ b/user/tests/userlib_test.php @@ -76,6 +76,22 @@ class core_userliblib_testcase extends advanced_testcase { user_update_user($user, false); $dbuser = $DB->get_record('user', array('id' => $user->id)); $this->assertSame($password, $dbuser->password); + + // Verify event is not triggred by user_update_user when needed. + $sink = $this->redirectEvents(); + user_update_user($user, false, false); + $events = $sink->get_events(); + $sink->close(); + $this->assertCount(0, $events); + + // With password, there should be 1 event. + $sink = $this->redirectEvents(); + user_update_user($user, true, false); + $events = $sink->get_events(); + $sink->close(); + $this->assertCount(1, $events); + $event = array_pop($events); + $this->assertInstanceOf('\core\event\user_updated', $event); } /** @@ -128,5 +144,13 @@ class core_userliblib_testcase extends advanced_testcase { $this->assertEventLegacyData($dbuser, $event); $expectedlogdata = array(SITEID, 'user', 'add', '/view.php?id='.$event->objectid, fullname($dbuser)); $this->assertEventLegacyLogData($expectedlogdata, $event); + + // Verify event is not triggred by user_create_user when needed. + $user = array('username' => 'usernametest2'); // Create another user. + $sink = $this->redirectEvents(); + user_create_user($user, true, false); + $events = $sink->get_events(); + $sink->close(); + $this->assertCount(0, $events); } }