diff --git a/auth/oauth2/classes/api.php b/auth/oauth2/classes/api.php index 430abeef8d3..ffcb79c47fb 100644 --- a/auth/oauth2/classes/api.php +++ b/auth/oauth2/classes/api.php @@ -105,6 +105,10 @@ class api { $userid = $USER->id; } + if (linked_login::count_records(['username' => $userinfo['username']]) > 0) { + throw new moodle_exception('alreadylinked', 'auth_oauth2'); + } + if (\core\session\manager::is_loggedinas()) { throw new moodle_exception('notwhileloggedinas', 'auth_oauth2'); } @@ -144,9 +148,8 @@ class api { $record->issuerid = $issuer->get('id'); $record->username = $userinfo['username']; $record->userid = $userid; - $existing = linked_login::get_record((array)$record); - if ($existing) { - return false; + if (linked_login::count_records(['username' => $userinfo['username']]) > 0) { + throw new moodle_exception('alreadylinked', 'auth_oauth2'); } $record->email = $userinfo['email']; $record->confirmtoken = random_string(32); @@ -239,6 +242,10 @@ class api { require_once($CFG->dirroot.'/user/profile/lib.php'); require_once($CFG->dirroot.'/user/lib.php'); + if (linked_login::count_records(['username' => $userinfo['username']]) > 0) { + throw new moodle_exception('alreadylinked', 'auth_oauth2'); + } + $user = new stdClass(); $user->username = $userinfo['username']; $user->email = $userinfo['email']; @@ -319,4 +326,18 @@ class api { $login->delete(); } + + /** + * Delete linked logins for a user. + * + * @param \core\event\user_deleted $event + * @return boolean + */ + public static function user_deleted(\core\event\user_deleted $event) { + global $DB; + + $userid = $event->objectid; + + return $DB->delete_records(linked_login::TABLE, ['userid' => $userid]); + } } diff --git a/auth/oauth2/db/events.php b/auth/oauth2/db/events.php new file mode 100644 index 00000000000..b6f793c38d1 --- /dev/null +++ b/auth/oauth2/db/events.php @@ -0,0 +1,31 @@ +. + +/** + * This file definies observers needed by the plugin. + * + * @package auth_oauth2 + * @copyright 2017 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +// List of observers. +$observers = [ + [ + 'eventname' => '\core\event\user_deleted', + 'callback' => '\auth_oauth2\api::user_deleted', + ], +]; diff --git a/auth/oauth2/lang/en/auth_oauth2.php b/auth/oauth2/lang/en/auth_oauth2.php index f0715e0a489..1ba808c28b5 100644 --- a/auth/oauth2/lang/en/auth_oauth2.php +++ b/auth/oauth2/lang/en/auth_oauth2.php @@ -83,3 +83,4 @@ $string['notwhileloggedinas'] = 'Linked logins cannot be managed while logged in $string['oauth2:managelinkedlogins'] = 'Manage own linked login accounts'; $string['plugindescription'] = 'This authentication plugin displays a list of the configured identity providers on the login page. Selecting an identity provider allows users to login with their credentials from an OAuth 2 provider.'; $string['pluginname'] = 'OAuth 2'; +$string['alreadylinked'] = 'This external account is already linked to an account on this site'; diff --git a/auth/oauth2/linkedlogins.php b/auth/oauth2/linkedlogins.php index 12285306a5a..fe18f8fb847 100644 --- a/auth/oauth2/linkedlogins.php +++ b/auth/oauth2/linkedlogins.php @@ -58,8 +58,12 @@ if ($action == 'new') { $userinfo = $client->get_userinfo(); if (!empty($userinfo)) { - \auth_oauth2\api::link_login($userinfo, $issuer); - redirect($PAGE->url, get_string('changessaved'), null, \core\output\notification::NOTIFY_SUCCESS); + try { + \auth_oauth2\api::link_login($userinfo, $issuer); + redirect($PAGE->url, get_string('changessaved'), null, \core\output\notification::NOTIFY_SUCCESS); + } catch (Exception $e) { + redirect($PAGE->url, $e->getMessage(), null, \core\output\notification::NOTIFY_ERROR); + } } else { redirect($PAGE->url, get_string('notloggedin', 'auth_oauth2'), null, \core\output\notification::NOTIFY_ERROR); } diff --git a/auth/oauth2/version.php b/auth/oauth2/version.php index 8fc34eb410d..275893493ad 100644 --- a/auth/oauth2/version.php +++ b/auth/oauth2/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2017051500; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2017051501; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2017050500; // Requires this Moodle version. $plugin->component = 'auth_oauth2'; // Full name of the plugin (used for diagnostics).