From: skodak Date: Fri, 16 Feb 2007 10:45:53 +0000 (+0000) Subject: MDL-8542 External db auth cleanup X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=8ae42b8d7846da5400ca00122b78190a780e632e;p=moodle.git MDL-8542 External db auth cleanup * configurable encoding conversions * fixed handling of magic quotes * proper sybase quoting * adodb debug mode * fixed language strings * sha1 support * connection setup command (use names 'utf8') * mysqli support * form field labels * general cleanup and minor fixing --- diff --git a/auth/db/auth.php b/auth/db/auth.php index d01ecc97e0..bb370dc28b 100644 --- a/auth/db/auth.php +++ b/auth/db/auth.php @@ -12,8 +12,9 @@ * 2006-08-28 File created. */ -// This page cannot be called directly -if (!isset($CFG)) exit; +if (!defined('MOODLE_INTERNAL')) { + die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page +} /** * External database authentication plugin. @@ -30,38 +31,53 @@ class auth_plugin_db { */ function auth_plugin_db() { $this->config = get_config('auth/db'); + if (empty($this->config->extencoding)) { + $this->config->extencoding = 'utf-8'; + } } /** * Returns true if the username and password work and false if they are * wrong or don't exist. * - * @param string $username The username - * @param string $password The password - * @returns bool Authentication success or failure. + * @param string $username The username (with system magic quotes) + * @param string $password The password (with system magic quotes) + * + * @return bool Authentication success or failure. */ function user_login ($username, $password) { global $CFG; + $textlib = textlib_get_instance(); + $extusername = $textlib->convert(stripslashes($username), 'utf-8', $this->config->extencoding); + $extpassword = $textlib->convert(stripslashes($password), 'utf-8', $this->config->extencoding); + // Connect to the external database (forcing new connection) - $authdb = &ADONewConnection($this->config->type); - $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); + $authdb = &ADONewConnection($this->config->type); + if (!empty($this->config->debugauthdb)) { + $authdb->debug = true; + ob_start();//start output buffer to allow later use of the page headers + } + $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); $authdb->SetFetchMode(ADODB_FETCH_ASSOC); + if (!empty($this->config->setupsql)) { + $authdb->Execute($this->config->setupsql); + } - if ($this->config->passtype === 'internal') { + if ($this->config->passtype === 'internal') { // lookup username externally, but resolve // password locally -- to support backend that // don't track passwords - $rs = $authdb->Execute("SELECT * FROM {$this->config->table} - WHERE {$this->config->fielduser} = '$username' "); + $rs = $authdb->Execute("SELECT * FROM {$this->config->table} + WHERE {$this->config->fielduser} = '".$this->ext_addslashes($extusername)."' "); $authdb->Close(); if (!$rs) { print_error('auth_dbcantconnect','auth'); return false; } - + if ( $rs->RecordCount() ) { // user exists exterally // check username/password internally @@ -71,31 +87,33 @@ class auth_plugin_db { } else { // user does not exist externally return false; - } + } - } else { + } else { // normal case: use external db for passwords if ($this->config->passtype === 'md5') { // Re-format password accordingly - $password = md5($password); + $extpassword = md5($extpassword); + } else if ($this->config->passtype === 'sha1') { + $extpassword = sha1($extpassword); } - $rs = $authdb->Execute("SELECT * FROM {$this->config->table} - WHERE {$this->config->fielduser} = '$username' - AND {$this->config->fieldpass} = '$password' "); + $rs = $authdb->Execute("SELECT * FROM {$this->config->table} + WHERE {$this->config->fielduser} = '".$this->ext_addslashes($extusername)."' + AND {$this->config->fieldpass} = '".$this->ext_addslashes($extpassword)."' "); $authdb->Close(); - + if (!$rs) { print_error('auth_dbcantconnect','auth'); return false; } - + if ( $rs->RecordCount() ) { return true; } else { return false; - } - + } + } } @@ -103,18 +121,30 @@ class auth_plugin_db { /** * Reads any other information for a user from external database, * then returns it in an array + * + * @param string $username (with system magic quotes) */ function get_userinfo($username) { global $CFG; + $textlib = textlib_get_instance(); + $extusername = $textlib->convert(stripslashes($username), 'utf-8', $this->config->extencoding); + // Connect to the external database (forcing new connection) $authdb = &ADONewConnection($this->config->type); - $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); + if (!empty($this->config->debugauthdb)) { + $authdb->debug = true; + ob_start();//start output buffer to allow later use of the page headers + } + $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); $authdb->SetFetchMode(ADODB_FETCH_ASSOC); + if (!empty($this->config->setupsql)) { + $authdb->Execute($this->config->setupsql); + } - $fields = array("firstname", "lastname", "email", "phone1", "phone2", - "department", "address", "city", "country", "description", + $fields = array("firstname", "lastname", "email", "phone1", "phone2", + "department", "address", "city", "country", "description", "idnumber", "lang"); @@ -135,22 +165,18 @@ class auth_plugin_db { $select = 'SELECT ' . substr($select,1); $sql = $select . " FROM {$this->config->table}" . - " WHERE {$this->config->fielduser} = '$username'"; + " WHERE {$this->config->fielduser} = '".$this->ext_addslashes($extusername)."'"; if ($rs = $authdb->Execute($sql)) { if ( $rs->RecordCount() == 1 ) { $fields_obj = rs_fetch_record($rs); foreach ($selectfields as $localname=>$externalname) { - if (empty($CFG->unicodedb)) { - $fields_obj->{$localname} = utf8_decode($fields_obj->{$localname}); - } - $result[$localname] = addslashes(stripslashes($fields_obj->{$localname})); + $result[$localname] = $textlib->convert($fields_obj->{$localname}, $this->config->extencoding, 'utf-8'); } } rs_close($rs); } } $authdb->Close(); - return $result; } @@ -160,13 +186,14 @@ class auth_plugin_db { * * @param object $user The user to update * @param string $newpassword The new password + * * @return bool True on success */ function user_update_password($user, $newpassword) { global $CFG; if ($this->config->passtype === 'internal') { - return set_field('user', 'password', md5($newpassword), 'id', $user->id, 'mnethostid', $CFG->mnet_localhost_id); + update_internal_user_password($user, $newpassword, true); } else { // we should have never been called! return false; @@ -179,17 +206,17 @@ class auth_plugin_db { * Sync shouid be done by using idnumber attribute, not username. * You need to pass firstsync parameter to function to fill in * idnumbers if they dont exists in moodle user table. - * + * * Syncing users removes (disables) users that dont exists anymore in external db. - * Creates new users and updates coursecreator status of users. - * + * 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. * */ - function sync_users ($do_updates=0) { - + function sync_users ($do_updates=false) { + global $CFG; $pcfg = get_config('auth/db'); @@ -197,24 +224,24 @@ class auth_plugin_db { /// list external users /// $userlist = $this->get_userlist(); - $quoteduserlist = implode("', '", $userlist); + $quoteduserlist = implode("', '", addslashes_recursive($userlist)); $quoteduserlist = "'$quoteduserlist'"; /// /// delete obsolete internal users /// - + // find obsolete users if (count($userlist)) { - $sql = 'SELECT u.id, u.username - FROM ' . $CFG->prefix .'user u + $sql = 'SELECT u.id, u.username + FROM ' . $CFG->prefix .'user u WHERE u.auth=\'db\' AND u.deleted=\'0\' AND u.username NOT IN (' . $quoteduserlist . ')'; } else { - $sql = 'SELECT u.id, u.username - FROM ' . $CFG->prefix .'user u + $sql = 'SELECT u.id, u.username + FROM ' . $CFG->prefix .'user u WHERE u.auth=\'db\' AND u.deleted=\'0\' '; } - $remove_users = get_records_sql($sql); + $remove_users = get_records_sql($sql); if (!empty($remove_users)) { print_string('auth_dbuserstoremove','auth', count($remove_users)); @@ -224,24 +251,24 @@ class auth_plugin_db { foreach ($remove_users as $user) { //following is copy pasted from admin/user.php //maybe this should moved to function in lib/datalib.php - $updateuser = new stdClass(); + $updateuser = new object(); $updateuser->id = $user->id; - $updateuser->deleted = "1"; + $updateuser->deleted = 1; $updateuser->timemodified = time(); - if (update_record("user", $updateuser)) { - // unenrol_student($user->id); // From all courses - // remove_teacher($user->id); // From all courses - // remove_admin($user->id); - delete_records('role_assignments', 'userid', $user->id); // unassign all roles - notify(get_string("deletedactivity", "", fullname($user, true)) ); + if (update_record('user', $updateuser)) { + echo "\t"; + print_string('auth_dbdeleteuser', 'auth', array($user->username, $user->id)); + echo "\n"; } else { - notify(get_string("deletednot", "", fullname($user, true))); + echo "\t"; + print_string('auth_dbdeleteusererror', 'auth', $user->username); + echo "\n"; } //copy pasted part ends - } + } commit_sql(); - } - unset($remove_users); // free mem! + } + unset($remove_users); // free mem! if (!count($userlist)) { // exit right here @@ -269,15 +296,16 @@ class auth_plugin_db { // only go ahead if we actually // have fields to update locally if (!empty($updatekeys)) { - $sql = 'SELECT u.id, u.username - FROM ' . $CFG->prefix .'user u + $sql = 'SELECT u.id, u.username + FROM ' . $CFG->prefix .'user u WHERE u.auth=\'db\' AND u.deleted=\'0\' AND u.username IN (' . $quoteduserlist . ')'; - $update_users = get_records_sql($sql); - - foreach ($update_users as $user) { - $this->db_update_user_record($user->username, $updatekeys); + if ($update_users = get_records_sql($sql)) { + + foreach ($update_users as $user) { + $this->db_update_user_record(addslashes($user->username), $updatekeys); + } + unset($update_users); // free memory } - unset($update_users); // free memory } } @@ -287,12 +315,12 @@ class auth_plugin_db { /// // NOTE: this is very memory intensive // and generally inefficient - $sql = 'SELECT u.id, u.username - FROM ' . $CFG->prefix .'user u + $sql = 'SELECT u.id, u.username + FROM ' . $CFG->prefix .'user u WHERE u.auth=\'db\' AND u.deleted=\'0\''; $users = get_records_sql($sql); - + // simplify down to usernames $usernames = array(); foreach ($users as $user) { @@ -310,26 +338,28 @@ class auth_plugin_db { foreach($add_users as $user) { $username = $user; $user = $this->get_userinfo_asobj($user); - + // prep a few params $user->username = $username; $user->modified = time(); $user->confirmed = 1; $user->auth = 'db'; $user->mnethostid = $CFG->mnet_localhost_id; - - // insert it - $old_debug=$CFG->debug; - $CFG->debug=10; - + if (empty($user->lang)) { + $user->lang = $CFG->lang; + } + + $user = addslashes_object($user); // maybe the user has been deleted before if ($old_user = get_record('user', 'username', $user->username, 'deleted', 1, 'mnethostid', $user->mnethostid)) { $user->id = $old_user->id; set_field('user', 'deleted', 0, 'username', $user->username); - print_string('auth_dbrevive','auth',array($user->username, $user->id)); + echo "\t"; + print_string('auth_dbrevive','auth',array(stripslashes($user->username), $user->id)); echo "\n"; - } elseif ($id=insert_record ('user',$user)) { // it is truly a new user - print_string('auth_dbinsertuser','auth',array($user->username, $id)); + } elseif ($id = insert_record ('user',$user)) { // it is truly a new user + echo "\t"; + print_string('auth_dbinsertuser','auth',array(stripslashes($user->username), $id)); echo "\n"; $user->id = $id; // if relevant, tag for password generation @@ -338,10 +368,10 @@ class auth_plugin_db { set_user_preference('create_password', 1, $id); } } else { + echo "\t"; print_string('auth_dbinsertusererror', 'auth', $user->username); echo "\n"; } - $CFG->debug=$old_debug; } commit_sql(); unset($add_users); // free mem @@ -351,32 +381,37 @@ class auth_plugin_db { function user_exists ($username) { + $textlib = textlib_get_instance(); + $extusername = $textlib->convert(stripslashes($username), 'utf-8', $this->config->extencoding); + // Connect to the external database (forcing new connection) $authdb = &ADONewConnection($this->config->type); - $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); + if (!empty($this->config->debugauthdb)) { + $authdb->debug = true; + ob_start();//start output buffer to allow later use of the page headers + } + $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); $authdb->SetFetchMode(ADODB_FETCH_ASSOC); + if (!empty($this->config->setupsql)) { + $authdb->Execute($this->config->setupsql); + } - $rs = $authdb->Execute("SELECT * FROM {$this->config->table} - WHERE {$this->config->fielduser} = '$username' "); + $rs = $authdb->Execute("SELECT * FROM {$this->config->table} + WHERE {$this->config->fielduser} = '".$this->ext_addslashes($extusername)."' "); $authdb->Close(); if (!$rs) { print_error('auth_dbcantconnect','auth'); return false; } - + if ( $rs->RecordCount() ) { // user exists exterally - // check username/password internally - // ?? there is no $password variable, so why?? - /*if ($user = get_record('user', 'username', $username)) { - return ($user->password == md5($password)); - }*/ return $rs->RecordCount(); } else { // user does not exist externally return false; - } + } } @@ -384,8 +419,15 @@ class auth_plugin_db { // Connect to the external database (forcing new connection) $authdb = &ADONewConnection($this->config->type); - $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); + if (!empty($this->config->debugauthdb)) { + $authdb->debug = true; + ob_start();//start output buffer to allow later use of the page headers + } + $authdb->Connect($this->config->host, $this->config->user, $this->config->pass, $this->config->name, true); $authdb->SetFetchMode(ADODB_FETCH_ASSOC); + if (!empty($this->config->setupsql)) { + $authdb->Execute($this->config->setupsql); + } // fetch userlist $rs = $authdb->Execute("SELECT {$this->config->fielduser} AS username @@ -396,7 +438,7 @@ class auth_plugin_db { print_error('auth_dbcantconnect','auth'); return false; } - + if ( $rs->RecordCount() ) { $userlist = array(); while ($rec = rs_fetch_next_record($rs)) { @@ -405,31 +447,33 @@ class auth_plugin_db { return $userlist; } else { return array(); - } + } } /** * reads userinformation from DB and return it in an object * - * @param string $username username + * @param string $username username (with system magic quotes) * @return array */ function get_userinfo_asobj($username) { $user_array = truncate_userinfo($this->get_userinfo($username)); - $user = new object; + $user = new object(); foreach($user_array as $key=>$value) { $user->{$key} = $value; } return $user; } - /* - * will update a local user record from an external source. - * is a lighter version of the one in moodlelib -- won't do + /** + * will update a local user record from an external source. + * is a lighter version of the one in moodlelib -- won't do * expensive ops such as enrolment * - * If you don't pass $updatekeys, there is a performance hit and + * If you don't pass $updatekeys, there is a performance hit and * values removed from DB won't be removed from moodle. + * + * @param string $username username (with system magic quotes) */ function db_update_user_record($username, $updatekeys=false) { global $CFG; @@ -438,7 +482,7 @@ class auth_plugin_db { //just in case check text case $username = trim(moodle_strtolower($username)); - + // get the current user record $user = get_record('user', 'username', $username, 'mnethostid', $CFG->mnet_localhost_id); if (empty($user)) { // trouble @@ -450,25 +494,24 @@ class auth_plugin_db { // Ensure userid is not overwritten $userid = $user->id; - // TODO: this had a function_exists() - now we have a $this + // TODO: this had a function_exists() - now we have a $this if ($newinfo = $this->get_userinfo($username)) { $newinfo = truncate_userinfo($newinfo); - + if (empty($updatekeys)) { // all keys? this does not support removing values $updatekeys = array_keys($newinfo); } - + foreach ($updatekeys as $key) { - unset($value); if (isset($newinfo[$key])) { $value = $newinfo[$key]; - $value = addslashes(stripslashes($value)); // Just in case } else { $value = ''; } - if (!empty($this->config->{'field_updatelocal_' . $key})) { + + if (!empty($this->config->{'field_updatelocal_' . $key})) { if ($user->{$key} != $value) { // only update if it's changed - set_field('user', $key, $value, 'id', $userid); + set_field('user', $key, addslashes($value), 'id', $userid); } } } @@ -476,9 +519,11 @@ class auth_plugin_db { return get_record_select("user", "id = '$userid' AND deleted <> '1'"); } - // A chance to validate form data, and last chance to - // do stuff before it is inserted in config_plugin - function validate_form(&$form, &$err) { + /** + * A chance to validate form data, and last chance to + * do stuff before it is inserted in config_plugin + */ + function validate_form(&$form, &$err) { if ($form->passtype === 'internal') { $this->config->changepasswordurl = ''; set_config('changepasswordurl', '', 'auth/db'); @@ -524,7 +569,7 @@ class auth_plugin_db { * @param array $page An object containing all the data for this page. */ function config_form($config, $err) { - include "config.html"; + include 'config.html'; } /** @@ -533,51 +578,78 @@ class auth_plugin_db { function process_config($config) { // set to defaults if undefined if (!isset($config->host)) { - $config->host = "localhost"; + $config->host = 'localhost'; } if (!isset($config->type)) { - $config->type = "mysql"; + $config->type = 'mysql'; + } + if (!isset($config->sybasequoting)) { + $config->sybasequoting = 0; } if (!isset($config->name)) { - $config->name = ""; + $config->name = ''; } if (!isset($config->user)) { - $config->user = ""; + $config->user = ''; } if (!isset($config->pass)) { - $config->pass = ""; + $config->pass = ''; } if (!isset($config->table)) { - $config->table = ""; + $config->table = ''; } if (!isset($config->fielduser)) { - $config->fielduser = ""; + $config->fielduser = ''; } if (!isset($config->fieldpass)) { - $config->fieldpass = ""; + $config->fieldpass = ''; } if (!isset($config->passtype)) { - $config->passtype = "plaintext"; + $config->passtype = 'plaintext'; + } + if (!isset($config->extencoding)) { + $config->extencoding = 'utf-8'; + } + if (!isset($config->setupsql)) { + $config->setupsql = ''; + } + if (!isset($config->debugauthdb)) { + $config->debugauthdb = 0; } if (!isset($config->changepasswordurl)) { $config->changepasswordurl = ''; } + $config = stripslashes_recursive($config); // save settings - set_config('host', $config->host, 'auth/db'); - set_config('type', $config->type, 'auth/db'); - set_config('name', $config->name, 'auth/db'); - set_config('user', $config->user, 'auth/db'); - set_config('pass', $config->pass, 'auth/db'); - set_config('table', $config->table, 'auth/db'); - set_config('fielduser', $config->fielduser, 'auth/db'); - set_config('fieldpass', $config->fieldpass, 'auth/db'); - set_config('passtype', $config->passtype, 'auth/db'); - set_config('changepasswordurl', $config->changepasswordurl, 'auth/db'); - + set_config('host', $config->host, 'auth/db'); + set_config('type', $config->type, 'auth/db'); + set_config('sybasequoting', $config->sybasequoting, 'auth/db'); + set_config('name', $config->name, 'auth/db'); + set_config('user', $config->user, 'auth/db'); + set_config('pass', $config->pass, 'auth/db'); + set_config('table', $config->table, 'auth/db'); + set_config('fielduser', $config->fielduser, 'auth/db'); + set_config('fieldpass', $config->fieldpass, 'auth/db'); + set_config('passtype', $config->passtype, 'auth/db'); + set_config('extencoding', trim($config->extencoding), 'auth/db'); + set_config('setupsql', trim($config->setupsql), 'auth/db'); + set_config('debugauthdb', $config->debugauthdb, 'auth/db'); + set_config('changepasswordurl', trim($config->changepasswordurl), 'auth/db'); + return true; } + function ext_addslashes($text) { + // using custom made function for now + if (empty($this->config->sybasequoting)) { + $text = str_replace('\\', '\\\\', $text); + $text = str_replace(array('\'', '"', "\0"), array('\\\'', '\\"', '\\0'), $text); + } else { + $text = str_replace("'", "''", $text); + } + return $text; + } } ?> diff --git a/auth/db/auth_db_sync_users.php b/auth/db/auth_db_sync_users.php index c9bcac97a9..6b0965224f 100644 --- a/auth/db/auth_db_sync_users.php +++ b/auth/db/auth_db_sync_users.php @@ -1,23 +1,25 @@ libdir.'/blocklib.php'); +require_once($CFG->libdir.'/moodlelib.php'); require_once($CFG->dirroot.'/course/lib.php'); -require_once($CFG->dirroot.'/lib/blocklib.php'); require_once($CFG->dirroot.'/mod/resource/lib.php'); -require_once($CFG->dirroot.'/lib/moodlelib.php'); require_once($CFG->dirroot.'/mod/forum/lib.php'); -$CFG->debug=10; $dbauth = get_auth_plugin('db'); $dbauth->sync_users(true); diff --git a/auth/db/config.html b/auth/db/config.html index 09d70f4f0a..52a15b90b6 100644 --- a/auth/db/config.html +++ b/auth/db/config.html @@ -7,6 +7,9 @@ if (!isset($config->type)) { $config->type = "mysql"; } + if (!isset($config->sybasequoting)) { + $config->sybasequoting = 0; + } if (!isset($config->name)) { $config->name = ""; } @@ -31,6 +34,15 @@ if (!isset($config->changepasswordurl)) { $config->changepasswordurl = ''; } + if (empty($config->extencoding)) { + $config->extencoding = 'utf-8'; + } + if (empty($config->debugauthdb)) { + $config->debugauthdb = 0; + } + if (!isset($config->setupsql)) { + $config->setupsql = ''; + } $pluginconfig = get_config('auth/db'); @@ -38,30 +50,30 @@ - + - + - + + + + + + + - + - + - + - + - + - + + + + + + + - + + + + + + + + + + + + + -Specify the format that the password field is using. MD5 encryption is useful for connecting to other common web applications like PostNuke.

Use \'internal\' if you want to the external DB to manage usernames & email addresses, but Moodle to manage passwords. If you use \'internal\', you must provide a populated email address field in the external DB, and you must execute admin/cron.php regularly. Moodle will send an email to new users with a temporary password.

'; +$string['auth_dbpasstype'] = '

Specify the format that the password field is using. MD5 hashing is useful for connecting to other common web applications like PostNuke.

Use \'internal\' if you want to the external DB to manage usernames & email addresses, but Moodle to manage passwords. If you use \'internal\', you must provide a populated email address field in the external DB, and you must execute both admin/cron.php and auth/db/auth_db_sync_users.php regularly. Moodle will send an email to new users with a temporary password.

'; $string['auth_dbtable'] = 'Name of the table in the database'; -$string['auth_dbtitle'] = 'Use an external database'; +$string['auth_dbtitle'] = 'External database'; $string['auth_dbtype'] = 'The database type (See the ADOdb documentation for details)'; $string['auth_dbuser'] = 'Username with read access to the database'; $string['auth_dbcantconnect'] ='Could not connect to the specified authentication database...'; @@ -64,10 +64,14 @@ $string['auth_dbuserstoadd'] = 'User entries to add: $a'; $string['auth_dbrevive'] = 'Revived user $a[0] id $a[1]'; $string['auth_dbinsertuser'] ='inserted user $a[0] id $a[1]'; $string['auth_dbinsertusererror'] = 'error inserting user $a'; +$string['auth_dbdeleteuser'] ='deleted user $a[0] id $a[1]'; +$string['auth_dbdeleteusererror'] = 'error deleting user $a'; $string['auth_dbuserstoremove'] = 'User entries to remove: $a'; $string['auth_dbusernotexist'] = 'Cannot update non-existent user: $a'; $string['auth_dbhost_key'] = 'Host'; $string['auth_dbtype_key'] = 'Database'; +$string['auth_dbsybasequoting'] = 'Use sybase quotes'; +$string['auth_dbsybasequotinghelp'] = 'Sybase style single quote escaping - needed for Oracle, MS SQL and some other databases. Do not use for MySQL!'; $string['auth_dbname_key'] = 'DB Name'; $string['auth_dbuser_key'] = 'DB User'; $string['auth_dbpass_key'] = 'Password'; @@ -75,6 +79,12 @@ $string['auth_dbtable_key'] = 'Table'; $string['auth_dbfielduser_key'] = 'Username field'; $string['auth_dbfieldpass_key'] = 'Password field'; $string['auth_dbpasstype_key'] = 'Password format'; +$string['auth_dbextencoding'] = 'External db encoding'; +$string['auth_dbextencodinghelp'] = 'Encoding used in external database'; +$string['auth_dbsetupsql'] = 'SQL setup command'; +$string['auth_dbsetupsqlhelp'] = 'SQL command for special database setup, often used to setup communication encoding - example for MySQL and PostgreSQL: SET NAMES \'utf8\''; +$string['auth_dbdebugauthdb'] = 'Debug ADOdb'; +$string['auth_dbdebugauthdbhelp'] = 'Debug ADOdb connection to external database - use when getting empty page during login. Not suitable for production sites.'; $string['auth_dbchangepasswordurl_key'] = 'Password-change URL'; // Email plugin @@ -286,11 +296,12 @@ $string['forcechangepasswordfirst_help'] = 'Force users to change password on th $string['guestloginbutton'] = 'Guest login button'; $string['instructions'] = 'Instructions'; $string['internal'] = 'Internal'; -$string['md5'] = 'MD5 encryption'; +$string['md5'] = 'MD5 hash'; $string['passwordhandling'] = 'Password field handling'; $string['plaintext'] = 'Plain text'; $string['selfregistration'] = 'Self registration'; $string['selfregistration_help'] = 'Choose which auth plugin will handle user self-registration.'; +$string['sha1'] = 'SHA1 hash'; $string['showguestlogin'] = 'You can hide or show the guest login button on the login page.'; $string['stdchangepassword'] = 'Use standard Change Password Page'; $string['stdchangepassword_expl'] = 'If the external authentication system allows password changes through Moodle, switch this to Yes. This setting overrides \'Change Password URL\'.';
: - +
: - type, ""); ?> - + @@ -69,24 +81,37 @@
: - + +
+
: - +
: - +
: - +
: - +
: - +
: - passtype, ""); @@ -175,10 +201,46 @@
+ + +
: - + +
+ +
+