Skip to content

Commit

Permalink
MDL-32746 core: Implement new user_loggedin event
Browse files Browse the repository at this point in the history
  • Loading branch information
Frederic Massart committed Jul 23, 2013
1 parent 35c1179 commit 3b086e3
Show file tree
Hide file tree
Showing 5 changed files with 192 additions and 2 deletions.
110 changes: 110 additions & 0 deletions auth/classes/event/user_loggedin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* User login event.
*
* @package core_auth
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace core_auth\event;

defined('MOODLE_INTERNAL') || die();

/**
* User login event class.
*
* @package core_auth
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_loggedin extends \core\event\base {

/**
* Returns localised description of what happened.
*
* @return \lang_string.
*/
public function get_description() {
return new \lang_string('event_user_loggedin_desc', '', $this->get_username());
}

/**
* Return legacy data for add_to_log().
*
* @return array
*/
public function get_legacy_logdata() {
return array(SITEID, 'user', 'login', "view.php?id=" . $this->data['objectid'] . "&course=".SITEID,
$this->data['objectid'], 0, $this->data['objectid']);
}

/**
* Return localised event name.
*
* @return \lang_string
*/
public static function get_name() {
return new \lang_string('event_user_loggedin');
}

/**
* Get URL related to the action
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/user/profile.php', array('id' => $this->data['objectid']));
}

/**
* Return the username of the logged in user.
*
* @return string
*/
public function get_username() {
return $this->data['other']['username'];
}

/**
* Init method.
*
* @return void
*/
protected function init() {
$this->context = \context_system::instance();
$this->data['crud'] = 'r';
$this->data['level'] = 50; // TODO MDL-37658.
$this->data['objecttable'] = 'user';
}

/**
* Custom validation.
*
* @throws coding_exception when validation does not pass.
* @return void
*/
protected function validate_data() {
if (!isset($this->data['objectid'])) {
throw new \coding_exception("objectid has to be specified.");
} else if (!isset($this->data['other']['username'])) {
throw new \coding_exception("other['username'] has to be specified.");
}
}

}
75 changes: 75 additions & 0 deletions auth/tests/auth_test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Tests for auth.
*
* @package core_auth
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

defined('MOODLE_INTERNAL') || die();

global $CFG;
require_once($CFG->libdir . '/authlib.php');

/**
* Auth testcase class.
*
* @package core_auth
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class auth_testcase extends advanced_testcase {

public function test_user_loggedin_event() {
global $USER;
$this->resetAfterTest(true);
$this->setAdminUser();

$sink = $this->redirectEvents();
$user = clone($USER);
login_attempt_valid($user);
$events = $sink->get_events();
$sink->close();

$this->assertCount(1, $events);
$event = reset($events);
$this->assertInstanceOf('\core_auth\event\user_loggedin', $event);
$this->assertEquals('user', $event->objecttable);
$this->assertEquals('2', $event->objectid);
$this->assertEquals(context_system::instance()->id, $event->contextid);
$this->assertEquals($user, $event->get_record_snapshot('user', 2));
}

public function test_user_loggedin_event_exceptions() {
try {
$event = \core_auth\event\user_loggedin::create(array('objectid' => 1));
$this->fail('\core_auth\event\user_loggedin requires other[\'username\']');
} catch(Exception $e) {
$this->assertInstanceOf('coding_exception', $e);
}

try {
$event = \core_auth\event\user_loggedin::create(array('other' => array('username' => 'test')));
$this->fail('\core_auth\event\user_loggedin requires objectid');
} catch(Exception $e) {
$this->assertInstanceOf('coding_exception', $e);
}
}

}
2 changes: 2 additions & 0 deletions lang/en/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@
$string['errorminpasswordnonalphanum'] = 'Passwords must have at least {$a} non-alphanumeric character(s).';
$string['errorminpasswordupper'] = 'Passwords must have at least {$a} upper case letter(s).';
$string['errorpasswordupdate'] = 'Error updating password, password not changed';
$string['event_user_loggedin'] = 'User has logged in';
$string['event_user_loggedin_desc'] = 'User {$a} has logged in';
$string['forcechangepassword'] = 'Force change password';
$string['forcechangepasswordfirst_help'] = 'Force users to change password on their first login to Moodle.';
$string['forcechangepassword_help'] = 'Force users to change password on their next login to Moodle.';
Expand Down
5 changes: 5 additions & 0 deletions lib/authlib.php
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,11 @@ function login_is_lockedout($user) {
function login_attempt_valid($user) {
global $CFG;

$event = \core_auth\event\user_loggedin::create(array('objectid' => $user->id,
'other' => array('username' => $user->username)));
$event->add_record_snapshot('user', $user);
$event->trigger();

if ($user->mnethostid != $CFG->mnet_localhost_id) {
return;
}
Expand Down
2 changes: 0 additions & 2 deletions login/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,6 @@
}

/// Let's get them all set up.
add_to_log(SITEID, 'user', 'login', "view.php?id=$USER->id&course=".SITEID,
$user->id, 0, $user->id);
complete_user_login($user);

// sets the username cookie
Expand Down

0 comments on commit 3b086e3

Please sign in to comment.