From a580549d814adf828bf2bc6461a5572183ba114c Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 23 Oct 2011 17:08:41 -0400 Subject: Refactor to *finally* get rid of the god-class "MessageManager". Accomplish this largely by using singletons. Now, I know this breaks the "build", at least in PHP 5.2. But there's a lot here that's good stuff, so just wait for the next commit. Now, a *LOT* changed, as you can see by the size of the diff; it's about a day and a half of editing worth of editing. I'll describe a little of it, but I'm not going to go into a ton of detail, and won't bother trying to break it into separate commits (they're all so interconnected, it would be mental masturbation). 'Cause I'm the only one looking at it at this point. 1. MessageManager did 3 things: A. Act as a global site class. This has been moved into `lib/Site.class.php' B. Act as a registry for singletons. Now there's a `lib/Singleton.class.php' abstract class to let them manage themselves. : Note: With the possible exception of Database, none of the : : singletons *need* to be singletons, but to create : : multiple of them would be wasteful. : C. Check if the database conf file exists, and if it doesn't show an error message. This has been moved into index.php, and the message has been turned into a proper view. 2. Recognize `Auth.class.php' for what it is, a multiton. Rename Auth::getObj to Auth::getInstance to be consistant with singletons. 3. Make Site->baseUrl() (formerly `MessageManager->baseUrl()') figure the base URL each time, either with or without the database. This way we can be more flexible with initing the Template. 4. Init Template (now a singleton) sanely. We can now use views with no DB. I will use the above to shorten the below file changes: index.php: [1C] Also, just tidy up. src/controllers/Users.class.php: [1B] [2] src/lib/Controller.class.php: [4] src/lib/DB.class.php: [1B] [2] src/lib/Database.class.php: [1B] src/lib/Hasher.class.php: [1B] (new file) A singleton wrapper around `ext/PasswordHash.class.php', use bcrypt while exposing fewer internals. src/lib/Login.class.php: [1B] src/lib/MessageManager.class.php: [1] src/lib/Model.class.php: [1B] (new file) A abstract class for models, so they don't have to worry about initing the DB. src/lib/PluginManager.class.php: [1B] src/lib/Singleton.class.php: [1B] (new file) An abstract class that will take care of being a singleton for you; in order to make a class a singleton, just extend Singleton. src/lib/Site.class.php: [1A] [3] (new file) src/lib/View.class.php: [4] src/models/Auth.class.php: [2] [1B] Also make getUsername safely return false if the DB isn't connected. src/models/ContactMethod: extend `Model' src/views/Template.class.php: [1B] [3] src/views/pages/no-conf.html.php: [1C] src/views/pages/plugins/index.html.php: [1B] src/views/pages/users/500.html.php: [1B] --- src/lib/Controller.class.php | 7 +--- src/lib/DB.class.php | 16 ++++---- src/lib/Database.class.php | 20 ++++++---- src/lib/Hasher.class.php | 18 +++++++++ src/lib/Login.class.php | 7 ++-- src/lib/MessageManager.class.php | 85 ---------------------------------------- src/lib/Model.class.php | 9 +++++ src/lib/PluginManager.class.php | 10 +++-- src/lib/Singleton.class.php | 12 ++++++ src/lib/Site.class.php | 32 +++++++++++++++ src/lib/View.class.php | 5 ++- 11 files changed, 106 insertions(+), 115 deletions(-) create mode 100644 src/lib/Hasher.class.php delete mode 100644 src/lib/MessageManager.class.php create mode 100644 src/lib/Model.class.php create mode 100644 src/lib/Singleton.class.php create mode 100644 src/lib/Site.class.php (limited to 'src/lib') diff --git a/src/lib/Controller.class.php b/src/lib/Controller.class.php index f9ed59d..05736ee 100644 --- a/src/lib/Controller.class.php +++ b/src/lib/Controller.class.php @@ -1,18 +1,13 @@ template(); - + $obj = new View($view); $obj->show($vars); } diff --git a/src/lib/DB.class.php b/src/lib/DB.class.php index 5954726..ac8dafe 100644 --- a/src/lib/DB.class.php +++ b/src/lib/DB.class.php @@ -1,7 +1,7 @@ $editable); } private static function user_set($uid, $key, $value) { - $user = Auth::getObj($uid); + $user = Auth::getInstance($uid); switch ($key) { case 'auth_uid': @@ -127,8 +127,8 @@ class DB { } private static function admin_get($plugin, $key) { - global $mm; $db = $mm->database(); - $user = Auth::getObj(Login::isLoggedIn()); + $db = Database::getInstance(); + $user = Auth::getInstance(Login::isLoggedIn()); if ($user->isAdmin()) { $editable = true; switch ($plugin) { @@ -149,8 +149,8 @@ class DB { 'editable'=>$editable); } private static function admin_set($plugin, $key, $value) { - global $mm; $db = $mm->database(); - $user = Auth::getObj(Login::isLoggedIn()); + $db = Database::getInstance(); + $user = Auth::getInstance(Login::isLoggedIn()); if (!$user->isAdmin()) { return false; } diff --git a/src/lib/Database.class.php b/src/lib/Database.class.php index 13d9559..1e98511 100644 --- a/src/lib/Database.class.php +++ b/src/lib/Database.class.php @@ -1,12 +1,19 @@ conf = $conf_file; + self::$me = $this; + } + public static function getInstance() { + return self::$me; } // Low-Level SQL functions ///////////////////////////////////////////// @@ -114,9 +121,8 @@ class Database { if (!is_int($uid)) return false; $table = $this->mysql_table('auth'); - global $mm; - $hasher = $mm->hasher(); - @$hash = $hasher->HashPassword($password); + $hasher = Hasher::getInstance(); + @$hash = $hasher->hashPassword($password); $query = "UPDATE $table \n". "SET hash='$hash' \n". @@ -130,12 +136,10 @@ class Database { return false; } - global $mm; - $table = $this->mysql_table('auth'); $user = $this->mysql_escape($username); - $hasher = $mm->hasher(); - @$hash = $hasher->HashPassword($password); + $hasher = Hasher::getInstance(); + @$hash = $hasher->hashPassword($password); $status = 0; $query = "INSERT INTO $table ( name, hash , status) \n". diff --git a/src/lib/Hasher.class.php b/src/lib/Hasher.class.php new file mode 100644 index 0000000..dc16d68 --- /dev/null +++ b/src/lib/Hasher.class.php @@ -0,0 +1,18 @@ +pw_hash = new PasswordHash(8, false); + } + + public function hash($password) { + return $this->pw_hash->HashPassword($password); + } + public function check($password, $hash) { + return $this->pw_hash->CheckPassword($password, $hash); + } +} diff --git a/src/lib/Login.class.php b/src/lib/Login.class.php index 870774a..a470176 100644 --- a/src/lib/Login.class.php +++ b/src/lib/Login.class.php @@ -1,4 +1,6 @@ database(); - $hasher = $mm->hasher(); + $db = Database::getInstance(); + $hasher = Hasher::getInstance(); $uid = $db->getUID($username); if ($uid!==false && $db->getStatus($uid)>=3) diff --git a/src/lib/MessageManager.class.php b/src/lib/MessageManager.class.php deleted file mode 100644 index d327eb7..0000000 --- a/src/lib/MessageManager.class.php +++ /dev/null @@ -1,85 +0,0 @@ -conf = $conf_file; - if (!file_exists($this->conf)) { - $this->base = $_SERVER['REQUEST_URI']; - $t = $this->template(); - $t->header('Message Manager'); - $t->paragraph( - 'Awe shiz, dude, conf.php doesn\'t exist, you '. - 'need to go through the '. - 'installer.'); - $t->footer(); - exit(); - } - session_start(); - } - - // Load Things - - public function database() { - if (!isset($this->database)) { - require_once('Database.class.php'); - $this->database = new Database($this->conf); - } - return $this->database; - } - - public function hasher() { - if (!isset($this->pw_hasher)) { - require_once('PasswordHash.class.php'); - $this->pw_hasher = new PasswordHash(8, false); - } - return $this->pw_hasher; - } - - public function template() { - if (!isset($this->template)) { - require_once(VIEWPATH.'/Template.class.php'); - $this->template = new Template($this->baseUrl(), $this); - } - return $this->template; - } - - public function pluginManager() { - if (!isset($this->pluginManager)) { - require_once('PluginManager.class.php'); - $this->pluginManager = new PluginManager(); - } - return $this->pluginManager; - } - - // Utility functions - - public function shortUrl($longUrl) { - $ch = curl_init('http://ur1.ca'); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFILEDS, - 'longurl='.urlencode($longUrl)); - $html = curl_exec(); - preg_match('/Your ur1 is: /',$html,$matches); - $shortUrl = $matches[1]; - curl_close($ch); - return $shortUrl; - } - - public function baseUrl() { - if (!isset($this->base)) { - $this->base = $this->database()->getSysConf('baseurl'); - } - return $this->base; - } -} diff --git a/src/lib/Model.class.php b/src/lib/Model.class.php new file mode 100644 index 0000000..14f59d4 --- /dev/null +++ b/src/lib/Model.class.php @@ -0,0 +1,9 @@ +database(); + $db = Database::getInstance(); require_once("$plugin_name.class.php"); $obj = new $plugin_name; @@ -53,7 +55,7 @@ class PluginManager { * Return an array of enabled plugin names. */ public function getActivePlugins() { - global $mm; $db = $mm->database(); + $db = Database::getInstance(); $string = $db->getSysConf('plugins'); return $db->valueToArray($string); } @@ -62,7 +64,7 @@ class PluginManager { * Set the enabled plugins. */ public function setActivePlugins($plugins) { - global $mm; $db = $mm->database(); + $db = Database::getInstance(); $string = $db->arrayToValue($plugins); return $db->setSysConf('plugins', $string); } diff --git a/src/lib/Singleton.class.php b/src/lib/Singleton.class.php new file mode 100644 index 0000000..4eb3bb3 --- /dev/null +++ b/src/lib/Singleton.class.php @@ -0,0 +1,12 @@ +/',$html,$matches); + $shortUrl = $matches[1]; + curl_close($ch); + return $shortUrl; + } + + public function baseUrl() { + $base = $_SERVER['REQUEST_URI']; + + $db = Database::getInstance(); + if ($db !== null) { + $b = $db->getSysConf('baseurl'); + if ($b != false) { + $base = $b; + } + } + + return $base; + } +} diff --git a/src/lib/View.class.php b/src/lib/View.class.php index 33a9c4e..d7a21d3 100644 --- a/src/lib/View.class.php +++ b/src/lib/View.class.php @@ -123,7 +123,10 @@ class View { $mimes = Mime::ext2mime($this->ext); header('Content-type: '.$mimes[0]); - + + require_once(VIEWPATH.'/Template.class.php'); + $vars['template'] = new Template(); + global $VARS; $VARS = $vars; include($file); -- cgit v1.2.3-2-g168b From 29a3ffb99435827d5a7ea6886ac22bd2ee18d593 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 27 Oct 2011 19:44:10 -0400 Subject: I think this fixes everything, but it now depends on PHP 5.3+ The introduction of the dependency on PHP 5.3 is that lib/Singleton.class uses `get_called_class()' --- src/lib/Database.class.php | 4 ++-- src/lib/Login.class.php | 2 +- src/lib/Model.class.php | 2 +- src/lib/Singleton.class.php | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src/lib') diff --git a/src/lib/Database.class.php b/src/lib/Database.class.php index 1e98511..a76d891 100644 --- a/src/lib/Database.class.php +++ b/src/lib/Database.class.php @@ -122,7 +122,7 @@ class Database extends Singleton { $table = $this->mysql_table('auth'); $hasher = Hasher::getInstance(); - @$hash = $hasher->hashPassword($password); + @$hash = $hasher->hash($password); $query = "UPDATE $table \n". "SET hash='$hash' \n". @@ -139,7 +139,7 @@ class Database extends Singleton { $table = $this->mysql_table('auth'); $user = $this->mysql_escape($username); $hasher = Hasher::getInstance(); - @$hash = $hasher->hashPassword($password); + @$hash = $hasher->hash($password); $status = 0; $query = "INSERT INTO $table ( name, hash , status) \n". diff --git a/src/lib/Login.class.php b/src/lib/Login.class.php index a470176..bb21928 100644 --- a/src/lib/Login.class.php +++ b/src/lib/Login.class.php @@ -19,7 +19,7 @@ class Login { return 2; } $hash = $db->getPasswordHash($uid); - if ($hasher->CheckPassword($password, $hash)) { + if ($hasher->check($password, $hash)) { // success $_SESSION['uid'] = $uid; return 0; diff --git a/src/lib/Model.class.php b/src/lib/Model.class.php index 14f59d4..0cce525 100644 --- a/src/lib/Model.class.php +++ b/src/lib/Model.class.php @@ -4,6 +4,6 @@ require_once('Database.class.php'); abstract class Model { protected $db; public function __construct() { - $db = Database::getInstance(); + $this->db = Database::getInstance(); } } diff --git a/src/lib/Singleton.class.php b/src/lib/Singleton.class.php index 4eb3bb3..2f8c74f 100644 --- a/src/lib/Singleton.class.php +++ b/src/lib/Singleton.class.php @@ -1,12 +1,12 @@