[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/auth/db/tests/ -> db_test.php (source)

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * External database auth sync tests, this also tests adodb drivers
  19   * that are matching our four supported Moodle database drivers.
  20   *
  21   * @package    auth_db
  22   * @category   phpunit
  23   * @copyright  2012 Petr Skoda {@link http://skodak.org}
  24   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  25   */
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  
  30  class auth_db_testcase extends advanced_testcase {
  31      /** @var string Original error log */
  32      protected $oldlog;
  33  
  34      protected function init_auth_database() {
  35          global $DB, $CFG;
  36          require_once("$CFG->dirroot/auth/db/auth.php");
  37  
  38          // Discard error logs from AdoDB.
  39          $this->oldlog = ini_get('error_log');
  40          ini_set('error_log', "$CFG->dataroot/testlog.log");
  41  
  42          $dbman = $DB->get_manager();
  43  
  44          set_config('extencoding', 'utf-8', 'auth/db');
  45  
  46          set_config('host', $CFG->dbhost, 'auth/db');
  47          set_config('user', $CFG->dbuser, 'auth/db');
  48          set_config('pass', $CFG->dbpass, 'auth/db');
  49          set_config('name', $CFG->dbname, 'auth/db');
  50  
  51          if (!empty($CFG->dboptions['dbport'])) {
  52              set_config('host', $CFG->dbhost.':'.$CFG->dboptions['dbport'], 'auth/db');
  53          }
  54  
  55          switch ($DB->get_dbfamily()) {
  56  
  57              case 'mysql':
  58                  set_config('type', 'mysqli', 'auth/db');
  59                  set_config('setupsql', "SET NAMES 'UTF-8'", 'auth/db');
  60                  set_config('sybasequoting', '0', 'auth/db');
  61                  if (!empty($CFG->dboptions['dbsocket'])) {
  62                      $dbsocket = $CFG->dboptions['dbsocket'];
  63                      if ((strpos($dbsocket, '/') === false and strpos($dbsocket, '\\') === false)) {
  64                          $dbsocket = ini_get('mysqli.default_socket');
  65                      }
  66                      set_config('type', 'mysqli://'.rawurlencode($CFG->dbuser).':'.rawurlencode($CFG->dbpass).'@'.rawurlencode($CFG->dbhost).'/'.rawurlencode($CFG->dbname).'?socket='.rawurlencode($dbsocket), 'auth/db');
  67                  }
  68                  break;
  69  
  70              case 'oracle':
  71                  set_config('type', 'oci8po', 'auth/db');
  72                  set_config('sybasequoting', '1', 'auth/db');
  73                  break;
  74  
  75              case 'postgres':
  76                  set_config('type', 'postgres7', 'auth/db');
  77                  $setupsql = "SET NAMES 'UTF-8'";
  78                  if (!empty($CFG->dboptions['dbschema'])) {
  79                      $setupsql .= "; SET search_path = '".$CFG->dboptions['dbschema']."'";
  80                  }
  81                  set_config('setupsql', $setupsql, 'auth/db');
  82                  set_config('sybasequoting', '0', 'auth/db');
  83                  if (!empty($CFG->dboptions['dbsocket']) and ($CFG->dbhost === 'localhost' or $CFG->dbhost === '127.0.0.1')) {
  84                      if (strpos($CFG->dboptions['dbsocket'], '/') !== false) {
  85                          $socket = $CFG->dboptions['dbsocket'];
  86                          if (!empty($CFG->dboptions['dbport'])) {
  87                              $socket .= ':' . $CFG->dboptions['dbport'];
  88                          }
  89                          set_config('host', $socket, 'auth/db');
  90                      } else {
  91                          set_config('host', '', 'auth/db');
  92                      }
  93                  }
  94                  break;
  95  
  96              case 'mssql':
  97                  if (get_class($DB) == 'mssql_native_moodle_database') {
  98                      set_config('type', 'mssql_n', 'auth/db');
  99                  } else {
 100                      set_config('type', 'mssqlnative', 'auth/db');
 101                  }
 102                  set_config('sybasequoting', '1', 'auth/db');
 103                  break;
 104  
 105              default:
 106                  throw new exception('Unknown database family ' . $DB->get_dbfamily());
 107          }
 108  
 109          $table = new xmldb_table('auth_db_users');
 110          $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
 111          $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, null, null);
 112          $table->add_field('pass', XMLDB_TYPE_CHAR, '255', null, null, null);
 113          $table->add_field('email', XMLDB_TYPE_CHAR, '255', null, null, null);
 114          $table->add_field('firstname', XMLDB_TYPE_CHAR, '255', null, null, null);
 115          $table->add_field('lastname', XMLDB_TYPE_CHAR, '255', null, null, null);
 116          $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
 117          if ($dbman->table_exists($table)) {
 118              $dbman->drop_table($table);
 119          }
 120          $dbman->create_table($table);
 121          set_config('table', $CFG->prefix.'auth_db_users', 'auth/db');
 122          set_config('fielduser', 'name', 'auth/db');
 123          set_config('fieldpass', 'pass', 'auth/db');
 124  
 125          // Setu up field mappings.
 126  
 127          set_config('field_map_email', 'email', 'auth/db');
 128          set_config('field_updatelocal_email', 'oncreate', 'auth/db');
 129          set_config('field_updateremote_email', '0', 'auth/db');
 130          set_config('field_lock_email', 'unlocked', 'auth/db');
 131  
 132          // Init the rest of settings.
 133          set_config('passtype', 'plaintext', 'auth/db');
 134          set_config('changepasswordurl', '', 'auth/db');
 135          set_config('debugauthdb', 0, 'auth/db');
 136          set_config('removeuser', AUTH_REMOVEUSER_KEEP, 'auth/db');
 137      }
 138  
 139      protected function cleanup_auth_database() {
 140          global $DB;
 141  
 142          $dbman = $DB->get_manager();
 143          $table = new xmldb_table('auth_db_users');
 144          $dbman->drop_table($table);
 145  
 146          ini_set('error_log', $this->oldlog);
 147      }
 148  
 149      public function test_plugin() {
 150          global $DB, $CFG;
 151  
 152          $this->resetAfterTest(false);
 153  
 154          // NOTE: It is strongly discouraged to create new tables in advanced_testcase classes,
 155          //       but there is no other simple way to test ext database enrol sync, so let's
 156          //       disable transactions are try to cleanup after the tests.
 157  
 158          $this->preventResetByRollback();
 159  
 160          $this->init_auth_database();
 161  
 162          /** @var auth_plugin_db $auth */
 163          $auth = get_auth_plugin('db');
 164  
 165          $authdb = $auth->db_init();
 166  
 167  
 168          // Test adodb may access the table.
 169  
 170          $user1 = (object)array('name'=>'u1', 'pass'=>'heslo', 'email'=>'[email protected]');
 171          $user1->id = $DB->insert_record('auth_db_users', $user1);
 172  
 173  
 174          $sql = "SELECT * FROM {$auth->config->table}";
 175          $rs = $authdb->Execute($sql);
 176          $this->assertInstanceOf('ADORecordSet', $rs);
 177          $this->assertFalse($rs->EOF);
 178          $fields = $rs->FetchRow();
 179          $this->assertTrue(is_array($fields));
 180          $this->assertTrue($rs->EOF);
 181          $rs->Close();
 182  
 183          $authdb->Close();
 184  
 185  
 186          // Test bulk user account creation.
 187  
 188          $user2 = (object)array('name'=>'u2', 'pass'=>'heslo', 'email'=>'[email protected]');
 189          $user2->id = $DB->insert_record('auth_db_users', $user2);
 190  
 191          $user3 = (object)array('name'=>'admin', 'pass'=>'heslo', 'email'=>'[email protected]'); // Should be skipped.
 192          $user3->id = $DB->insert_record('auth_db_users', $user3);
 193  
 194          $this->assertCount(2, $DB->get_records('user'));
 195  
 196          $trace = new null_progress_trace();
 197          $auth->sync_users($trace, false);
 198  
 199          $this->assertEquals(4, $DB->count_records('user'));
 200          $u1 = $DB->get_record('user', array('username'=>$user1->name, 'auth'=>'db'));
 201          $this->assertSame($user1->email, $u1->email);
 202          $u2 = $DB->get_record('user', array('username'=>$user2->name, 'auth'=>'db'));
 203          $this->assertSame($user2->email, $u2->email);
 204          $admin = $DB->get_record('user', array('username'=>'admin', 'auth'=>'manual'));
 205          $this->assertNotEmpty($admin);
 206  
 207  
 208          // Test sync updates.
 209  
 210          $user2b = clone($user2);
 211          $user2b->email = '[email protected]';
 212          $DB->update_record('auth_db_users', $user2b);
 213  
 214          $auth->sync_users($trace, false);
 215          $this->assertEquals(4, $DB->count_records('user'));
 216          $u2 = $DB->get_record('user', array('username'=>$user2->name));
 217          $this->assertSame($user2->email, $u2->email);
 218  
 219          $auth->sync_users($trace, true);
 220          $this->assertEquals(4, $DB->count_records('user'));
 221          $u2 = $DB->get_record('user', array('username'=>$user2->name));
 222          $this->assertSame($user2->email, $u2->email);
 223  
 224          set_config('field_updatelocal_email', 'onlogin', 'auth/db');
 225          $auth->config->field_updatelocal_email = 'onlogin';
 226  
 227          $auth->sync_users($trace, false);
 228          $this->assertEquals(4, $DB->count_records('user'));
 229          $u2 = $DB->get_record('user', array('username'=>$user2->name));
 230          $this->assertSame($user2->email, $u2->email);
 231  
 232          $auth->sync_users($trace, true);
 233          $this->assertEquals(4, $DB->count_records('user'));
 234          $u2 = $DB->get_record('user', array('username'=>$user2->name));
 235          $this->assertSame($user2b->email, $u2->email);
 236  
 237  
 238          // Test sync deletes and suspends.
 239  
 240          $DB->delete_records('auth_db_users', array('id'=>$user2->id));
 241          $this->assertCount(2, $DB->get_records('auth_db_users'));
 242          unset($user2);
 243          unset($user2b);
 244  
 245          $auth->sync_users($trace, false);
 246          $this->assertEquals(4, $DB->count_records('user'));
 247          $this->assertEquals(0, $DB->count_records('user', array('deleted'=>1)));
 248          $this->assertEquals(0, $DB->count_records('user', array('suspended'=>1)));
 249  
 250          set_config('removeuser', AUTH_REMOVEUSER_SUSPEND, 'auth/db');
 251          $auth->config->removeuser = AUTH_REMOVEUSER_SUSPEND;
 252  
 253          $auth->sync_users($trace, false);
 254          $this->assertEquals(4, $DB->count_records('user'));
 255          $this->assertEquals(0, $DB->count_records('user', array('deleted'=>1)));
 256          $this->assertEquals(1, $DB->count_records('user', array('suspended'=>1)));
 257  
 258          $user2 = (object)array('name'=>'u2', 'pass'=>'heslo', 'email'=>'[email protected]');
 259          $user2->id = $DB->insert_record('auth_db_users', $user2);
 260  
 261          $auth->sync_users($trace, false);
 262          $this->assertEquals(4, $DB->count_records('user'));
 263          $this->assertEquals(0, $DB->count_records('user', array('deleted'=>1)));
 264          $this->assertEquals(0, $DB->count_records('user', array('suspended'=>1)));
 265  
 266          $DB->delete_records('auth_db_users', array('id'=>$user2->id));
 267  
 268          set_config('removeuser', AUTH_REMOVEUSER_FULLDELETE, 'auth/db');
 269          $auth->config->removeuser = AUTH_REMOVEUSER_FULLDELETE;
 270  
 271          $auth->sync_users($trace, false);
 272          $this->assertEquals(4, $DB->count_records('user'));
 273          $this->assertEquals(1, $DB->count_records('user', array('deleted'=>1)));
 274          $this->assertEquals(0, $DB->count_records('user', array('suspended'=>1)));
 275  
 276          $user2 = (object)array('name'=>'u2', 'pass'=>'heslo', 'email'=>'[email protected]');
 277          $user2->id = $DB->insert_record('auth_db_users', $user2);
 278  
 279          $auth->sync_users($trace, false);
 280          $this->assertEquals(5, $DB->count_records('user'));
 281          $this->assertEquals(1, $DB->count_records('user', array('deleted'=>1)));
 282          $this->assertEquals(0, $DB->count_records('user', array('suspended'=>1)));
 283  
 284  
 285          // Test user_login().
 286  
 287          $user3 = (object)array('name'=>'u3', 'pass'=>'heslo', 'email'=>'[email protected]');
 288          $user3->id = $DB->insert_record('auth_db_users', $user3);
 289  
 290          $this->assertFalse($auth->user_login('u4', 'heslo'));
 291          $this->assertTrue($auth->user_login('u1', 'heslo'));
 292  
 293          $this->assertFalse($DB->record_exists('user', array('username'=>'u3', 'auth'=>'db')));
 294          $this->assertTrue($auth->user_login('u3', 'heslo'));
 295          $this->assertFalse($DB->record_exists('user', array('username'=>'u3', 'auth'=>'db')));
 296  
 297          set_config('passtype', 'md5', 'auth/db');
 298          $auth->config->passtype = 'md5';
 299          $user3->pass = md5('heslo');
 300          $DB->update_record('auth_db_users', $user3);
 301          $this->assertTrue($auth->user_login('u3', 'heslo'));
 302  
 303          set_config('passtype', 'sh1', 'auth/db');
 304          $auth->config->passtype = 'sha1';
 305          $user3->pass = sha1('heslo');
 306          $DB->update_record('auth_db_users', $user3);
 307          $this->assertTrue($auth->user_login('u3', 'heslo'));
 308  
 309          set_config('passtype', 'internal', 'auth/db');
 310          $auth->config->passtype = 'internal';
 311          create_user_record('u3', 'heslo', 'db');
 312          $this->assertTrue($auth->user_login('u3', 'heslo'));
 313  
 314  
 315          $DB->delete_records('auth_db_users', array('id'=>$user3->id));
 316  
 317          set_config('removeuser', AUTH_REMOVEUSER_KEEP, 'auth/db');
 318          $auth->config->removeuser = AUTH_REMOVEUSER_KEEP;
 319          $this->assertTrue($auth->user_login('u3', 'heslo'));
 320  
 321          set_config('removeuser', AUTH_REMOVEUSER_SUSPEND, 'auth/db');
 322          $auth->config->removeuser = AUTH_REMOVEUSER_SUSPEND;
 323          $this->assertFalse($auth->user_login('u3', 'heslo'));
 324  
 325          set_config('removeuser', AUTH_REMOVEUSER_FULLDELETE, 'auth/db');
 326          $auth->config->removeuser = AUTH_REMOVEUSER_FULLDELETE;
 327          $this->assertFalse($auth->user_login('u3', 'heslo'));
 328  
 329          set_config('passtype', 'sh1', 'auth/db');
 330          $auth->config->passtype = 'sha1';
 331          $this->assertFalse($auth->user_login('u3', 'heslo'));
 332  
 333  
 334          // Test login create and update.
 335  
 336          $user4 = (object)array('name'=>'u4', 'pass'=>'heslo', 'email'=>'[email protected]');
 337          $user4->id = $DB->insert_record('auth_db_users', $user4);
 338  
 339          set_config('passtype', 'plaintext', 'auth/db');
 340          $auth->config->passtype = 'plaintext';
 341  
 342          $iuser4 = create_user_record('u4', 'heslo', 'db');
 343          $this->assertNotEmpty($iuser4);
 344          $this->assertSame($user4->name, $iuser4->username);
 345          $this->assertSame($user4->email, $iuser4->email);
 346          $this->assertSame('db', $iuser4->auth);
 347          $this->assertSame($CFG->mnet_localhost_id, $iuser4->mnethostid);
 348  
 349          $user4b = clone($user4);
 350          $user4b->email = '[email protected]';
 351          $DB->update_record('auth_db_users', $user4b);
 352  
 353          set_config('field_updatelocal_email', 'oncreate', 'auth/db');
 354          $auth->config->field_updatelocal_email = 'oncreate';
 355  
 356          update_user_record('u4');
 357          $iuser4 = $DB->get_record('user', array('id'=>$iuser4->id));
 358          $this->assertSame($user4->email, $iuser4->email);
 359  
 360          set_config('field_updatelocal_email', 'onlogin', 'auth/db');
 361          $auth->config->field_updatelocal_email = 'onlogin';
 362  
 363          update_user_record('u4');
 364          $iuser4 = $DB->get_record('user', array('id'=>$iuser4->id));
 365          $this->assertSame($user4b->email, $iuser4->email);
 366  
 367  
 368          // Test user_exists()
 369  
 370          $this->assertTrue($auth->user_exists('u1'));
 371          $this->assertTrue($auth->user_exists('admin'));
 372          $this->assertFalse($auth->user_exists('u3'));
 373          $this->assertTrue($auth->user_exists('u4'));
 374  
 375          $this->cleanup_auth_database();
 376      }
 377  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1