[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»

Директория хранения файловых элементов определяется администратором в системной настройке «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
665
+33
Поблагодарить автора Отправить деньги

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

Иван Бочкарев
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
              Исправил. Походу всё-таки придётся писать тесты. Самому уследить за всем очень сложно.
          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 Erin
              02 сентября 2021, 19:43
              +1
              Спасибо.
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                12