Версия vBulletin: 3.8.7 Patch Level 2
Я использую этот код для работы с файлами cookie vBulletin в моем другом поддомене. Я имею в виду: forum.mysite.com, myscript.mysite.com.
function get_session($hash){
$db = new DB("settings.forum.ini.php");
$ip = implode('.', array_slice(explode('.', $_SERVER['REMOTE_ADDR']), 0, 4 - 1));
$newidhash = md5($_SERVER['HTTP_USER_AGENT'] . $ip);
$query = "SELECT * FROM session WHERE sessionhash = :hash LIMIT 1";
$row = $db->query($query, array("hash"=>$hash));
if(isset($row[0]['userid'])){
$sessionhash = $row[0]['sessionhash'];
$idhash = $row[0]['idhash'];
$userid = $row[0]['userid'];
$lastactive = $row[0]['lastactivity'];
$db->closeConnection();
return ($idhash == $newidhash && (time() - $lastactive) < 900) ? $userid : false;
}
$db->closeConnection();
return false;
}
function get_cookie($id, $pass){
$db = new DB("settings.forum.ini.php");
$query = "SELECT * FROM user WHERE userid = :id LIMIT 1";
$row = $db->query($query, array("id"=>$id));
if(isset($row[0])){
$dbpass = $row[0]['password'];
// vb might change the salt from time to time. can be found in the /includes/functions.php file
if(md5($dbpass.COOKIE_SALT) == $pass){
$db->closeConnection();
return $id;
}
}
$db->closeConnection();
return false;
}
function check_login_cookie(){
$return = false;
if(isset($_COOKIE[COOKIE_PREFIX.'userid']) && isset($_COOKIE[COOKIE_PREFIX.'password'])){
if(get_cookie($_COOKIE[COOKIE_PREFIX.'userid'], $_COOKIE[COOKIE_PREFIX.'password'])){
$return = $_COOKIE[COOKIE_PREFIX.'userid'];
}
}
if($return !== false){
return $return;
}
if(isset($_COOKIE[COOKIE_PREFIX.'sessionhash'])){
$return = get_session($_COOKIE[COOKIE_PREFIX.'sessionhash']);
}
return $return;
}
function user_info($id){
$db = new DB("settings.forum.ini.php");
$query = "SELECT lastactivity,username,userid,membergroupids,usergroupid FROM user WHERE userid = :id LIMIT 1";
$return = $db->row("SELECT * FROM user WHERE userid = :id LIMIT 1", array("id"=>$id));
$db->closeConnection();
return $return;
}
function check_login(){
if($li = check_login_cookie()){
$uinfo = user_info($li);
$db = new DB("settings.forum.ini.php");
$q_lastactivity = "UPDATE user SET lastactivity = :time WHERE userid = :id LIMIT 1";
$db->query($q_lastactivity, array("time"=>time(), "id"=>$li));
if((time() - $uinfo['lastactivity']) > 900){
$q_lastvisit = "UPDATE user SET lastvisit = :la WHERE userid = :id LIMIT 1";
$db->query($q_lastvisit, array("la"=>$uinfo['lastactivity'], "id"=>$li));
}
$db->closeConnection();
}
return $li ? $uinfo : false;
}
Когда я ставлю галочку «Запомнить меня», мой сценарий работает и обнаруживает вход в систему, но при использовании сеанса он не будет входить (не входя в систему, я имею в виду, что форум обнаруживает вход в систему, а сценарий — нет).
Затем я проверил сессия таблица и она была пустой, хотя с этим работает тестовая версия, которую я использовал для теста.
Задача ещё не решена.
Других решений пока нет …