From 7415aed103fc3bbda4a46d02147a9bf68aa010d9 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Sun, 14 Nov 2010 02:01:59 +0000 Subject: [PATCH] MDL-11728 finally defining the exact meaning of is_internal() in auth plugins internal means "uses password hash for user authentication", there is a new is_synchronised_with_external() method that indicates if moodle should automatically sync user info with external system after login; I have also improved the default for prevent_local_passwords() which is now defaulting to !is_internal() --- auth/db/auth.php | 75 ++++++++++++++++++++++++----------------------- lib/authlib.php | 20 +++++++++---- lib/moodlelib.php | 2 +- 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/auth/db/auth.php b/auth/db/auth.php index 09f2c2ff94f..4f875b53239 100644 --- a/auth/db/auth.php +++ b/auth/db/auth.php @@ -1,20 +1,17 @@ libdir.'/authlib.php'); require_once($CFG->libdir.'/adodb/adodb.inc.php'); @@ -53,7 +50,7 @@ class auth_plugin_db extends auth_plugin_base { $authdb = $this->db_init(); - if ($this->config->passtype === 'internal') { + if ($this->is_internal()) { // lookup username externally, but resolve // password locally -- to support backend that // don't track passwords @@ -65,10 +62,10 @@ class auth_plugin_db extends auth_plugin_base { return false; } - if ( !$rs->EOF ) { + if (!$rs->EOF) { $rs->Close(); $authdb->Close(); - // user exists exterally + // user exists externally // check username/password internally if ($user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id))) { return validate_internal_user_password($user, $password); @@ -81,7 +78,7 @@ class auth_plugin_db extends auth_plugin_base { } } else { - // normal case: use external db for passwords + // normal case: use external db for both usernames and passwords if ($this->config->passtype === 'md5') { // Re-format password accordingly $extpassword = md5($extpassword); @@ -126,6 +123,7 @@ class auth_plugin_db extends auth_plugin_base { return $authdb; } + /** * retuns user attribute mappings between moodle and ldap * @@ -151,7 +149,6 @@ class auth_plugin_db extends auth_plugin_base { * @return array without magic quotes */ function get_userinfo($username) { - global $CFG; $textlib = textlib_get_instance(); @@ -186,10 +183,8 @@ class auth_plugin_db extends auth_plugin_base { } $authdb->Close(); return $result; - } - /** * Change a user's password * @@ -199,9 +194,7 @@ class auth_plugin_db extends auth_plugin_base { * @return bool True on success */ function user_update_password($user, $newpassword) { - - global $CFG; - if ($this->config->passtype === 'internal') { + if ($this->is_internal()) { return update_internal_user_password($user, $newpassword); } else { // we should have never been called! @@ -219,15 +212,13 @@ class auth_plugin_db extends auth_plugin_base { * Syncing users removes (disables) users that dont exists anymore in external db. * Creates new users and updates coursecreator status of users. * - * @param bool $do_updates Optional: set to true to force an update of existing accounts - * * This implementation is simpler but less scalable than the one found in the LDAP module. * + * @param bool $do_updates Optional: set to true to force an update of existing accounts + * @return bool success */ function sync_users($do_updates=false) { - global $CFG, $DB; - $pcfg = get_config('auth/db'); /// list external users $userlist = $this->get_userlist(); @@ -370,7 +361,7 @@ class auth_plugin_db extends auth_plugin_base { $id = $DB->insert_record ('user',$user); // it is truly a new user echo "\t"; print_string('auth_dbinsertuser','auth_db',array('name'=>$user->username, 'id'=>$id)); echo "\n"; // if relevant, tag for password generation - if ($this->config->passtype === 'internal') { + if ($this->is_internal()) { set_user_preference('auth_forcepasswordchange', 1, $id); set_user_preference('create_password', 1, $id); } @@ -397,7 +388,7 @@ class auth_plugin_db extends auth_plugin_base { if (!$rs) { print_error('auth_dbcantconnect','auth_db'); - } else if ( !$rs->EOF ) { + } else if (!$rs->EOF) { // user exists exterally $result = true; } @@ -420,7 +411,7 @@ class auth_plugin_db extends auth_plugin_base { if (!$rs) { print_error('auth_dbcantconnect','auth_db'); - } else if ( !$rs->EOF ) { + } else if (!$rs->EOF) { while ($rec = $rs->FetchRow()) { $rec = (object)array_change_key_case((array)$rec , CASE_LOWER); array_push($result, $rec->username); @@ -546,8 +537,8 @@ class auth_plugin_db extends auth_plugin_base { } if (!empty($update)) { $authdb->Execute("UPDATE {$this->config->table} - SET ".implode(',', $update)." - WHERE {$this->config->fielduser}='".$this->ext_addslashes($extusername)."'"); + SET ".implode(',', $update)." + WHERE {$this->config->fielduser}='".$this->ext_addslashes($extusername)."'"); } $authdb->Close(); return true; @@ -565,14 +556,13 @@ class auth_plugin_db extends auth_plugin_base { } function prevent_local_passwords() { - if (!isset($this->config->passtype)) { - return false; - } - return ($this->config->passtype != 'internal'); + return !$this->is_internal(); } /** - * Returns true if this authentication plugin is 'internal'. + * Returns true if this authentication plugin is "internal". + * + * Internal plugins use password hashes from Moodle user table for authentication. * * @return bool */ @@ -580,7 +570,18 @@ class auth_plugin_db extends auth_plugin_base { if (!isset($this->config->passtype)) { return true; } - return ($this->config->passtype == 'internal'); + return ($this->config->passtype === 'internal'); + } + + /** + * Indicates if moodle should automatically update internal user + * records with data from external sources using the information + * from auth_plugin_base::get_userinfo(). + * + * @return bool true means automatically copy data from ext to user table + */ + function is_synchronised_with_external() { + return true; } /** @@ -590,7 +591,7 @@ class auth_plugin_db extends auth_plugin_base { * @return bool */ function can_change_password() { - return ($this->config->passtype == 'internal' or !empty($this->config->changepasswordurl)); + return ($this->is_internal() or !empty($this->config->changepasswordurl)); } /** @@ -600,11 +601,11 @@ class auth_plugin_db extends auth_plugin_base { * @return moodle_url */ function change_password_url() { - if ($this->config->passtype == 'internal') { + if ($this->is_internal()) { // standard form return null; } else { - // use custom url + // use admin defined custom url return new moodle_url($this->config->changepasswordurl); } } @@ -615,7 +616,7 @@ class auth_plugin_db extends auth_plugin_base { * @return bool */ function can_reset_password() { - return ($this->config->passtype == 'internal'); + return $this->is_internal(); } /** diff --git a/lib/authlib.php b/lib/authlib.php index 9b9c9b4dae3..334bd44b542 100644 --- a/lib/authlib.php +++ b/lib/authlib.php @@ -172,9 +172,9 @@ class auth_plugin_base { } /** - * Returns true if this authentication plugin is "internal" (which means that - * Moodle stores the users' passwords and other details in the local Moodle - * database). + * Returns true if this authentication plugin is "internal". + * + * Internal plugins use password hashes from Moodle user table for authentication. * * @return bool */ @@ -188,8 +188,18 @@ class auth_plugin_base { * @return bool true means md5 password hash stored in user table, false means flag 'not_cached' stored there instead */ function prevent_local_passwords() { - // NOTE: this will be changed to true in 2.0 - return false; + return !$this->is_internal(); + } + + /** + * Indicates if moodle should automatically update internal user + * records with data from external sources using the information + * from get_userinfo() method. + * + * @return bool true means automatically copy data from ext to user table + */ + function is_synchronised_with_external() { + return !$this->is_internal(); } /** diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 82b82b0be31..329795dd412 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -3735,7 +3735,7 @@ function authenticate_user_login($username, $password) { update_internal_user_password($user, $password); // just in case salt or encoding were changed (magic quotes too one day) - if (!$authplugin->is_internal()) { // update user record from external DB + if ($authplugin->is_synchronised_with_external()) { // update user record from external DB $user = update_user_record($username, get_auth_plugin($user->auth)); } } else {