intro
Пользователи
-
В сети
-
Количество сообщений
5 -
Reputation
2 intro's Reputation
-
Очередь тем не обнулилась
UPD: проблема решилась весьма неожиданным для меня образом. Пользователь создал новую тему (которую понадобилось одобрить) в разделе с этим косяком, и очередь тем в нём встала на круги своя. Всем спасибо. P.S.:Однако, если кто-то поделится инфой, как можно решить этот вопрос без создания темы, я буду весьма признателен.
-
Очередь тем не обнулилась
Доброго всем времени суток. Столкнулся нынче с проблемкой. Пользователь создал тему, которой потребовалось одобрение. Но он её создал не в соответствующем разделе. Я сначала решил перенести тему в нужный раздел, а потом одобрить её. После такого финта появилась проблема в разделе, в котором тема создавалась изначально (до переноса): До этого я одобрял темы - всё нормально. Получается, если сначала одобрить тему, а потом перенести - проблем не будет. А вот наоборот - вылезает данный косяк. Я полез в бд, может там нарою таблицу нужную и подправлю - а не тут-то было. Я заблудился (в очередной раз) в базе от IPS. Почистил кэш форума через админку - не помогло (впрочем, не удивительно). Полез честно гуглить на просторах гугла, а после и здесь. Единственное что я нашёл, так вот эту тему - "Проблема с отображением очереди тем" - на нашем форуме. Но нерадивому ТСу ответить не захотели, по всей видимости, за его дерзость. Поэтому я так и не нашёл решение своей проблемки и остался с ней наедине. Очень прошу знающих, помочь с решением. Может хотя бы подсказать в какую сторону копать, а я там включу мозги и что-то да исправлю?.. Заранее всех благодарю за отзывчивость и помощь! С уважением, Юрий. P.S.: версия форума v4.2.7 NULLED by ipbmafia
-
Внешняя авторизация и запрет регистрации
Вот и я об этом же подумал, но запоздало. Сначала мне показалось, что там переведённые офф. доки . Спасибо.
-
Внешняя авторизация и запрет регистрации
Так как редактировать сообщения я не могу, то новым сообщением добавлю, я забыл сказать, что кнопку "Регистрация" вам надо будет ручками выпилить из 'globalTemplate', если мне не изменяет память, в настройках стилей и тем. P.S.: что-то мне подсказывает, что я тему не в той ветке создал.
-
intro changed their profile photo
-
Внешняя авторизация и запрет регистрации
Всем доброго времени суток. Меня зовут Юрий, и я хотел бы поделиться своим опытом настройки внешней авторизации в 4-ой версии форума. Предисловие Вот решил, обновить свой форум с 3.4.6 до 4.1.8. Естественно всё делаю на тестовом сервере, со всеми бэкапами. Обновился без ошибок, русифицировал. После всего начал играться с внешней авторизацией. Внешняя авторизации должна быть обязательна (форум для проекта с онлайн игрой), чтоб на форум могли заходить только игроки. В общем нашёл я нужные файлы, но код в них (ну естественно) совершенно отличный от старой версии. С горем пополам я разобрался во внешней авторизации. На третьей версии форума я не разбирался - мне досталась уже готовая внешняя авторизация, как раз под мои нужды. Может я сейчас расскажу что-то банальное из серии "открыть Америку", но может кому-то принесу пользу, своим сообщением. Те кто разобрался во внешней авторизации сам, либо проходите мимо, либо, если есть ошибки у меня - поделитесь своим мнением. В чём плюсы новой внешней авторизации? Ну во-первых. теперь всё в одном файле, не в двух, как было раньше. Если в 3-е версии, чтоб добавить новый способ шифрования пароля, надо было изменять два файла, то в 4-ой это всё в одном файле. Да и вообще, все файлы с авторизацией теперь в одном каталоге, что весьма упрощает работу с авторизацией. Во-вторых, сам код стал более понятным для восприятия. Но самым главным плюсом для меня оказалась возможность выбора типа аутентификации. В третьей версии, на чистом движке была возможность аутентификации только по имени. Но в моём случае, имя пользователя может измениться, в отличии от E-mail, поэтому я делал аутентификацию по E-mail. Для этого мне надо было редактировать файл внешней авторизации таким образом, чтоб он как имя использовал другое поле из внешней БД. Делалось легко, но всё же приходилось это делать ручками. Но вот вышла 4-я версия, и тут это уже встроено в движок форума. Ура, товарищи! Как же настроить новую внешнюю авторизацию? Я расскажу на своём примере, с добавлением дополнительного способа шифрования пароля. Итак, находим файл '/system/Login/External.php'. Далее ищем строку 141, функцию encryptedPassword(). В конструкцию switch добавляем секцию case с нашим способом шифрования. В моём случае, это crypt с солью: case 'crypt': return crypt($password, '$ra$05$rZMc8a8HnXT3R2lKTcFgaT$'); Далее, в функции acpForm() находим ключ массива db_encryption. Если ваша секция case состоит из двух строк, как у меня, и отделена от остальных конструкций разрывом строки, как в оригинале, то этот ключ будет находиться на 195-й строке. db_encryption является ассоциативным массивом с парой ключ => значение, где "ключ", это значение, указанное в вашей секции case, а "значение", это текст, который будет отображаться в АЦП, при выборе способа шифрования. Вот готовый код, с нашим способом шифрования: 'db_encryption' => new \IPS\Helpers\Form\Select( 'login_external_encryption', $this->settings['db_encryption'], TRUE, array( 'options' => array( 'md5' => 'MD5', 'sha1' => 'SHA1', 'crypt' => 'CRYPT', 'plaintext' => 'login_external_encryption_plain', ) ) ), Теперь, чтобы задействовать этот способ авторизации, вы идёте в АЦП -> Система -> Настройка сайта -> Методы входа. Включаете Внешняя база данных и переходите к её изменению. Настройте её по своему желанию, укажите поля E-mail и имени пользователей и выберите ваш способ шифрования пароля, который мы добавили в файл External.php. Сохраняем и отключаем внутреннюю авторизацию, под названием "Стандартный" (метод входа, имеется ввиду ). Внешняя авторизация настроена и готова к использованию. Но это ещё не всё, как оказалось. Во всей этой красоте есть ложка мёда. Тьфу ты.. Ложка дёгтя. Самый большой минус, на мой взгляд (и единственный, замеченный мною), в новой системе внешней авторизации. Этот минус больше связан с регистрацией, нежели авторизацией. В 3-ей версии форума было два режима отключения регистрации: Только внутренняя Все возможные методы регистрации Всем понятно, что они значат. Первый режим позволяет создавать новых пользователей при использовании внешней авторизации, а вот второй режим блокирует всё. И эта реализация была правильной, на мой взгляд. Например, в моём случае форум используется только для зарегистрированных игроков в игре. Поэтому я отключаю внутреннюю регистрацию, чтоб могли зарегистрироваться только игроки, при использовании внешней авторизации (напомню, что внутренняя у нас отключена). А вот в 4-ке нас ждёт разочарование! Дело в том, что в новой версии убрали "режимы" отключения регистрации. Теперь, если вы отключаете регистрацию, то даже используя внешнюю авторизацию, создать нового пользователя невозможно. Решение проблемы с закрытой регистрацией и внешней авторизацией Вполне возможно, что кто-то напишет хук, который фиксит эту проблему (если такие хуки возможны - я плохо разбираюсь в принципе их работы, только использую :lol: ), а может, уже такой хук есть. Я не знаю. Я эту проблему решил своим методом - напрямую изменив исходный код форума. Дело в том, что проверка на то, отключена ли регистрация, происходит в самой функции регистрации. Моя идея состоит в том, чтобы проверять метод авторизации, при вызове функции регистрации, и, если это "внешняя авторизация", то разрешать регистрацию. Идём в уже знакомый нам файл '/system/Login/External.php' и ищем строку 128. Там находится вызов функции регистрации. $member = $this->createOrUpdateAccount( NULL, array(), $this->settings['db_col_user'] ? $result[ $this->settings['db_col_user'] ] : NULL, $this->settings['db_col_email'] ? $result[ $this->settings['db_col_email'] ] : NULL ); Забегая наперёд, эта функция, находящаяся в другом файле, по умолчанию принимает 7 параметров, а если их нет, то этим параметрам присваиваются нулевые значения (кроме первого, первый параметр должен обязательно передаваться, хотя бы нулевым). А наш вызов, на строке 128, передаёт всего 4 параметра: пользователя (пустой), настройки пользователя (тоже пустые), имя пользователя и его E-mail. Чтобы указать, что это именно "внешняя авторизация", нам достаточно передать один единственный параметр, со значением 'external' (так как это текстовое значение, не забываем ставить кавычки). Но учитывая то, что функция принимает 7 параметров, мы рискуем передать наше значение в другой параметр, и на выходе получить ошибку. Поэтому нам надо заполнить вызов функции дефолтными значениями оставшихся параметров и добавить наш параметр. Вот готовый код вызова функции регистрации (строка 128): $member = $this->createOrUpdateAccount( NULL, array(), $this->settings['db_col_user'] ? $result[ $this->settings['db_col_user'] ] : NULL, $this->settings['db_col_email'] ? $result[ $this->settings['db_col_email'] ] : NULL, NULL, NULL, NULL, 'external' ); Теперь надо принять наш параметр в самой функции регистрации. Открываем файл '/system/Login/LoginAbstract.php'. Этот файл содержит основные функции, касающиеся авторизации, регистрации и удаления пользователей (удаление вызывается из родительского класса). На строке 267 находим функцию createOrUpdateAccount() и дописываем наш параметр, с дефолтным значением 'internal' (так как все остальные вызовы этой функции не передают этот параметр, то дефолтное значение обязательно). Я дописал такой вот код $reg_method = 'internal'. protected function createOrUpdateAccount( $member, $memberProperties=array(), $name=NULL, $email=NULL, $details=NULL, $profileSync=NULL, $profileSyncClass=NULL, $reg_method = 'internal' ) Чуть ниже, на строке 272 находим проверку на отключение регистрации: /* Is registration enabled? */ if( !\IPS\Settings::i()->allow_reg ) { $exception = new \IPS\Login\Exception( 'reg_disabled', \IPS\Login\Exception::REGISTRATION_DISABLED ); $exception->handler = mb_substr( get_called_class(), 10 ); $exception->member = $member; throw $exception; } Мы должны в условие добавить наш параметр. Так как данная конструкция прерывает выполнение кода, а нам надо, чтоб была доступна только внешняя регистрация, при отключенной регистрации, то, для срабатывания прерывания, то метод регистрации не должен быть внешним. Код с исправленным условием: /* Is registration enabled? */ if( !\IPS\Settings::i()->allow_reg && $reg_method != 'external') { $exception = new \IPS\Login\Exception( 'reg_disabled', \IPS\Login\Exception::REGISTRATION_DISABLED ); $exception->handler = mb_substr( get_called_class(), 10 ); $exception->member = $member; throw $exception; } Ну вот и всё. Теперь ваша внешняя авторизация не подчиняется правилу отключённой регистрации. По такому принципу вы можете в любых других методах регистрации указать, какой можно использовать при отключённой регистрации, а какой нельзя. Надеюсь, для кого-то моя статья будет полезна. Если есть какие-то замечания по поводу моей статьи - обязательно напишите, я из обязательно учту на будущее. Всего вам наилучшего, и приятной работы с новой версией форума.