Initial commit. master
authormjo <mjo@mjo.(none)>
Wed, 10 Sep 2008 19:03:52 +0000 (15:03 -0400)
committermjo <mjo@mjo.(none)>
Wed, 10 Sep 2008 19:03:52 +0000 (15:03 -0400)
LocalSettings.third_party_db_auth.php [new file with mode: 0644]
README [new file with mode: 0644]
third_party_db_auth.class.php [new file with mode: 0644]

diff --git a/LocalSettings.third_party_db_auth.php b/LocalSettings.third_party_db_auth.php
new file mode 100644 (file)
index 0000000..c52c236
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+// First, require the plugin.
+require_once './extensions/third_party_db_auth.class.php';
+
+// Now create the plugin object.
+$wgAuth = new ThirdPartyDbAuth('localhost',
+                              'db_name',
+                              'db_username',
+                              'db_password');
+
+/* Here, you have to set the two queries that the class will
+ * use to determine:
+ *
+ * a) whether or not a given username/password combination is valid
+ * b) whether or not a given user exists in the database
+ *
+ * These defaults (below) should give you some idea of how this works.
+ * There are two variables allowed in the quereis, %u and %p
+ * which will be expanded to the supplied username and password
+ * respectively.
+ *
+ * The authentication or existence check will succeed (return true)
+ * if the query returns any rows. Note that this implementation
+ * makes the username/password case-insensitve.
+ */
+$wgAuth->set_authentication_query("SELECT * FROM users WHERE username='%u' AND password='%p'");
+$wgAuth->set_user_exists_query("SELECT * FROM users WHERE username='%u'");
+?>
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..81bb3d9
--- /dev/null
+++ b/README
@@ -0,0 +1,9 @@
+This class is an authorization plugin for Mediawiki. It performs the
+authorization and user existence queries to an arbitrary MySQL
+database. An example of its use is included in the
+LocalSettings.third_party_db_auth.php file.
+
+To use the plugin, you could either 'require' the
+LocalSettings.third_party_db_auth.php file in your LocalSettings.php,
+or copy-and-paste its contents into LocalSettings.php, somewhere near
+the bottom (after DefaultSettings.php is included).
diff --git a/third_party_db_auth.class.php b/third_party_db_auth.class.php
new file mode 100644 (file)
index 0000000..11d255b
--- /dev/null
@@ -0,0 +1,241 @@
+<?php\r
+#\r
+# Copyright Michael Orlitzky\r
+#\r
+# http://michael.orlitzky.com/\r
+#\r
+# This program is free software: you can redistribute it and/or modify\r
+# it under the terms of the GNU General Public License as published by\r
+# the Free Software Foundation, either version 3 of the License, or\r
+# (at your option) any later version.\r
+#\r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+# GNU General Public License for more details.\r
+#\r
+# http://www.fsf.org/licensing/licenses/gpl.html\r
+#\r
+\r
+require_once('./includes/AuthPlugin.php');\r
+\r
+class ThirdPartyDbAuth extends AuthPlugin {\r
+\r
+  /* A connection to the database that lasts as long\r
+   * as this object is around.\r
+   */\r
+  private $connection = null;\r
+\r
+\r
+  /* The query used to determine whether\r
+   or not the user is authorized. */\r
+  private $authentication_query = null;\r
+\r
+  \r
+  /* Used to determine whether or not a\r
+   username is present in the database. */\r
+  private $user_exists_query = null;\r
+\r
+\r
+  /* True if the supplied query returns one or more rows\r
+   * when executed against our database connection */\r
+  private function query_returns_rows($query) {\r
+    $result = mysql_query($query, $this->connection);\r
+    $row_count = mysql_num_rows($result);\r
+    mysql_free_result($result);\r
+    \r
+    if ($row_count > 0) {\r
+      return true;\r
+    }\r
+    else {\r
+      return false;\r
+    }\r
+  }\r
+\r
+\r
+  \r
+  public function set_authentication_query($query) {\r
+    $this->authentication_query = $query;\r
+  }\r
+\r
+  \r
+\r
+  public function set_user_exists_query($query) {\r
+    $this->user_exists_query = $query;\r
+  }\r
+\r
+  \r
+  \r
+  /* The constructor creates a connection to the database\r
+   * which is kept open for the lifetime of the object\r
+   */  \r
+  public function __construct($database_hostname,\r
+                             $database_name,\r
+                             $database_username,\r
+                             $database_password) {\r
+\r
+    $this->connection = mysql_connect($database_hostname,\r
+                                     $database_username,\r
+                                     $database_password)\r
+      or die(mysql_error());\r
+\r
+    mysql_select_db($database_name, $this->connection)\r
+      or die("Couldn't select database {$this->database_name}. Error: " . mysql_error());\r
+  }\r
+\r
+\r
+  \r
+  /* The destructor just closes the database connection\r
+   * that was opened in the constructor.\r
+   */\r
+  public function __destruct() {\r
+    mysql_close($this->connection);\r
+  }\r
+\r
+  \r
+  \r
+  /*\r
+   * Attempt to authenticate the user. We consider them authenticated\r
+   * if there are any records returned from our authentication query.\r
+   */\r
+  function authenticate($username, $password) {\r
+    if ($this->authentication_query == null) {\r
+      return false;\r
+    }\r
+    \r
+    $escaped_username = mysql_real_escape_string($username);\r
+    $escaped_password = mysql_real_escape_string($password);    \r
+\r
+    // Substitute for the username and password template variables.\r
+    $query = str_replace('%u', $escaped_username, $this->authentication_query);\r
+    $query = str_replace('%p', $escaped_password, $query);\r
+    \r
+    return $this->query_returns_rows($query);\r
+  }\r
+\r
+\r
+\r
+  /* Check to see if a username exists in our data source.\r
+   */\r
+  function userExists($username) {\r
+    if ($this->user_exists_query == null) {\r
+      return false;\r
+    }\r
+    \r
+    $escaped_username = mysql_real_escape_string($username);\r
+\r
+    // Substitute for the username template variable.\r
+    $query = str_replace('%u', $escaped_username, $this->user_exists_query);\r
+    \r
+    return $this->query_returns_rows($query);\r
+  }\r
+\r
+\r
+  \r
+  /* Most of the functions below this point are just overridden\r
+   * to return constant values. Generally, we don't want to allow\r
+   * users to touch our third-party database, so for example, we\r
+   * return false immediately from any attempts to add a user.\r
+   */\r
+   \r
+  \r
+  /* We don't add users to our data source, so always return false. */\r
+  function addUser($user, $password) {\r
+    return false;\r
+  }\r
+\r
+  \r
+  /* This needs to be true.\r
+   * Check the superclass source code for an explanation. \r
+   */\r
+  function autoCreate() {\r
+    return true;\r
+  }\r
+\r
+\r
+  \r
+  function canCreateAccounts() {\r
+    return false;\r
+  }\r
+\r
+\r
+  \r
+  /*\r
+   * If you want to munge the case of an account name before the final\r
+   * check, now is your chance.\r
+   */\r
+  function getCanonicalName($username) {\r
+    return $username;\r
+  }\r
+\r
+\r
+       \r
+  /* Disable some user interface options that don't make\r
+   * sense in our context.\r
+   */\r
+  function modifyUITemplate(&$template) {\r
+    $template->set('usedomain', false); // We do not want a domain name.\r
+    $template->set('create', false); // Remove option to create new accounts from the wiki.\r
+    $template->set('useemail', false); // Disable the mail new password box.\r
+  }\r
+\r
+\r
+       \r
+  function setDomain($domain) {}\r
+\r
+\r
+\r
+  function allowPasswordChange() {\r
+    return false;\r
+  }\r
+\r
+       \r
+\r
+  function setPassword($password) {\r
+    return false;\r
+  }\r
+\r
+  \r
+\r
+  function strict() {\r
+    return true;\r
+  }\r
+\r
+\r
+  \r
+  function strictUserAuth($username) {\r
+    return true;\r
+  }\r
+\r
+       \r
+\r
+  /* This might actually be useful, but we don't use it. */\r
+  function updateUser( &$user ) {\r
+    return false;\r
+  }\r
+\r
+\r
+\r
+  function updateExternalDB($user) {\r
+    return false;\r
+  }\r
+\r
+\r
+  \r
+  /* We don't use domains, so they're never valid.\r
+   */\r
+  function validDomain($domain) {\r
+    return false;\r
+  } \r
+\r
+}\r
+\r
+\r
+$wgExtensionCredits['other'][] = array(\r
+       'name' => 'Third-party Database Authentication',\r
+       'author' => 'Michael Orlitzky',\r
+       'description' => 'Allow Mediawiki to authenticate to a third-party (MySQL) database.',\r
+       'url' => 'http://michael.orlitzky.com/'\r
+);\r
+\r
+?>\r