Файл: upload/install/include/installer.class.php
Строк: 817
<?php
/**
* [PHPFOX_HEADER]
*/
defined('PHPFOX') or exit('NO DICE!');
/**
*
*
* @copyright [PHPFOX_COPYRIGHT]
* @author Raymond Benc
* @package Phpfox
* @version $Id: installer.class.php 4519 2012-07-18 14:01:51Z Raymond_Benc $
*/
class Phpfox_Installer
{
private $_oTpl = null;
private $_oReq = null;
private $_sUrl = 'install';
private $_bUpgrade = false;
private static $_aPhrases = array();
private $_aSteps = array(
'license',
'requirement',
'configuration',
'process',
'import',
'language',
'module',
'post',
'final',
'completed'
);
private $_aModuleInstalls = array(
'video'
);
private $_aVersions = array(
'1.6.21',
'2.0.0rc1',
'2.0.0rc2',
'2.0.0rc3',
'2.0.0rc4',
'2.0.0rc5',
'2.0.0rc6',
'2.0.0rc7',
'2.0.0rc8',
'2.0.0rc9',
'2.0.0rc10',
'2.0.0rc11',
'2.0.0rc12',
'2.0.0',
'2.0.1',
'2.0.2',
'2.0.3',
'2.0.4',
'2.0.5dev1',
'2.0.5dev2',
'2.0.5',
'2.0.6',
'2.0.7',
'2.1.0beta1',
'2.1.0beta2',
'2.1.0rc1',
'2.1.0',
'3.0.0beta1',
'3.0.0beta2',
'3.0.0beta3',
'3.0.0beta4',
'3.0.0beta5',
'3.0.0rc1',
'3.0.0rc2',
'3.0.0rc3',
'3.0.0',
'3.0.1',
'3.0.2',
'3.1.0beta1',
'3.1.0rc1',
'3.1.0',
'3.2.0beta1',
'3.2.0rc1',
'3.2.0',
'3.3.0beta1',
'3.3.0beta2',
'3.3.0rc1',
'3.3.0'
);
private $_sTempDir = '';
private $_sSessionFile = '';
private $_hFile = null;
private $_aOldConfig = array();
private $_sPage = '';
private static $_sSessionId = null;
public function __construct()
{
$this->_oTpl = Phpfox::getLib('template');
$this->_oReq = Phpfox::getLib('request');
$this->_oUrl = Phpfox::getLib('url');
$this->_sTempDir = Phpfox::getLib('file')->getTempDir();
$this->_sPage = $this->_oReq->get('page');
$this->_sUrl = ($this->_oReq->get('req1') == 'upgrade' ? 'upgrade' : 'install');
self::$_sSessionId = ($this->_oReq->get('sessionid') ? $this->_oReq->get('sessionid') : uniqid());
if ($this->_sUrl == 'upgrade')
{
$this->_bUpgrade = true;
if (file_exists(PHPFOX_DIR . 'include' . PHPFOX_DS . 'settings' . PHPFOX_DS . 'server.sett.php'))
{
require_once(PHPFOX_DIR . 'include' . PHPFOX_DS . 'settings' . PHPFOX_DS . 'server.sett.php');
$this->_aOldConfig = $_CONF;
}
}
if (!Phpfox::getLib('file')->isWritable($this->_sTempDir))
{
if (PHPFOX_SAFE_MODE)
{
$this->_sTempDir = PHPFOX_DIR_FILE . 'log' . PHPFOX_DS;
if (!Phpfox::getLib('file')->isWritable($this->_sTempDir))
{
exit('Unable to write to temporary folder: ' . $this->_sTempDir);
}
}
else
{
exit('Unable to write to temporary folder: ' . $this->_sTempDir);
}
}
$this->_sSessionFile = $this->_sTempDir . 'installer_' . ($this->_bUpgrade ? 'upgrade_' : '') . '_' . self::$_sSessionId . '_' . 'phpfox.log';
$this->_hFile = fopen($this->_sSessionFile, 'a');
if ($this->_sUrl == 'install' && $this->_oReq->get('req2') == '')
{
if (file_exists(PHPFOX_DIR_SETTING . 'server.sett.php'))
{
require(PHPFOX_DIR_SETTING . 'server.sett.php');
if (isset($_CONF['core.is_installed']) && $_CONF['core.is_installed'] === true)
{
$this->_oUrl->forward('../install/index.php?' . PHPFOX_GET_METHOD . '=/upgrade/');
}
}
if (file_exists(PHPFOX_DIR . 'include' . PHPFOX_DS . 'settings' . PHPFOX_DS . 'server.sett.php'))
{
$this->_oUrl->forward('../install/index.php?' . PHPFOX_GET_METHOD . '=/upgrade/');
}
}
if ($this->_bUpgrade)
{
$this->_aSteps = array(
'license',
'requirement',
'update',
'completed'
);
}
// Define some needed params
Phpfox::getLib('setting')->setParam(array(
'core.path' => self::getHostPath() . 'install/',
'core.url_static_script' => self::getHostPath() . 'static/jscript/',
'core.url_static_css' => self::getHostPath() . 'static/style/',
'core.url_static_image' => self::getHostPath() . 'static/image/',
'sCookiePath' => '/',
'sCookieDomain' => '',
'sWysiwyg' => false,
'bAllowHtml' => false,
'core.url_rewrite' => '2'
)
);
$sLanguageFile = PHPFOX_DIR_XML . 'installer' . PHPFOX_XML_SUFFIX;
if (!file_exists($sLanguageFile))
{
Phpfox_Error::trigger('Unable to load locale language package: ' . $sLanguageFile, E_USER_ERROR);
}
// Cache language file
$bCache = false;
$sCacheFile = PHPFOX_DIR_CACHE . 'installer_language.php';
if (Phpfox::getLib('file')->isWritable(PHPFOX_DIR_CACHE) && file_exists($sCacheFile))
{
$bCache = true;
}
if ($bCache === false)
{
$aPhrases = Phpfox::getLib('xml.parser')->parse($sLanguageFile);
foreach ($aPhrases['phrases']['phrase'] as $aPhrase)
{
self::$_aPhrases[$aPhrase['var_name']] = $aPhrase['value'];
}
if (Phpfox::getLib('file')->isWritable(PHPFOX_DIR_CACHE))
{
$sData = '<?php' . "n";
$sData .= 'self::$_aPhrases = ';
$sData .= var_export(self::$_aPhrases, true);
$sData .= ";n" . '?>';
Phpfox::getLib('file')->writeToCache('installer_language.php', $sData);
}
}
else
{
require_once($sCacheFile);
}
}
public static function getSessionId()
{
return self::$_sSessionId;
}
public static function getHostPath()
{
$sScriptPath = $_SERVER['PHP_SELF'];
$sSubfolder = dirname(substr($sScriptPath, 0, strrpos($sScriptPath, '/'))).'/';
if ($sSubfolder == '//' or $sSubfolder == '/')
{
$sSubfolder = '/';
}
return 'http://' . $_SERVER['HTTP_HOST'] . $sSubfolder;
}
public static function getPhrase($sVar)
{
return (isset(self::$_aPhrases[$sVar]) ? self::$_aPhrases[$sVar] : '');
}
public function run()
{
if ($this->_bUpgrade
&& (int) substr($this->_getCurrentVersion(), 0, 1) < 2
&& file_exists(PHPFOX_DIR . '.htaccess')
)
{
$sHtaccessContent = file_get_contents(PHPFOX_DIR . '.htaccess');
if (preg_match('/RewriteEngine/i', $sHtaccessContent))
{
exit('In order for us to continue with the upgrade you will need to rename or remove the file ".htaccess".');
}
}
$sStep = ($this->_oReq->get('req2') ? strtolower($this->_oReq->get('req2')) : 'license');
$this->_oTpl->setTitle(self::getPhrase('phpfox_installer'))->setBreadcrumb(self::getPhrase('phpfox_installer'));
$bPass = false;
if (!in_array($sStep, $this->_aSteps))
{
if (in_array($sStep, $this->_aModuleInstalls))
{
$bPass = true;
}
else
{
exit('Invalid step.');
}
}
$sMethod = '_' . $sStep;
$iStep = 0;
foreach ($this->_aSteps as $iKey => $sMyStep)
{
if ($sMyStep === $sStep)
{
$iStep = ($iKey - 1);
break;
}
}
if ($bPass === false && isset($this->_aSteps[$iStep]) && !$this->_isPassed($this->_aSteps[$iStep]))
{
$this->_oUrl->forward($this->_step($this->_aSteps[$iStep]));
}
$this->_sStep = $sStep;
if (method_exists($this, $sMethod))
{
call_user_func(array(&$this, $sMethod));
}
else
{
$sStep = 'key';
}
if (PHPFOX_DEBUG)
{
$this->_oTpl->setHeader(array('debug.css' => 'style_css'));
}
if (!file_exists($this->_oTpl->getLayoutFile($sStep)))
{
$sStep = 'default';
}
list($aBreadCrumbs, $aBreadCrumbTitle) = $this->_oTpl->getBreadCrumb();
$this->_oTpl->setImage(array(
'ajax_small' => 'ajax/small.gif',
'ajax_large' => 'ajax/large.gif',
'loading_animation' => 'misc/loading_animation.gif',
'close' => 'misc/close.gif'
)
);
$this->_oTpl->setHeader(array(
'<link rel="shortcut icon" type="image/x-icon" href="' . Phpfox_Installer::getHostPath() . 'favicon.ico" />',
'layout.css' => 'style_css',
'thickbox.css' => 'style_css',
'jquery/jquery.js' => 'static_script',
'common.js' => 'static_script',
'main.js' => 'static_script',
'thickbox/thickbox.js' => 'static_script'
)
)
->assign(array(
'sTemplate' => $sStep,
'sLocaleDirection' => 'ltr',
'sLocaleCode' => 'en',
'sUrl' => $this->_sUrl,
'aErrors' => Phpfox_Error::get(),
'sPublicMessage' => Phpfox::getMessage(),
'aBreadCrumbs' => $aBreadCrumbs,
'aBreadCrumbTitle' => $aBreadCrumbTitle,
'aSteps' => $this->_getSteps()
)
);
if ($this->_bUpgrade)
{
$this->_oTpl->setTitle('Upgrading from: ' . $this->_getCurrentVersion());
}
header("X-Content-Encoded-By: phpFox " . PhpFox::getVersion());
$this->_oTpl->getLayout('template');
Phpfox::clearMessage();
}
########################
# Special Module Install Routines
########################
private function _video($bInstall = false)
{
$sFfmpeg = '';
$sMencoder = '';
$iPass = 0;
if (!PHPFOX_SAFE_MODE)
{
if (($aVals = $this->_oReq->getArray('val')))
{
if (!empty($aVals['ffmpeg']))
{
exec($aVals['ffmpeg'] . ' 2>&1', $aOutput);
if (preg_match("/FFmpeg version/", $aOutput[0]))
{
if ($bInstall === true)
{
$this->_db()->update(Phpfox::getT('setting'), array('value_actual' => $aVals['ffmpeg']), 'module_id = 'video' AND var_name = 'ffmpeg_path'');
}
else
{
$_SESSION[Phpfox::getParam('core.session_prefix')]['installer_ffmpeg'] = $aVals['ffmpeg'];
}
$iPass++;
}
else
{
Phpfox_Error::set($aOutput[0]);
}
unset($aOutput);
}
if (!empty($aVals['mencoder']))
{
exec($aVals['mencoder'] . ' 2>&1', $aOutput);
if (preg_match("/MPlayer Team/", $aOutput[0]))
{
if ($bInstall === true)
{
$this->_db()->update(Phpfox::getT('setting'), array('value_actual' => $aVals['mencoder']), 'module_id = 'video' AND var_name = 'mencoder_path'');
}
else
{
$_SESSION[Phpfox::getParam('core.session_prefix')]['installer_mencoder'] = $aVals['mencoder'];
}
$iPass++;
}
else
{
Phpfox_Error::set($aOutput[0]);
}
unset($aOutput);
}
}
if (PHP_OS == 'Linux')
{
$sOutput = shell_exec('whereis ffmpeg 2>&1');
$aOutput = explode("n", $sOutput);
if (isset($aOutput[0]))
{
$aParts = explode('ffmpeg:', $aOutput[0]);
if (isset($aParts[1]))
{
$aSubParts = explode(' ', trim($aParts[1]));
if (isset($aSubParts[0]) && !empty($aSubParts[0]))
{
if (PHPFOX_OPEN_BASE_DIR || (!PHPFOX_OPEN_BASE_DIR && file_exists($aSubParts[0])))
{
$sFfmpeg = $aSubParts[0];
}
}
}
}
unset($aOutput);
$sOutput = shell_exec('whereis mencoder 2>&1');
$aOutput = explode("n", $sOutput);
if (isset($aOutput[0]))
{
$aParts = explode('mencoder:', $aOutput[0]);
if (isset($aParts[1]))
{
$aSubParts = explode(' ', trim($aParts[1]));
if (isset($aSubParts[0]) && !empty($aSubParts[0]))
{
if (PHPFOX_OPEN_BASE_DIR || (!PHPFOX_OPEN_BASE_DIR && file_exists($aSubParts[0])))
{
$sMencoder = $aSubParts[0];
}
}
}
}
unset($aOutput);
}
}
if (!empty($_SESSION[Phpfox::getParam('core.session_prefix')]['installer_ffmpeg']))
{
$sFfmpeg = $_SESSION[Phpfox::getParam('core.session_prefix')]['installer_ffmpeg'];
}
if (!empty($_SESSION[Phpfox::getParam('core.session_prefix')]['installer_mencoder']))
{
$sMencoder = $_SESSION[Phpfox::getParam('core.session_prefix')]['installer_mencoder'];
}
$aForms = array(
'ffmpeg' => $sFfmpeg,
'mencoder' => $sMencoder
);
return $aForms;
}
########################
# Install/Upgrade Steps
########################
private function _key()
{
if (file_exists($this->_sSessionFile))
{
fclose($this->_hFile);
@unlink($this->_sSessionFile);
$this->_hFile = fopen($this->_sSessionFile, 'a');
}
unset($_SESSION[Phpfox::getParam('core.session_prefix')]['installer']);
if (defined('PHPFOX_SKIP_INSTALL_KEY'))
{
$this->_pass('license');
}
$oApi = Phpfox::getLib('phpfox.api');
$oValid = Phpfox::getLib('validator')->set(array('sFormName' => 'js_form', 'aParams' => array(
'email' => array(
'def' => 'email',
'title' => 'Enter a valid email.'
),
'password' => 'Enter your password.'
)
)
);
if ($this->_oReq->get('skip'))
{
$this->_pass('license');
}
if ($aVals = $this->_oReq->getArray('val'))
{
if ($oValid->isValid($aVals))
{
// Connect to phpFox and verify the license
if ($oApi->send('clientVerification', $aVals))
{
$this->_pass('license');
}
else
{
$this->_oTpl->assign(array(
'sError' => $oApi->getError()
)
);
}
}
}
else
{
if (!$oApi->send('domainVerification'))
{
$this->_oTpl->assign(array(
'bFailed' => true
)
);
}
}
$this->_oTpl->setTitle('Client Verification')
->setBreadcrumb('Client Verification')
->assign(array(
'sCreateJs' => $oValid->createJS(),
'sGetJsForm' => $oValid->getJsForm(),
'bHasCurl' => (function_exists('curl_init') ? true : false)
)
);
}
private function _license()
{
if ($this->_oReq->get('agree'))
{
$this->_pass('requirement');
}
$this->_oTpl->assign(array(
'bIsUpgrade' => ($this->_sUrl == 'upgrade' ? true : false)
)
);
}
private function _requirement()
{
$bIsPassed = true;
$aVerify = array(
'php_version' => (version_compare(phpversion(), '5', '<') !== true ? true : false),
'php_xml_support' => (function_exists('xml_set_element_handler') ? true : false),
'php_gd' => ((extension_loaded('gd') && function_exists('gd_info')) ? true : false)
);
foreach ($aVerify as $sCheck => $bPassed)
{
if ($bPassed === false)
{
$bIsPassed = false;
break;
}
}
$aDrivers = Phpfox::getLib('database.support')->getSupported();
$aDbChecks = array();
$iDbs = 0;
foreach ($aDrivers as $aDriver)
{
$aDbChecks[$aDriver['label']] = $aDriver['available'];
if ($aDriver['available'])
{
$iDbs++;
}
}
if (!$iDbs)
{
$bIsPassed = false;
}
$oFile = Phpfox::getLib('file');
$aFileChecks = array();
$aModuleLists = Phpfox::getLib('module')->getModuleFiles();
$aModules = array_merge($aModuleLists['core'], $aModuleLists['plugin']);
$bNoLoadFail = false;
$aModuleHistory = array();
foreach ($aModules as $aModule)
{
$sModule = $aModule['name'];
if (!file_exists(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'include' . PHPFOX_DS . 'phpfox.class.php'))
{
continue;
}
$aLines = file(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'include' . PHPFOX_DS . 'phpfox.class.php');
foreach ($aLines as $sLine)
{
$sLine = trim($sLine);
if (substr($sLine, 0, 5) == 'class')
{
$sLine = str_replace('class Module_', '', $sLine);
if (isset($aModuleHistory[$sLine]))
{
Phpfox_Error::set('We found modules with duplicate class names.<br />"' . PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'include' . PHPFOX_DS . 'phpfox.class.php"<br />matches<br />"' . $aModuleHistory[$sLine] . '"');
$bIsPassed = false;
$bNoLoadFail = true;
break;
}
$aModuleHistory[$sLine] = PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'include' . PHPFOX_DS . 'phpfox.class.php';
}
}
}
if (!$bNoLoadFail)
{
$sFiles = '';
foreach ($aModules as $aModule)
{
if (($aFiles = Phpfox::getLib('module')->init($aModule['name'], 'aInstallWritable')))
{
$sFiles .= implode(',', $aFiles) . ',';
}
}
$sFiles = rtrim($sFiles, ',');
$aFiles = explode(',', $sFiles);
sort($aFiles);
foreach ($aFiles as $iKey => $sFile)
{
$sFile = str_replace('/', PHPFOX_DS, $sFile);
if (file_exists(PHPFOX_DIR . $sFile) && $oFile->isWritable(PHPFOX_DIR . $sFile))
{
continue;
}
if (!file_exists(PHPFOX_DIR . $sFile))
{
$aFileChecks[$sFile] = true;
continue;
}
if ($sFile == 'include/setting/server.sett.php' && (int) substr($this->_getCurrentVersion(), 0, 1) > 1 && $this->_bUpgrade)
{
continue;
}
if (!$oFile->isWritable(PHPFOX_DIR . $sFile))
{
$aFileChecks[$sFile] = false;
}
}
}
if (count($aFileChecks))
{
$bIsPassed = false;
}
if ($this->_oReq->getArray('val') && $bIsPassed === true)
{
if (function_exists('phpinfo'))
{
ob_clean();
phpinfo();
$sPhpInfo = ob_get_contents();
$hFile = fopen(PHPFOX_DIR_FILE . 'log' . PHPFOX_DS . 'phpfox_phpinfo_' . date('d.m.y', PHPFOX_TIME) . '_' . uniqid() . '.php', 'a');
fwrite($hFile, '<?php defined('PHPFOX') or exit('NO DICE!'); ?>' . "n" . $sPhpInfo);
fclose($hFile);
ob_clean();
}
$this->_pass(($this->_bUpgrade ? 'update' : 'configuration'));
}
$aChecks = array(
'php' => array(
'title' => 'PHP Version and Settings',
'passed' => '<strong style="color:green;">Yes</strong>',
'failed' => '<strong style="color:red;">No</strong>',
'checks' => array(
'PHP 5' => $aVerify['php_version'],
'PHP XML Support' => $aVerify['php_xml_support'],
'PHP GD Support' => $aVerify['php_gd']
)
),
'database' => array(
'title' => 'Supported Databases - <a href="#" onclick="return showHiddenTags(this);">view all</a>',
'passed' => '<strong style="color:green;">Available</strong>',
'failed' => '<strong style="color:red;">Unavailable</strong>',
'checks' => $aDbChecks,
'hide' => true
),
'file' => array(
'title' => 'Files and Directories',
'passed' => '<strong style="color:red;">Missing</strong>',
'failed' => '<strong style="color:red;">Unwritable</strong>',
'checks' => $aFileChecks
)
);
$this->_oTpl->setTitle('Requirement Check')
->setBreadcrumb('Requirement Check')
->assign(array(
'aChecks' => $aChecks,
'bIsPassed' => $bIsPassed
)
);
}
/**
* @todo Oracle is not required to have a host name so we need a fix to check
* the host name only if its not oracle.
*
*/
private function _configuration()
{
Phpfox::getLib('cache')->remove();
$aExists = array();
$aForms = array();
if (defined('PHPFOX_INSTALL_HOST'))
{
$aForms['host'] = PHPFOX_INSTALL_HOST;
$aForms['name'] = PHPFOX_INSTALL_NAME;
$aForms['user_name'] = PHPFOX_INSTALL_USER;
}
// Get supported database drivers
$aDrivers = Phpfox::getLib('database.support')->getSupported(true);
$oValid = Phpfox::getLib('validator')->set(array('sFormName' => 'js_form', 'aParams' => array(
'prefix' => 'No database prefix provided.'
)
)
);
if ($aVals = $this->_oReq->getArray('val'))
{
if ($oValid->isValid($aVals))
{
Phpfox::getLibClass('phpfox.database.dba');
$sDriver = 'phpfox.database.driver.' . strtolower(preg_replace("/W/i", "", $aVals['driver']));
if (Phpfox::getLibClass($sDriver))
{
$oDb = Phpfox::getLib($sDriver);
if ($oDb->connect($aVals['host'], $aVals['user_name'], $aVals['password'], $aVals['name']))
{
// Drop database tables, only if user allows us too
if (isset($aVals['drop']) && ($aDrops = $this->_oReq->getArray('table')))
{
$oDb->dropTables($aDrops, $aVals);
}
$oDbSupport = Phpfox::getLib('database.support');
$aTables = $oDbSupport->getTables($aVals['driver'], $oDb);
$aSql = Phpfox::getLib('module')->getModuleTables($aVals['prefix']);
foreach ($aSql as $sSql)
{
if (in_array($sSql, $aTables))
{
$aExists[] = $sSql;
}
}
if (count($aExists))
{
Phpfox_Error::set('We have found that the following table(s) already exist:');
}
else
{
$aForms = array_merge($this->_video(), $aForms);
if (Phpfox_Error::isPassed())
{
// Cache modules we need to install
$sCacheModules = PHPFOX_DIR_FILE . 'log' . PHPFOX_DS . 'installer_modules.php';
if (file_exists($sCacheModules))
{
unlink($sCacheModules);
}
$sData = '<?php' . "n";
$sData .= '$aModules = ';
$sData .= var_export($aVals['module'], true);
$sData .= ";n?>";
Phpfox::getLib('file')->write($sCacheModules, $sData);
unset($aVals['module']);
if ($this->_saveSettings($aVals))
{
$this->_pass('process');
}
}
}
}
}
}
}
else
{
$aForms = array_merge($this->_video(), $aForms);
}
$aModules = Phpfox::getLib('module')->getModuleFiles();
sort($aModules['core']);
sort($aModules['plugin']);
$this->_oTpl->setTitle('Configuration')
->setBreadcrumb('Configuration')
->assign(array(
'aDrivers' => $aDrivers,
'sCreateJs' => $oValid->createJS(),
'sGetJsForm' => $oValid->getJsForm(false),
'aTables' => $aExists,
'aModules' => $aModules,
'aForms' => $aForms
)
);
}
private function _process()
{
Phpfox::getLibClass('phpfox.database.dba');
$sDriver = 'phpfox.database.driver.' . strtolower(preg_replace("/W/i", "", Phpfox::getParam(array('db', 'driver'))));
if (Phpfox::getLibClass($sDriver))
{
$oDb = Phpfox::getLib($sDriver);
if ($oDb->connect(Phpfox::getParam(array('db', 'host')), Phpfox::getParam(array('db', 'user')), Phpfox::getParam(array('db', 'pass')), Phpfox::getParam(array('db', 'name'))))
{
}
}
$oDbSupport = Phpfox::getLib('database.support');
$sCacheModules = PHPFOX_DIR_FILE . 'log' . PHPFOX_DS . 'installer_modules.php';
if (!file_exists($sCacheModules))
{
// Something went wrong...
}
require_once($sCacheModules);
$oModuleProcess = Phpfox::getService('admincp.module.process');
foreach ($aModules as $iKey => $sModule)
{
if ($sModule == 'core')
{
unset($aModules[$iKey]);
}
}
$aModules = array_merge(array('core'), $aModules);
foreach ($aModules as $sModule)
{
if ($sModule == 'phpfoxsample' || $sModule == 'phpfox')
{
continue;
}
$oModuleProcess->install($sModule, array(
'table' => true
)
);
}
$sModuleLog = PHPFOX_DIR_CACHE . 'installer_completed_modules.log';
if (file_exists($sModuleLog))
{
unlink($sModuleLog);
}
$this->_pass();
$this->_oTpl->assign(array(
'sMessage' => 'Tables installed...',
'sNext' => $this->_step('import')
)
);
}
private function _import()
{
Phpfox::getLib('phpfox.process')->import(Phpfox::getLib('xml.parser')->parse(PHPFOX_DIR_XML . 'version' . PHPFOX_XML_SUFFIX));
PhpFox::getService('core.country.process')->importForInstall(Phpfox::getLib('xml.parser')->parse(PHPFOX_DIR_XML . 'country' . PHPFOX_XML_SUFFIX));
$this->_pass();
$this->_oTpl->assign(array(
'sMessage' => 'Imports complete...',
'sNext' => $this->_step('language')
));
}
private function _language()
{
$this->_db()->insert(Phpfox::getT('language'), array(
'language_id' => 'en',
'title' => 'English (US)',
'user_select' => '1',
'language_code' => 'en',
'charset' => 'UTF-8',
'direction' => 'ltr',
'flag_id' => 'png',
'time_stamp' => '1184048203',
'created' => 'N/A (Core)',
'site' => '',
'is_default' => '1',
'is_master' => '1'
)
);
Phpfox::getService('language.process')->import(Phpfox::getLib('xml.parser')->parse(PHPFOX_DIR_XML . 'installer' . PHPFOX_XML_SUFFIX), 'phpfox_installer', true, true);
$this->_pass();
$this->_oTpl->assign(array(
'sMessage' => 'Language package imported...',
'sNext' => $this->_step('module')
)
);
}
private function _module()
{
// Load the cached module list
$sCacheModules = PHPFOX_DIR_FILE . 'log' . PHPFOX_DS . 'installer_modules.php';
if (!file_exists($sCacheModules))
{
// Something went wrong...
}
require_once($sCacheModules);
$sModuleLog = PHPFOX_DIR_CACHE . 'installer_completed_modules.log';
$aInstalled = array();
if (file_exists($sModuleLog))
{
$aLines = file($sModuleLog);
foreach ($aLines as $sLine)
{
$sLine = trim($sLine);
if (empty($sLine))
{
continue;
}
$aInstalled[$sLine] = true;
}
}
$bInstallAll = (defined('PHPFOX_INSTALL_ALL_MODULES') ? true : false);
$oModuleProcess = Phpfox::getService('admincp.module.process');
$hFile = fopen($sModuleLog, 'a+');
$iCnt = 0;
$sMessage = '';
$sInstalledModule = '';
foreach ($aModules as $sModule)
{
if (isset($aInstalled[$sModule]))
{
continue;
}
$iCnt++;
$sInstalledModule .= $sModule . "n";
$sMessage .= "<li>" . $sModule . "</li>";
$oModuleProcess->install($sModule, array('insert' => true));
if ($bInstallAll === false && $iCnt == 5)
{
break;
}
}
fwrite($hFile, $sInstalledModule);
fclose($hFile);
if ($this->_bUpgrade)
{
return ($iCnt === 0 ? true : false);
}
// No more modules to install then lets send them to the final step
if ($iCnt === 0 || defined('PHPFOX_INSTALL_ALL_MODULES'))
{
$this->_pass();
unlink($sModuleLog);
$this->_oTpl->assign(array(
'sMessage' => 'All modules installed...',
'sNext' => $this->_step('post')
)
);
}
else
{
$this->_oTpl->assign(array(
'sMessage' => 'Installed Module(s): <div class="label_flow" style="height:200px;"><ul>' . $sMessage . '</ul></div>',
'sNext' => $this->_step('module')
)
);
}
}
private function _post()
{
// Load the cached module list
$sCacheModules = PHPFOX_DIR_FILE . 'log' . PHPFOX_DS . 'installer_modules.php';
if (!file_exists($sCacheModules))
{
// Something went wrong...
}
require_once($sCacheModules);
$oModuleProcess = Phpfox::getService('admincp.module.process');
foreach ($aModules as $sModule)
{
$oModuleProcess->install($sModule, array('post_install' => true));
}
$this->_pass();
$this->_oTpl->assign(array(
'sMessage' => 'Post install completed...',
'sNext' => $this->_step('final')
)
);
}
private function _final()
{
$aForms = array();
$aValidation = array(
'full_name' => 'full_name',
'email' => array(
'def' => 'email',
'title' => 'Provide a valid email.'
),
'password' => array(
'def' => 'password',
'title' => 'Provide a valid password.'
),
'month' => 'Select month of birth.',
'day' => 'Select day of birth.',
'year' => 'Select year of birth.',
'country_iso' => 'Select current location.',
'gender' => 'Select your gender.',
'user_name' => array(
'def' => 'username',
'title' => 'Provide a valid user name.'
)
);
$oValid = Phpfox::getLib('validator')->set(array('sFormName' => 'js_form', 'aParams' => $aValidation));
if ($aVals = $this->_oReq->getArray('val'))
{
Phpfox::getService('user.validate')->user($aVals['user_name'])->email($aVals['email']);
if ($oValid->isValid($aVals))
{
if (($iUserId = Phpfox::getService('user.process')->add($aVals, ADMIN_USER_ID)))
{
list($bLogin, $aUser) = Phpfox::getService('user.auth')->login($aVals['email'], $aVals['password'], 'email');
if ($bLogin || isset($aVals['skip_user_login']))
{
$this->_db()->update(Phpfox::getT('user_field'), array('in_admincp' => PHPFOX_TIME), 'user_id = ' . $iUserId);
$this->_db()->update(Phpfox::getT('setting'), array('value_actual' => Phpfox::getVersion()), 'var_name = 'phpfox_version'');
$this->_video(true);
$this->_pass('completed');
}
}
}
}
else
{
$aForms = array_merge($this->_video(), $aForms);
}
$this->_oTpl->assign(array(
'sCreateJs' => $oValid->createJS(),
'sGetJsForm' => $oValid->getJsForm(false),
'aForms' => $aForms
)
);
}
private function _update()
{
$aContent = array(
'action' => $this->_oReq->get('action'),
'version' => $this->_oReq->get('version'),
'page' => $this->_oReq->get('page'),
'time_stamp' => PHPFOX_TIME,
'ip_address' => Phpfox::getIp()
);
$hFile = fopen(PHPFOX_DIR_FILE . 'log' . PHPFOX_DS . 'upgrade_' . self::$_sSessionId . '.log', 'w');
fwrite($hFile, serialize($aContent) . "n");
fclose($hFile);
$sNext = $this->_oReq->get('next');
if (!empty($sNext))
{
$sNext = str_replace('-', '.', $sNext);
}
$sMessage = '';
foreach ($this->_aVersions as $iKey => $sVersion)
{
if (isset($bStopNextVersion) || (!empty($sNext) && $sNext == $sVersion))
{
if (file_exists(PHPFOX_DIR_INSTALL . 'include' . PHPFOX_DS . 'version' . PHPFOX_DS . $sVersion . '.php'))
{
require_once(PHPFOX_DIR_INSTALL . 'include' . PHPFOX_DS . 'version' . PHPFOX_DS . $sVersion . '.php');
if ($bCompleted === true)
{
if (isset($this->_aVersions[($iKey + 1)]))
{
$this->_oTpl->assign(array(
'sMessage' => 'Upgrade to ' . $sVersion . ' completed. Next version is ' . $this->_aVersions[($iKey + 1)] . '.',
'sNext' => $this->_step(array(
'update',
'version' => str_replace('.', '-', $sVersion),
'next' => str_replace('.', '-', $this->_aVersions[($iKey + 1)])
)
)
)
);
}
else
{
$this->_pass('completed');
}
}
}
else
{
$sMessage = 'You are not upgrading from a valid version. You must have v1.6.21 or higher installed. If you are using an older version you can use the upgrade script provided with the v1.6.21 package.';
}
break;
}
if (empty($sNext) && $sVersion == $this->_getCurrentVersion())
{
$bStopNextVersion = true;
}
}
if (!isset($bCompleted))
{
$this->_oTpl->assign(array(
'sMessage' => $sMessage
)
);
}
}
private function _completed()
{
if (Phpfox::getLib('file')->isWritable(PHPFOX_DIR_SETTING . 'server.sett.php'))
{
$sContent = file_get_contents(PHPFOX_DIR_SETTING . 'server.sett.php');
$sContent = preg_replace("/\$_CONF['core.is_installed'] = (.*?);/i", "\$_CONF['core.is_installed'] = true;", $sContent);
if ($hServerConf = @fopen(PHPFOX_DIR_SETTING . 'server.sett.php', 'w'))
{
fwrite($hServerConf, $sContent);
fclose($hServerConf);
}
}
if (!defined('PHPFOX_SKIP_INSTALL_KEY'))
{
$oApi = Phpfox::getLib('phpfox.api');
if ($oApi->send('brandingRemoval'))
{
Phpfox::getLib('database')->update(Phpfox::getT('setting'), array('value_actual' => '1'), "var_name = 'branding'");
}
}
$this->_db()->update(Phpfox::getT('setting'), array('value_actual' => Phpfox::getVersion()), 'var_name = 'phpfox_version'');
$this->_db()->update(Phpfox::getT('setting'), array('value_actual' => date('j/n/Y', PHPFOX_TIME)), 'var_name = 'official_launch_of_site'');
if ($this->_bUpgrade)
{
$iCurrentVersion = $this->_getCurrentVersion();
if (!$this->_db()->select('COUNT(*)')
->from(Phpfox::getT('install_log'))
->where('is_upgrade = 1 AND version_id = '' . $iCurrentVersion . '' AND upgrade_version_id = '' . Phpfox::getVersion() . ''')
->execute('getField')
)
{
$this->_db()->insert(Phpfox::getT('install_log'), array(
'is_upgrade' => '1',
'version_id' => $this->_getCurrentVersion(),
'upgrade_version_id' => Phpfox::getVersion(),
'time_stamp' => PHPFOX_TIME,
'ip_address' => Phpfox::getIp()
)
);
}
}
else
{
if (!$this->_db()->select('COUNT(*)')
->from(Phpfox::getT('install_log'))
->where('is_upgrade = 0 AND version_id = '' . Phpfox::getVersion() . '' AND ' . $this->_db()->isNull('upgrade_version_id') . '')
->execute('getField')
)
{
$this->_db()->insert(Phpfox::getT('install_log'), array(
'version_id' => Phpfox::getVersion(),
'time_stamp' => PHPFOX_TIME,
'ip_address' => Phpfox::getIp()
)
);
}
}
Phpfox::getLib('cache')->remove();
$this->_oTpl->assign(array(
'bIsUpgrade' => $this->_bUpgrade,
'sUpgradeVersion' => Phpfox::getVersion()
)
);
}
########################
# Private Methods
########################
private function _getCurrentVersion()
{
static $sVersion = null;
if ($sVersion !== null)
{
return $sVersion;
}
if ($this->_sUrl == 'install')
{
return Phpfox::getVersion();
}
$bIsLegacy = true;
if (file_exists(PHPFOX_DIR . 'include' . PHPFOX_DS . 'setting' . PHPFOX_DS . 'server.sett.php'))
{
require(PHPFOX_DIR . 'include' . PHPFOX_DS . 'setting' . PHPFOX_DS . 'server.sett.php');
if ($_CONF['core.is_installed'] === true)
{
$aRow = Phpfox::getLib('database')->select('value_actual')->from(Phpfox::getT('setting'))->where('var_name = 'phpfox_version'')->execute('getRow');
if (isset($aRow['value_actual']))
{
$sVersion = $aRow['value_actual'];
return $aRow['value_actual'];
}
}
}
if (file_exists(PHPFOX_DIR . 'include' . PHPFOX_DS . 'settings' . PHPFOX_DS . 'version.php'))
{
require_once(PHPFOX_DIR . 'include' . PHPFOX_DS . 'settings' . PHPFOX_DS . 'version.php');
$sVersion = $_CONF['info.version'];
return $_CONF['info.version'];
}
else
{
$aRow = Phpfox::getLib('database')->select('value_actual')->from(Phpfox::getT('setting'))->where('var_name = 'phpfox_version'')->execute('getRow');
if (isset($aRow['value_actual']))
{
$sVersion = $aRow['value_actual'];
return $aRow['value_actual'];
}
}
return Phpfox_Error::set('Unknown version.', E_USER_ERROR);
}
/**
* @todo We need to work on this routine, not working very well.
*/
private function _isPassed($sStep)
{
$aFile = file($this->_sSessionFile);
foreach ($aFile as $sLine)
{
$sLine = trim($sLine);
if (empty($sLine))
{
continue;
}
if ($sLine == $sStep)
{
return true;
}
}
exit('Failed');
return false;
}
private function _pass($sForward = null)
{
fwrite($this->_hFile, "n" . $this->_sStep);
if ($sForward !== null)
{
fclose($this->_hFile);
$this->_oUrl->forward($this->_step($sForward));
}
fclose($this->_hFile);
return true;
}
private function _getOldT($sTable)
{
return (isset($this->_aOldConfig['db']['prefix']) ? $this->_aOldConfig['db']['prefix'] : '') . $sTable;
}
private function _db()
{
return Phpfox::getLib('database');
}
private function _step($aParams)
{
if (is_array($aParams))
{
$aParams['sessionid'] = self::$_sSessionId;
}
else
{
$aParams = array($aParams, 'sessionid' => self::$_sSessionId);
}
return $this->_oUrl->makeUrl($this->_sUrl, $aParams);
}
private function _saveSettings($aVals)
{
// Get sub-folder
$sScriptPath = $_SERVER['PHP_SELF'];
$sSubfolder = dirname(substr($sScriptPath, 0, strrpos($sScriptPath, '/'))).'/';
if ($sSubfolder == '//' or $sSubfolder == '/')
{
$sSubfolder = '/';
}
// Get the settings content
$sContent = file_get_contents(PHPFOX_DIR_SETTING . 'server.sett.php');
// Trim and addslashes to each value since we are writing to a file
foreach ($aVals as $iKey => $sVal)
{
$aVals[$iKey] = addslashes(trim($sVal));
}
$aFind = array(
"/\$_CONF['db']['driver'] = (.*?);/i",
"/\$_CONF['db']['host'] = (.*?);/i",
"/\$_CONF['db']['user'] = (.*?);/i",
"/\$_CONF['db']['pass'] = (.*?);/i",
"/\$_CONF['db']['name'] = (.*?);/i",
"/\$_CONF['db']['prefix'] = (.*?);/i",
"/\$_CONF['db']['port'] = (.*?);/i",
"/\$_CONF['core.host'] = (.*?);/i",
"/\$_CONF['core.folder'] = (.*?);/i",
"/\$_CONF['core.url_rewrite'] = (.*?);/i",
"/\$_CONF['core.salt'] = (.*?);/i",
"/\$_CONF['core.cache_suffix'] = (.*?);/i"
);
$aReplace = array(
"\$_CONF['db']['driver'] = '{$aVals['driver']}';",
"\$_CONF['db']['host'] = '{$aVals['host']}';",
"\$_CONF['db']['user'] = '{$aVals['user_name']}';",
"\$_CONF['db']['pass'] = '{$aVals['password']}';",
"\$_CONF['db']['name'] = '{$aVals['name']}';",
"\$_CONF['db']['prefix'] = '" . (!empty($aVals['prefix']) ? $aVals['prefix'] : 'phpfox_') . "';",
"\$_CONF['db']['port'] = '{$aVals['port']}';",
"\$_CONF['core.host'] = '{$_SERVER['HTTP_HOST']}';",
"\$_CONF['core.folder'] = '{$sSubfolder}';",
"\$_CONF['core.url_rewrite'] = '" . ((isset($aVals['rewrite']) && $aVals['rewrite'] === true) ? '1' : '2') . "';",
"\$_CONF['core.salt'] = '" . md5(uniqid(rand(), true)) . "';",
"\$_CONF['core.cache_suffix'] = '.php';"
);
$sContent = preg_replace($aFind, $aReplace, $sContent);
if ($hServerConf = @fopen(PHPFOX_DIR_SETTING . 'server.sett.php', 'w'))
{
fwrite($hServerConf, $sContent);
fclose($hServerConf);
return true;
}
return Phpfox_Error::set('Unable to open config file.');
}
private function _getSteps()
{
$aSteps = array();
$iCnt = 0;
foreach ($this->_aSteps as $sStep)
{
$sStepName = $sStep;
switch ($sStep)
{
case 'key':
$sStepName = 'Verification';
break;
case 'license':
$sStepName = 'License Agreement';
break;
case 'requirement':
$sStepName = 'Requirement Check';
break;
case 'update':
$sStepName = 'Updates';
break;
case 'completed':
$sStepName = 'Completed';
break;
case 'configuration':
$sStepName = 'Configuration';
break;
case 'process':
$sStepName = 'Preparing Installation';
break;
case 'import':
$sStepName = 'Importing Data';
break;
case 'language':
$sStepName = 'Installing Default Language';
break;
case 'module':
$sStepName = 'Installing Modules';
break;
case 'post':
$sStepName = 'Checking Install';
break;
case 'final':
$sStepName = 'Create an Admin';
break;
}
$iCnt++;
$aSteps[] = array(
'name' => $sStepName,
'is_active' => ($this->_sStep == $sStep ? true : false),
'count' => $iCnt
);
}
return $aSteps;
}
private function _upgradeDatabase($sVersion)
{
if ((int) substr($this->_getCurrentVersion(), 0, 1) <= 1)
{
return;
}
define('PHPFOX_UPGRADE_MODULE_XML', true);
$hDir = opendir(PHPFOX_DIR_MODULE);
while ($sModule = readdir($hDir))
{
if ($sModule == '.' || $sModule == '..')
{
continue;
}
if ($sModule == 'phpfox')
{
continue;
}
if (file_exists(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'install' . PHPFOX_DS . 'phpfox.xml.php'))
{
$aModule = Phpfox::getLib('xml.parser')->parse(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'install' . PHPFOX_DS . 'phpfox.xml.php');
if (isset($aModule['tables']))
{
$oPhpfoxDatabaseExport = Phpfox::getLib('database.support');
$aTables = unserialize(trim($aModule['tables']));
$sQueries = Phpfox::getLib('database.export')->process(Phpfox::getParam(array('db', 'driver')), $aTables);
$aDriver = $oPhpfoxDatabaseExport->getDriver(Phpfox::getParam(array('db', 'driver')));
$sQueries = preg_replace('#phpfox_#i', Phpfox::getParam(array('db', 'prefix')), $sQueries);
if ($aDriver['comments'] == 'remove_comments')
{
$oPhpfoxDatabaseExport->removeComments($sQueries);
}
else
{
$oPhpfoxDatabaseExport->removeRemarks($sQueries);
}
$aSql = $oPhpfoxDatabaseExport->splitSqlFile($sQueries, $aDriver['delim']);
foreach ($aSql as $sSql)
{
$sSql = preg_replace('/CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $sSql);
$this->_db()->query($sSql);
}
}
}
}
$hDir = opendir(PHPFOX_DIR_MODULE);
while ($sModule = readdir($hDir))
{
if ($sModule == '.' || $sModule == '..')
{
continue;
}
if ($sModule == 'phpfox')
{
continue;
}
$bIsNewModule = false;
if (file_exists(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'install' . PHPFOX_DS . 'phpfox.xml.php'))
{
$aModule = Phpfox::getLib('xml.parser')->parse(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'install' . PHPFOX_DS . 'phpfox.xml.php');
if (isset($aModule['data']['module_id']))
{
$iIsModule = $this->_db()->select('COUNT(*)')
->from(Phpfox::getT('module'))
->where('module_id = '' . $this->_db()->escape($aModule['data']['module_id']) . ''')
->execute('getField');
if (!$iIsModule)
{
$bIsNewModule = true;
$this->_db()->insert(Phpfox::getT('module'), array(
'module_id' => $aModule['data']['module_id'],
'product_id' => 'phpfox',
'is_core' => $aModule['data']['is_core'],
'is_active' => 1,
'is_menu' => $aModule['data']['is_menu'],
'menu' => $aModule['data']['menu'],
'phrase_var_name' => $aModule['data']['phrase_var_name']
)
);
Phpfox::getService('admincp.module.process')->install(null, array('insert' => true), 'phpfox', $aModule);
}
}
if (!empty($aModule['data']['menu']))
{
$aModuleCheck = $this->_db()->select('module_id, menu')
->from(Phpfox::getT('module'))
->where('module_id = '' . $this->_db()->escape($aModule['data']['module_id']) . ''')
->execute('getRow');
if (isset($aModuleCheck['module_id']) && $aModuleCheck['menu'] != $aModule['data']['menu'])
{
$this->_db()->update(Phpfox::getT('module'), array('menu' => $aModule['data']['menu']), 'module_id = '' . $this->_db()->escape($aModuleCheck['module_id']) . ''');
}
}
}
if (file_exists(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'install' . PHPFOX_DS . 'version' . PHPFOX_DS . $sVersion . '.xml.php'))
{
$aUpgradeModule = Phpfox::getLib('xml.parser')->parse(PHPFOX_DIR_MODULE . $sModule . PHPFOX_DS . 'install' . PHPFOX_DS . 'version' . PHPFOX_DS . $sVersion . '.xml.php');
if (isset($aUpgradeModule['sql']))
{
$sSqlQuery = Phpfox::getLib('database.export')->processAlter(Phpfox::getParam(array('db', 'driver')), unserialize($aUpgradeModule['sql']), false, true);
$sSqlQuery = preg_replace('#phpfox_#i', Phpfox::getParam(array('db', 'prefix')), $sSqlQuery);
$aDriver = $oPhpfoxDatabaseExport->getDriver(Phpfox::getParam(array('db', 'driver')));
$aSql = $oPhpfoxDatabaseExport->splitSqlFile($sSqlQuery, $aDriver['delim']);
foreach ($aSql as $sSql)
{
$this->_db()->query($sSql);
}
}
if ($bIsNewModule === false)
{
Phpfox::getService('admincp.module.process')->install(null, array('insert' => true), 'phpfox', $aUpgradeModule);
}
}
}
closedir($hDir);
}
}
?>