]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-8542 External db auth cleanup
authorskodak <skodak>
Fri, 16 Feb 2007 10:45:53 +0000 (10:45 +0000)
committerskodak <skodak>
Fri, 16 Feb 2007 10:45:53 +0000 (10:45 +0000)
* 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

auth/db/auth.php
auth/db/auth_db_sync_users.php
auth/db/config.html
lang/en_utf8/auth.php

index d01ecc97e0febd5262652b632c5ddccea5bcb1ba..bb370dc28be8de2b5c43dab3b78cb5a2647539ec 100644 (file)
@@ -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;
+    }
 }
 
 ?>
index c9bcac97a9a95ba18dc68ea3e8d2d619b684584b..6b0965224ff06018b8034ed3dbac00b3b3d9145a 100644 (file)
@@ -1,23 +1,25 @@
 <?php
 /** auth_db_sync_users.php
- * 
- * This script is meant to be called from a cronjob to sync moodle with the LDAP 
- * backend in those setups where the LDAP backend acts as 'master'.
- * 
+ *
+ * This script is meant to be called from a system cronjob to
+ * sync moodle user accounts with external database.
+ *
+ * It is required for internal password format.
+ *
  * Recommended cron entry:
  * # 5 minutes past 4am
  * 5 4 * * * /usr/bin/php -c /etc/php4/cli/php.ini /var/www/moodle/auth/db/auth_db_sync_users.php
- * 
- * Notes: 
+ *
+ * Notes:
  *   - If you have a large number of users, you may want to raise the memory limits
  *     by passing -d memory_limit=256M
  *   - For debugging & better logging, you are encouraged to use in the command line:
  *     -d log_errors=1 -d error_reporting=E_ALL -d display_errors=0 -d html_errors=0
- *     
+ *
  * Performance notes:
- * + The code is simpler, but not as optimized as its LDAP counterpart. 
- * 
- *    
+ * + The code is simpler, but not as optimized as its LDAP counterpart.
+ *
+ *
  */
 
 
@@ -26,14 +28,15 @@ if (!empty($_SERVER['GATEWAY_INTERFACE'])) {
     exit;
 }
 
+$nomoodlecookie = true; // cookie not needed
+
 require_once(dirname(dirname(dirname(__FILE__))).'/config.php'); // global moodle config file.
 
+require_once($CFG->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);
 
index 09d70f4f0ac1bf22c99c1518c80599fb5616e1ce..52a15b90b60cb15620a2914cbe2f1b7572fd6ee2 100644 (file)
@@ -7,6 +7,9 @@
     if (!isset($config->type)) {
         $config->type = "mysql";
     }
+    if (!isset($config->sybasequoting)) {
+        $config->sybasequoting = 0;
+    }
     if (!isset($config->name)) {
         $config->name = "";
     }
     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');
 
 <table cellspacing="0" cellpadding="5" border="0" align="center">
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbhost_key", "auth") ?>: </td>
+    <td align="right"><label for="host"><?php print_string("auth_dbhost_key", "auth") ?></label></td>
     <td>
-        <input name="host" type="text" size="30" value="<?php echo $config->host?>" />
+        <input id="host" name="host" type="text" size="30" value="<?php echo $config->host?>" />
         <?php
 
         if (isset($err["host"])) {
             formerr($err["host"]);
         }
-        
+
         ?>
     </td>
     <td><?php print_string("auth_dbhost", "auth") ?></td>
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbtype_key", "auth") ?>: </td>
+    <td align="right"><label for="menutype"><?php print_string("auth_dbtype_key", "auth") ?></label></td>
     <td>
-    <?php  $dbtypes = array("access","ado_access", "ado", "ado_mssql", "borland_ibase", "csv", "db2", "fbsql", "firebird", "ibase", "informix72", "informix", "mssql", "mssql_n", "mysql", "mysqlt", "oci805", "oci8", "oci8po", "odbc", "odbc_mssql", "odbc_oracle", "oracle", "postgres64", "postgres7", "postgres", "proxy", "sqlanywhere", "sybase", "vfp");
+    <?php  $dbtypes = array("access","ado_access", "ado", "ado_mssql", "borland_ibase", "csv", "db2", "fbsql", "firebird", "ibase", "informix72", "informix", "mssql", "mssql_n", "mysql", "mysqli", "mysqlt", "oci805", "oci8", "oci8po", "odbc", "odbc_mssql", "odbc_oracle", "oracle", "postgres64", "postgres7", "postgres", "proxy", "sqlanywhere", "sybase", "vfp");
        foreach ($dbtypes as $dbtype) {
            $dboptions[$dbtype] = $dbtype;
        }
        choose_from_menu($dboptions, "type", $config->type, "");
     ?>
-      
+
     </td>
     <td>
     <?php  print_string("auth_dbtype","auth") ?>
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbname_key", "auth") ?>: </td>
+    <td align="right"><label for="sybasequoting"><?php print_string("auth_dbsybasequoting", "auth") ?></label></td>
     <td>
-        <input name="name" type="text" size="30" value="<?php echo $config->name?>" />
+        <select id="sybasequoting" name="sybasequoting">
+            <option value="0" <?php echo ($config->sybasequoting ? '' : 'selected="yes"') ?> >
+                <?php  print_string('no')  ?></option>
+            <option value="1" <?php echo ($config->sybasequoting ? 'selected="yes"' : '') ?> >
+                <?php  print_string('yes') ?></option>
+        </select>
+    </td>
+    <td><?php print_string("auth_dbsybasequotinghelp", "auth") ?></td>
+</tr>
+
+<tr valign="top" class="required">
+    <td align="right"><label for="name"><?php print_string("auth_dbname_key", "auth") ?></label></td>
+    <td>
+        <input id="name" name="name" type="text" size="30" value="<?php echo $config->name?>" />
         <?php
 
         if (isset($err["name"])) {
             formerr($err["name"]);
         }
-        
+
         ?>
     </td>
     <td><?php print_string("auth_dbname", "auth") ?></td>
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbuser_key", "auth") ?>: </td>
+    <td align="right"><label for="user"><?php print_string("auth_dbuser_key", "auth") ?></label></td>
     <td>
-        <input name="user" type="text" size="30" value="<?php echo $config->user?>" />
+        <input id="user" name="user" type="text" size="30" value="<?php echo $config->user?>" />
         <?php
 
         if (isset($err["user"])) {
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbpass_key", "auth") ?>: </td>
+    <td align="right"><label for="pass"><?php print_string("auth_dbpass_key", "auth") ?></label></td>
     <td>
-        <input name="pass" type="text" size="30" value="<?php echo $config->pass?>" />
+        <input id="pass" name="pass" type="text" size="30" value="<?php echo $config->pass?>" />
         <?php
 
         if (isset($err["pass"])) {
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbtable_key", "auth") ?>: </td>
+    <td align="right"><label for="table"><?php print_string("auth_dbtable_key", "auth") ?></label></td>
     <td>
-        <input name="table" type="text" size="30" value="<?php echo $config->table?>" />
+        <input id="table" name="table" type="text" size="30" value="<?php echo $config->table?>" />
         <?php
 
         if (isset($err["table"])) {
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbfielduser_key", "auth") ?>: </td>
+    <td align="right"><label for="fielduser"><?php print_string("auth_dbfielduser_key", "auth") ?></label></td>
     <td>
-        <input name="fielduser" type="text" size="30" value="<?php echo $config->fielduser?>" />
+        <input id="fielduser" name="fielduser" type="text" size="30" value="<?php echo $config->fielduser?>" />
         <?php
 
         if (isset($err["fielduser"])) {
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbfieldpass_key", "auth") ?>: </td>
+    <td align="right"><label for="fieldpass"><?php print_string("auth_dbfieldpass_key", "auth") ?></label></td>
     <td>
-        <input name="fieldpass" type="text" size="30" value="<?php echo $config->fieldpass?>" />
+        <input id="fieldpass" name="fieldpass" type="text" size="30" value="<?php echo $config->fieldpass?>" />
         <?php
 
         if (isset($err["fieldpass"])) {
 </tr>
 
 <tr valign="top" class="required">
-    <td align="right"><?php print_string("auth_dbpasstype_key", "auth") ?>: </td>
+    <td align="right"><label for="menupasstype"><?php print_string("auth_dbpasstype_key", "auth") ?></label></td>
     <td>
-        <?php  
+        <?php
 
         $passtype["plaintext"] = get_string("plaintext", "auth");
         $passtype["md5"]       = get_string("md5", "auth");
+        $passtype["sha1"]      = get_string("sha1", "auth");
         $passtype["internal"]  = get_string("internal", "auth");
         choose_from_menu($passtype, "passtype", $config->passtype, "");
 
     <td><?php print_string("auth_dbpasstype", "auth") ?></td>
 </tr>
 
+<tr valign="top" class="required">
+    <td align="right"><label for="extencoding"><?php print_string("auth_dbextencoding", "auth") ?></label></td>
+    <td>
+        <input id="extencoding" name="extencoding" type="text" value="<?php echo $config->extencoding ?>" />
+        <?php
+
+        if (isset($err['extencoding'])) {
+            formerr($err['extencoding']);
+        }
+
+        ?>
+    </td>
+    <td><?php print_string('auth_dbextencodinghelp', 'auth') ?></td>
+</tr>
+
 <tr valign="top">
-    <td align="right"><?php print_string("auth_dbchangepasswordurl_key", "auth") ?>: </td>
+    <td align="right"><label for="setupsql"><?php print_string("auth_dbsetupsql", "auth") ?></label></td>
     <td>
-        <input name="changepasswordurl" type="text" value="<?php echo $config->changepasswordurl ?>" />
+        <input id="setupsql" name="setupsql" type="text" value="<?php echo $config->setupsql ?>" />
+    </td>
+    <td><?php print_string('auth_dbsetupsqlhelp', 'auth') ?></td>
+</tr>
+
+<tr valign="top">
+    <td align="right"><label for="debugauthdb"><?php print_string("auth_dbdebugauthdb", "auth") ?></label></td>
+    <td>
+        <select id="debugauthdb" name="debugauthdb">
+            <option value="0" <?php echo ($config->debugauthdb ? '' : 'selected="yes"') ?> >
+                <?php  print_string('no')  ?></option>
+            <option value="1" <?php echo ($config->debugauthdb ? 'selected="yes"' : '') ?> >
+                <?php  print_string('yes') ?></option>
+        </select>
+    </td>
+    <td><?php print_string("auth_dbdebugauthdbhelp", "auth") ?></td>
+</tr>
+
+<tr valign="top">
+    <td align="right"><label for="changepasswordurl"><?php print_string("auth_dbchangepasswordurl_key", "auth") ?></label></td>
+    <td>
+        <input id="changepasswordurl" name="changepasswordurl" type="text" value="<?php echo $config->changepasswordurl ?>" />
         <?php
 
         if (isset($err['changepasswordurl'])) {
     </td>
     <td><?php print_string('changepasswordhelp', 'auth') ?></td>
 </tr>
-<?php 
+<?php
 
 global $user_fields;
 print_auth_lock_options('db', $user_fields, get_string('auth_dbextrafields', 'auth'), true, false);
index ec9e026d9520be12ee126430c64757b5c82852dc..d798f40188b05a3a4cb98fe5f8fe31c9249e927f 100644 (file)
@@ -54,9 +54,9 @@ $string['auth_dbfielduser'] = 'Name of the field containing usernames';
 $string['auth_dbhost'] = 'The computer hosting the database server.';
 $string['auth_dbname'] = 'Name of the database itself';
 $string['auth_dbpass'] = 'Password matching the above username';
-$string['auth_dbpasstype'] = '<p>Specify the format that the password field is using. MD5 encryption is useful for connecting to other common web applications like PostNuke.</p> <p>Use \'internal\' if you want to the external DB to manage usernames &amp; email addresses, but Moodle to manage passwords. If you use \'internal\', you <i>must</i> 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.</p>';
+$string['auth_dbpasstype'] = '<p>Specify the format that the password field is using. MD5 hashing is useful for connecting to other common web applications like PostNuke.</p> <p>Use \'internal\' if you want to the external DB to manage usernames &amp; email addresses, but Moodle to manage passwords. If you use \'internal\', you <i>must</i> 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.</p>';
 $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 <a href=\"../lib/adodb/readme.htm#drivers\">ADOdb documentation</a> 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: <em>SET NAMES \'utf8\'</em>';
+$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\'.';