From 0a8d5edbdc8e3e251f29b7370fdc2e594b06446f Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Mon, 10 Nov 2008 20:17:09 +0000 Subject: Early look at the User/Auth module refactoring. It will look for a driver based on the contents of the user/config/user.php file. And load that driver based on the User_Driver interface. There is a default User_Gallery_Driver class that will provide the actual interface implementation. Replacing this driver will allow a completely different user and authentication implementation to be used... hopefully will reduce issues with embedding and other user management systems. Removed from unit tests so they will still run. --- modules/gallery_unit_test/controllers/test.php | 4 +- modules/user/config/user.php | 25 +++ modules/user/helpers/user_installer.php | 68 +------- modules/user/libraries/User.php | 196 ++++++++++++++++++++++++ modules/user/libraries/drivers/User.php | 60 ++++++++ modules/user/libraries/drivers/User/Gallery.php | 163 ++++++++++++++++++++ 6 files changed, 451 insertions(+), 65 deletions(-) create mode 100644 modules/user/config/user.php create mode 100644 modules/user/libraries/User.php create mode 100644 modules/user/libraries/drivers/User.php create mode 100644 modules/user/libraries/drivers/User/Gallery.php (limited to 'modules') diff --git a/modules/gallery_unit_test/controllers/test.php b/modules/gallery_unit_test/controllers/test.php index 203edcba..c50ba5c4 100644 --- a/modules/gallery_unit_test/controllers/test.php +++ b/modules/gallery_unit_test/controllers/test.php @@ -62,13 +62,13 @@ class Test_Controller extends Controller { // this way. Uninstall modules first and core last. Ignore errors during uninstall. try { comment_installer::uninstall(); - user_installer::uninstall(); +// user_installer::uninstall(); core_installer::uninstall(); } catch (Exception $e) { } core_installer::install(); - user_installer::install(); +// user_installer::install(); comment_installer::install(); print new Unit_Test(); diff --git a/modules/user/config/user.php b/modules/user/config/user.php new file mode 100644 index 00000000..9a82c5fd --- /dev/null +++ b/modules/user/config/user.php @@ -0,0 +1,25 @@ +where("name", "user")->find()->version; - } catch (Exception $e) { - if ($e->getCode() == E_DATABASE_ERROR) { - $base_version = 0; - } else { - Kohana::log("error", $e); - throw $e; - } - } - Kohana::log("debug", "base_version: $base_version"); - - if ($base_version == 0) { - $db->query("CREATE TABLE IF NOT EXISTS `users` ( - `id` int(9) NOT NULL auto_increment, - `name` varchar(255) NOT NULL, - `display_name` char(255) NOT NULL, - `email` int(9) default NULL, - PRIMARY KEY (`id`), - UNIQUE KEY(`display_name`)) - ENGINE=InnoDB DEFAULT CHARSET=utf8;"); - - $db->query("CREATE TABLE IF NOT EXISTS`groups` ( - `id` int(9) NOT NULL auto_increment, - `name` char(255) default NULL, - PRIMARY KEY (`id`), - UNIQUE KEY(`name`)) - ENGINE=InnoDB DEFAULT CHARSET=utf8;"); - - $db->query("CREATE TABLE IF NOT EXISTS `groups_users` ( - `group_id` int(9) NOT NULL, - `user_id` int(9) NOT NULL, - PRIMARY KEY (`group_id`, `user_id`), - UNIQUE KEY(`user_id`, `group_id`)) - ENGINE=InnoDB DEFAULT CHARSET=utf8;"); - - $user_module = ORM::factory("module")->where("name", "user")->find(); - $user_module->name = "user"; - $user_module->version = 1; - $user_module->save(); - - $user = ORM::factory("user")->where("display_name", "admin")->find(); - $user->name = "admin"; - $user->display_name = "Gallery Administrator"; - $user->save(); - $id = $user->id; - $db->query("UPDATE `items` SET `owner_id` = $id WHERE `owner_id` IS NULL"); - - foreach (array("administrator", "registered") as $group_name) { - $group = ORM::factory("group")->where("name", $group_name)->find(); - $group->name = $group_name; - $group->save(); - if (!$group->add($user)) { - throw new Exception("@todo {$user->name} WAS_NOT_ADDED_TO {$group_name}"); - } - } - } + $user = User::instance(); + $user->install(); } public static function uninstall() { - $db = Database::instance(); - $db->query("DROP TABLE IF EXISTS `users`;"); - $db->query("DROP TABLE IF EXISTS `groups`;"); - $db->query("DROP TABLE IF EXISTS `groups_users`;"); - ORM::factory("module")->where("name", "user")->find()->delete(); + Kohana::log("debug", "user_installer::install"); + $user = User::instance(); + $user->uninstall(); } } \ No newline at end of file diff --git a/modules/user/libraries/User.php b/modules/user/libraries/User.php new file mode 100644 index 00000000..a32c5691 --- /dev/null +++ b/modules/user/libraries/User.php @@ -0,0 +1,196 @@ +_driver = $driver; + $this->_config = $config; + + Kohana::log('debug', 'Auth Library initialized'); + } + + /** + * @see User_Driver::install + */ + public function install() { + $this->_driver->install(); + + $user_module = ORM::factory("module")->where("name", "user")->find(); + $user_module->name = "user"; + $user_module->version = 1; + $user_module->save(); + + $user = $this->_driver->get_user_by_name("admin"); + if (!$user->loaded) { + $user = $this->_driver->create_user("admin", "admin", "admin"); + } + + foreach (array("administrator", "registered") as $group_name) { + $group = $user = $this->_driver->get_group_by_name($group_name); + if (!$group->loaded) { + $group = $this->_driver->create_group($group_name); + // Don't assume we can use ORM relationship to join groups and users. Use the interface. + $this->_driver->add_user_to_group($group->id, $user->id); + } + } + + $db = Database::instance(); + $db->query("UPDATE `items` SET `owner_id` = {$user->id} WHERE `owner_id` IS NULL"); + } + + /** + * @see User_Driver::uninstall + */ + public function uninstall() { + $this->_driver->uninstall(); + ORM::factory("module")->where("name", "user")->find()->delete(); + } + + /** + * @see User_Driver::install + */ + public function create_user($name, $display_name, $password, $email=null) { + $this->_driver->create_user($name, $display_name, $password, $email); + } + + /** + * @see User_Driver::update_user + */ + public function update_user($id, $name, $display_name, $password, $email=null) { + $this->_driver->update_user($id, $name, $display_name, $password, $email); + } + + /** + * @see User_Driver::get_user + */ + public function get_user($id) { + $this->_driver->get_user($id); + } + + /** + * @see User_Driver::get_user_by_name + */ + public function get_user_by_name($name) { + $this->_driver->get_user_by_name($name); + } + + /** + * @see User_Driver::delete_user + */ + public function delete_user($id) { + $this->_driver->delete_user($id); + } + + /** + * @see User_Driver::create_group + */ + public function create_group($group_name) { + $this->_driver->create_group($group_name); + } + + /** + * @see User_Driver::rename_group + */ + public function rename_group($id, $new_name) { + $this->_driver->rename_group($id, $new_name); + } + + /** + * @see User_Driver::get_group + */ + public function get_group($id) { + $this->_driver->get_group($id); + } + + /** + * @see User_Driver::get_group_by_name + */ + public function get_group_by_name($group_name) { + $this->_driver->get_group_by_name($group_name); + } + + /** + * @see User_Driver::delete_group + */ + public function delete_group($id) { + $this->_driver->delete_group($id); + } + + /** + * @see User_Driver::add_user_to_group + */ + public function add_user_to_group($group_id, $user_id) { + $this->_driver->add_user_to_group($group_id, $user_id); + } + + /** + * @see User_Driver::remove_user_from_group + */ + public function remove_user_from_group($group_id, $user_id) { + $this->_driver->remove_user_from_group($group_id, $user_id); + } +} \ No newline at end of file diff --git a/modules/user/libraries/drivers/User.php b/modules/user/libraries/drivers/User.php new file mode 100644 index 00000000..1030f5e9 --- /dev/null +++ b/modules/user/libraries/drivers/User.php @@ -0,0 +1,60 @@ +where("name", "user")->find()->version; + } catch (Exception $e) { + if ($e->getCode() == E_DATABASE_ERROR) { + $base_version = 0; + } else { + Kohana::log("error", $e); + throw $e; + } + } + Kohana::log("debug", "base_version: $base_version"); + + if ($base_version == 0) { + $db->query("CREATE TABLE IF NOT EXISTS `users` ( + `id` int(9) NOT NULL auto_increment, + `name` varchar(255) NOT NULL, + `display_name` char(255) NOT NULL, + `password` varchar(128) NOT NULL, + `logins` int(10) unsigned NOT NULL default '0', + `last_login` int(10) unsigned NOT NULL default '0', + `email` int(9) default NULL, + PRIMARY KEY (`id`), + UNIQUE KEY(`display_name`)) + ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + + $db->query("CREATE TABLE IF NOT EXISTS`groups` ( + `id` int(9) NOT NULL auto_increment, + `name` char(255) default NULL, + PRIMARY KEY (`id`), + UNIQUE KEY(`name`)) + ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + + $db->query("CREATE TABLE IF NOT EXISTS `groups_users` ( + `group_id` int(9) NOT NULL, + `user_id` int(9) NOT NULL, + PRIMARY KEY (`group_id`, `user_id`), + UNIQUE KEY(`user_id`, `group_id`)) + ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + + } + } + + /** + * @see User_Driver::install + * + */ + public function uninstall() { + $db = Database::instance(); + $db->query("DROP TABLE IF EXISTS `users`;"); + $db->query("DROP TABLE IF EXISTS `groups`;"); + $db->query("DROP TABLE IF EXISTS `groups_users`;"); + } + + /** + * @see User_Driver::create_user + */ + public function create_user($name, $display_name, $password, $email=null) { + throw new Exception("@todo NOT_IMPLMENTED: create_user"); + } + + /** + * @see User_Driver::update_user + */ + public function update_user($id, $name, $display_name, $password, $email=null) { + throw new Exception("@todo NOT_IMPLMENTED: update_user"); + } + + /** + * @see User_Driver::get_user + */ + public function get_user($id) { + throw new Exception("@todo NOT_IMPLMENTED: get_user"); + } + + /** + * @see User_Driver::get_user_by_name + */ + public function get_user_by_name($name) { + throw new Exception("@todo NOT_IMPLMENTED: get_user_by_name"); + } + + /** + * @see User_Driver::delete_user + */ + public function delete_user($id) { + throw new Exception("@todo NOT_IMPLMENTED: delete_user"); + } + + /** + * @see User_Driver::create_group + */ + public function create_group($group_name) { + throw new Exception("@todo NOT_IMPLMENTED: create_group"); + } + + /** + * @see User_Driver::rename_group + */ + public function rename_group($id, $new_name) { + throw new Exception("@todo NOT_IMPLMENTED: rename_group"); + } + + /** + * @see User_Driver::get_group + */ + public function get_group($id) { + throw new Exception("@todo NOT_IMPLMENTED: get_group"); + } + + /** + * @see User_Driver::get_group_by_name + */ + public function get_group_by_name($group_name) { + throw new Exception("@todo NOT_IMPLMENTED: get_group_by_name"); + } + + /** + * @see User_Driver::delete_group + */ + public function delete_group($id) { + throw new Exception("@todo NOT_IMPLMENTED: delete_group"); + } + + /** + * @see User_Driver::add_user_to_group + */ + public function add_user_to_group($group_id, $user_id) { + throw new Exception("@todo NOT_IMPLMENTED: add_user_to_group"); + } + + /** + * @see User_Driver::remove_user_from_group + */ + public function remove_user_from_group($group_id, $user_id) { + throw new Exception("@todo NOT_IMPLMENTED: remove_user_from_group"); + } +} \ No newline at end of file -- cgit v1.2.3