[Console] Сохраняем код в файл
Продолжаю традицию Василия делиться с обществом полезными решениями. В этот раз речь пойдет о компоненте Console (автор Николай Ланец). Для разработчика вещь незаменимая. Я очень часто пользуюсь им. Но у него не хватает одной маленькой, но очень удобной фичи — возможности сохранять код. Благодаря Илье Уткину, консоль научилась хранить код в сессии. Но этого мало. Я для себя немного доработал консоль и теперь она может сохранять код в файл и загружать из файла. Вот этим решением я и готов поделится с обществом. Разработчики должны оценить.
Инструкция простая. При сохранении указываем имя файла, при загрузке выбираем нужный файл.
Вот мой форк консоли. Если Николай даст согласие, я готов отправить пулреквест.
Продолжение темы сохранения.
Инструкция простая. При сохранении указываем имя файла, при загрузке выбираем нужный файл.
Вот мой форк консоли. Если Николай даст согласие, я готов отправить пулреквест.
Продолжение темы сохранения.
Поблагодарить автора
Отправить деньги
Комментарии: 36
О, это просто отличная доработка!
Особенно учитывая тот факт, что АСЕ плохо оптимизирован под мобильные платформы и вставить текст в окно консоли из буфера обмена на планшетах и смартфонах не получается.
Спасибо!:))
Особенно учитывая тот факт, что АСЕ плохо оптимизирован под мобильные платформы и вставить текст в окно консоли из буфера обмена на планшетах и смартфонах не получается.
Спасибо!:))
Да пожалуйста! :)
А мож лучше не в файл, а в табличку? А в админке список вывести, для быстрого доступа.
p.s. это не критика, это предложение))) а плюсик заметке поставил))
p.s. это не критика, это предложение))) а плюсик заметке поставил))
Честно говоря не понимаю, чем лучше. Я, например, работая с несколькими объектами, сохраняю файлы для каждого (правильные addPackage и т.п. ) Потом открываю нужный и работаю. Легко и быстро. И доработка простейшая — поправил один файл и создал 3 процессора.
Так что, лично я не вижу никаких преимуществ табличного варианта.
Так что, лично я не вижу никаких преимуществ табличного варианта.
+ файлы, я так понимаю, можно легко перенести в другой проект?
Ну если файлы легкие, то легко. А если тяжелые, то тяжело. :)
Отлично) а то приходилось писать сниппет и выполнять на левой страничке)
Нужная штука!
Классно, мне нравится
Было бы удобно еще и в сниппеты сохранять/загружать.
Не плохая идея.
Супер!
Может быть, стоит разместить пулл реквест к компоненту? Или Николаю напрямую отправить (он у нас зарегистрирован кстати, недавно пост его авторства читал). Нужная штука в некоторых случаях.
Если Николай посчитает нужным такой функционал и его все устроит, я готов отправить pullrequest.
Если я правильно понимаю, сделать PR тебе достаточно легко (все равно все изменения уже на Гите). Поскольку функционал полезный, отправляй запрос, а Николай уже по факту решит. Но такой вариант может ускорить процесс появления обновленной версии.
Сергей, спасибо за пулл-реквест. Сегодня ближе к вечеру погоняю и скорее всего одобрю.
Сергей, пробежался я по коду быстренько. Первое, что кидается в глаза — это отсутствие проверки прав при сохранении файлов в процессоре. Это меганесекурно. Любой, залогиненный в админке, сможет записать свой исполняемый код. Это я поправлю.
Второй большой недостаток, хотя и не такой важный: не использование источников файлов. Там не только работа с нужными директориями, но и сразу проверка прав на них. понятно дело, что в большинстве случаев консоль используют только разрабы самих сайтов, но все же.
Второй большой недостаток, хотя и не такой важный: не использование источников файлов. Там не только работа с нужными директориями, но и сразу проверка прав на них. понятно дело, что в большинстве случаев консоль используют только разрабы самих сайтов, но все же.
Я решил, что если на выполнение кода права проверяются, то этого достаточно. А так как файлы сохраняются в директорию core и доступ снаружи туда закрыт, то посчитал, что это безопасно.
А по источникам файлов… Не все сразу. :)
А по источникам файлов… Не все сразу. :)
А так как файлы сохраняются в директорию core и доступ снаружи туда закрыт, то посчитал, что это безопасно.Ну да. Только прикол в том, что пользователь можете затереть сам же процессор консоли, записав в него нужный код, и его же вызывать через консоль-коннектор. А может там же создать новый файл, к которому опять-таки будет иметь доступ на выполнение через коннектор консоли, передав нужный action.
Точно. Добавил basename().
Теперь файл сохраняется только в /core/components/console/files/, не выше и не ниже.
Так безопасно?
П.С. Учиться и учиться ещё.
Теперь файл сохраняется только в /core/components/console/files/, не выше и не ниже.
Так безопасно?
П.С. Учиться и учиться ещё.
Вот так безопасно: github.com/sergant210/modx-console/pull/2/files
А ограничивать только текущей директорией, это, во-первых, не добавляет безопасности, во-вторых, ограничивает функционал (может я хочу поредактировать статический сниппет какого-нибудь стороннего модуля).
А ограничивать только текущей директорией, это, во-первых, не добавляет безопасности, во-вторых, ограничивает функционал (может я хочу поредактировать статический сниппет какого-нибудь стороннего модуля).
может я хочу поредактировать статический сниппет какого-нибудь стороннего модуляЯ такое не закладывал. Я-то думал чтобы сохранять файлы как временные.
Вот так безопасноТеперь нужно добавлять это разрешение 'console.save_file' в базу при обновлении компонента.
Пока не обязательно. Этот компонент изначально ориентирован только на sudo-юзеров, потому прописывать можно любые права — все будет разрешено судошникам. Главное тут — чтобы остальным было запрещено.
Еще добавил проверку на пустое имя файла. Точно помню, что была, но в процессе видимо пропала.
Подобные проверки не очень информативны. Проверка идет сразу и наличия кода и имени файла. Если что-то не соблюдается, запись в файл не выполняется, при этом на клиент вернется ответ Успешно. Здесь сразу несколько сценариев с логическими ошибками. К примеру, я сохраняю файл, но по какой-то причине у меня данные кода на сервер не отправились (не важно какие). Сервер мне вернет Успех, я радостный закрываю браузер, потом возвращаюсь к коду через пару дней и начинаю приунывать.
Сценарий второй: я что-то там накодил, а потом решил все затереть, дабы никто из напарников не увидел мой быдлокод. Стераю код и отправляю Сохранить. Опять-таки получаю Успех и закрываю браузер. А потом тот же Сергей Прохоров обнаруживаем мой не затертый файл и начинает тыкать в меня пальцем.
И еще момент: вот отсутствие кода в запросе не всегда следует расценивать как ошибку (может я хочу стереть все в файл). Возвращать ошибочный ответ здесь нельзя. При этом и не записывать в файл здесь нельзя.
А вот отсутствие названия файла — конкретная ошибка, и в данном случае следует возвращать сообщение об ошибке.
Сценарий второй: я что-то там накодил, а потом решил все затереть, дабы никто из напарников не увидел мой быдлокод. Стераю код и отправляю Сохранить. Опять-таки получаю Успех и закрываю браузер. А потом тот же Сергей Прохоров обнаруживаем мой не затертый файл и начинает тыкать в меня пальцем.
И еще момент: вот отсутствие кода в запросе не всегда следует расценивать как ошибку (может я хочу стереть все в файл). Возвращать ошибочный ответ здесь нельзя. При этом и не записывать в файл здесь нельзя.
А вот отсутствие названия файла — конкретная ошибка, и в данном случае следует возвращать сообщение об ошибке.
Поправил.
Сделал так — если код есть — записываем, если нет — удаляем файл.
Сделал так — если код есть — записываем, если нет — удаляем файл.
ОК
Новый PR слать?
Да. Вечером предметней посмотрю.
Сорри, что вчера так и не выкатил новую консоль, до позднего вечера был занят. Сегодня позанимался ей плотно, но не все еще закончил. Там довольно объемный кодрефакторинг пришлось делать. Но завтра уже консоль точно появится. Новшество поюзал, весьма юзабельно получилось.
Извините, а как поставить это приложение?
точнее, как поставить — это я разобрался. Почти. Поясню:
Console у меня стояла, версии 2.0.2. Работало. Но сохранялся код только в Session. Сейчас увидел этот пост, решил надо поставить. Проверил обновленя установленной консоли, пишет обновлений нет. Поискал в Репозитории, нашел, поставил. Сейчас пишет, что версия 2.2.0, однако кнопок «Сохранить/Загрузить в/из файла» не появилось. Кроме всего прочего, если раньше я писал такой код
Console у меня стояла, версии 2.0.2. Работало. Но сохранялся код только в Session. Сейчас увидел этот пост, решил надо поставить. Проверил обновленя установленной консоли, пишет обновлений нет. Поискал в Репозитории, нашел, поставил. Сейчас пишет, что версия 2.2.0, однако кнопок «Сохранить/Загрузить в/из файла» не появилось. Кроме всего прочего, если раньше я писал такой код
echo "1";
то в итоге получал в выводе 1
А сейчас я получаю вот это {"completed":true,"output":"1
\nSQL time: 0.0000 s\nSQL queries: 0\nPHP time: 0.0001 s\nTotal time: 0.0001 s\nMemory: 0 MB<\/pre>"}
Напрашивается только один вывод — автор дополнения удалил данный функционал.
странно, а написано
Console-2.2.0-beta
=============================================================
- Added execution report
Console-2.1.0-beta
=============================================================
- Added a feature to save the console code to file and load from file.
- Added a feature to save the console code to snippet and load from snippet.
Ладно удалил сохранение в файл и сниппет, зачем вывод портить было. Э-эх… хорошее было приложение
Напрашивается только один вывод — кто-то не почистил кеш своего браузера после установки обновления.
Поставил +1
" — а старушка засвистела?
— Нет
— Так чего же Вы приперлись?! Болван!
— Согласен" © «Операция Ы»
" — а старушка засвистела?
— Нет
— Так чего же Вы приперлись?! Болван!
— Согласен" © «Операция Ы»
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.