• На проекте открылась регистрация только для продавцов. Для обычных пользователей будет открыта позже. Подробнее.
    P.S. Не надо скидывать ссылки на форумы, где у вас ноль сообщений. Подобные заявки будут отклонятся.

Заходим в закрытые комнаты чата Siropu

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
В паблик пока не выкладываю, надо у нас закрыть + придумать что можно из этого выжать :)
Фишка простая, нужно добавить куку xf_chatRoom или отредактировать значение на нужное нам, если список чата виден, то ID комнаты видно в списке, в противном случае подбираем.
 

X-Oleg

8айтовый
WebVoice
А-а-а, понял, это что-бы пароль каждый раз не вводить, автор додумался куку сделать, но не сделал проверку вводил-ли автор пароль...:websmiles_11:

Надо-было уникальный идентификатор генерировать (типо сессии), тогда такого не было-бы !
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Как выяснилось бага с кукой появилась в последних версиях, я сравниваю с 1.17.х с 1.20.х
По моему бага закралась где-то в этом файле(\library\Siropu\Chat\ControllerPublic\Chat.php), пока что не вникал в работу

1.17.х
PHP:
    protected function _getRoomID($validate = true)
    {
        $roomId = $this->_input->filterSingle('room_id', XenForo_Input::UINT);

        if ($this->_input->filterSingle('embedded', XenForo_Input::UINT))
        {
            return $roomId;
        }

        if ($validate && $roomId)
        {
            if ($roomIdCookie = XenForo_Helper_Cookie::getCookie('chatRoom'))
            {
                if ($roomIdCookie != $roomId)
                {
                    $roomId = $roomIdCookie;
                }
            }
            else if ($session = $this->_getModel()->getSession($this->_getUID()))
            {
                $roomId = $session['user_room_id'];
                $this->_getHelper()->setRoomCookie($roomId);
            }
        }

        return $roomId;
    }


1.20.х
PHP:
    protected function _getRoomID($validate = true)
    {
        $roomReqId = $this->_input->filterSingle('room', XenForo_Input::STRING);
        $roomId    = is_numeric($roomReqId) ? $roomReqId : $this->_input->filterSingle('room_id', XenForo_Input::UINT);

        if ($this->_input->filterSingle('embedded', XenForo_Input::UINT) && !$roomReqId)
        {
            return $roomId;
        }

        if ($validate)
        {
            if ($roomIdCookie = XenForo_Helper_Cookie::getCookie('chatRoom'))
            {
                if ($roomIdCookie != $roomId)
                {
                    $roomId = $roomIdCookie;
                }
            }
            else if ($session = $this->_getModel()->getSession($this->_getUID()))
            {
                $roomId = $session['user_room_id'];
                $this->_getHelper()->setRoomCookie($roomId);
            }
        }

        return $roomId;
    }

В этом же файле, в 1.20.х в функции actionIndex() появились следующие переменные:
PHP:
        $roomId        = $this->_getHelper()->getRoomId($session);
        $joinRoomId    = $this->_input->filterSingle('room', XenForo_Input::STRING);
        $navRoomList   = $this->_getOptions()->siropu_chat_navigation_rooms;
        $navRoomList   = $navRoomList ? array_map('trim', explode(',', $navRoomList)) : array();
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
В той же функции actionIndex() ниже появилось условие:

PHP:
        if (is_numeric($joinRoomId) && in_array($joinRoomId, $navRoomList))
        {
            if ($joinRoomId && ($room = $this->_getModel()->getRoomById((int) $joinRoomId)))
            {
                if (!$this->_getHelper()->checkRoomPermissions($room) || $room['room_password'])
                {
                    return $this->responseError(new XenForo_Phrase('siropu_chat_room_no_permission'));
                }

                $roomId = $joinRoomId;
            }
            else
            {
                $roomId = 0;
            }

            $this->_getHelper()->setRoomCookie($roomId);
        }
 

X-Oleg

8айтовый
WebVoice
Чот не пойму, в пхп не селён, но рассуждаю с точки зрения си, итак:

$validate = true будет постоянно true, так ?

Далее идём в ветку:

Код:
 if ($validate)
{
if ($roomIdCookie = XenForo_Helper_Cookie::getCookie('chatRoom'))
{
if ($roomIdCookie != $roomId)
{
$roomId = $roomIdCookie;
}
}
else if ($session = $this->_getModel()->getSession($this->_getUID()))
{
$roomId = $session['user_room_id'];
$this->_getHelper()->setRoomCookie($roomId);
}
}

Короче в зачем эта проверка ?
 

X-Oleg

8айтовый
WebVoice
Вот и ошибка:

Нужно так:

if ($validate && $roomId)

Смысл в том, что проверка на $roomId тоже нужно, если её не будет, то в ветку не зайдёт и тогда уже не будет брать из куки, я так думаю... :)
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Чот не пойму, в пхп не селён, но рассуждаю с точки зрения си, итак:

$validate = true будет постоянно true, так ?

Да, будет постоянно истиной, пока в функции не переопределится, по этому условие if ($validate) будет всегда выполнятся.
 

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Общими усилиями было найдено решение, нужно вернуть старое условие
PHP:
if ($validate && $roomId)
в функцию
PHP:
protected function _getRoomID($validate = true)
вместо
PHP:
if ($validate)
 

X-Oleg

8айтовый
WebVoice
Фикс от автора плагина:

Код:
protected function _getRoomID($validate = true)
    {
        $roomReqId = $this->_input->filterSingle('room', XenForo_Input::STRING);
        $roomId    = is_numeric($roomReqId) ? $roomReqId : $this->_input->filterSingle('room_id', XenForo_Input::UINT);

        if ($this->_input->filterSingle('embedded', XenForo_Input::UINT) && !$roomReqId)
        {
            return $roomId;
        }

        if ($validate && $roomId != 0)
        {
            $roomId = $this->_getHelper()->getRoomId($this->_getModel()->getSession($this->_getUID()));
        }

        return $roomId;
    }

В целом тоже самое, что и мы сделали, у нас по проще код, ибо сразу понятно:if ($validate && $roomId)

Т.е. в нашем случае по коду ясно, что вход в ветку будет если все "Истина", или "1", а у автора используется логическое "И", привет мат. логика:

Т.е. нужно вспоминать таблицу истиности:

72985.jpg


В общем тоже самое $validate && $roomId != 0, только в случае если $validate=1 и $roomId=1.

Будет работать, но я считаю что нужно код делать максимально понятным, что-бы потом самому незапутатся ! :)
 
Сверху