<?php
/**
 * Authentication plugin interface. Instantiate a subclass of AuthPlugin
 * and set $wgAuth to it to authenticate against some external tool.
 *
 * The default behavior is not to do anything, and use the local user
 * database for all authentication. A subclass can require that all
 * accounts authenticate externally, or use it only as a fallback; also
 * you can transparently create internal wiki accounts the first time
 * someone logs in who can be authenticated externally.
 *
 * This interface is new, and might change a bit before 1.4.0 final is
 * done...
 *
 * Vanilla model by David Cramer
 * AuthPlugin extension by Daniel Gravenor c/o HolisticEarth.org
 * AuthPlugin original by Kai Backman
 *
 * @package MediaWiki
 */
require_once("includes/AuthPlugin.php");

class 
AuthPlugin_Vanilla extends AuthPlugin {
        
        
// Create a persistent DB connection
        
var $vanilla_database;
        
        function 
AuthPlugin_Vanilla($host$username$password$dbname$prefix) {
                
$this->vanilla_database mysql_pconnect($host$username$password);
                
mysql_select_db($dbname$this->vanilla_database);
                
$this->vanilla_prefix $prefix;
                
// set the usergroups for those who can edit the wiki
                
$this->allowed_usergroups = Array(3456);
                
// set the usergroups for the administrators
                
$this->admin_usergroups = Array(56);
                
$this->user_rights = Array("sysop");
                
// search pattern to only accept alphanumeric or underscore characters in usernames
                // if they have illegal characters, their name cannot exist, period
                
$this->searchpattern "/[^a-zA-Z0-9]+/";
        }

        
/**
        * Check whether there exists a user account with the given name.
        * The name will be normalized to MediaWiki's requirements, so
        * you might need to munge it (for instance, for lowercase initial
        * letters).
        *
        * @param string $username
        * @return bool
        * @access public
        */
        
function userExists($username ) {
                
// if no illegal characters are found in their username, then check to see if they exist
                
if (!preg_match($this->searchpattern$username)) { 
                        
$username addslashes($username);
                        
$vanilla_find_user_query "SELECT RoleID FROM " $this->vanilla_prefix "User WHERE Name LIKE '" $username "'";
                        
$vanilla_find_result mysql_query($vanilla_find_user_query$this->vanilla_database);
                        
// make sure that there is only one person with the username
                        
if (mysql_num_rows($vanilla_find_result) == 1) {
                                
$vanilla_userinfo mysql_fetch_assoc($vanilla_find_result);
                                
mysql_free_result($vanilla_find_result);
                                
// Only registered and admins. Banned and unregistered don't belong here.
                                
if (in_array($vanilla_userinfo['RoleID'], $this->allowed_usergroups)) {
                                        return 
true;
                                }
                        }
                }
                
// if no one is registered with that username, or there are more than 1 entries
                // or they have illegal characters return false (they do not exist)
                
return false;
        }
        
        
/**
        * Check if a username+password pair is a valid login.
        * The name will be normalized to MediaWiki's requirements, so
        * you might need to munge it (for instance, for lowercase initial
        * letters).
        *
        * @param string $username
        * @param string $password
        * @return bool
        * @access public
        */
        
function authenticate($username$password) {
                
// if their name does not contain any illegal characters, let them try to login
                
if (!preg_match($this->searchpattern$username)) { 
                        
$username addslashes($username);
                        
$vanilla_find_user_query "SELECT Password, RoleID FROM " $this->vanilla_prefix "User WHERE Name LIKE '" $username "'";
                        
$vanilla_find_result mysql_query($vanilla_find_user_query$this->vanilla_database);
                        if (
mysql_num_rows($vanilla_find_result) == 1) {
                                
$vanilla_userinfo mysql_fetch_assoc($vanilla_find_result);
                                
mysql_free_result($vanilla_find_result);
                                
// Only registered and admins. Banned and unregistered don't belong here.
                                
if (in_array($vanilla_userinfo['RoleID'], $this->allowed_usergroups)) {
                                        if(
md5($password) == $vanilla_userinfo['Password']) return true;
                                }
                        }
                }
                return 
false;
        }
        
        
/**
        * When a user logs in, optionally fill in preferences and such.
        * For instance, you might pull the email address or real name from the
        * external user database.
        *
        * The User object is passed by reference so it can be modified; don't
        * forget the & on your function declaration.
        *
        * @param User $user
        * @access public
        */
        
function updateUser( &$user ) {
                
# Override this and do something
                
$vanilla_find_user_query "SELECT RoleID FROM " $this->vanilla_prefix "User WHERE Name LIKE'" addslashes($user->mName) . "'";
                
$vanilla_find_result mysql_query($vanilla_find_user_query$this->vanilla_database) or die("Could not find username");
                if(
mysql_num_rows($vanilla_find_result) == 1) {
                        
$vanilla_userinfo mysql_fetch_assoc($vanilla_find_result);
                        
mysql_free_result($vanilla_find_result);
                        
                        if (
in_array($vanilla_userinfo['RoleID'], $this->admin_usergroups) || $admin_secondary === true) {
                                
// if a user is not a sysop, make them a sysop
                                
if (!in_array("sysop"$user->getEffectiveGroups())) {
                                        
$user->addGroup('sysop');
                                        return 
true;
                                }
                        }
                        
// if the user is not an administrator, but they were, and they are still a sysop, remove their sysop status
                        
if (!in_array($vanilla_userinfo['RoleID'], $this->admin_usergroups) && $admin_secondary === false) {
                                if (
in_array("sysop"$user->getEffectiveGroups())) {
                                        
$user->removeGroup('sysop');
                                        return 
true;
                                }
                        }
                }
                return 
false;
        }

        
/**
        * Return true if the wiki should create a new local account automatically
        * when asked to login a user who doesn't exist locally but does in the
        * external auth database.
        *
        * If you don't automatically create accounts, you must still create
        * accounts in some way. It's not possible to authenticate without
        * a local account.
        *
        * This is just a question, and shouldn't perform any actions.
        *
        * @return bool
        * @access public
        */
        
function autoCreate() {
                return 
true;
        }
        
        
/**
        * Return true to prevent logins that don't authenticate here from being
        * checked against the local database's password fields.
        *
        * This is just a question, and shouldn't perform any actions.
        *
        * @return bool
        * @access public
        */
        
function strict() {
                return 
true;
        }
        
        
/**
        * When creating a user account, optionally fill in preferences and such.
        * For instance, you might pull the email address or real name from the
        * external user database.
        *
        * The User object is passed by reference so it can be modified; don't
        * forget the & on your function declaration.
        *
        * @param User $user
        * @access public
        */
        
function initUser( &$user ) { 
                
$vanilla_find_user_query "SELECT Email, RoleID FROM " $this->vanilla_prefix "User WHERE Name LIKE '" addslashes($user->mName) . "'";
                
$vanilla_find_result mysql_query($vanilla_find_user_query$this->vanilla_database);
                if(
mysql_num_rows($vanilla_find_result) == 1) {
                        
$vanilla_userinfo mysql_fetch_assoc($vanilla_find_result);
                        
mysql_free_result($vanilla_find_result);
                        
$user->mEmail $vanilla_userinfo['Email'];
                        
$user->mEmailAuthenticated wfTimestampNow();
                }
        }
}
?>