Esempio n. 1
0
/**
 * Load a list of package servers.
 */
function PackageServers()
{
    global $txt, $scripturl, $context, $boarddir, $sourcedir, $modSettings, $smcFunc;
    // Ensure we use the correct template, and page title.
    $context['sub_template'] = 'servers';
    $context['page_title'] .= ' - ' . $txt['download_packages'];
    // Load the list of servers.
    $request = $smcFunc['db_query']('', '
		SELECT id_server, name, url
		FROM {db_prefix}package_servers', array());
    $context['servers'] = array();
    while ($row = $smcFunc['db_fetch_assoc']($request)) {
        $context['servers'][] = array('name' => $row['name'], 'url' => $row['url'], 'id' => $row['id_server']);
    }
    $smcFunc['db_free_result']($request);
    $context['package_download_broken'] = !is_writable($boarddir . '/Packages') || !is_writable($boarddir . '/Packages/installed.list');
    if ($context['package_download_broken']) {
        @chmod($boarddir . '/Packages', 0777);
        @chmod($boarddir . '/Packages/installed.list', 0777);
    }
    $context['package_download_broken'] = !is_writable($boarddir . '/Packages') || !is_writable($boarddir . '/Packages/installed.list');
    if ($context['package_download_broken']) {
        if (isset($_POST['ftp_username'])) {
            require_once $sourcedir . '/Class-Package.php';
            $ftp = new ftp_connection($_POST['ftp_server'], $_POST['ftp_port'], $_POST['ftp_username'], $_POST['ftp_password']);
            if ($ftp->error === false) {
                // I know, I know... but a lot of people want to type /home/xyz/... which is wrong, but logical.
                if (!$ftp->chdir($_POST['ftp_path'])) {
                    $ftp_error = $ftp->error;
                    $ftp->chdir(preg_replace('~^/home[2]?/[^/]+?~', '', $_POST['ftp_path']));
                }
            }
        }
        if (!isset($ftp) || $ftp->error !== false) {
            if (!isset($ftp)) {
                require_once $sourcedir . '/Class-Package.php';
                $ftp = new ftp_connection(null);
            } elseif ($ftp->error !== false && !isset($ftp_error)) {
                $ftp_error = $ftp->last_message === null ? '' : $ftp->last_message;
            }
            list($username, $detect_path, $found_path) = $ftp->detect_path($boarddir);
            if ($found_path || !isset($_POST['ftp_path'])) {
                $_POST['ftp_path'] = $detect_path;
            }
            if (!isset($_POST['ftp_username'])) {
                $_POST['ftp_username'] = $username;
            }
            $context['package_ftp'] = array('server' => isset($_POST['ftp_server']) ? $_POST['ftp_server'] : (isset($modSettings['package_server']) ? $modSettings['package_server'] : 'localhost'), 'port' => isset($_POST['ftp_port']) ? $_POST['ftp_port'] : (isset($modSettings['package_port']) ? $modSettings['package_port'] : '21'), 'username' => isset($_POST['ftp_username']) ? $_POST['ftp_username'] : (isset($modSettings['package_username']) ? $modSettings['package_username'] : ''), 'path' => $_POST['ftp_path'], 'error' => empty($ftp_error) ? null : $ftp_error);
        } else {
            $context['package_download_broken'] = false;
            $ftp->chmod('Packages', 0777);
            $ftp->chmod('Packages/installed.list', 0777);
            $ftp->close();
        }
    }
}
Esempio n. 2
0
function CheckFilesWritable()
{
    global $txt, $incontext;
    $incontext['page_title'] = $txt['ftp_checking_writable'];
    $incontext['sub_template'] = 'chmod_files';
    $writable_files = array('attachments', 'avatars', 'cache', 'template_cache', 'Packages', 'Packages/installed.list', 'Smileys', 'Themes', 'agreement.txt', 'Settings.php', 'Settings_bak.php');
    $extra_files = array('Themes/classic/index.template.php', 'Themes/classic/style.css');
    foreach ($incontext['detected_languages'] as $lang => $temp) {
        $extra_files[] = 'Themes/default/languages/' . $lang;
    }
    // With mod_security installed, we could attempt to fix it with .htaccess.
    if (function_exists('apache_get_modules') && in_array('mod_security', apache_get_modules())) {
        $writable_files[] = file_exists(dirname(__FILE__) . '/.htaccess') ? '.htaccess' : '.';
    }
    $failed_files = array();
    // On linux, it's easy - just use is_writable!
    if (substr(__FILE__, 1, 2) != ':\\') {
        foreach ($writable_files as $file) {
            if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                @chmod(dirname(__FILE__) . '/' . $file, 0755);
                // Well, 755 hopefully worked... if not, try 777.
                if (!is_writable(dirname(__FILE__) . '/' . $file) && !@chmod(dirname(__FILE__) . '/' . $file, 0777)) {
                    $failed_files[] = $file;
                }
            }
        }
        foreach ($extra_files as $file) {
            @chmod(dirname(__FILE__) . (empty($file) ? '' : '/' . $file), 0777);
        }
    } else {
        foreach ($writable_files as $file) {
            // Folders can't be opened for write... but the index.php in them can ;)
            if (is_dir(dirname(__FILE__) . '/' . $file)) {
                $file .= '/index.php';
            }
            // Funny enough, chmod actually does do something on windows - it removes the read only attribute.
            @chmod(dirname(__FILE__) . '/' . $file, 0777);
            $fp = @fopen(dirname(__FILE__) . '/' . $file, 'r+');
            // Hmm, okay, try just for write in that case...
            if (!is_resource($fp)) {
                $fp = @fopen(dirname(__FILE__) . '/' . $file, 'w');
            }
            if (!is_resource($fp)) {
                $failed_files[] = $file;
            }
            @fclose($fp);
        }
        foreach ($extra_files as $file) {
            @chmod(dirname(__FILE__) . (empty($file) ? '' : '/' . $file), 0777);
        }
    }
    $failure = count($failed_files) >= 1;
    if (!isset($_SERVER)) {
        return !$failure;
    }
    // Put the list into context.
    $incontext['failed_files'] = $failed_files;
    // It's not going to be possible to use FTP on windows to solve the problem...
    if ($failure && substr(__FILE__, 1, 2) == ':\\') {
        $incontext['error'] = $txt['error_windows_chmod'] . '
					<ul style="margin: 2.5ex; font-family: monospace;">
						<li>' . implode('</li>
						<li>', $failed_files) . '</li>
					</ul>';
        return false;
    } elseif ($failure) {
        // Load any session data we might have...
        if (!isset($_POST['ftp_username']) && isset($_SESSION['installer_temp_ftp'])) {
            $_POST['ftp_server'] = $_SESSION['installer_temp_ftp']['server'];
            $_POST['ftp_port'] = $_SESSION['installer_temp_ftp']['port'];
            $_POST['ftp_username'] = $_SESSION['installer_temp_ftp']['username'];
            $_POST['ftp_password'] = $_SESSION['installer_temp_ftp']['password'];
            $_POST['ftp_path'] = $_SESSION['installer_temp_ftp']['path'];
        }
        $incontext['ftp_errors'] = array();
        if (isset($_POST['ftp_username'])) {
            $ftp = new ftp_connection($_POST['ftp_server'], $_POST['ftp_port'], $_POST['ftp_username'], $_POST['ftp_password']);
            if ($ftp->error === false) {
                // Try it without /home/abc just in case they messed up.
                if (!$ftp->chdir($_POST['ftp_path'])) {
                    $incontext['ftp_errors'][] = $ftp->last_message;
                    $ftp->chdir(preg_replace('~^/home[2]?/[^/]+?~', '', $_POST['ftp_path']));
                }
            }
        }
        if (!isset($ftp) || $ftp->error !== false) {
            if (!isset($ftp)) {
                $ftp = new ftp_connection(null);
            } elseif ($ftp->error !== false && empty($incontext['ftp_errors']) && !empty($ftp->last_message)) {
                $incontext['ftp_errors'][] = $ftp->last_message;
            }
            list($username, $detect_path, $found_path) = $ftp->detect_path(dirname(__FILE__));
            if (empty($_POST['ftp_path']) && $found_path) {
                $_POST['ftp_path'] = $detect_path;
            }
            if (!isset($_POST['ftp_username'])) {
                $_POST['ftp_username'] = $username;
            }
            // Set the username etc, into context.
            $incontext['ftp'] = array('server' => isset($_POST['ftp_server']) ? $_POST['ftp_server'] : 'localhost', 'port' => isset($_POST['ftp_port']) ? $_POST['ftp_port'] : '21', 'username' => isset($_POST['ftp_username']) ? $_POST['ftp_username'] : '', 'path' => isset($_POST['ftp_path']) ? $_POST['ftp_path'] : '/', 'path_msg' => !empty($found_path) ? $txt['ftp_path_found_info'] : $txt['ftp_path_info']);
            return false;
        } else {
            $_SESSION['installer_temp_ftp'] = array('server' => $_POST['ftp_server'], 'port' => $_POST['ftp_port'], 'username' => $_POST['ftp_username'], 'password' => $_POST['ftp_password'], 'path' => $_POST['ftp_path']);
            $failed_files_updated = array();
            foreach ($failed_files as $file) {
                if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                    $ftp->chmod($file, 0755);
                }
                if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                    $ftp->chmod($file, 0777);
                }
                if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                    $failed_files_updated[] = $file;
                    $incontext['ftp_errors'][] = rtrim($ftp->last_message) . ' -> ' . $file . "\n";
                }
            }
            $ftp->close();
            // Are there any errors left?
            if (count($failed_files_updated) >= 1) {
                // Guess there are...
                $incontext['failed_files'] = $failed_files_updated;
                // Set the username etc, into context.
                $incontext['ftp'] = $_SESSION['installer_temp_ftp'] += array('path_msg' => $txt['ftp_path_info']);
                return false;
            }
        }
    }
    return true;
}
Esempio n. 3
0
function packageRequireFTP($destination_url, $files = null, $return = false)
{
    global $context, $modSettings, $package_ftp, $boarddir, $txt;
    // Try to make them writable the manual way.
    if ($files !== null) {
        foreach ($files as $k => $file) {
            // If this file doesn't exist, then we actually want to look at the directory, no?
            if (!file_exists($file)) {
                $file = dirname($file);
            }
            // This looks odd, but it's an attempt to work around PHP suExec.
            if (!@is_writable($file)) {
                @chmod($file, 0755);
            }
            if (!@is_writable($file)) {
                @chmod($file, 0777);
            }
            if (!@is_writable(dirname($file))) {
                @chmod($file, 0755);
            }
            if (!@is_writable(dirname($file))) {
                @chmod($file, 0777);
            }
            $fp = is_dir($file) ? @opendir($file) : @fopen($file, 'rb');
            if (@is_writable($file) && $fp) {
                unset($files[$k]);
                if (!is_dir($file)) {
                    fclose($fp);
                } else {
                    closedir($fp);
                }
            }
        }
        // No FTP required!
        if (empty($files)) {
            return array();
        }
    }
    // They've opted to not use FTP, and try anyway.
    if (isset($_SESSION['pack_ftp']) && $_SESSION['pack_ftp'] == false) {
        if ($files === null) {
            return array();
        }
        foreach ($files as $k => $file) {
            // This looks odd, but it's an attempt to work around PHP suExec.
            if (!file_exists($file)) {
                mktree(dirname($file), 0755);
                @touch($file);
                @chmod($file, 0755);
            }
            if (!@is_writable($file)) {
                @chmod($file, 0777);
            }
            if (!@is_writable(dirname($file))) {
                @chmod(dirname($file), 0777);
            }
            if (@is_writable($file)) {
                unset($files[$k]);
            }
        }
        return $files;
    } elseif (isset($_SESSION['pack_ftp'])) {
        // Load the file containing the ftp_connection class.
        loadClassFile('Class-Package.php');
        $package_ftp = new ftp_connection($_SESSION['pack_ftp']['server'], $_SESSION['pack_ftp']['port'], $_SESSION['pack_ftp']['username'], package_crypt($_SESSION['pack_ftp']['password']));
        if ($files === null) {
            return array();
        }
        foreach ($files as $k => $file) {
            $ftp_file = strtr($file, array($_SESSION['pack_ftp']['root'] => ''));
            // This looks odd, but it's an attempt to work around PHP suExec.
            if (!file_exists($file)) {
                mktree(dirname($file), 0755);
                $package_ftp->create_file($ftp_file);
                $package_ftp->chmod($ftp_file, 0755);
            }
            if (!@is_writable($file)) {
                $package_ftp->chmod($ftp_file, 0777);
            }
            if (!@is_writable(dirname($file))) {
                $package_ftp->chmod(dirname($ftp_file), 0777);
            }
            if (@is_writable($file)) {
                unset($files[$k]);
            }
        }
        return $files;
    }
    if (isset($_POST['ftp_none'])) {
        $_SESSION['pack_ftp'] = false;
        $files = packageRequireFTP($destination_url, $files, $return);
        return $files;
    } elseif (isset($_POST['ftp_username'])) {
        loadClassFile('Class-Package.php');
        $ftp = new ftp_connection($_POST['ftp_server'], $_POST['ftp_port'], $_POST['ftp_username'], $_POST['ftp_password']);
        if ($ftp->error === false) {
            // Common mistake, so let's try to remedy it...
            if (!$ftp->chdir($_POST['ftp_path'])) {
                $ftp_error = $ftp->last_message;
                $ftp->chdir(preg_replace('~^/home[2]?/[^/]+?~', '', $_POST['ftp_path']));
            }
        }
    }
    if (!isset($ftp) || $ftp->error !== false) {
        if (!isset($ftp)) {
            loadClassFile('Class-Package.php');
            $ftp = new ftp_connection(null);
        } elseif ($ftp->error !== false && !isset($ftp_error)) {
            $ftp_error = $ftp->last_message === null ? '' : $ftp->last_message;
        }
        list($username, $detect_path, $found_path) = $ftp->detect_path($boarddir);
        if ($found_path) {
            $_POST['ftp_path'] = $detect_path;
        } elseif (!isset($_POST['ftp_path'])) {
            $_POST['ftp_path'] = isset($modSettings['package_path']) ? $modSettings['package_path'] : $detect_path;
        }
        if (!isset($_POST['ftp_username'])) {
            $_POST['ftp_username'] = $username;
        }
        $context['package_ftp'] = array('server' => isset($_POST['ftp_server']) ? $_POST['ftp_server'] : (isset($modSettings['package_server']) ? $modSettings['package_server'] : 'localhost'), 'port' => isset($_POST['ftp_port']) ? $_POST['ftp_port'] : (isset($modSettings['package_port']) ? $modSettings['package_port'] : '21'), 'username' => isset($_POST['ftp_username']) ? $_POST['ftp_username'] : (isset($modSettings['package_username']) ? $modSettings['package_username'] : ''), 'path' => $_POST['ftp_path'], 'error' => empty($ftp_error) ? null : $ftp_error, 'destination' => $destination_url);
        // If we're returning dump out here.
        if ($return) {
            return $files;
        }
        $context['page_title'] = $txt['package_ftp_necessary'];
        $context['sub_template'] = 'ftp_required';
        obExit();
    } else {
        if (!in_array($_POST['ftp_path'], array('', '/'))) {
            $ftp_root = strtr($boarddir, array($_POST['ftp_path'] => ''));
            if (substr($ftp_root, -1) == '/' && ($_POST['ftp_path'] == '' || substr($_POST['ftp_path'], 0, 1) == '/')) {
                $ftp_root = substr($ftp_root, 0, -1);
            }
        } else {
            $ftp_root = $boarddir;
        }
        $_SESSION['pack_ftp'] = array('server' => $_POST['ftp_server'], 'port' => $_POST['ftp_port'], 'username' => $_POST['ftp_username'], 'password' => package_crypt($_POST['ftp_password']), 'path' => $_POST['ftp_path'], 'root' => $ftp_root);
        if (!isset($modSettings['package_path']) || $modSettings['package_path'] != $_POST['ftp_path']) {
            updateSettings(array('package_path' => $_POST['ftp_path']));
        }
        $files = packageRequireFTP($destination_url, $files, $return);
    }
    return $files;
}
Esempio n. 4
0
function doStep3()
{
    global $txt;
    $chmod =& $_SESSION['webinstall_state']['chmod'];
    if (ini_get('memory_limit') < 64) {
        ini_set('memory_limit', '64M');
    }
    foreach ($_SESSION['webinstall_state']['files_to_download'] as $i => $file) {
        if ($i < $_GET['substep']) {
            continue;
        }
        $fp = fopen(dirname(__FILE__) . '/smf_install' . $i . '.tmp', 'rb');
        $data = '';
        while (!feof($fp)) {
            $data .= fread($fp, 4096);
        }
        fclose($fp);
        if (!empty($_SESSION['installer_temp_ftp'])) {
            $ftp = new ftp_connection($_SESSION['installer_temp_ftp']['server'], $_SESSION['installer_temp_ftp']['port'], $_SESSION['installer_temp_ftp']['username'], $_SESSION['installer_temp_ftp']['password']);
            $ftp->chdir($_SESSION['installer_temp_ftp']['path']);
            extract_tar($data, dirname(__FILE__), $ftp);
            $ftp->unlink('smf_install' . $i . '.tmp');
            $ftp->close();
        } else {
            extract_tar($data, dirname(__FILE__), null);
            unlink('smf_install' . $i . '.tmp');
        }
        if ($i < $_SESSION['webinstall_state']['files_to_download_total'] - 1) {
            $query_string = '?step=3&substep=' . ($i + 1);
            $percent_done_total = round(($i + 1) / $_SESSION['webinstall_state']['files_to_download_total'] * 100, 2);
            // Pausing time!
            echo '
				<div class="panel">
					<h2 style="margin-top: 2ex;">', $txt['not_done_yet'], '</h2>
					<h3>', $txt['extraction_paused'], '</h3>

					<div style="padding-left: 20%; padding-right: 20%; margin-top: 1ex;">
						<strong>', $txt['extraction_progress'], ':</strong>
						<div style="font-size: 8pt; height: 12pt; border: 1px solid black; background-color: white; padding: 1px; position: relative;">
							<div style="padding-top: 1pt; width: 100%; z-index: 2; color: black; position: absolute; text-align: center; font-weight: bold;">', $percent_done_total, '%</div>
							<div style="width: ', $percent_done_total, '%; height: 12pt; z-index: 1; background-color: red;">&nbsp;</div>
						</div>
					</div>
					<form action="', $_SERVER['PHP_SELF'], $query_string, '" method="post" name="autoSubmit">
						<div class="righttext" style="margin: 1ex;"><input name="b" type="submit" value="', $txt['continue'], '" /></div>
					</form>
					<script type="text/javascript"><!-- // --><![CDATA[
						window.onload = doAutoSubmit;
						var countdown = 3;

						function doAutoSubmit()
						{
							if (countdown == 0)
								document.autoSubmit.submit();
							else if (countdown == -1)
								return;

							document.autoSubmit.b.value = "', $txt['continue'], ' (" + countdown + ")";
							countdown--;

							setTimeout(doAutoSubmit, 1000);
						}
					// ]]></script>
				</div>';
            return true;
        }
    }
    $_SESSION['webinstall_state']['files_to_download'] = array();
    if (file_exists(dirname(__FILE__) . '/install.php')) {
        header('Location: http://' . (empty($_SERVER['HTTP_HOST']) ? $_SERVER['SERVER_NAME'] . (empty($_SERVER['SERVER_PORT']) || $_SERVER['SERVER_PORT'] == '80' ? '' : ':' . $_SERVER['SERVER_PORT']) : $_SERVER['HTTP_HOST']) . (strtr(dirname($_SERVER['PHP_SELF']), '\\', '/') == '/' ? '' : strtr(dirname($_SERVER['PHP_SELF']), '\\', '/')) . '/install.php');
        exit;
    } elseif (file_exists(dirname(__FILE__) . '/upgrade.php')) {
        header('Location: http://' . (empty($_SERVER['HTTP_HOST']) ? $_SERVER['SERVER_NAME'] . (empty($_SERVER['SERVER_PORT']) || $_SERVER['SERVER_PORT'] == '80' ? '' : ':' . $_SERVER['SERVER_PORT']) : $_SERVER['HTTP_HOST']) . (strtr(dirname($_SERVER['PHP_SELF']), '\\', '/') == '/' ? '' : strtr(dirname($_SERVER['PHP_SELF']), '\\', '/')) . '/upgrade.php');
        exit;
    }
    echo '
				<div class="panel">
					<h2>', $txt['extraction_complete'], '</h2>
					<h3>', $txt['extraction_complete_info'], '</h3>

					<form action="', strtr(dirname($_SERVER['PHP_SELF']), array(basename(__FILE__) => 'install.php')), '" method="post">
						<div class="righttext" style="margin: 1ex;"><input type="submit" value="', $txt['continue'], '" /></div>
					</form>
				</div>';
    unset($_SESSION['webinstall_state']);
    return true;
}
Esempio n. 5
0
function make_files_writable()
{
    global $txt;
    $writable_files = array('attachments', 'avatars', 'Packages', 'Packages/installed.list', 'Smileys', 'Themes', 'agreement.txt', 'Settings.php', 'Settings_bak.php');
    $extra_files = array('Themes/classic/index.template.php', 'Themes/classic/style.css');
    foreach ($GLOBALS['detected_languages'] as $lang => $temp) {
        $extra_files[] = 'Themes/default/languages/' . $lang;
    }
    $failure = false;
    // With mod_security installed, we could attempt to fix it with .htaccess.
    if (function_exists('apache_get_modules') && in_array('mod_security', apache_get_modules())) {
        $writable_files[] = file_exists(dirname(__FILE__) . '/.htaccess') ? '.htaccess' : '.';
    }
    // On linux, it's easy - just use is_writable!
    if (substr(__FILE__, 1, 2) != ':\\') {
        foreach ($writable_files as $file) {
            if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                @chmod(dirname(__FILE__) . '/' . $file, 0755);
                // Well, 755 hopefully worked... if not, try 777.
                $failure |= !is_writable(dirname(__FILE__) . '/' . $file) && !@chmod(dirname(__FILE__) . '/' . $file, 0777);
            }
        }
        foreach ($extra_files as $file) {
            @chmod(dirname(__FILE__) . (empty($file) ? '' : '/' . $file), 0777);
        }
    } else {
        foreach ($writable_files as $file) {
            // Folders can't be opened for write... but the index.php in them can ;).
            if (is_dir(dirname(__FILE__) . '/' . $file)) {
                $file .= '/index.php';
            }
            // Funny enough, chmod actually does do something on windows - it removes the read only attribute.
            @chmod(dirname(__FILE__) . '/' . $file, 0777);
            $fp = @fopen(dirname(__FILE__) . '/' . $file, 'r+');
            // Hmm, okay, try just for write in that case...
            if (!$fp) {
                $fp = @fopen(dirname(__FILE__) . '/' . $file, 'w');
            }
            $failure |= !$fp;
            @fclose($fp);
        }
        foreach ($extra_files as $file) {
            @chmod(dirname(__FILE__) . (empty($file) ? '' : '/' . $file), 0777);
        }
    }
    if (!isset($_SERVER)) {
        return !$failure;
    }
    // It's not going to be possible to use FTP on windows to solve the problem...
    if ($failure && substr(__FILE__, 1, 2) == ':\\') {
        echo '
				<div class="error_message">
					<div style="color: red;">', $txt['error_windows_chmod'], '</div>
					<ul style="margin: 2.5ex; font-family: monospace;">
						<li>', implode('</li>
						<li>', $writable_files), '</li>
					</ul>
					<a href="', $_SERVER['PHP_SELF'], '?step=0&amp;overphp=true">', $txt['error_message_click'], '</a> ', $txt['error_message_try_again'], '
				</div>';
        return false;
    } elseif ($failure) {
        // Load any session data we might have...
        if (!isset($_POST['ftp_username']) && isset($_SESSION['installer_temp_ftp'])) {
            $_POST['ftp_server'] = $_SESSION['installer_temp_ftp']['server'];
            $_POST['ftp_port'] = $_SESSION['installer_temp_ftp']['port'];
            $_POST['ftp_username'] = $_SESSION['installer_temp_ftp']['username'];
            $_POST['ftp_password'] = $_SESSION['installer_temp_ftp']['password'];
            $_POST['ftp_path'] = $_SESSION['installer_temp_ftp']['path'];
        }
        if (isset($_POST['ftp_username'])) {
            $ftp = new ftp_connection($_POST['ftp_server'], $_POST['ftp_port'], $_POST['ftp_username'], $_POST['ftp_password']);
            if ($ftp->error === false) {
                // Try it without /home/abc just in case they messed up.
                if (!$ftp->chdir($_POST['ftp_path'])) {
                    $ftp_error = $ftp->last_message;
                    $ftp->chdir(preg_replace('~^/home[2]?/[^/]+?~', '', $_POST['ftp_path']));
                }
            }
        }
        if (!isset($ftp) || $ftp->error !== false) {
            if (!isset($ftp)) {
                $ftp = new ftp_connection(null);
            } elseif ($ftp->error !== false && !isset($ftp_error)) {
                $ftp_error = $ftp->last_message === null ? '' : $ftp->last_message;
            }
            list($username, $detect_path, $found_path) = $ftp->detect_path(dirname(__FILE__));
            if ($found_path || !isset($_POST['ftp_path'])) {
                $_POST['ftp_path'] = $detect_path;
            }
            if (!isset($_POST['ftp_username'])) {
                $_POST['ftp_username'] = $username;
            }
            echo '
				<div class="panel">
					<h2>', $txt['ftp_setup'], '</h2>
					<h3>', $txt['ftp_setup_info'], '</h3>';
            if (isset($ftp_error)) {
                echo '
					<div class="error_message">
						<div style="color: red;">
							', $txt['error_ftp_no_connect'], '<br />
							<br />
							<code>', $ftp_error, '</code>
						</div>
					</div>
					<br />';
            }
            echo '
					<form action="', $_SERVER['PHP_SELF'], '?step=0&amp;overphp=true" method="post">

						<table width="520" cellspacing="0" cellpadding="0" border="0" align="center" style="margin-bottom: 1ex;">
							<tr>
								<td width="26%" valign="top" class="textbox"><label for="ftp_server">', $txt['ftp_server'], ':</label></td>
								<td>
									<div style="float: ', empty($txt['lang_rtl']) ? 'right' : 'left', '; margin-', empty($txt['lang_rtl']) ? 'right' : 'left', ': 1px;"><label for="ftp_port" class="textbox"><b>', $txt['ftp_port'], ':&nbsp;</b></label> <input type="text" size="3" name="ftp_port" id="ftp_port" value="', isset($_POST['ftp_port']) ? $_POST['ftp_port'] : '21', '" /></div>
									<input type="text" size="30" name="ftp_server" id="ftp_server" value="', isset($_POST['ftp_server']) ? $_POST['ftp_server'] : 'localhost', '" style="width: 70%;" />
									<div style="font-size: smaller; margin-bottom: 2ex;">', $txt['ftp_server_info'], '</div>
								</td>
							</tr><tr>
								<td width="26%" valign="top" class="textbox"><label for="ftp_username">', $txt['ftp_username'], ':</label></td>
								<td>
									<input type="text" size="50" name="ftp_username" id="ftp_username" value="', isset($_POST['ftp_username']) ? $_POST['ftp_username'] : '', '" style="width: 99%;" />
									<div style="font-size: smaller; margin-bottom: 2ex;">', $txt['ftp_username_info'], '</div>
								</td>
							</tr><tr>
								<td width="26%" valign="top" class="textbox"><label for="ftp_password">', $txt['ftp_password'], ':</label></td>
								<td>
									<input type="password" size="50" name="ftp_password" id="ftp_password" style="width: 99%;" />
									<div style="font-size: smaller; margin-bottom: 3ex;">', $txt['ftp_password_info'], '</div>
								</td>
							</tr><tr>
								<td width="26%" valign="top" class="textbox"><label for="ftp_path">', $txt['ftp_path'], ':</label></td>
								<td style="padding-bottom: 1ex;">
									<input type="text" size="50" name="ftp_path" id="ftp_path" value="', $_POST['ftp_path'], '" style="width: 99%;" />
									<div style="font-size: smaller; margin-bottom: 2ex;">', !empty($found_path) ? $txt['ftp_path_found_info'] : $txt['ftp_path_info'], '</div>
								</td>
							</tr>
						</table>

						<div style="margin: 1ex; margin-top: 2ex; text-align: ', empty($txt['lang_rtl']) ? 'right' : 'left', ';"><input type="submit" value="', $txt['ftp_connect'], '" /></div>
					</form>

					<h2>', $txt['ftp_setup_why'], '</h2>
					<h3>', $txt['ftp_setup_why_info'], '</h3>

					<ul style="margin: 2.5ex; font-family: monospace;">
						<li>', implode('</li>
						<li>', $writable_files), '</li>
					</ul>
					<a href="', $_SERVER['PHP_SELF'], '?step=0&amp;overphp=true">', $txt['error_message_click'], '</a> ', $txt['ftp_setup_again'], '

				</div>';
            return false;
        } else {
            $_SESSION['installer_temp_ftp'] = array('server' => $_POST['ftp_server'], 'port' => $_POST['ftp_port'], 'username' => $_POST['ftp_username'], 'password' => $_POST['ftp_password'], 'path' => $_POST['ftp_path']);
            foreach ($writable_files as $file) {
                if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                    $ftp->chmod($file, 0755);
                }
                if (!is_writable(dirname(__FILE__) . '/' . $file)) {
                    $ftp->chmod($file, 0777);
                }
            }
            $ftp->close();
        }
    }
    return true;
}
Esempio n. 6
0
function makeFilesWritable(&$files)
{
    global $upcontext, $boarddir;
    if (empty($files)) {
        return true;
    }
    $failure = false;
    // On linux, it's easy - just use is_writable!
    if (substr(__FILE__, 1, 2) != ':\\') {
        foreach ($files as $k => $file) {
            if (!is_writable($file)) {
                @chmod($file, 0755);
                // Well, 755 hopefully worked... if not, try 777.
                if (!is_writable($file) && !@chmod($file, 0777)) {
                    $failure = true;
                } else {
                    unset($files[$k]);
                }
            } else {
                unset($files[$k]);
            }
        }
    } else {
        foreach ($files as $k => $file) {
            // Folders can't be opened for write... but the index.php in them can ;).
            if (is_dir($file)) {
                $file .= '/index.php';
            }
            // Funny enough, chmod actually does do something on windows - it removes the read only attribute.
            @chmod($file, 0777);
            $fp = @fopen($file, 'r+');
            // Hmm, okay, try just for write in that case...
            if (!$fp) {
                $fp = @fopen($file, 'w');
            }
            if (!$fp) {
                $failure = true;
            } else {
                unset($files[$k]);
            }
            @fclose($fp);
        }
    }
    if (empty($files)) {
        return true;
    }
    if (!isset($_SERVER)) {
        return !$failure;
    }
    // What still needs to be done?
    $upcontext['chmod']['files'] = $files;
    // If it's windows it's a mess...
    if ($failure && substr(__FILE__, 1, 2) == ':\\') {
        $upcontext['chmod']['ftp_error'] = 'total_mess';
        return false;
    } elseif ($failure) {
        // Load any session data we might have...
        if (!isset($_POST['ftp_username']) && isset($_SESSION['installer_temp_ftp'])) {
            $upcontext['chmod']['server'] = $_SESSION['installer_temp_ftp']['server'];
            $upcontext['chmod']['port'] = $_SESSION['installer_temp_ftp']['port'];
            $upcontext['chmod']['username'] = $_SESSION['installer_temp_ftp']['username'];
            $upcontext['chmod']['password'] = $_SESSION['installer_temp_ftp']['password'];
            $upcontext['chmod']['path'] = $_SESSION['installer_temp_ftp']['path'];
        } elseif (isset($_POST['ftp_username'])) {
            $upcontext['chmod']['server'] = $_POST['ftp_server'];
            $upcontext['chmod']['port'] = $_POST['ftp_port'];
            $upcontext['chmod']['username'] = $_POST['ftp_username'];
            $upcontext['chmod']['password'] = $_POST['ftp_password'];
            $upcontext['chmod']['path'] = $_POST['ftp_path'];
        }
        if (isset($upcontext['chmod']['username'])) {
            $ftp = new ftp_connection($upcontext['chmod']['server'], $upcontext['chmod']['port'], $upcontext['chmod']['username'], $upcontext['chmod']['password']);
            if ($ftp->error === false) {
                // Try it without /home/abc just in case they messed up.
                if (!$ftp->chdir($upcontext['chmod']['path'])) {
                    $upcontext['chmod']['ftp_error'] = $ftp->last_message;
                    $ftp->chdir(preg_replace('~^/home[2]?/[^/]+?~', '', $upcontext['chmod']['path']));
                }
            }
        }
        if (!isset($ftp) || $ftp->error !== false) {
            if (!isset($ftp)) {
                $ftp = new ftp_connection(null);
            } elseif ($ftp->error !== false && !isset($upcontext['chmod']['ftp_error'])) {
                $upcontext['chmod']['ftp_error'] = $ftp->last_message === null ? '' : $ftp->last_message;
            }
            list($username, $detect_path, $found_path) = $ftp->detect_path(dirname(__FILE__));
            if ($found_path || !isset($upcontext['chmod']['path'])) {
                $upcontext['chmod']['path'] = $detect_path;
            }
            if (!isset($upcontext['chmod']['username'])) {
                $upcontext['chmod']['username'] = $username;
            }
            return false;
        } else {
            // We want to do a relative path for FTP.
            if (!in_array($upcontext['chmod']['path'], array('', '/'))) {
                $ftp_root = strtr($boarddir, array($upcontext['chmod']['path'] => ''));
                if (substr($ftp_root, -1) == '/' && ($upcontext['chmod']['path'] == '' || substr($upcontext['chmod']['path'], 0, 1) == '/')) {
                    $ftp_root = substr($ftp_root, 0, -1);
                }
            } else {
                $ftp_root = $boarddir;
            }
            // Save the info for next time!
            $_SESSION['installer_temp_ftp'] = array('server' => $upcontext['chmod']['server'], 'port' => $upcontext['chmod']['port'], 'username' => $upcontext['chmod']['username'], 'password' => $upcontext['chmod']['password'], 'path' => $upcontext['chmod']['path'], 'root' => $ftp_root);
            foreach ($files as $k => $file) {
                if (!is_writable($file)) {
                    $ftp->chmod($file, 0755);
                }
                if (!is_writable($file)) {
                    $ftp->chmod($file, 0777);
                }
                // Assuming that didn't work calculate the path without the boarddir.
                if (!is_writable($file)) {
                    if (strpos($file, $boarddir) === 0) {
                        $ftp_file = strtr($file, array($_SESSION['installer_temp_ftp']['root'] => ''));
                        $ftp->chmod($ftp_file, 0755);
                        if (!is_writable($file)) {
                            $ftp->chmod($ftp_file, 0777);
                        }
                        // Sometimes an extra slash can help...
                        $ftp_file = '/' . $ftp_file;
                        if (!is_writable($file)) {
                            $ftp->chmod($ftp_file, 0755);
                        }
                        if (!is_writable($file)) {
                            $ftp->chmod($ftp_file, 0777);
                        }
                    }
                }
                if (is_writable($file)) {
                    unset($files[$k]);
                }
            }
            $ftp->close();
        }
    }
    // What remains?
    $upcontext['chmod']['files'] = $files;
    if (empty($files)) {
        return true;
    }
    return false;
}