[AdminTools] Запрет действий с пакетами

Всем привет! Хоть я последнее время мало уделяю внимания MODX, но уж очень мне понравилась идея Владимира. И я решил добавить такой функционал в свой пакет AdminTools. Реализация достаточно простая — без таблиц, интерфейсов и т.п. Только системная настройка, в которой определяются права. Подробности под катом.



Для пакетов в MODX определены следующие действия:
— Установка (install)
— Переустановка (reinstall)
— Деинсталляция (uninstall)
— Обновление (update)
— Удаление (remove)
— Проверить обновление (checkupdate)
— Посмотреть детали (details)

Любое из этих действий можно запретить. Также можно запретить сразу все действия (об этом ниже). Для управления этим функционалом добавлена системная настройка admintools_package_actions. В ней нужно указать права для пакетов в формате javascript объекта:
{package1:{action1:false, action2:"Сообщение для action2.", message:"Сообщение по-умолчанию."},
package2:{...}}
Чтобы запретить действие, можно указать или false или сообщение. Если указано false, то сообщение будет искаться в ключе message. Этот ключ пригодится, если нужно вывести одно сообщение для всех действий. Таким образом, для каждого действия можно указать своё сообщение или для всех одно общее или вперемешку — для некоторых определить, для остальных общее.

Дальше на примерах покажу как это настраивается.
1. Запретить удаление пакета
{Ace:{remove:"Удаление запрещено!"}}
// или так
{Ace:{remove:false}}  // Выведется дефолтное сообщение "Доступ запрещён!".
// или так
{Ace:{remove:false, message:"Действие запрещено!"}}

2. Запретить установку определённого пакета
{Ace:{install:"Данный пакет устанавливать запрещено по причине несовместимости!"}}

3. Запретить все действия для пакета. Для этого добавлен специальный ключ all.
{Ace:{all:"Все действия с этим пакетом запрещены!"}}

4. Разрешить только некоторые действия для пакета.
{Ace:{details:true, all:"Это действие запрещено!"}}
// эквивалентно
{Ace:{details:true, all:false, message:"Это действие запрещено!"}}

Названия пакетов регистрозависимые, поэтому будьте внимательны.

В общем, пробуйте, благодарите или ругайте. :)
Сергей Шлоков
27 июля 2017, 07:33
modx.pro
1
1 833
+9
Поблагодарить автора Отправить деньги

Комментарии: 13

Владимир
27 июля 2017, 10:37
+2
Вещь! Спасибо!
2. Запретить установку определённого пакета
— это, кстати, ой как полезно, жаль не угадаешь что владелец сайта удумает пробовать самостоятельно устанавливать (но, благо, MODX это не WP и не J***!)
Семён Кудрявцев
27 июля 2017, 11:02
0
Цветовые темы больше не работают, переключал переключал, чистил все кеши, всё равно стандартная тема.
И кнопка избранных элементов с панели элементы пропала.
    Семён Кудрявцев
    27 июля 2017, 11:14
    0
    Полностью снёс пакет и заново поставил, те же проблемы. Функционал избранных элементов не работает.
    Ещё заметил пропали стандартные кнопки (плюсик и обновлялка) в панелях элементов.
    В консоли вываливает кучу ошибок типа adminTools.config
    Пришлось пока снести обновление и поставить старую версию, она стабильно работает.
      Сергей Шлоков
      27 июля 2017, 11:21
      0
      Проверим. Пока отключил обновление. На тестовом сайте всё гуд (см. картинку в топике).
        Сергей Шлоков
        27 июля 2017, 11:38
        0
        Исправил. Проверил на своих сайтах, всё работает.
        Спасибо за багтестинг!
          Семён Кудрявцев
          27 июля 2017, 11:50
          +2
          Вам, Сергей спасибо, за прекрасные дополнения к MODX. Жаль что в последнее время от Вас не часто слышно новостей по новым компонентам.
            Сергей Шлоков
            27 июля 2017, 13:20
            +4
            У меня сейчас вообще нет времени на программирование. Но как только освобожусь, закончу то что запланировал на Laravel. Думаю, многим здесь это понравится. :)
      Aleksandr Huz
      27 июля 2017, 16:25
      0
      А запретить сразу для всех пакетов можно?
        Сергей Шлоков
        27 июля 2017, 18:13
        +2
        Я не делал. Проще убрать доступ в этот интерфейс.
          Aleksandr Huz
          28 июля 2017, 12:43
          0
          Ну а если можно обновлять все пакеты, а другие действия запретить, то закрыть доступ не вариант.

          Решение:
          Написать в admintools_package_actions
          {All:{remove:"Удаление запрещено!"}}
          — запрет для удаление для всех пакетов

          а в файле assets/components/admintools/js/mgr/admintools.js заменить строчку
          var packageOptions = adminToolsPackageActions[record.data.name] ?  adminToolsPackageActions[record.data.name] : false;
          на
          var packageOptions = adminToolsPackageActions['All'] || adminToolsPackageActions[record.data.name] || false;
            Сергей Шлоков
            29 июля 2017, 06:59
            +1
            Идею понял, но решение не додуманное — настройка All всегда в приоритете. Т.е. нельзя разрешить какое-то действие в пакете. Но даже если поменять местами аргументы, то все равно нужно проверять совпадения действий.

              Aleksandr Huz
              29 июля 2017, 11:13
              0
              Поменять местами аргументы и пусть конкретное правило для пакета всегда будет в приоритете.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        13