В общем, т.к. кармы у меня не хватает, то выложу решение здесь. Решение универсальное, покрывает все 4 возможные ситуации, описанные мною выше в этой теме.
Варианта решения 2: простой и ручной.
В простом скачайте файл
instantcms.ru/users/files/download5244.html распакуйте в корень вашего сайта с заменой файлов.
В архиве файл install_ftp.php от версии 2.2.1 модифицированный по инструкции, описанной ниже.
Никаких дыр и прочего не встроено. Кому скучно — можете проверить.
Либо ручной вариант:
В файле system/controllers/admin/actions/install_ftp.php нужно заменить полностью функцию (строки 92-114)
private function checkDestination($connection, $account){
$list = ftp_nlist($connection, $account['path']);
$ftp_path = 'ftp://' . $account['host'] . rtrim($account['path'], '/');
if ($list === false) {
cmsUser
::addSessionMessage(sprintf(LANG_CP_FTP_NO_ROOT
, $ftp_path), 'error'); return false;
}
$check_dirs = array('system', 'templates');
foreach($check_dirs as $dir){
if (!in_array($account['path'] . $dir, $list)){ cmsUser
::addSessionMessage(sprintf(LANG_CP_FTP_BAD_ROOT
, $ftp_path), 'error'); return false;
}
}
return true;
}
на
private function checkDestination($connection, $account) {
$ftp_path = 'ftp://' . $account['host'] . $account['path'];
$check_dirs = array(array('system/core', 'core.php'), array('templates', '.htaccess'));
foreach ($check_dirs as $dir) {
$list = ftp_nlist($connection, $account['path'] . $dir[0]);
if ($list == false) {
cmsUser
::addSessionMessage(sprintf(LANG_CP_FTP_NO_ROOT
, $ftp_path . $dir[0]), 'error'); return false;
}
cmsUser
::addSessionMessage(sprintf(LANG_CP_FTP_BAD_ROOT
, $ftp_path . $dir[0]), 'error'); return false;
}
}
return true;
}