function fn_ftp_chmod_file($filename, $perm = DEFAULT_FILE_PERMISSIONS, $recursive = false) { $result = false; $ftp = Registry::get('ftp_connection'); if (is_resource($ftp)) { $dest = dirname($filename); $dest = rtrim($dest, '/') . '/'; // force adding trailing slash to path $rel_path = str_replace(Registry::get('config.dir.root') . '/', '', $dest); $cdir = ftp_pwd($ftp); if (empty($rel_path)) { // if rel_path is empty, assume it's root directory $rel_path = $cdir; } if (@ftp_chdir($ftp, $rel_path)) { $result = @ftp_site($ftp, 'CHMOD ' . sprintf('0%o', $perm) . ' ' . fn_basename($filename)); if ($recursive) { $path = fn_normalize_path($cdir . '/' . $rel_path . fn_basename($filename)); if (is_dir($path)) { $_files = fn_get_dir_contents($path, true, true, '', '', true); if (!empty($_files)) { foreach ($_files as $_file) { fn_ftp_chmod_file($path . '/' . $_file, $perm, false); } } } } ftp_chdir($ftp, $cdir); } } return $result; }
/** * Corrects permissions of store files and folders * * @param array $cart_settings Cart settings * @param array $database_settings Database settings * @param array $server_settings Server settings * @param array $ftp_settings FTP connection settings * @param array $addons List of addons to be installed * @return bool Always true */ public function actionCorrectPermissions($cart_settings, $database_settings, $server_settings, $ftp_settings, $addons) { $app = App::instance(); $validator = new Validator(); if (!empty($ftp_settings['ftp_hostname']) && !empty($ftp_settings['ftp_username']) && !empty($ftp_settings['ftp_password'])) { if (fn_ftp_connect($ftp_settings)) { $files = array('config.local.php' => 0666, 'images' => 0777, 'design' => 0777, 'var' => 0777); foreach ($files as $file => $perm) { fn_ftp_chmod_file($file, $perm, true); } } } $validator->isFilesystemWritable(true); $params['dispatch'] = 'setup.index'; $params['cart_settings'] = $cart_settings; $params['database_settings'] = $database_settings; $params['server_settings'] = $server_settings; $params['addons'] = $addons; $app->run($params); return true; }
public function chmod($path, $permissions, Log $logger) { $logger->add(str_repeat('-', 10)); $logger->add(sprintf('Changing permissions of "%s" to %o', $path, $permissions)); $logger->add('Using chmod()... ', true, true, false); $result = @chmod($path, $permissions); $logger->add($result ? 'OK' : 'FAILED', true, false, true); if (!$result) { $logger->add('Using FTP...'); $ftp_connection = Registry::get('ftp_connection'); if (is_resource($ftp_connection)) { $logger->add('Connection is already established'); $ftp_ready = true; } elseif (fn_ftp_connect($this->settings, true)) { $logger->add('Connection established'); $ftp_ready = true; } else { $logger->add('Failed to establish connection'); $ftp_ready = false; } if ($ftp_ready) { $result = fn_ftp_chmod_file($path, $permissions, false); $logger->add(sprintf('FTP chmod result: %s', $result ? 'OK' : 'FAILED')); } } $logger->add(str_repeat('-', 10)); return $result; }
/** * Sets writable permissions to the specified file/dir * * @param string $path Path to file/dir * @param bool $show_notifications Show FTP connection error notifications * @return bool true if permissions were succesfully changed, false otherwise */ public function correctPermissions($path, $show_notifications) { $ftp_link = Registry::get('ftp_connection'); if (empty($ftp_link) && is_null($this->ftp_connection_status)) { if (fn_ftp_connect(Registry::get('settings.Upgrade_center'), $show_notifications)) { $this->ftp_connection_status = true; } else { $this->ftp_connection_status = false; } } $correction_result = true; if (is_file($path) || is_dir($path)) { if (!is_writable($path)) { @chmod($path, 0777); } if (!is_writable($path) && !is_null($this->ftp_connection_status)) { fn_ftp_chmod_file($path, 0777); } if (!is_writable($path)) { $correction_result = false; } } return $correction_result; }
function fn_uc_check_file_access(&$result, $path, $package, $correct_permissions) { if (is_file($path)) { $original_file = str_replace(Registry::get('config.dir.upgrade') . $package . '/package/', Registry::get('config.dir.root') . '/', $path); $relative_file = str_replace(Registry::get('config.dir.root') . '/', '', $original_file); if (!is_writable($original_file) && $correct_permissions) { @chmod($original_file, 0777); } if (!is_writable($original_file) && $correct_permissions) { fn_ftp_chmod_file($original_file); } if (is_file($original_file) && !is_writable($original_file)) { $result['non_writable'][] = $relative_file; } } if (is_dir($path)) { foreach (scandir($path) as $subfile) { $skip_files = array('.', '..'); if (!in_array($subfile, $skip_files)) { fn_uc_check_file_access($result, $path . '/' . $subfile, $package, $correct_permissions); } } } return true; }