XF 1.5 Выдача прав извне (из другой CMS)

Erriour

Проверенные
Сообщения
10
Реакции
1
Баллы
3,300
В общих чертах: есть сайт, есть форум. хочу выдавать отдельным пользователям отдельные максимально урезанные права (вплоть до нажатия одной кнопки на выдачу конкретных прав и конкретных статусов).

Значится, логично было бы полезть в базу и поменять значения с правами по шаблону, как выдал кому-то из нормальной админки...
OFFTOP

Кстати, в vBulletin это всё реально выдавалось путём замены двух ячеек. Жаль, что там всё в решето в плане безопасности



Написал пару функций, но потом понял, что этот "шайтан-движок" запутан ещё больше, чем кажется:
PHP:
public function setStatus($member, $group_id, $is_staff){
        if (!$user = $this->findXenUser($member['name'], $member['email'])) {
            return true;
        }
        
        $this->db->prepare("UPDATE " . F_PREFIX . "user SET user_group_id=?, display_style_group_id=?, is_staff=? WHERE user_id=?")
            ->execute(array(
                $group_id,
                $group_id,
                $is_staff,
                $user->user_id
            ));

        return false;
    }
    
    public function setRights($member, $group_id, $param_rights, $node_rights, $iter) {
        if (!$user = $this->findXenUser($member['name'], $member['email'])) {
            return true;
        }
        
        switch($group_id){
            case 2: //Обычный юзер
                if($iter == 1){
                    $param_rights = 2;
                    $this->db->prepare("UPDATE " . F_PREFIX . "user SET permission_combination_id=? WHERE user_id=?")
                        ->execute(array(
                            $this->_convert_encoding(strip_tags($param_rights)),
                            $user->user_id
                        ));
                        
                    $this->db->prepare("DELETE FROM " . F_PREFIX . "moderator WHERE user_id=?")
                        ->execute(array($user->user_id));
                    $this->db->prepare("DELETE FROM " . F_PREFIX . "moderator_content WHERE user_id=?")
                            ->execute(array($user->user_id));
                    $this->db->prepare("DELETE FROM " . F_PREFIX . "permission_combination WHERE user_id=?")
                            ->execute(array($user->user_id));
                }
                break;
            case 7: //Какая-то группа
            case 6: //Какая-то группа
                if($iter == 1){               
                    $param_rights = 2;
                    $this->db->prepare("UPDATE " . F_PREFIX . "user SET permission_combination_id=? WHERE user_id=?")
                        ->execute(array(
                            $this->_convert_encoding(strip_tags($param_rights)),
                            $user->user_id
                        ));
                    $this->db->prepare("DELETE FROM " . F_PREFIX . "moderator WHERE user_id=?")
                        ->execute(array($user->user_id));
                    $this->db->prepare("DELETE FROM " . F_PREFIX . "moderator_content WHERE user_id=?")
                            ->execute(array($user->user_id));
                    $this->db->prepare("DELETE FROM " . F_PREFIX . "permission_entry_content WHERE user_id=?")
                            ->execute(array($user->user_id));
                    $this->db->prepare("INSERT INTO " . F_PREFIX . "moderator (`user_id`,`is_super_moderator`,`moderator_permissions`,`extra_user_group_ids`) VALUES (?, ?, ?, ?)")
                        ->execute(array($user->user_id, 0, "a:0:{}", ""));
                }
                $this->db->prepare("INSERT INTO `". F_PREFIX ."permission_entry_content` (`permission_entry_id`, `content_type`, `content_id`, `user_group_id`, `user_id`, `permission_group_id`, `permission_id`, `permission_value`, `permission_value_int`) VALUES ('0', 0x6e6f6465, ?, '0', ?, 0x666f72756d, 0x6c6f636b556e6c6f636b546872656164, 'content_allow', '0')")
                        ->execute(array($node_rights, $user->user_id));

                $this->db->prepare("INSERT INTO " . F_PREFIX . "moderator_content (`user_id`,`content_type`,`content_id`,`moderator_permissions`) VALUES (?, ?, ?, ?)")
                        ->execute(array($user->user_id, "node", $node_rights, 'a:1:{s:5:"forum";a:1:{s:16:"lockUnlockThread";s:1:"1";}}'));
                break;
            default:
                return true;
                break;
        }
        
        return false;
    }

Трёт все права отлично (возвращая к обычному юзеру), с выдачей статусов тоже проблем нет (замена одной ячейки - труда не составляет). Проблема возникает с самими правами, когда есть просто тонны таблиц непонятно для чего, но как они заполняются и чего там происходит - вообще не понятно. То вроде заполняешь пермишены - отваливается весь форум для юзера, то пишет, что нет прав, то вообще никак не реагирует...

В общем, какие есть способы выдать заготовленные права на определённые узлы (один или несколько) без танцев с бубном?

OFFTOP

У меня есть доступ к тех.поддержке форума, но там на такие вопросы шлют на форум. На форуме никто и никогда не отвечает, хотя разрабы сидят постоянно

 
Значится, логично было бы полезть в базу и поменять значения с правами по шаблону, как выдал кому-то из нормальной админки...
Вообще не лезьте в базу. Пошерстите файлы и смотрите, какие функции используются там.
XenForo_ControllerAdmin_User, XenForo_DataWriter_User, XenForo_Model_User
Подключите ксен и используйте эти функции, что-то по типу такого.
Может есть резон посмотреть bdApi, нет ли там этой функции. Скорее всего нет, но попытка не пытка
PHP:
<?php
// XenForo Authentication Loader
$startTime = microtime(true);
define('XF_ROOT', '/xx/xxx/xxx/your_domain.com/httpdocs/forums/'); // set this (absolute path)!

require_once(XF_ROOT . '/library/XenForo/Autoloader.php');

XenForo_Autoloader::getInstance()->setupAutoloader(XF_ROOT . '/library');

XenForo_Application::initialize(XF_ROOT . '/library', XF_ROOT);
XenForo_Application::set('page_start_time', $startTime);
//XenForo_Application::disablePhpErrorHandler();
//XenForo_Application::setDebugMode(false);

XenForo_Session::startPublicSession();

$visitor = XenForo_Visitor::getInstance();
(код выше - не самый лучший пример, это что я нашёл за две минуты и не проверял, но в целом - примерно так и должно выглядеть)
 
Последнее редактирование:
/admin.php?user-permissions/1/
Контроллер всего этого чуда: XenForo_ControllerAdmin_Permission_User
Вам нужно раздербанить форму на указанной странице чтобы узнать, какие вам права нужны. Итого посмотрев этот код, можно наклепать простую функцию на подобии этой:
PHP:
    public function setUserPermissions($userId = 0)
    {
        $user = XenForo_Visitor::setup($userId);
        if (!empty($user)) {
            // Possible values: unset - allow - deny
            $permissions = [
                'general' => [
                    'view' => 'allow'
                ]
            ];
           
            /** @var XenForo_Model_Permission $permissionModel */
            $permissionModel = XenForo_Model::create('XenForo_Model_Permission');
            $permissionModel->updateGlobalPermissionsForUserCollection($permissions, 0, $userId)
        }
       
        return;
    }
Изначально просто немного неправильно вас понял и дал другие классы
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу