public function updateSessionId(User $user, $oldUserId) { SessionDAO::create()->dropByUserId($oldUserId); $session = SessionDAO::create()->getByUserId($user->getId()); $session->setSessionId($user->getWSRequest()->getCookie('token'))->setAccessTime(date(self::TIMESTAMP))->setUserId($user->getId()); $session->save(); PropertiesDAO::create()->dropByUserId($oldUserId); UserBlacklistDAO::create()->dropByUserId($oldUserId); NameChangeDAO::create()->dropByUserId($oldUserId); UserDAO::create()->dropById($oldUserId); }
public function handleRequest(ChainContainer $chain) { $newUserWrapper = $chain->getFrom(); $container = DI::get()->container(); $logger = $container->get('logger'); /* @var $logger Logger */ $clients = DI::get()->getUsers(); $socketRequest = $newUserWrapper->getWSRequest(); /* @var $socketRequest Request */ $langCode = $socketRequest->getCookie('lang') ?: 'ru'; $lang = $container->get('lang')->setLangByCode($langCode); /* @var $lang Lang */ $newUserWrapper->setIp($socketRequest->getHeader('X-Real-IP'))->setLastMsgId((int) $socketRequest->getCookie('lastMsgId'))->setLanguage($lang); $imprint = $socketRequest->getCookie('token2'); $sessionHandler = DI::get()->getSession(); $logger->info("New connection:\n IP = {$newUserWrapper->getIp()},\n token = {$socketRequest->getCookie('token')},\n token2 = {$imprint},\n lastMsgId = {$newUserWrapper->getLastMsgId()}", [__CLASS__]); try { if (!($token = $socketRequest->getCookie('token'))) { throw new InvalidSessionException('No token'); } /** @var SessionDAO $session */ $session = $sessionHandler->read($token); if (!$session) { $tmpSession = TmpSessionDAO::create()->getBySessionId($token); if (!$tmpSession->getId()) { throw new InvalidSessionException('Wrong token ' . $token); } $tmpSession->dropById($tmpSession->getId()); $session = SessionDAO::create()->setSessionId($token); } } catch (InvalidSessionException $e) { $logger->error("Unauthorized session {$newUserWrapper->getIp()}; " . $e->getMessage(), [__CLASS__]); $newUserWrapper->send(['msg' => $lang->getPhrase('UnAuthSession'), 'refreshToken' => 1]); $newUserWrapper->close(); return false; } if ($session->getUserId() != 0) { $user = $this->handleKnownUser($session, $clients, $logger, $newUserWrapper); $logger->info('Handled known user_id = ' . $user->getId()); } else { $user = $this->createNewUser($lang, $logger, $newUserWrapper, $socketRequest); } //update access time $sessionHandler->store($token, $user->getId()); if ($imprint) { $logger->info('Searching similar imprint ' . $imprint . ' for user ' . $user->getId()); $user->setImprint($imprint); $similarUser = UserDAO::create()->getByImprint($imprint); if (count($similarUser)) { /** @var UserDAO $similarUser */ $similarUser = $similarUser[0]; if ($similarUser->getId() && $similarUser->getId() != $user->getId()) { $logger->info('Found banned user ' . $similarUser->getId() . ', banning also ' . $user->getId()); $user->setBanned(true); } } $user->save(false); } if ($user->isBanned()) { $logger->info('Dropping banned user ' . $user->getId()); $newUserWrapper->send(['msg' => 'Banned!', 'disconnect' => 1]); return false; } $newUserWrapper->setUserDAO($user)->setToken($token)->setLoginTime(time()); $clients->attach($newUserWrapper); }