W

Wanderer

+21
Репутация
2
Рейтинг
#1 Проблема с установкой дополнений после обновления ICMS 2.1.2 31 мая 2015 в 19:15


Я не очень понимаю, а как мне, хотя бы временно, решить эту проблему, куда вставить код?

Няшк

кому вопрос?
#2 [ЕСТЬ РЕШЕНИЕ] Поле «Список: мультивыбор» — предупреждение 21 мая 2015 в 18:33
#3 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 15:57


Версия патча для моего компонента.

Скорпион

ссылка кривая
#4 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 10:24


Ну тогда используя basename можно так:

Скорпион
Да, и это правильное решение v
Только форматирование добавьте
#5 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:43


и всетаки, раз имеем три варианта наличия слеша (без, один слеш, два слеша) может просто перед проверкой "чистить" слеши и потом проверять?

Скорпион
вариант с двумя слэшами — это "производное" от полного пути в имени файла.
#6 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:37


Есть еще вариант в голове.
очищать слеши совсем функцией $str = str_replace("\/","", $str);

Скорпион
Можно. Но лучше задействовать basename.
#7 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:35


попробуйте в файл из #46 установить $path='/system/core'

Wanderer
  1.  
  2. Сервер найден
  3. Подключение выполнено успешно
  4. (
  5. [0] => /system/core/action.php
  6. [1] => /system/core/backend.php
  7. ...
  8. )
  9.  

Скорпион

Спасибо.
Дополненное решение будет вечером.
#8 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:35
На 4-ом сервере (файлохранилище, не хостинг, ОС Windows Server 2012, встроенный FTP сервер)
$path = '/СУ02'; //путь к папке сервера

  1. (
  2. [0] => /СУ02/су_20130228.zip
  3. [1] => /СУ02/СУ.rar
  4. )
Включу этот сервер в тестирование универсального решения.
#9 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:31


а вот вывод скрипта из #46 на том же серваке (стенде):

  1.  
  2. Сервер найден
  3. Подключение выполнено успешно
  4. (
  5. [0] => /.htaccess
  6. [1] => /bootstrap.php
  7. [2] => /cache
  8. [3] => /credits.txt
  9. [4] => /cron.php
  10. [5] => /index.php
  11. [6] => /license.en.txt
  12. [7] => /license.ru.txt
  13. [8] => /readme.txt
  14. [9] => /system
  15. [10] => /templates
  16. [11] => /test.php
  17. [12] => /testing.html
  18. [13] => /upload
  19. [14] => /wysiwyg
  20. )
  21.  

Скорпион
попробуйте в файл из #46 установить $path='/system/core'
#10 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:30


Wanderer, а у меня на двух серверах $list такой какой я указал выше… и ?

Скорпион
И значит, что нужно учитывать и такой вариант.
С FTP сервера получить список файлов можно 2-мя функциями:
ftp_nlist и ftp_rawlist. Ни та, ни другая не стандартизированы.

Варианта решения 2:
а) либо сохранить проверку наличия развернутой InstantCMS и городить костыли
б) либо от проверки отказаться и лить как есть.
#11 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:18


Wanderer, причем тут вариант?
В строке которой идет проверка с массивом $list проверяется только имя файла $dir[1], без директории $dir[0], хотя в самом массиве $list в полученных значениях директории присутствуют.
И как оно может быть равно? В итоге получаем постоянное false.
Мне просто интересно как это могло сработать у lezginka.ru

Скорпион

У меня на трех разных серверах в &list только конечные имена объектов, без путей. Пример приведен в 46-ом сообщении.
Поэтому и пишу про еще один вариант.

UPD: нашел еще один сервер, на котором сейчас протестирую код.
#12 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:17

if ($account['path']) {
$root = ftp_chdir($connection, $account['path']);
if (!$root) {
cmsUser::addSessionMessage(sprintf(LANG_CP_FTP_NO_ROOT, $account['path'], 'error');
return false;
}
}

Геннадий Иванович
Тут интересная ситуация:
$account['path'] всегда будет чему-то равна (не пустая строка) благодаря 31-33 и 74 строчкам кода.
#13 Проблема с установкой дополнений после обновления ICMS 2.1.2 17 мая 2015 в 08:08


.......
должно быть так:

  1.  
  2. if ((!in_array($dir[0] . '/' . $dir[1], $list)) && (!in_array('/' . $dir[0] . '/' . $dir[1], $list)) && (!in_array('//' . $dir[0] . '/' . $dir[1], $list))) {
  3.  

Скорпион
Получается, есть еще один вариант возврата nlist
Я dir[0] учел в
  1. $list = ftp_nlist($connection, $account['path'] . $dir[0]);
#14 Проблема с установкой дополнений после обновления ICMS 2.1.2 10 мая 2015 в 18:17
Если решение вам не помогло, нужно понять, почему.
Для этого создайте новый чистый файл, назовите его удобным Вам именем и укажите расширение php.
В файл запишите текст, указанный ниже. Если необходимо, откорректируйте значения переменных в начале файла (комментарии указаны).
  1. <?php
  2.  
  3. $host = 'localhost'; //указать адрес сервера
  4. $user = 'anonymous'; // логин
  5. $pass = ''; //пароль
  6. $path = '/www'; //путь к папке сервера
  7. $is_pasv = true; //пассивный режим. Если не подключается, поменять на false
  8.  
  9. $connection = @ftp_connect($host);
  10.  
  11. if (!$connection) {
  12. echo '<pre>Неверный адрес сервера, либо сервер не отвечает</pre>';
  13. return;
  14. }
  15. echo '<pre>Сервер найден</pre>';
  16.  
  17. $session = @ftp_login($connection, $user, $pass);
  18. if (!$session) {
  19. echo '<pre>Не удалось авторизоваться с указанными логином/паролем</pre>';
  20. return;
  21. }
  22.  
  23. echo '<pre>Подключение выполнено успешно</pre>';
  24.  
  25. if ($is_pasv) {
  26. ftp_pasv($connection, true);
  27. }
  28.  
  29. $list = ftp_nlist($connection, $path);
  30.  
  31. if ($list === false) {
  32. echo '<pre>Возвращен пустой список файлов</pre>';
  33. return;
  34. }
  35.  
  36. echo '<pre>';
  37. print_r($list);
  38. echo '</pre>';
  39. ?>
  40.  
  41.  
после чего загрузите файл на вебсервер и откройте его через веб-браузер.
В идеале у вас должна открыться страничка без оформления с содержанием вида
  1. Сервер найден
  2. Подключение выполнено успешно
  3. (
  4. [0] => .htaccess
  5. [1] => bootstrap.php
  6. [2] => credits.txt
  7. [3] => cron.php
  8. [4] => index.php
  9. [5] => license.en.txt
  10. [6] => license.ru.txt
  11. [7] => readme.txt
  12. [8] => testftp.php
  13. )
Текст из страницы скопируйте на форум в сообщение.
#15 Проблема с установкой дополнений после обновления ICMS 2.1.2 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.