MediaWiki integration...and nothing obviously...

Started by MaSSSS, March 04, 2012, 03:59:10 AM

Previous topic - Next topic

MaSSSS

 

  Hello. Im trying to integrate MediaWiki into my SMF 2.0.2 but Im not quite skilled. It shouldn't be that hard, but still Im failing.

My site is hosted at site5.com and I have all the necessary access to setup anything I would need to. My forum is at http://sexyuclan.net/forum

Software I run :

PHP 5.2.17 / 5.3.8 - configured trough .htaccess

SuPHP_ConfigPath /home/sexyucla
AddHandler application/x-httpd-php53 .php


Means custom php.ini and loading php 5.3 for some domains, some not.
Using MySQL 5.5.x & Apache 2.2.x

I used this bridge https://github.com/SimpleMachines/smf-mw-auth and it gives me this error right now.

Warning: array_merge() [function.array-merge]: Argument #1 is not an array in /home/sexyucla/public_html/wiki/includes/User.php on line 2298

Warning: array_unique() [function.array-unique]: The argument should be an array in /home/sexyucla/public_html/wiki/includes/User.php on line 2298

Warning: Invalid argument supplied for foreach() in /home/sexyucla/public_html/wiki/includes/User.php on line 3472

Warning: Invalid argument supplied for foreach() in /home/sexyucla/public_html/wiki/includes/User.php on line 3481
MediaWiki internal error.

Exception caught inside exception handler.

Set $wgShowExceptionDetails = true; at the bottom of LocalSettings.php to show detailed debugging information.


Here is how I setup mediawiki;

Run install script, configured it as follows:

- use its own database with its own user, and use innodb in binary mode
- created user, with password, and enabled email system
- made directory in /wiki/extensions named "SimpleMachines" and extracted package there.
- edited Auth_SMF.php so it looks like this

  <?php
/*
SMF and MediaWiki Integration
=============================
Author: SleePy (sleepy at simplemachines dot org)
Original Author: Ryan Wagoner (rswagoner at gmail dot com)
Version: 1.13

Copyright
=============================
Copyright © 2011 Simple Machines. All rights reserved.

 Developed by: Simple Machines Forum Project
 Simple Machines
 http://www.simplemachines.org

 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
[x] Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers.
[x] Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution.
[x] Neither the names of Simple Machines Forum, Simple Machines, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission.

Place this file in your wiki/extenstions folder. If you
encouter an issue be sure to read the known issues below.

Add to LocalSettings.php
========================
# This requires a user be logged into the wiki to make changes.
#$wgGroupPermissions['*']['edit'] = false; // MediaWiki Setting

# If you experience the issue where you appear to be logged in
# eventhough you are logged out then disable the page cache.
#$wgEnableParserCache = false;
#$wgCachePages = false;

# SMF Authentication
# To get started you only need to configure wgSMFPath. 
# The rest of the settings are optional for advanced features.

# Relative path to the forum directory from the wiki
# Do not put a trailing /
# Example: /public_html/forum and /public_html/wiki -> ../forum
#$wgSMFPath = "../forum"; 

# Use SMF's login system to automatically log you in/out of the wiki
# This works best if you are using SMF database sessions (default).
# Make sure "Use database driven sessions" is checked in the
# SMF Admin -> Server Settings -> Feature Configuration section
# NOTE: Make sure to configure the wgCookeDomain below
#$wgSMFLogin = true;

# Members in these SMF groups will not be allowed to sign into wiki.
# This is useful for denying access to wiki and a easy anti-spam
# method.  The group ID, which can be found in the url (;group=XXX)
# when viewing the group from the administrator control panel.
#$wgSMFDenyGroupID = array(4);

# Grant members of this SMF group(s) access to the wiki
# NOTE: The wgSMFDenyGroupID group supersedes this.
#wgSMFGroupID = array(2);

# Grant members of this SMF group(s) wiki sysop privileges
# NOTE: These members must be able to login to the wiki
#$wgSMFAdminGroupID = array(1, 3);

# SMF to wiki group translation.  This allows us to assign wiki groups
# to those in certain SMF groups.
#$wgSMFSpecialGroups = array(
# // SMF Group ID => Wiki group name.
# 5 => 'autoconfirmed',
#);

# THIS MUST BE ADDED.  This prevents direct access to the Auth file.
#define('SMF_IN_WIKI', true);

# Load up the extension
#require_once "$IP/extensions/Auth_SMF.php";
#$wgAuth = new Auth_SMF();

 */
if (!defined('SMF_IN_WIKI'))
exit('Hacking attempt on SMF...');

error_reporting(E_ALL); // Debug

if(file_exists("$wgSMFPath/Settings.php"))
require_once("$wgSMFPath/Settings.php");
else
die('Check to make sure $wgSMFPath is correctly set in LocalSettings.php!');

$smf_settings['boardurl'] = $boardurl;
$smf_settings['cookiename'] = $cookiename;
$smf_settings['db_server'] = $db_server;
$smf_settings['db_name'] = $db_name;
$smf_settings['db_user'] = $db_user;
$smf_settings['db_passwd'] = $db_passwd;
$smf_settings['db_prefix'] = $db_prefix;

/**
 * Check the SMF cookie and automatically log the user into the wiki.
 *
 * @param User $user
 * @return bool
 * @public
 */
function AutoAuthenticateSMF ($initial_user_data, &$user)
{
global $wgAuth$smf_settings$modSettings$smf_member_id$user_settings$ID_MEMBER;

// As to why we need to do this makes no sense really.
// Thanks to Norv of SimpleMachines.org for the fix.
$ID_MEMBER 0;
$user $initial_user_data;

if (isset($_COOKIE[$smf_settings['cookiename']]))
{
$_COOKIE[$smf_settings['cookiename']] = stripslashes($_COOKIE[$smf_settings['cookiename']]);

// MediaWiki doesn't support PHP4 since 1.6.12, so no check for a security issue is needed.
list ($ID_MEMBER$password) = @unserialize($_COOKIE[$smf_settings['cookiename']]);
$ID_MEMBER = !empty($ID_MEMBER) && strlen($password) > ? (int) $ID_MEMBER 0;
}

// Only load this stuff if the user isn't a guest.
if ($ID_MEMBER != 0)
{
if (empty($_SESSION['user_settings']) || empty($_SESSION['user_settings_time']) || time() > $_SESSION['user_settings_time'] + 900)
{
$request $wgAuth->query("
SELECT id_member, member_name, email_address, real_name,
is_activated, passwd, password_salt,
id_group, id_post_group, additional_groups
FROM 
$smf_settings[db_prefix]members
WHERE id_member = '
{$ID_MEMBER}'
AND is_activated = 1
LIMIT 1"
);

$user_settings mysql_fetch_assoc($request);

$_SESSION['user_settings'] = serialize($user_settings);
mysql_free_result($request);
}
else
$user_settings unserialize($_SESSION['user_settings']);

// Did we find 'im?  If not, junk it.
if (!empty($user_settings))
{
// SHA-1 passwords should be 40 characters long.
if (strlen($password) == 40)
$check sha1($user_settings['passwd'] . $user_settings['password_salt']) == $password;
else
$check false;

// Wrong password or not activated - either way, you're going nowhere.
$ID_MEMBER $check && ($user_settings['is_activated'] == || $user_settings['is_activated'] == 11) ? $user_settings['id_member'] : 0;
}
else
$ID_MEMBER 0;

// This just simplifies things further on.
$user_settings['smf_groups'] = array_merge(array($user_settings['id_group'], $user_settings['id_post_group']), explode(','$user_settings['additional_groups']));
}

// Log out guests or members with invalid cookie passwords.
if($ID_MEMBER == 0)
{
// A bug seems to exist in isLoggedIn when it calls getId.
// getId appears to try to load user data, which may not exist at this point.
// Why getId just doesn't return $this->mId, I have no idea.
$user->doLogout();
return false;
}

// Do we know the SMF member id yet?
if (empty($smf_member_id))
$smf_member_id $user->getOption('smf_member_id');

// If the username has an underscore or space accept the first registered user.
if(empty($smf_member_id) && (strpos($user_settings['member_name'], ' ') !== false || strpos($user_settings['member_name'], '_') !== false))
{
$request $wgAuth->query("
SELECT id_member 
FROM 
$smf_settings[db_prefix]members
WHERE member_name = '" 
$user_settings['member_name'] . "'
ORDER BY date_registered ASC
LIMIT 1"
);

list($id) = mysql_fetch_row($request);
mysql_free_result($request);

// Sorry your name was taken already!
if($id != $ID_MEMBER)
{
if($user->isLoggedIn())
$user->logout();
return true;
}
}

// Lastly check to see if they are not banned and allowed to login
if (!$wgAuth->isNotBanned($ID_MEMBER) || !$wgAuth->canLogin())
{
if($user->isLoggedIn())
$user->logout();
return true;
}

// Convert to wiki standards
$username ucfirst(str_replace('_''\''$user_settings['member_name']));
// Wiki doesn't allow [] and SMF does, SMF doesn't allow =" and Wiki does.
// We do it like this so we can reverse it to find the original name if needed.
$username strtr($username, array('[' => '='']' => '"'));

// Only poll the database if no session or username mismatch.
if(!($user->isLoggedIn() && $user->getName() == $username))
{
       
$user->setId($user->idFromName($username));

// No ID we need to add this member to the wiki database.
if ($user->getID() == 0)
{
// getID clears out the name set above.
$user->setName($username);
$user->setEmail($user_settings['email_address']);
$user->setRealName($user_settings['real_name']);

// Let wiki know that their email has been verified.
$user->mEmailAuthenticated wfTimestampNow(); 

// Finally create the user.
$user->addToDatabase();

// Don't worry about clearing the cache, the setEmail will do that.
$user->setOption('smf_member_id'$ID_MEMBER);
$user->setOption('smf_last_update'time());

// Some reason addToDatabase doesn't set options.  So we do this manually.
$user->saveSettings();
}
}

// Do we know the SMF member id yet?
if (empty($smf_member_id))
$smf_member_id $user->getOption('smf_member_id');

// We have tried all we can, but the data just doesn't match up.
if (empty($smf_member_id) || $smf_member_id != $ID_MEMBER)
{
// TODO: Log errors if the ids don't match?

if ($user->isLoggedIn())
$user->logout();
return true;
}

// Keep their email and real name up to date with SMF
$last_update = (int) $user->getOption('smf_last_update'0);

if (empty($last_update) || time() > ($last_update 900))
{
$user->setEmail($user_settings['email_address']);
$user->setRealName($user_settings['real_name']);

// We have some sort of group change.
$wgAuth->isGroupAllowed($user_settings['member_name'], &$user);
$wgAuth->setAdminGroup($user$smf_member_id);

// Save!
$user->setOption('smf_last_update'time());
$user->saveSettings();
}

// Go ahead and log 'em in
wfSetupSession();
$user->setCookies();

return true;
}

/**
 * Redirect them to the SMF login page.
 *
 * @param User $user
 * @public
 */
function UserLoginFormSMF (&$user)
{
smf_sessionSetup();
smf_redirectWrapper('old_url''login');
}

/**
 * Redirect and utilize the SMF logout function.
 * This also destroys the wiki session, preventing issues
 * where wiki still believes a user is logged in.
 *
 * @param User $user
 * @public
 */
function UserLogoutSMF (&$user)
{
global $wgCookiePrefix$wgSessionName;

// Log them out of wiki first.
$user->doLogout();

// Destory their session.
$wgCookiePrefix strtr($wgCookiePrefix"=,; +.\"'\\[""__________");
$old_session session_name(isset($wgSessionName) ? $wgSessionName $wgCookiePrefix '_session');
session_destroy();

// Destroy the cookie!
    
$params session_get_cookie_params();
    
setcookie(session_name(), ''time() - 42000$params['path'], $params['domain'], $params['secure'], $params['httponly']);

// Back to whatever we had (we hope mediawiki).
session_name($old_session);

// Now SMFs turn.
smf_sessionSetup();

// This means we have no SMF session data or unable to find it.
if (empty($_SESSION['session_var']))
return true;

smf_redirectWrapper('logout_url''logout;' $_SESSION['session_var'] . '=' $_SESSION['session_value']);
}

/**
 * Redirect and utilize the SMF register function.
 *
 * @public
 */
function UserRegisterSMF (&$template)
{
smf_sessionSetup();
smf_redirectWrapper('old_url''register');
}

/**
 * Wrapper to configure the SMF session and perform the redirect.
 *
 * @public
 */
function smf_redirectWrapper($session$action) {
global $wgScriptPath$smf_settings;

$page = !empty($_GET['returnto']) ? '?title=' urlencode($_GET['returnto']) . '&' '?';
$_SESSION[$session] = 'http://' $_SERVER['SERVER_NAME'] . $wgScriptPath '/index.php' $page 'board=redirect';

// Do the actual redirect.
header ('Location: ' $smf_settings['boardurl'] . '/index.php?action=' $action);
exit();
}

/**
 * If the user has visited the forum during the browser session
 * then load up the exisiting session. Otherwise start a new
 * session that SMF can use.
 *
 * @public
 */
function smf_sessionSetup()
{
global $wgSessionsInMemcached$wgCookieDomain$smf_settings;

// Clean out the existing session. This should have no affect
// since we are going to redirct the user to the SMF page.
@session_write_close();

// We can guess if wiki is using memcache sessions, so is SMF.
if ($wgSessionsInMemcached)
@ini_set('session.save_handler''memcache');

// Why MediaWiki doesn't store the original.
$old_session session_name();
session_name(ini_get('session.name'));

// Start your engines.
session_start();

// Load up the SMF session and set the redirect URL.
if(isset($_COOKIE[$smf_settings['cookiename']]))
session_decode($_COOKIE[$smf_settings['cookiename']]);
// No exisiting session, create one
else
{
// Grab us a unique ID for SMF.
session_regenerate_id();

// Needed for SMF checks.
$_SESSION['rand_code'] = md5(session_id() . rand());
$_SESSION['USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];

// Set the cookie.
$data serialize(array(0''0));
setcookie($smf_settings['cookiename'], $datatime() + 3600'/'$wgCookieDomain0);
}

// Restore the old session.
session_name($old_session);
}

// First check if class has already been defined.
if (!class_exists('AuthPlugin'))
require_once "$IP/includes/AuthPlugin.php";

class 
Auth_SMF extends AuthPlugin
{
var $conn 0;

/**
 * Class constructor that will initialize the hooks and database connection.
 */
function Auth_SMF()
{
global $wgSMFLogin$wgHooks$wgDefaultUserOptions;

// Integrate with SMF login / logout?
if(isset($wgSMFLogin) && $wgSMFLogin)
{
$wgHooks['AutoAuthenticate'][] = 'AutoAuthenticateSMF';
$wgHooks['UserLoadFromSession'][] = 'AutoAuthenticateSMF';
$wgHooks['UserLoginForm'][] = 'UserLoginFormSMF';
$wgHooks['UserLogout'][] = 'UserLogoutSMF';
}

// Default some settings we us.
$wgDefaultUserOptions['smf_member_id'] = 0;
$wgDefaultUserOptions['smf_last_update'] = 0;

// Always redirect registration to SMF.
$wgHooks['UserCreateForm'][] = 'UserRegisterSMF';

// Connect to the database.
$this->connect();
}

/**
 * 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 $username String: username.
 * @return bool
 * @public
 */
public function userExists($username)
{
global $smf_settings$smf_member_id;

// Check if we did this already recently.
if (isset($_SESSION['smf_uE_t'], $_SESSION['smf_uE']) && time() < ($_SESSION['smf_uE'] + 300))
return $_SESSION['smf_uE'];
$_SESSION['smf_uE'] = time();

$username $this->fixUsername($username);
$request $this->query("
SELECT member_name
FROM 
$smf_settings[db_prefix]members
WHERE id_member = '
{$smf_member_id}'
LIMIT 1"
);

list ($user) = mysql_fetch_row($request);
mysql_free_result($request);

// Play it safe and double check the match.
$_SESSION['smf_uE'] = strtolower($user) == strtolower($username) ? true false;

return $_SESSION['smf_uE'];
}

/**
 * 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 $username String: username.
 * @param $password String: user password.
 * @return bool
 * @public
 */
public function authenticate($username$password)
{
global $smf_settings$smf_member_id;

// No id, you must be unauthorized.
if ($smf_member_id == 0)
return false;

$username $this->fixUsername($username);
$request $this->query("
SELECT member_name, passwd
FROM 
$smf_settings[db_prefix]members
WHERE id_member = '
{$smf_member_id}'
AND is_activated = 1
LIMIT 1"
);

list($member_name$passwd) = mysql_fetch_row($request);
mysql_free_result($request);

$pw sha1(strtolower($username) . $password);

// Check for password match, the user is not banned, and the user is allowed.
if($pw == $passwd && $this->isNotBanned($smf_member_id) && $this->isGroupAllowed($username))
return true;

return false;
}

/**
 * Modify options in the login template.
 *
 * @param $template UserLoginTemplate object.
 * @public
 */
public function modifyUITemplate(&$template)
{
$template->set('usedomain',   false); // We do not want a domain name.
$template->set('create',      false); // Remove option to create new accounts from the wiki.
$template->set('useemail',    false); // Disable the mail new password box.
}

/**
 * Set the domain this plugin is supposed to use when authenticating.
 *
 * @param $domain String: authentication domain.
 * @public
 */
public function setDomain($domain)
{
$this->domain $domain;
}

/**
 * Check to see if the specific domain is a valid domain.
 *
 * @param $domain String: authentication domain.
 * @return bool
 * @public
 */
public function validDomain$domain)
{
return true;
}

/**
* This allows us to disable properties we don't want to allow users to modify
* @param $prop String: property to disallow
* @return bool
* @public
*/
public function allowPropChange($prop)
{
if ($prop == 'emailaddress')
return false;

return true;
}

/**
 * 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
 * @public
 */
public function updateUser( &$user)
{
global $smf_settings$smf_member_id;

// No id, you must be unauthorized.
if ($smf_member_id == 0)
return false;

$username $this->fixUsername($user->getName());
$request $this->query("
SELECT email_address, real_name
FROM 
$smf_settings[db_prefix]members
WHERE id_member = '
{$smf_member_id}'
LIMIT 1"
);

while($row mysql_fetch_assoc($request))
{
$user->setRealName($row['real_name']);
$user->setEmail($row['email_address']);

$this->setAdminGroup($user);

$user->setOption('smf_last_update'time());
$user->saveSettings();
}
mysql_free_result($request);

return true;
}


/**
 * 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
 * @public
 */
public function autoCreate()
{
return true;
}

/**
 * Can users change their passwords?
 *
 * @return bool
 */
public function allowPasswordChange()
{
global $wgSMFLogin;

// Only allow password change if not using auto login.
// Otherwise we would need a bunch of code to rewrite
// the SMF login cookie with the new password.
if(isset($wgSMFLogin) && $wgSMFLogin)
return false;

return true;
}

/**
 * Update user information in the external authentication database.
 * Return true if successful.
 *
 * @param $user User object.
 * @return bool
 * @public
 */
public function updateExternalDB($user)
{
return true;
}

/**
 * Check to see if external accounts can be created.
 * Return true if external accounts can be created.
 * @return bool
 * @public
 */
public function canCreateAccounts()
{
return false;
}

/**
 * Add a user to the external authentication database.
 * Return true if successful.
 *
 * @param User $user - only the name should be assumed valid at this point
 * @param string $password
 * @param string $email
 * @param string $realname
 * @return bool
 * @public
 */
public function addUser($user$password$email=''$realname='')
{
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
 * @public
 */
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 object.
 * @param $autocreate bool True if user is being autocreated on login
 * @public
 */
public function initUser$user$autocreate false)
{
global $smf_settings$smf_member_id;

// No id, you must be unauthorized.
if ($smf_member_id == 0)
return false;

// Check what time we last did this.
$last_update $user->getOption('smf_last_update'0);
if (!empty($last_update) && time() > $last_update 900)
return true;

$username $this->fixUsername($user->getName());
$request $this->query("
SELECT id_member, email_address, real_name
FROM 
$smf_settings[db_prefix]members
WHERE id_member = '
{$smf_member_id}'
LIMIT 1"
);

while($row mysql_fetch_assoc($request))
{
$user->setRealName($row[real_name]);
$user->setEmail($row[email_address]);

// Let wiki know that their email has been verified.
$user->mEmailAuthenticated wfTimestampNow(); 

$this->setAdminGroup($user);

$user->setOption('smf_last_update'time());
$user->saveSettings();
}
mysql_free_result($request);

return true;
}

/**
 * If you want to munge the case of an account name before the final
 * check, now is your chance.
 *
 * @public
 */
public function getCanonicalName($username)
{
/**
 * wiki converts username (john_doe -> John doe)
 * then getCanonicalName is called
 * user not in wiki database call userExists
 * lastly call authenticate
 */
return $username;
}

/**
 * The wiki converts underscores to spaces. Attempt to work around this
 * by checking for both cases. Hopefully we'll only get one match.
 * Otherwise the first registered SMF account takes priority.
 *
 * @public
 */
public function fixUsername($username)
{
global $smf_settings$smf_member_id;
static $fixed_name '';

// No space no problem.
if(strpos($username' ') === false)
return $username;

// We may have done this once already.
if (!empty($fixed_name))
return $fixed_name;

// Look for either case sorted by date.
$request $this->query("
SELECT member_name 
FROM 
$smf_settings[db_prefix]members
WHERE member_name = '
{$username}
OR member_name = '" 
strtr($username, array(' ' => '_''[' => '='']' => '"')) . "'
ORDER BY date_registered ASC
LIMIT 1"
);

list($user) = mysql_fetch_row($request);
mysql_free_result($request);

// No result play it safe and return the original.
$fixed_name $user;
return !isset($user) ? $username $user;
}

/**
 * Check to see if the user is banned partially
 * restricting their ability to post or login.
 *
 * @public
 */
public function isNotBanned($id_member)
{
global $smf_settings$smf_member_id;

// Perhaps we have it cached in the session.
if (isset($_SESSION['smf_iNB_t'], $_SESSION['smf_iNB']) && time() < ($_SESSION['smf_iNB_t'] + 900))
return $_SESSION['smf_iNB'] ? true false;

$request $this->query("
SELECT id_ban
FROM 
$smf_settings[db_prefix]ban_items AS i
LEFT JOIN 
$smf_settings[db_prefix]ban_groups AS g
ON (i.id_ban_group = g.id_ban_group)
WHERE i.id_member = '
{$id_member}'
AND (g.cannot_post = 1 OR g.cannot_login = 1)"
);

$banned mysql_num_rows($request);
mysql_free_result($request);

$_SESSION['smf_iNB_t'] = time();
$_SESSION['smf_iNB'] = $banned false true;

return $_SESSION['smf_iNB'];
}

/**
 * Check to see if the user is able to login.
 *
 * @public
 */
public function canLogin()
{
global $wgSMFDenyGroupID$user_settings;

if (isset($_SESSION['smf_cL_t'], $_SESSION['smf_cL']) && time() < ($_SESSION['smf_cL_t'] + 900))
return $_SESSION['smf_cL'] ? true false;

$_SESSION['smf_iNB_t'] = time();
$_SESSION['smf_cL'] = true;

if (!empty($wgSMFDenyGroupID) && array_intersect($user_settings['smf_groups'], $wgSMFDenyGroupID) != array())
$_SESSION['smf_cL'] = false;

return $_SESSION['smf_cL'];
}

/**
 * Check to see if the user should have sysop rights.
 * Either they are an administrator or are in one
 * of the define groups.
 *
 * To save database queries the fixed username is used.
 *
 * @public
 */
public function setAdminGroup(&$user)
{
global $wgSMFAdminGroupID$user_settings;
static $already_done false;

// Loop prevention.
if ($already_done)
return;
$already_done true;

// Check if we did this already recently.
if (isset($_SESSION['smf_sAG']) && time() < ($_SESSION['smf_sAG'] + 900))
return;
$_SESSION['smf_sAG'] = time();

// Administrator always get admin rights.
if (!in_array(1$wgSMFAdminGroupID))
$wgSMFAdminGroupID[] = 1;

// Search through all groups, if match give them admin rights.
if (!empty($wgSMFAdminGroupID) && array_intersect($user_settings['smf_groups'], $wgSMFAdminGroupID) != array())
{
if (!in_array("sysop"$user->getEffectiveGroups()))
$user->addGroup("sysop");

return;
}

// No go! Make sure they are not a sysop.
if (in_array("sysop"$user->getEffectiveGroups()))
$user->removeGroup("sysop");
return;
}


/**
 * Check to see if the user is allowed to log in.
 * Either they are an administrator or are in one
 * of the define groups.
 *
 * @public
 */
public function isGroupAllowed($username, &$user)
{
global $wgSMFGroupID$wgSMFDenyGroupID$wgSMFSpecialGroups$user_settings;

// Check if we did this already recently.
if (isset($_SESSION['smf_iSA_t'], $_SESSION['smf_iSA']) && time() < ($_SESSION['smf_iSA_t'] + 900))
return $_SESSION['smf_iSA'];
$_SESSION['smf_iSA_t'] = time();

// This allows us to wiki assign groups based on SMF member groups.
if (!empty($wgSMFSpecialGroups))
{
// This is done for speed purposes when working with a large array.
$temp_groups explode(','$user_settings['additional_groups']);

foreach ($wgSMFSpecialGroups as $smf_group => $wiki_group)

if (in_array($smf_group$temp_groups) && !in_array($wiki_group$user->getEffectiveGroups()))
{
$user->addGroup($wiki_group);
$group_added true;
}
}
}

// Do they happen to be in a deny group?
if (!empty($wgSMFDenyGroupID) && array_intersect($user_settings['smf_groups'], $wgSMFDenyGroupID) != array())
$_SESSION['smf_iSA'] = false;
// This comes from the group add above.
elseif (!empty($group_added))
$_SESSION['smf_iSA'] = true;
// No limitations.
elseif (empty($wgSMFGroupID))
$_SESSION['smf_iSA'] = true;
// Search through all groups, if match give them admin rights.
elseif (!empty($wgSMFGroupID) && array_intersect($user_settings['smf_groups'], $wgSMFGroupID) != array())
$_SESSION['smf_iSA'] = true;
else
// No go!
$_SESSION['smf_iSA'] = false;

return $_SESSION['smf_iSA'];
}

/**
 * Connect to the database. Use the settings from smf.
 *
 * {@source}
 * @return resource
 */
public function connect()
{
global $smf_settings;

// Connect to database.
$this->conn = @mysql_pconnect($smf_settings['db_server'], $smf_settings['db_user'],
  $smf_settings['db_passwd'], true);

// Check if we are connected to the database.
if (!$this->conn)
$this->mysqlerror("SMF was unable to connect to the database.<br />\n");

// Select database: this assumes the wiki and smf are in the same database.
$db_selected = @mysql_select_db($smf_settings['db_name'], $this->conn);

// Check if we were able to select the database.
if (!$db_selected)
$this->mysqlerror("SMF was unable to connect to the database.<br />\n");
}

/**
 * Run the query and if applicable display the mysql error.
 *
 * @param string $query
 * @return resource
 */
public function query($query)
{
$request mysql_query($query$this->conn);

if(!$request)
$this->mysqlerror('Unable to view external table.');

return $request;
}

/**
 * Display an error when a mysql error is found.
 *
 * @param string $message
 * @access public
 */
public function mysqlerror($message)
{
global $wgSMFDebug;

echo $message "<br /><br />\n\n";

// Only if we are debugging.
if ($wgSMFDebug)
echo 'mySQL error number: 'mysql_errno(), "<br />\n"'mySQL error message: 'mysql_error(), "<br /><br />\n\n";

exit;
}
}

// Set the default options for a few settings we add.
// These are here as they do not need to be configurable.
$wgDefaultUserOptions['smf_member_id'] = 0;
$wgDefaultUserOptions['smf_last_update'] = 0;
$wgHooks['UserSaveOptions'][] = 'wfProfileSMFID';
$wgHiddenPrefs[] = 'smf_member_id';
$wgHiddenPrefs[] = 'smf_last_update';

// This prevents your SMF member ID from being lost when preferences are saved.
function wfProfileSMFID($user, &$saveOptions)
{
global $ID_MEMBER;

// Preserve our member id.
if (empty($saveOptions['smf_member_id']))
$saveOptions['smf_member_id'] = $user->mOptionOverrides['smf_member_id'];

// Still empty, maybe we can save the day.
if (empty($saveOptions['smf_member_id']) && !empty($ID_MEMBER))
$saveOptions['smf_member_id'] = (int) $ID_MEMBER;

// Note: We do not protect smf_last_update from being lost since we disabled
// changing emails means it would be lost and causes an error.  This way the
// Auth will restore it on the next page load (ie right after the page save).

return true;
}


Why? I had to comment lines for LocalSettings.php since I added them there.


LocalSettings.php file looks like this ( shorted )


<?php
# This file was automatically generated by the MediaWiki 1.18.1
# installer. If you make manual changes, please keep track in case you
# need to recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# http://www.mediawiki.org/wiki/Manual:Configuration_settings

# Protect against web entry
if ( !defined'MEDIAWIKI' ) ) {
exit;
}

## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;

$wgSitename      "Balkan MediaWiki";
$wgMetaNamespace "Balkan_MediaWiki";

## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath       "/wiki";
$wgScriptExtension  ".php5";

## The protocol and server name to use in fully-qualified URLs
$wgServer           "http://sexyuclan.net";

## The relative URL path to the skins directory
$wgStylePath        "$wgScriptPath/skins";

## The relative URL path to the logo.  Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
$wgLogo             "$wgStylePath/common/images/wiki.png";

## UPO means: this is also a user preference option

$wgEnableEmail      true;
$wgEnableUserEmail  false# UPO

$wgEmergencyContact "[email protected]";
$wgPasswordSender   "[email protected]";

$wgEnotifUserTalk      false# UPO
$wgEnotifWatchlist     false# UPO
$wgEmailAuthentication false;

## Database settings
$wgDBtype           "mysql";
$wgDBserver         "localhost";
$wgDBname           "something";
$wgDBuser           "something";
$wgDBpassword       "andsomethingelse";

# MySQL specific settings
$wgDBprefix         "";

# MySQL table options to use during installation or update
$wgDBTableOptions   "ENGINE=InnoDB, DEFAULT CHARSET=binary";

# Experimental charset support for MySQL 4.1/5.0.
$wgDBmysql5 false;

## Shared memory settings
$wgMainCacheType    CACHE_NONE;
$wgMemCachedServers = array();

## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads  true;
$wgUseImageMagick true;
$wgImageMagickConvertCommand "/usr/bin/convert";

# InstantCommons allows wiki to use images from http://commons.wikimedia.org
$wgUseInstantCommons  true;

## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
$wgShellLocale "en_US.utf8";

## If you want to use image uploads under safe mode,
## create the directories images/archive, images/thumb and
## images/temp, and make them all writable. Then uncomment
## this, if it's not already uncommented:
#$wgHashedUploadDirectory = false;

## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.
#$wgCacheDirectory = "$IP/cache";

# Site language code, should be one of the list in ./languages/Names.php
$wgLanguageCode "en";

$wgSecretKey "KJJKL;bl;l"Lbn'p"n'n'"n'';ln';dflmgyeah changed";

# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey = "something";

## Default skin: you can change the default skin. Use the internal symbolic
## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
$wgDefaultSkin = "vector";

## For attaching licensing metadata to pages, and displaying an
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl  = "";
$wgRightsText = "";
$wgRightsIcon = "";
$wgRightsCode = ""; # Not yet used

# Path to the GNU diff3 utility. Used for conflict resolution.
$wgDiff3 = "/usr/bin/diff3";

# Query string length limit for ResourceLoader. You should only set this if
# your web server has a query string length limit (then set it to that limit),
# or if you have suhosin.get.max_value_length set in php.ini (then set it to
# that value)
$wgResourceLoaderMaxQueryLength = -1;

# The following permissions were set based on your choice in the installer
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['edit'] = false;

# Enabled Extensions. Most extensions are enabled by including the base extension file here
# but check specific extension documentation for more details
# The following extensions were automatically enabled:
require_once( "
$IP/extensions/Nuke/Nuke.php" );
require_once( "
$IP/extensions/Gadgets/Gadgets.php" );
require_once( "
$IP/extensions/WikiEditor/WikiEditor.php" );
require_once( "
$IP/extensions/Renameuser/Renameuser.php" );
require_once( "
$IP/extensions/Vector/Vector.php" );
require_once( "
$IP/extensions/ConfirmEdit/ConfirmEdit.php" );
require_once( "
$IP/extensions/ParserFunctions/ParserFunctions.php" );


# End of automatically generated settings.
# Add more configuration options below.

# If you experience the issue where you appear to be logged in
# eventhough you are logged out then disable the page cache.
$wgEnableParserCache = false;
$wgCachePages = false;

# SMF Authentication
# To get started you only need to configure wgSMFPath. 
# The rest of the settings are optional for advanced features.

# Relative path to the forum directory from the wiki
# Do not put a trailing /
# Example: /public_html/forum and /public_html/wiki -> ../forum
$wgSMFPath = "../forum";

# Use SMF's login system to automatically log you in/out of the wiki
# This works best if you are using SMF database sessions (default).
# Make sure "
Use database driven sessions" is checked in the
# SMF Admin -> Server Settings -> Feature Configuration section
# NOTE: Make sure to configure the wgCookeDomain below
$wgSMFLogin = true;

# Members in these SMF groups will not be allowed to sign into wiki.
# This is useful for denying access to wiki and a easy anti-spam
# method.  The group ID, which can be found in the url (;group=XXX)
# when viewing the group from the administrator control panel.
$wgSMFDenyGroupID = array(4);

# Grant members of this SMF group(s) access to the wiki
# NOTE: The wgSMFDenyGroupID group supersedes this.
$wgSMFGroupID = array(1,8,10,5,13,11,12);

# Grant members of this SMF group(s) wiki sysop privileges
# NOTE: These members must be able to login to the wiki
$wgSMFAdminGroupID = array(1);

# SMF to wiki group translation.  This allows us to assign wiki groups
# to those in certain SMF groups.
#
$wgSMFSpecialGroups = array(
# // SMF Group ID => Wiki group name.
# 1 => 'autoconfirmed',
#);

# THIS MUST BE ADDED.  This prevents direct access to the Auth file.
define('SMF_IN_WIKI', true);

# Load up the extension
require_once ( "
$IP/extensions/SimpleMachines/Auth_SMF.php" );
$wgAuth = new Auth_SMF();


So what am I doing/did wrong here? Is this ok or I need to start over? There are million topics about this, and there is ZERO guides how to do this properly. Were not all programmers you know.

If I havent mentioned I use SMF 2.0.2/adk Portal 2.1.1/Aeva Media 1.4w/MediaWiki/1.18.1



Thanks in advance for help


EDIT:

And if I try to go directly to http://sexyuclan.net/wiki/ while Im not logged into the forums it will display wiki page properly. But if I try to login to wiki it will redirect me to forum login page. And if I try to login there it gives me this error.

QuoteYou were unable to login. Please check your cookie settings.

:(

Dos this .htaccess has something to do with this?


RewriteEngine on
RewriteBase /forum
RewriteRule ^pages/(.*)\.html index.php?page=$1 [L]
RewriteRule ^cat/([0-9]*)-(.*)\.html$ index.php?action=downloads;cat=$1 [L]
RewriteRule ^down/([0-9]*)-(.*)\.html$ index.php?action=downloads;sa=view;down=$1 [L]

MaSSSS



  Is this so hard or I did something very stupid, so nobody has anything to add or point me to right direction?

  I see you guys have wiki integrated here, so why not sharing how you did it with me. Im sorry if there is tutorial somewhere I couldnt find it.

Kindred

Слaва
Украинi

Please do not PM, IM or Email me with support questions.  You will get better and faster responses in the support boards.  Thank you.

"Loki is not evil, although he is certainly not a force for good. Loki is... complicated."

Illori


NanoSector

$wgSecretKey = "KJJKL;bl;l"Lbn'p"n'n'"n'';ln';dflmg- yeah changed";

WTH happened there? Code's not a place where you can bang on your keyboard, you know...
My Mods / Mod Builder - A tool to easily create mods / Blog
"I've heard from a reliable source that the Answer is 42. But, still no word on what the question is."

MaSSSS

#5
Quote from: Yoshi2889 on March 06, 2012, 11:22:43 AM
$wgSecretKey = "KJJKL;bl;l"Lbn'p"n'n'"n'';ln';dflmg- yeah changed";

WTH happened there? Code's not a place where you can bang on your keyboard, you know...

Changed that on purpose when I was posting here. Ill checkout links guys posted above, maybe there is more info than on github.

Anyways, Im asking myself right now, do I really need this? I have Aeva Gallery, and have KB system...so is mediawiki worth all this hustle?

I just foloowed this guide here http://www.simplemachines.org/community/index.php?topic=293441.0 and only thing left to do is what it says in section 12... "Consider using database-driven sessions and offloading all attachments to Mediawiki."


Checked above links, nothing useful...same thing I followed and very bad explained how to. Someone should write a tutorial about it for us noobs ^^

SCHWEjK

Hi,

I have exactly the same problems. With my installation I get the error message:

Warning: array_merge() [function.array-merge]: Argument #1 is not an array in /mnt/webf/b2/32/52290232/htdocs/fgvr/wiki/includes/User.php on line 2298

Warning: array_unique() [function.array-unique]: The argument should be an array in /mnt/webf/b2/32/52290232/htdocs/fgvr/wiki/includes/User.php on line 2298

Warning: Invalid argument supplied for foreach() in /mnt/webf/b2/32/52290232/htdocs/fgvr/wiki/includes/User.php on line 3472

Warning: Invalid argument supplied for foreach() in /mnt/webf/b2/32/52290232/htdocs/fgvr/wiki/includes/User.php on line 3481


When I click on login at Mediawiki, I get forwarded to my forum. But even after I logged in there, I cannot access the wiki. BTW, I enabled database-driven sessions.

This is my config:

<?php
# This file was automatically generated by the MediaWiki 1.18.1
# installer. If you make manual changes, please keep track in case you
# need to recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# http://www.mediawiki.org/wiki/Manual:Configuration_settings

# Protect against web entry
if ( !defined'MEDIAWIKI' ) ) {
exit;
}

## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;

$wgSitename      "NSA Wiki";
$wgMetaNamespace "NSA";

## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath       "";
$wgScriptExtension  ".php";

## The protocol and server name to use in fully-qualified URLs
$wgServer           "http://wiki.nsa.gov";

## The relative URL path to the skins directory
$wgStylePath        "$wgScriptPath/skins";

## The relative URL path to the logo.  Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
$wgLogo             "$wgStylePath/common/images/wiki.png";

## UPO means: this is also a user preference option

$wgEnableEmail      true;
$wgEnableUserEmail  true# UPO

$wgEmergencyContact "[email protected]";
$wgPasswordSender   "[email protected]";

$wgEnotifUserTalk      false# UPO
$wgEnotifWatchlist     false# UPO
$wgEmailAuthentication true;

## Database settings
$wgDBtype           "mysql";
$wgDBserver         "rdbms.example.com";
$wgDBname           "wiki";
$wgDBuser           "noname";
$wgDBpassword       "amistupidorwhat";

# MySQL specific settings
$wgDBprefix         "vwiki_";

# MySQL table options to use during installation or update
$wgDBTableOptions   "ENGINE=InnoDB, DEFAULT CHARSET=utf8";

# Experimental charset support for MySQL 4.1/5.0.
$wgDBmysql5 false;

## Shared memory settings
$wgMainCacheType    CACHE_NONE;
$wgMemCachedServers = array();

## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads  true;
$wgUseImageMagick true;
$wgImageMagickConvertCommand "/usr/bin/convert";

# InstantCommons allows wiki to use images from http://commons.wikimedia.org
$wgUseInstantCommons  false;

## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
$wgShellLocale "en_US.utf8";

## If you want to use image uploads under safe mode,
## create the directories images/archive, images/thumb and
## images/temp, and make them all writable. Then uncomment
## this, if it's not already uncommented:
#$wgHashedUploadDirectory = false;

## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.
#$wgCacheDirectory = "$IP/cache";

# Site language code, should be one of the list in ./languages/Names.php
$wgLanguageCode "de";

$wgSecretKey "sajhdlk213asjhd2kasjhdlkasjh031dsda21";

# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey "211usad121";

## Default skin: you can change the default skin. Use the internal symbolic
## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
$wgDefaultSkin "vector";

## For attaching licensing metadata to pages, and displaying an
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
$wgRightsPage ""# Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl  "";
$wgRightsText "";
$wgRightsIcon "";
# $wgRightsCode = ""; # Not yet used

# Path to the GNU diff3 utility. Used for conflict resolution.
$wgDiff3 "";

# Query string length limit for ResourceLoader. You should only set this if
# your web server has a query string length limit (then set it to that limit),
# or if you have suhosin.get.max_value_length set in php.ini (then set it to
# that value)
$wgResourceLoaderMaxQueryLength = -1;

# The following permissions were set based on your choice in the installer
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['read'] = false;

# Enabled Extensions. Most extensions are enabled by including the base extension file here
# but check specific extension documentation for more details
# The following extensions were automatically enabled:
require_once( "$IP/extensions/ConfirmEdit/ConfirmEdit.php" );
require_once( 
"$IP/extensions/Gadgets/Gadgets.php" );
require_once( 
"$IP/extensions/Nuke/Nuke.php" );
require_once( 
"$IP/extensions/ParserFunctions/ParserFunctions.php" );
require_once( 
"$IP/extensions/Vector/Vector.php" );
require_once( 
"$IP/extensions/WikiEditor/WikiEditor.php" );


# End of automatically generated settings.
# Add more configuration options below.

# This requires a user be logged into the wiki to make changes.
$wgGroupPermissions['*']['edit'] = false// MediaWiki Setting

# If you experience the issue where you appear to be logged in
# eventhough you are logged out then disable the page cache.
#$wgEnableParserCache = false;
#$wgCachePages = false;

# SMF Authentication
# To get started you only need to configure wgSMFPath. 
# The rest of the settings are optional for advanced features.

# Relative path to the forum directory from the wiki
# Do not put a trailing /
# Example: /public_html/forum and /public_html/wiki -> ../forum
$wgSMFPath "../forum"

# Use SMF's login system to automatically log you in/out of the wiki
# This works best if you are using SMF database sessions (default).
# Make sure "Use database driven sessions" is checked in the
# SMF Admin -> Server Settings -> Feature Configuration section
# NOTE: Make sure to configure the wgCookeDomain below
$wgSMFLogin true;

# Members in these SMF groups will not be allowed to sign into wiki.
# This is useful for denying access to wiki and a easy anti-spam
# method.  The group ID, which can be found in the url (;group=XXX)
# when viewing the group from the administrator control panel.
#$wgSMFDenyGroupID = array(4);

# Grant members of this SMF group(s) access to the wiki
# NOTE: The wgSMFDenyGroupID group supersedes this.
#wgSMFGroupID = array(2);

# Grant members of this SMF group(s) wiki sysop privileges
# NOTE: These members must be able to login to the wiki
$wgSMFAdminGroupID = array(1);

# SMF to wiki group translation.  This allows us to assign wiki groups
# to those in certain SMF groups.
#$wgSMFSpecialGroups = array(
# // SMF Group ID => Wiki group name.
# 5 => 'autoconfirmed',
#);

# THIS MUST BE ADDED.  This prevents direct access to the Auth file.
define('SMF_IN_WIKI'true);

# Load up the extension
require_once "$IP/extensions/Auth_SMF.php";
$wgAuth = new Auth_SMF();

Illori

please start a separate thread for your issue, this thread belongs to someone else.

SCHWEjK

Usually I would do this, but in this case our error messages are identical. Perhaps my input combined with that of the OP can solve the problem.

Illori

we request everyone to open a separate thread for their issues, this way if the solution is not the same they can get their own answers. also we dont know if your problem is the same just because the message is the same.

Andre N

I played with MediaWiki 1.18.1 and SMF 2.02 today and made the following observations which might help you (both)

1. The Auth_SMF.php file goes in the /wiki/extensions/ folder

2. In LocalSettings.php you need to manually add the following line and configure it
$wgCookieDomain = '.yourdomain.com';

3. I installed SMF 2.02 and MediaWiki 1.18.1 fresh using Installtron today. I uploaded the Auth_SMF.php file and modified LocalSettings.php according to the instructions. The login from SMF did not log me into MediaWiki.

4. In order for the login/logout to work I had to modify the Auth_SMF.php file a little bit. What worked for me is attached. I did not test registration, or account edit or anything else.

5. I noticed that when I log out from SMF, the MediaWiki user is not automatically logged out though so that still needs work. If I can find where it's SUPPOSED to be doing it I can fix it...
"Every generation of humans believed it had all the answers it needed, except for a few mysteries they assumed would be solved at any moment. And they all believed their ancestors were simplistic and deluded. What are the odds that you are the first generation of humans who will understand reality?"

Advertisement: