New plugin manager half-implemented. Most of the UI/frontend code is done. Moved sql_parse.php to /includes/ to allow use after installation - TODO: check installer, etc. for breakage
<?php
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
* Version 1.1.1
* Copyright (C) 2006-2007 Dan Fuhry
* Installation package
* upgrade.php - Upgrade interface
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
*/
define('IN_ENANO', 1);
// The list of versions in THIS AND PREVIOUS branches, in chronological order.
$enano_versions = array();
$enano_versions['1.0'] = array('1.0', '1.0.1', '1.0.2b1', '1.0.2', '1.0.3', '1.0.4');
$enano_versions['1.1'] = array('1.1.1', '1.1.2', '1.1.3');
// Turn on every imaginable API hack to make common load on older databases
define('IN_ENANO_UPGRADE', 1);
define('IN_ENANO_MIGRATION', 1);
define('ENANO_ALLOW_LOAD_NOLANG', 1);
@ini_set('display_errors', 'on');
// Load installer files
require_once('../includes/sql_parse.php');
require_once('includes/common.php');
require_once('includes/libenanoinstall.php');
// when the installer's common is loaded, it runs chdir() to the ENANO_ROOT, thus making this Enano's common.php
require_once('includes/common.php');
@ini_set('display_errors', 'on');
$ui = new Enano_Installer_UI('Enano upgrader', false);
if ( version_compare(PHP_VERSION, '5.0.0', '<') )
{
$ui->__construct('Enano upgrader', false);
}
$stg_welcome = $ui->add_stage('Welcome', true);
$stg_confirm = $ui->add_stage('Confirmation', true);
$stg_upgrade = $ui->add_stage('Perform upgrade', true);
$stg_finish = $ui->add_stage('Finish', true);
$stg_php4 = $ui->add_stage('PHP4 compatibility notice', false);
if ( version_compare(PHP_VERSION, '5.0.0', '<') || isset($_GET['debug_warn_php4']) )
{
$ui->set_visible_stage($stg_php4);
$ui->step = '';
$ui->show_header();
// This isn't localized because all localization code is dependent on
// PHP 5 (loading lang.php will throw a parser error under PHP4). This
// one message probably doesn't need to be localized anyway.
?>
<h2 class="heading-error">
Your server doesn't have support for PHP 5.
</h2>
<p>
PHP 5 is the latest version of the language on which Enano was built. Its many new features have been available since early 2004, yet
many web hosts have not migrated to it because of the work involved. In 2007, Zend Corporation announced that support for the aging
PHP 4.x would be discontinued at the end of the year. An initiative called <a href="http://gophp5.org/">GoPHP5</a> was started to
encourage web hosts to migrate to PHP 5.
</p>
<p>
Because of the industry's decision to not support PHP 4 any longer, the Enano team decided that it was time to begin using the powerful
features of PHP 5 at the expense of PHP 4 compatibility. Therefore, this version of Enano cannot be installed on your server until it
is upgraded to at least PHP 5.0.0, and preferably the latest available version.
<!-- No, not even removing the check in this installer script will help. As soon as the PHP4 check is passed, the installer shows the
language selection page, after which the language code is loaded. The language code and libjson2 will trigger parse errors under
PHP <5.0.0. -->
</p>
<p>
If you need to use Enano but can't upgrade your PHP because you're on a shared or reseller hosting service, you can use the
<a href="http://enanocms.org/download?series=1.0">1.0.x series of Enano</a> on your site. While the Enano team attempts to make this
older series work on PHP 4, official support is not provided for installations of Enano on PHP 4.
</p>
<?php
$ui->show_footer();
exit(0);
}
// Version check
if ( enano_version() == installer_enano_version() )
{
$ui->show_header();
echo '<h3>Already upgraded</h3>' . '<p>You don\'t need to migrate, you\'re already on <del>crack</del> the 1.1 platform.</p>';
$ui->show_footer();
exit();
}
// Start session manager
$session->start();
if ( !$session->user_logged_in || ( $session->user_logged_in && $session->auth_level < USER_LEVEL_ADMIN ) )
{
if ( isset($_POST['do_login']) )
{
if ( !$session->user_logged_in )
{
$result = $session->login_without_crypto($_POST['username'], $_POST['password'], false, USER_LEVEL_MEMBER);
}
$result = $session->login_without_crypto($_POST['username'], $_POST['password'], false, USER_LEVEL_ADMIN);
if ( $result['success'] )
{
header('HTTP/1.1 302 Some kind of redirect with implied no content');
header('Location: ' . scriptPath . '/install/' . $session->append_sid('upgrade.php'));
exit();
}
}
$ui->show_header();
?>
<h3>Authentication needed</h3>
<?php
echo '<form action="upgrade.php" method="post">';
if ( isset($result) )
{
echo '<b>Session manager returned error:</b>' . '<pre>' . print_r($result, true) . '</pre>';
}
?>
<p>You need <?php if ( !$session->user_logged_in ) echo 'to be logged in and have '; ?>an active admin session to continue.</p>
<p>
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" name="do_login" value="Log in" />
</p>
<?php
echo '</form>';
$ui->show_footer();
exit();
}
if ( isset($_GET['stage']) && @$_GET['stage'] == 'pimpmyenano' )
{
$ui->set_visible_stage($stg_upgrade);
}
else
{
$ui->set_visible_stage($stg_confirm);
}
// The real migration code
$ui->show_header();
if ( isset($_GET['stage']) && @$_GET['stage'] == 'pimpmyenano' )
{
/*
HOW DOES ENANO'S UPGRADER WORK?
Versions of Enano are organized into branches and then specific versions by
version number. The upgrader works by using a list of known version numbers
and then systematically executing upgrade schemas for each version.
When the user requests an upgrade, the first thing performed is a migration
check, which verifies that they are within the right branch. If they are not
within the right branch the upgrade framework will load a migration script
which will define a function named MIGRATE(). Performing more than one
migration in one pass will probably never be supported. How that works for
UX in 1.3.x/1.4.x I know not yet.
After performing any necessary branch migrations, the framework will perform
any upgrades within the target branch, which is the first two parts
(delimited by periods) of the installer's version number defined in the
installer's common.php.
enano_perform_upgrade() will only do upgrades. Not migrations. The two as
illustrated within this installer are very different.
*/
// Do we need to run the migration first?
list($major_version, $minor_version) = explode('.', enano_version());
$current_branch = "$major_version.$minor_version";
list($major_version, $minor_version) = explode('.', installer_enano_version());
$target_branch = "$major_version.$minor_version";
if ( $target_branch != $current_branch )
{
// First upgrade to the latest revision of the current branch
enano_perform_upgrade($current_branch);
// Branch migration could be tricky and is often highly specific between
// major branches, so just include a custom migration script.
require(ENANO_ROOT . "/install/schemas/upgrade/migration/{$current_branch}-{$target_branch}.php");
$result = MIGRATE();
if ( !$result )
{
echo 'Migration failed, there should be an error message above.';
$ui->show_footer();
exit;
}
}
// Do the actual upgrade
enano_perform_upgrade($target_branch);
$site_url = makeUrl(getConfig('main_page'), false, true);
echo '<p>All done! I\'ll actually be nice enough to give you a <a href="' . $site_url . '">link back to your site</a> this release <tt>:)</tt></p>';
echo '<p><b>It is important that you run a language string re-import and then clear your browser cache.</b> Otherwise you may see bits of the interface that appear to not be localized. This process will be automatic and non-destructive in later versions.</p>';
}
else
{
?>
<p>Nothing's really implemented for now except the actual migration code, which is not very smart. Just <a href="<?php echo $session->append_sid('upgrade.php?stage=pimpmyenano'); ?>">do the upgrade and get it over with</a>.</p>
<?php
}
$ui->show_footer();