Kod:
<?php
//###########################################################################
//# #
//# MultiLogin 0.3 #
//# Copyright © 2011 Brian Allen Vanderburg II #
//# #
//# Allows users to log into multiple accounts at once. #
//# #
//# This program is free software: you can redistribute it and/or #
//# modify it under the terms of the GNU General Public License as #
//# published by the Free Software Foundation, either version 3 of #
//# the License, or (at your option) any later version. #
//# #
//# This program is distributed in the hope that it will be useful, #
//# but WITHOUT ANY WARRANTY; without even the implied warranty of #
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. #
//# See the GNU General Public License for more details. #
//# #
//# You should have received a copy of the GNU General Public License #
//# along with this program. #
//# If not, see <http://www.gnu.org/licenses/>. #
//# #
//###########################################################################
if(!defined("IN_MYBB"))
die("This can only be included from MyBB.");
// A generic reusable session mechanism for storage of information. Multiple
// sessions can exist concurrently by storing each session id in a different
// cookie. This is needed since the same session information (the list of
// logged in users) is needed across any user accounts logged in.
class MultiLoginSession implements ArrayAccess, IteratorAggregate, Countable
{
const TABLE='multilogin_sessions';
static private $runcache = array();
private $sid = null;
private $data = null;
static public function cleanup()
{
global $db;
$cut = TIME_NOW - 24 * 3600;
$db->delete_query(self::TABLE, "time < '{$cut}'");
}
static public function load($sid)
{
global $db;
if(isset(self::$runcache[$sid]))
{
return self::$runcache[$sid];
}
$row = $db->fetch_array($db->simple_select(self::TABLE, "time, data", "sid=\"".$db->escape_string($sid)."\""));
if($row)
{
if(intval($row['time']) < (TIME_NOW - 24 * 3600))
{
$db->delete_query(self::TABLE, "sid=\"".$db->escape_string($sid)."\"");
return null;
}
else
{
// Each load updates timestamp
$db->update_query(self::TABLE, array('time' => TIME_NOW), "sid=\"".$db->escape_string($sid)."\"");
}
return new MultiLoginSession($sid, $row['data']);
}
return null;
}
static public function create()
{
global $db;
$sid = '';
$data = base64_encode(gzcompress(serialize(array())));
$created = FALSE;
for($i = 0; $i < 100; $i++)
{
$sid = random_str(50);
$row = array(
'sid' => $sid,
'time' => TIME_NOW,
'data' => $data
);
try
{
$result = $db->insert_query(self::TABLE, $row);
// Assume false/null result is a failure if it doesn't use exceptions
if($result !== FALSE && $result !== null)
{
$created = TRUE;
break;
}
}
catch(Exception $e)
{
// TODO: log message or something?
}
}
if(!$created)
{
return null;
}
return new MultiLoginSession($sid);
}
static public function activate()
{
global $db;
self::deactivate();
$db->query('CREATE TABLE '.TABLE_PREFIX.self::TABLE.' (sid VARCHAR(50) UNIQUE NOT NULL, time BIGINT, data TEXT)');
}
static public function deactivate()
{
global $db;
if($db->table_exists(self::TABLE))
{
$db->drop_table(self::TABLE);
}
}
private function __construct($sid, $data=null)
{
$this->sid = $sid;
if($data === null)
{
$this->data = array();
}
else
{
$this->data = unserialize(gzuncompress(base64_decode($data)));
if($this->data === FALSE || $this->data === null)
{
$this->data = array();
}
}
self::$runcache[$sid] = $this;
}
public function sid()
{
return $this->sid;
}
public function save()
{
global $db;
$row = array(
'time' => TIME_NOW,
'data' => base64_encode(gzcompress(serialize($this->data)))
);
$db->update_query(self::TABLE, $row, "sid=\"".$db->escape_string($this->sid)."\"");
}
// ArrayAccess
public function offsetSet($offset, $value)
{
if($offset === null)
{
$this->data[] = $value;
}
else
{
$this->data[$offset] = $value;
}
}
public function offsetGet($offset)
{
return isset($this->data[$offset]) ? $this->data[$offset] : null;
}
public function offsetExists($offset)
{
return isset($this->data[$offset]);
}
public function offsetUnset($offset)
{
unset($this->data[$offset]);
}
// IteratorAggregate/Traversable
public function getIterator()
{
return new ArrayIterator(&$this->data);
}
// Countable
public function count()
{
return count($this->data);
}
}
// Plugin portion
$plugins->add_hook("misc_clearcookies", "multilogin_clearcookies");
$plugins->add_hook("global_start", "multilogin_header");
$plugins->add_hook("member_do_login_end", "multilogin_login");
$plugins->add_hook("member_logout_start", "multilogin_logout");
$plugins->add_hook("member_login", "multilogin_switch");
function multilogin_info()
{
global $lang;
return array(
"name" => "Çoklu Kullanıcı Giriş Eklentisi",
"description" => "Birden Fazla Kullanıcı Olarak Giriş Yapmanızı Sağlar.<br /><img src=\"http://destek.mybb.com.tr/turkey.gif\" border=\"0\" alt=\"MCTR\" title=\"MCTR\" /> Türkçe Çeviri: <a title=\"MyBB.Com.TR - ByBenjo\" href=\"http://www.mybb.com.tr\" target=\"_blank\"><b>MyBB.Com.TR</b></a>",
"author" => "Brian Allen Vanderburg II",
"version" => "0.3",
"compatibility" => "16*",
"guid" => "213c401f14b344f5e8f290dfcc991630"
);
}
function multilogin_activate()
{
global $db, $mybb, $lang;
$template = array (
"title" => 'multilogin_header',
"template" => '<hr />{$multilogin_header_userbit}',
"sid" => -1,
"version" => 1.0,
"dateline" => TIME_NOW
);
$db->insert_query("templates", $template);
require_once MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets('header_welcomeblock_member', '#{\$lang->welcome_pms_usage}#', '{\$lang->welcome_pms_usage}<!-- MultiLogin1 -->{$multilogin_header}<!-- /MultiLogin1 -->');
find_replace_templatesets('header_welcomeblock_member', '#<a href=\"{\$mybb->settings\[\'bburl\'\]}/member.php\?action=logout#', '<!-- MultiLogin2 --><a href="{\$mybb->settings[\'bburl\']}/member.php?action=login">{\$lang->welcome_login}</a> — <!-- /MultiLogin2 --><a href="{$mybb->settings[\'bburl\']}/member.php?action=logout');
find_replace_templatesets('header_welcomeblock_guest', '#{\$lang->welcome_register}</a>\)</span>#', '{$lang->welcome_register}</a>)</span><!-- MultiLogin3 -->{$multilogin_header}<!-- /MultiLogin3 -->');
MultiLoginSession::activate();
}
function multilogin_deactivate()
{
global $db;
$db->delete_query("templates", "`title` = 'multilogin_header'");
require_once MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets('header_welcomeblock_member', '#\<!--\sMultiLogin1\s--\>(.+)\<!--\s/MultiLogin1\s--\>#is', '', 0);
find_replace_templatesets('header_welcomeblock_member', '#\<!--\sMultiLogin2\s--\>(.+)\<!--\s/MultiLogin2\s--\>#is', '', 0);
find_replace_templatesets('header_welcomeblock_guest', '#\<!--\sMultiLogin3\s--\>(.+)\<!--\s/MultiLogin3\s--\>#is', '', 0);
MultiLoginSession::deactivate();
}
function multilogin_get_session()
{
global $mybb;
static $session = null;
if($session !== null)
{
return $session;
}
if(isset($mybb->cookies['mybb_multilogin']))
{
$session = MultiLoginSession::load($mybb->cookies['mybb_multilogin']);
}
if($session === null)
{
$session = MultiLoginSession::create();
}
if($session)
{
my_setcookie('mybb_multilogin', $session->sid(), -1, $mybb->settings['cookiepath'], $mybb->settings['cookiedomain']);
}
return $session;
}
function multilogin_clearcookies()
{
@my_setcookie('mybb_multilogin', '', TIME_NOW - 1, $mybb->settings['cookiepath'], $mybb->settings['cookiedomain']);
}
function multilogin_header()
{
global $mybb, $templates, $lang, $multilogin_header;
// Create the header bit even if guest. A logout will cause a user
// to be the guest even if they were logged into other accounts
$session = multilogin_get_session();
if($session === null)
{
return;
}
$multilogin_header_userbit = '';
$dash = '';
if($mybb->user['uid'] != "0")
{
$multilogin_header_userbit .= " <a href='{$mybb->settings['bburl']}/member.php?action=login&do=multilogin&uid=0&my_post_key={$mybb->post_code}'><em>{$lang->guest}</em></a>";
$dash = ' — ';
}
foreach($session as $id => $key)
{
if($id == $mybb->user['uid'])
{
continue;
}
$user = get_user($id);
if($user)
{
$user['uid'] = intval($user['uid']);
$user['username'] = htmlspecialchars_uni($user['username']);
$multilogin_header_userbit .= "{$dash}<a href='{$mybb->settings['bburl']}/member.php?action=login&do=multilogin&uid={$user['uid']}&my_post_key={$mybb->post_code}'>{$user['username']}</a>";
$dash = ' — ';
}
}
$multilogin_header = '';
if($multilogin_header_userbit)
{
eval("\$multilogin_header = \"".$templates->get('multilogin_header')."\";");
}
}
function multilogin_login()
{
global $mybb;
if(isset($mybb->cookies['mybbuser']))
{
$session = multilogin_get_session();
if($session === null)
{
return;
}
$pos = strpos($mybb->cookies['mybbuser'], '_');
$id = substr($mybb->cookies['mybbuser'], 0, $pos);
$key = substr($mybb->cookies['mybbuser'], $pos + 1);
$session[$id] = $key;
$session->save();
}
}
function multilogin_logout()
{
global $mybb;
if(isset($mybb->user['uid']))
{
$session = multilogin_get_session();
if($session === null)
{
return;
}
if(isset($session[$mybb->user['uid']]))
{
unset($session[$mybb->user['uid']]);
$session->save();
}
}
}
function multilogin_switch()
{
global $mybb, $lang;
if($mybb->input['do'] == 'multilogin')
{
verify_post_check($mybb->input['my_post_key']);
// get the current page
$redirect_url = htmlentities($_SERVER['HTTP_REFERER']);
// change to guest?
if(intval($mybb->input['uid']) == 0)
{
my_unsetcookie('mybbuser');
redirect($redirect_url, "");
exit;
}
// load lang
$lang->load('multilogin');
// get the uid sanatized
$user = get_user(intval($mybb->input['uid']));
// check if user exists
if(!$user)
{
error($lang->multilogin_switch_error);
}
// check that we are logged in as that user
$session = multilogin_get_session();
if($session === null || !isset($session[$user['uid']]))
{
error($lang->multilogin_switch_error);
}
if($session[$user['uid']] != $user['loginkey'])
{
error($lang->multilogin_switch_error);
}
// make the switch!
my_unsetcookie('mybbuser');
my_setcookie('mybbuser', $user['uid'].'_'.$user['loginkey'], null, true);
// redirect to page
redirect($redirect_url, "");
exit;
}
}
Spoiler veremedim arkadaşlar. Kodu yüklememişler sanırım. :S
Çok teşekkür ederim. Sağ olun.