[pdoTools] Обновление 2.13 - повышение безопасности, данные для Fenom и т.д.

Друзья, представляю новую версию pdoTools с озвученным ранее функционалом. Не всё что запланировал успел сделать, но и в этой версии есть на что обратить внимание —

  • Исправлены известные дырки безопасности
    • вывод любого файла на сайте;
    • отрефакторен сниппет pdoUsers;
    • исправлена подмена пути (path traversal) в файловых элементах.
  • Модификатор «setOption» помечен как deprecated и будет удалён в следующей версии.
  • Параметры сниппетов «tplPath» и «elementsPath» помечены как deprecated и будут удалёны в следующей версии.
  • Добавлена возможность выводить массив необработанных данных (нужно при использовании Fenom).
  • Системные настройки «parser_class» и «parser_class_path» теперь будут регистрироваться в пространстве имён «core».

Безопасность

Вопрос безопасности я чуть позже более подробно рассмотрю на своём сайте в закрытом режиме. Хочу снять видос. В широком доступе эту информацию обсуждать нежелательно.

Модификатор «setOption» помечен как deprecated

Как я говорил в прошлой статье — контент-менеджер не должен иметь права на переопределение системных настроек. Но эта проблема не полностью закрывается данным исправлением. У объекта $_modx есть открытое свойство $config, которое позволяет контент-менеджеру делать тоже самое напрямую без использования модификатора. В следующей версии, которая явно будет мажорной, ибо ломает обратную совместимость, надо закрывать доступ к этому свойству.

Параметры сниппетов «tplPath» и «elementsPath»

Параметры сниппетов «tplPath» и «elementsPath» помечены как deprecated и будут удалёны в следующей версии.
Директория хранения файловых элементов определяется администратором в системной настройке «pdotools_elements_path». Контент-менеджер должен использовать файловые элементы из этой папки или вложенных подпапок.

Режим вывода необработанных данных

Мы много уже говорили про эту возможность. Так как pdoTools поставляется с Fenom, то можно вполне обойтись без многочисленных шаблонов «tpl», «tplFirst», «tplWrapper» и т.п. У всех сниппетов есть параметр «return», указывающий режим вывода —
  • chunks — оформленные чанки, по умолчанию.
  • sql — подготовленный сырой SQL, полезно для отладки. Сам запрос не выполняется, только выводится на экран.

  • data — готовый массив данных. Из-за особенностей работы сниппетов MODX этот вариант имеет смысл использовать только при вызове pdoFetch::run() напрямую из своего сниппета, в противном случае вы получите только строку «Array».
  • ids — возвращает только идентификаторы документов, через запятую. Удобно для подстановки в качестве параметра другим сниппетам. Параметр &returnIds использует именно этот тип.
  • json — возврат массива данных JSON строкой.
  • serialize — возврат массива данных сериализованной строкой. Иногда, по непонятным причинам, может вызвать нехватку памяти. Лучше использовать json.
Как видим по документации, у него есть режим «data», который выводит массив данных. Но в процессе конвертации массива в строку в итоге получается только «Array». В новой версии сниппеты умеют выводит массив для целей использования с шаблонизатором Fenom.
{set $resources = '!pdoResources' | snippet : [
    "return" => "data",
    ...
]}
{foreach $resources as $resource}
<p>Заголовок: {$resource.pagetitle}</p>
{/foreach}

Системные настройки «parser_class» и «parser_class_path»

Это настройки MODX. Поэтому неправильно их регистрировать как pdoTools настройки. При новой установке они будут создаваться в пространстве имён «core:site». При обновлении они перемещаться не будут.

Заключение

Вот что успел сделать. Планы по оптимизации запросов и сниппета pdoPage перенёс на следующую версию. Там не всё так просто. Надеюсь, эти доработки пригодятся.
Сергей Шлоков
01 сентября 2021, 17:24
modx.pro
1 617
+33
Поблагодарить автора Отправить деньги

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

Иван Бочкарев
01 сентября 2021, 17:27
+1
Спасибо!
    Sergey (Sentinel)
    01 сентября 2021, 17:29
    +1
    Круто! Спасибо
      Петропавловский Артем
      01 сентября 2021, 17:29
      0
      Ошибка:
      syntax error, unexpected ')' in core/components/pdotools/model/pdotools/_fenom.php on line 388
      Также нет пакета, сформированного composer'ом core/components/pdotools/vendor/autoload.php.
      Ошибки ломают сайты. Проверяйте перед релизом.
        Сергей Шлоков
        01 сентября 2021, 18:37
        +1
        Проверяйте перед релизом.
        Первым делом поставил на свой сайт. Прогнал все страницы. Ничего не сломалось. Единственное, что повылезало
        [pdoTools] The "tplPath" and "elementsPath" parameters are deprecated and will be removed in the next version.
        Первый блин… За композером не углядел. Выпустил 2.13.1 версию с исправлением.
          Петропавловский Артем
          01 сентября 2021, 18:40
          0
          Думаю, что нужно дополнительно проверять на чистых MODX. У меня как раз на таком вылезло. pdoCrumbs вызываю, а он ничего не выводит, уж, думал, я косячу. Потом логи почитал) Спасибо, за оперативность)
            Михаил Божко
            02 сентября 2021, 00:29
            +1
            pdoCrumbs и сейчас не работает в стандартном вызове
            {'pdoCrumbs'|snippet:[
            'fastMode' => 1,
            'tplWrapper' => '@INLINE <div class="breadcrumbs"><div class="section-wrapper">{$output}</div></div>',
            'wrapIfEmpty' => 0,
            'showHome' => 0,
            'showCurrent' => 1,
            'tplHome' => '@INLINE <a href="/" class="breadcrumbs__item">Главная <span class="breadcrumbs__divider">›</span></a>',
            'tpl' => '@INLINE <a href="{$link}" class="breadcrumbs__item">{$menutitle} <span class="breadcrumbs__divider">›</span></a>',
            'tplCurrent' => '@INLINE <span class="breadcrumbs__item breadcrumbs__item--current">{$menutitle}</span>'
            ]}
            пришлось удалять строки
            if (!isset($return)) {
                $scriptProperties['return'] = $return = 'chunks';
            }
            из кода сниппета pdoCrumbs
              Сергей Шлоков
              02 сентября 2021, 07:14
              0
              Исправил. Походу всё-таки придётся писать тесты. Самому уследить за всем очень сложно.
              Stepan
              08 ноября 2023, 23:57
              0
              Не очень понял, а зачем это удалять? Что-то взамен когда очень хочется как быть?
              я про elementsPath
            Scorp Satex
            01 сентября 2021, 17:37
            0
            Спасибо.

            А можно узнать почему на github.com/sergant210/pdoTools — ничего не обновилось? Где идет разработка и можно посмотреть изменения? Проект еще в статусе open source?
              Іван Клімчук
              01 сентября 2021, 18:19
              0
              А что и именно должно обновиться? Коммиты с кодом есть github.com/sergant210/pdoTools/commits/master
                Сергей Шлоков
                01 сентября 2021, 18:33
                0
                Просто всё физически успеть сложно.
                  iWatchYouFromAfar
                  02 сентября 2021, 22:54
                  +8
                  Круто что есть люди не дающие MODx'у потухнуть. Но при всем уважении к автору, кмк, все правки с таким популярным компонентом нужно гонять тестами, причем гонять люто, писать тесты под все сниппеты и их параметры, дабы к людям после нажатия на кноку «Обновить» не прилетали артефакты.

                  А фраза:

                  Просто всё физически успеть сложно.

                  Сама напрашивается на вопрос, а зачем торопиться-то? Лучше потратить на это месяц, два, три — да сколько угодно. Но выпустить железобетон который не сломает людям сайты.
                Anton
                02 сентября 2021, 19:43
                +1
                Спасибо.
                  Игорь
                  16 ноября 2021, 20:54
                  0
                  Всем привет! Спасибо автору за работу, однако…
                  Баг репорт! Версии: php — 7.3, Modx — 2.8.3, pdoTools 2.13.2 (последняя на данный момент).
                  При вызове pdoPage (ajax=scroll) вылазит ошибка
                  [pdoTools] The «tplPath» and «elementsPath» parameters are deprecated and will be removed in the next version.
                  , хотя все работает…
                    Сергей Шлоков
                    17 ноября 2021, 08:17
                    0
                    Игорь, а Вы читали пост? Он же ведь не очень большой. И там по этому поводу всё написано — в следующей версии нельзя будет указывать путь для файловых элементов в параметрах сниппета. Он указывается в системной настройке администратором (!) и не должен переопределяться простым контент-менеджером.
                      Игорь
                      17 ноября 2021, 12:01
                      0
                      Да, конечно, читал… но меня смутило то, что в настройках modx у меня отключен показ ошибок, связанных с «deprecated» методами.
                        Дмитрий
                        11 января 2022, 14:02
                        0
                        Сергей, вопрос: а если требуется подтянуть файловые элементы для одного сниппета или плагина из одной папки, а для другого – из другой? У меня на многих сайтах такая необходимость. Особенно это касается собственных компонентов – чтобы не складировать все в одной папке, часть плагинов подключаются из папки с элементами, которая находится в каталоге компонента. Мне кажется, что отключение этого параметра, сильно снизит удобство. Или есть еще способ подключать сниппет или плагин через
                        $pdoTools->runSnippet('<НАЗВАНИЕ ФАЙЛА>')
                        из определенного каталога, отличного от того, что задан в системных настройках pdoTools?
                          Сергей Шлоков
                          11 января 2022, 21:14
                          0
                          Я склоняюсь к решению, которое я сделал в ZoomX — возможность указывать несколько путей для файловых элементов. В сторонних компонентах нужно будет использовать плагин на событие «pdoToolsOnFenomInit».

                          В любом случае, во второй версии эти параметры просто задепрекейчены. В третьей (которая для MODX3) они удалены.
                            Дмитрий
                            11 января 2022, 21:16
                            0
                            Спасибо! Благодарю за наводку с
                            pdoToolsOnFenomInit
                          Stepan
                          29 ноября 2023, 15:55
                          0
                          Сергей, а что остановит КМ использовать setOption пару раз? или думаете не применится?
                        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                        20