Проблема с установкой дополнений после обновления ICMS 2.1.2

#31 10 мая 2015 в 16:34


И так на боевом сервере:

1. Давайте посмотрим, в каком формате nlist отдает список файлов и каталогов у Вас.

Wanderer
Array
(
[0] => //cache
[1] => //system
[2] => //templates
[3] => //upload
[4] => //wysiwyg
[5] => //.htaccess
[6] => //bootstrap.php
[7] => //credits.txt
[8] => //cron.php
[9] => //index.php
[10] => //license.en.txt
[11] => //license.ru.txt
[12] => //readme.txt
[13] => //testing.html
[14] => //systemfieldstext.php.original
)

Скорпион

О как. Очень интересно… Получается, у вас еще один формат массива от ftp_nlist.
попробовал на своем боевом сервере (не InstantCMS, но для понимания подойдет)
Array
(
[14] => /favicon.ico
[17] => /includes
[18] => /tmp
[25] => /..
[38] => /sitemap.xml
[46] => /robots.txt
)

Таким образом, получаем еще одну причину ошибки при установке компонентов.
Спасибо за информацию :)
#32 10 мая 2015 в 16:42
После применения патча:
Патч изменяет строку в файле /system/controllers/admin/actions/install_ftp.php
с
  1. $check_dirs = array('system', 'templates');
на
  1. $check_dirs = array('/system', '/templates');
ошибка пропала.
Вывод
  1. dump ($list);
  2. return false;
такой же hoho
Что еще пожелаете чтобы я сделал?
#33 10 мая 2015 в 16:50


Если Вы не заинтересованы, тогда не стоит рекомендовать Ваш патч как панацею.

Wanderer
Патч предложен как возможное решение проблемы.

Я заинтересован в решении проблемы, а не просто в полемике.

Wanderer
Предложите свой вариант.

Soul
Собирал информацию об ошибках :)
В данный момент вырабатываю универсальное решение.
#34 10 мая 2015 в 16:52


После применения патча:
Патч изменяет строку в файле /system/controllers/admin/actions/install_ftp.php
с

  1. $check_dirs = array('system', 'templates');
на
  1. $check_dirs = array('/system', '/templates');
ошибка пропала.
Вывод
  1. dump ($list);
  2. return false;
такой же hoho
Что еще пожелаете чтобы я сделал?

Скорпион
Почему Ваш патч сработал у Вас и кому он еще поможет:
Сейчас видно, что ftp_nlist возвращает структуру каталогов и файлов в 4-х разных форматах:
1. без слеша в начале (на моем домашнем сервере, денвер)
2. с одним слэшем (на моем боевом сервере на хостинге)
3. с двумя слэшами (Ваш случай)
4. с каталогами или без каталогов.

При проверке наличия нужных каталогов по указанному пути автоматически добавляется путь, который пользователь указывает в "Путь папки сайта".
Таким образом формируется нужное имя файла.
Сейчас подготовлю универсальный патч или его аналог, который позволит решить все 4 проблемы + апдейт, который в идеале нужно будет включить в следующий релиз.
#35 10 мая 2015 в 16:57
Далее на тестовом стенде:
OS — OpenServer 5.2.2
FTP — FTP FileZilla 0.9.45

1. Давайте посмотрим, в каком формате nlist отдает список файлов и каталогов у Вас.

Wanderer
Array
(
[0] => /.htaccess
[1] => /bootstrap.php
[2] => /cache
[3] => /credits.txt
[4] => /cron.php
[5] => /index.php
[6] => /license.en.txt
[7] => /license.ru.txt
[8] => /readme.txt
[9] => /system
[10] => /templates
[11] => /testing.html
[12] => /upload
[13] => /wysiwyg
)

Состояние движка одинаково (бэкап)
Настройки FTP тоже однотипные:
Сервер: mysite.ru
Путь: /
#36 10 мая 2015 в 16:58
Да — итог то забыл написать — без применения моего патча — ВСЕ ОК!
#37 10 мая 2015 в 17:05


Да — итог то забыл написать — без применения моего патча — ВСЕ ОК!

Скорпион

да, все верно. Обратите внимание на количество слэшей в начале каждой строки. Именно на такой вариант и рассчитано решение из поставки.
#38 10 мая 2015 в 17:05
Шоу продолжается.
Применил свой патч на тестовом стенде — получил ошибку. scratch
#39 10 мая 2015 в 17:07
В итоге все варианты наши — они разные для разных случаев.
Универсального нет — поэтому может вернуться к предыдущему варианту проверки. Разработчики — а?
#40 10 мая 2015 в 17:09


Шоу продолжается.
Применил свой патч на тестовом стенде — получил ошибку. scratch

Скорпион

И это тоже верно.
Вот код, который выполняет проверку:
$check_dirs = array('system', 'templates'); //объявляем массив для поиска.

foreach($check_dirs as $dir){ // обходим наш объявленный выше массив в цикле. Переменная $dir в первой итерации будет равна 'system', и 'templates' во второй
if (!in_array($account['path']. $dir, $list)){ //и вот тут самое интересное. Чаще всего $account['path'] равен '/'.
// Тогда код $account['path']. $dir сформирует в первой итерации строку '/system' (и '/templates' во второй) и начнет её искать в массиве $list.
// При разработке этого кода подразумевалось, что FTP сервер возвращает массив с одним слэшем в начале каждой строки. Тогда код должен отрабатывать верно.
// но тут сказалось отсутствие стандарта на эту функцию. В итоге имеем, что имеем.
#41 10 мая 2015 в 17:16
Wanderer, ну мне кажется первым делом надо избавиться от слешов, двоих — троих — десятерых.....
выпевши счас (праздник) — поэтому не думается, точнее не вспоминается как в массиве избавиться от слешов совсем.
это первое… для решения слешов....
ну а по поводу директорий — надо думать…
#42 10 мая 2015 в 17:18


Wanderer, ну мне кажется первым делом надо избавиться от слешов, двоих — троих — десятерых.....
выпевши счас (праздник) — поэтому не думается, точнее не вспоминается как в массиве избавиться от слешов совсем.
это первое… для решения слешов....
ну а по поводу директорий — надо думать......

Скорпион
по поводу директорий я уже придумал. Со слешами тоже, но пока изящность решения мне не очень нравится :)
#43 10 мая 2015 в 17:20
О! Сил хватило добраться до справочника.:
$str = str_replace("/","", $str);
Используя эту функцию — можно избавиться от слешов в массиве
вообщем надо думать…
#44 10 мая 2015 в 17:21


О! Сил хватило добраться до справочника.:
$str = str_replace("/","", $str);
Используя эту функцию — можно избавиться от слешов в массиве
вообщем надо думать.....

Скорпион
да, если рассматривать строку как массив символов, то утверждение верное. Но есть удобнее функция ltrim
#45 10 мая 2015 в 17:49
В общем, т.к. кармы у меня не хватает, то выложу решение здесь. Решение универсальное, покрывает все 4 возможные ситуации, описанные мною выше в этой теме.

Варианта решения 2: простой и ручной.
В простом скачайте файл instantcms.ru/users/files/download5244.html распакуйте в корень вашего сайта с заменой файлов.
В архиве файл install_ftp.php от версии 2.2.1 модифицированный по инструкции, описанной ниже.
Никаких дыр и прочего не встроено. Кому скучно — можете проверить.

Либо ручной вариант:
В файле system/controllers/admin/actions/install_ftp.php нужно заменить полностью функцию (строки 92-114)

  1. private function checkDestination($connection, $account){
  2.  
  3. $list = ftp_nlist($connection, $account['path']);
  4.  
  5. $ftp_path = 'ftp://' . $account['host'] . rtrim($account['path'], '/');
  6.  
  7. if ($list === false) {
  8. cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_NO_ROOT, $ftp_path), 'error');
  9. return false;
  10. }
  11.  
  12. $check_dirs = array('system', 'templates');
  13.  
  14. foreach($check_dirs as $dir){
  15. if (!in_array($account['path'] . $dir, $list)){
  16. cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_BAD_ROOT, $ftp_path), 'error');
  17. return false;
  18. }
  19. }
  20.  
  21. return true;
  22.  
  23. }
на

  1. private function checkDestination($connection, $account) {
  2.  
  3. $ftp_path = 'ftp://' . $account['host'] . $account['path'];
  4. $check_dirs = array(array('system/core', 'core.php'), array('templates', '.htaccess'));
  5.  
  6. foreach ($check_dirs as $dir) {
  7.  
  8. $list = ftp_nlist($connection, $account['path'] . $dir[0]);
  9.  
  10. if ($list == false) {
  11. cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_NO_ROOT, $ftp_path . $dir[0]), 'error');
  12. return false;
  13. }
  14. if ((!in_array($dir[1], $list)) && (!in_array('/' . $dir[1], $list)) && (!in_array('//' . $dir[1], $list))) {
  15. cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_BAD_ROOT, $ftp_path . $dir[0]), 'error');
  16. return false;
  17. }
  18. }
  19.  
  20. return true;
  21. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.