diff options
Diffstat (limited to 'plugins/Installation/Controller.php')
-rw-r--r-- | plugins/Installation/Controller.php | 1913 |
1 files changed, 927 insertions, 986 deletions
diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php index 1cdc760c73..153991a5d3 100644 --- a/plugins/Installation/Controller.php +++ b/plugins/Installation/Controller.php @@ -16,381 +16,365 @@ */ class Piwik_Installation_Controller extends Piwik_Controller_Admin { - // public so plugins can add/delete installation steps - public $steps = array( - 'welcome' => 'Installation_Welcome', - 'systemCheck' => 'Installation_SystemCheck', - 'databaseSetup' => 'Installation_DatabaseSetup', - 'databaseCheck' => 'Installation_DatabaseCheck', - 'tablesCreation' => 'Installation_Tables', - 'generalSetup' => 'Installation_SuperUser', - 'firstWebsiteSetup' => 'Installation_SetupWebsite', - 'displayJavascriptCode' => 'Installation_JsTag', - 'finished' => 'Installation_Congratulations', - ); - - protected $pathView = 'Installation/templates/'; - - protected $session; - - public function __construct() - { - $this->session = new Piwik_Session_Namespace('Piwik_Installation'); - if(!isset($this->session->currentStepDone)) - { - $this->session->currentStepDone = ''; - $this->session->skipThisStep = array(); - } - - Piwik_PostEvent('InstallationController.construct', $this); - } - - /** - * Get installation steps - * - * @return array installation steps - */ - public function getInstallationSteps() - { - return $this->steps; - } - - /** - * Get default action (first installation step) - * - * @return string function name - */ - function getDefaultAction() - { - $steps = array_keys($this->steps); - return $steps[0]; - } - - /** - * Installation Step 1: Welcome - */ - function welcome($message = false) - { - // Delete merged js/css files to force regenerations based on updated activated plugin list - Piwik::deleteAllCacheOnUpdate(); - - $view = new Piwik_Installation_View( - $this->pathView . 'welcome.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $view->newInstall = !file_exists(Piwik_Config::getLocalConfigPath()); - $view->errorMessage = $message; - $this->skipThisStep( __FUNCTION__ ); - $view->showNextStep = $view->newInstall; - $this->session->currentStepDone = __FUNCTION__; - echo $view->render(); - } - - /** - * Installation Step 2: System Check - */ - function systemCheck() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - $view = new Piwik_Installation_View( - $this->pathView . 'systemCheck.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - - $view->duringInstall = true; - - $this->setupSystemCheckView($view); - $this->session->general_infos = $view->infos['general_infos']; - - // make sure DB sessions are used if the filesystem is NFS - if ($view->infos['is_nfs']) - { - $this->session->general_infos['session_save_handler'] = 'dbtable'; - } - - $view->showNextStep = !$view->problemWithSomeDirectories - && $view->infos['phpVersion_ok'] - && count($view->infos['adapters']) - && !count($view->infos['missing_extensions']) - && !count($view->infos['missing_functions']) - ; - // On the system check page, if all is green, display Next link at the top - $view->showNextStepAtTop = $view->showNextStep; - - $this->session->currentStepDone = __FUNCTION__; - - echo $view->render(); - } - - /** - * Installation Step 3: Database Set-up - * @throws Exception|Zend_Db_Adapter_Exception - */ - function databaseSetup() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - // case the user hits the back button - $this->session->skipThisStep = array( - 'firstWebsiteSetup' => false, - 'displayJavascriptCode' => false, - ); - - $view = new Piwik_Installation_View( - $this->pathView . 'databaseSetup.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - - $view->showNextStep = false; - - $form = new Piwik_Installation_FormDatabaseSetup(); - - if ($form->validate()) - { - try - { - $dbInfos = $form->createDatabaseObject(); - $this->session->databaseCreated = true; - - Piwik::checkDatabaseVersion(); - $this->session->databaseVersionOk = true; - - $this->session->db_infos = $dbInfos; - $this->redirectToNextStep( __FUNCTION__ ); - } - catch (Exception $e) - { - $view->errorMessage = Piwik_Common::sanitizeInputValue($e->getMessage()); - } - } - $view->addForm($form); - - echo $view->render(); - } - - /** - * Installation Step 4: Database Check - */ - function databaseCheck() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - $view = new Piwik_Installation_View( - $this->pathView . 'databaseCheck.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - - $error = false; - $this->skipThisStep( __FUNCTION__ ); - - if(isset($this->session->databaseVersionOk) - && $this->session->databaseVersionOk === true) - { - $view->databaseVersionOk = true; - } - else - { - $error = true; - } - - if(isset($this->session->databaseCreated) - && $this->session->databaseCreated === true) - { - $dbInfos = $this->session->db_infos; - $view->databaseName = $dbInfos['dbname']; - $view->databaseCreated = true; - } - else - { - $error = true; - } - - $this->createDbFromSessionInformation(); - $db = Zend_Registry::get('db'); - - try { - $db->checkClientVersion(); - } catch(Exception $e) { - $view->clientVersionWarning = $e->getMessage(); - $error = true; - } - - if(!Piwik::isDatabaseConnectionUTF8()) - { - $dbInfos = $this->session->db_infos; - $dbInfos['charset'] = 'utf8'; - $this->session->db_infos = $dbInfos; - } - - $view->showNextStep = true; - $this->session->currentStepDone = __FUNCTION__; - - if($error === false) - { - $this->redirectToNextStep(__FUNCTION__); - } - echo $view->render(); - } - - /** - * Installation Step 5: Table Creation - */ - function tablesCreation() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - $view = new Piwik_Installation_View( - $this->pathView . 'tablesCreation.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - $this->createDbFromSessionInformation(); - - if(Piwik_Common::getRequestVar('deleteTables', 0, 'int') == 1) - { - Piwik::dropTables(); - $view->existingTablesDeleted = true; - - // when the user decides to drop the tables then we dont skip the next steps anymore - // workaround ZF-1743 - $tmp = $this->session->skipThisStep; - $tmp['firstWebsiteSetup'] = false; - $tmp['displayJavascriptCode'] = false; - $this->session->skipThisStep = $tmp; - } - - $tablesInstalled = Piwik::getTablesInstalled(); - $tablesToInstall = Piwik::getTablesNames(); - $view->tablesInstalled = ''; - if(count($tablesInstalled) > 0) - { - // we have existing tables - $view->tablesInstalled = implode(', ', $tablesInstalled); - $view->someTablesInstalled = true; - - $minimumCountPiwikTables = 17; - $baseTablesInstalled = preg_grep('/archive_numeric|archive_blob/', $tablesInstalled, PREG_GREP_INVERT); - - Piwik::createAccessObject(); - Piwik::setUserIsSuperUser(); - if(count($baseTablesInstalled) >= $minimumCountPiwikTables && - count(Piwik_SitesManager_API::getInstance()->getAllSitesId()) > 0 && - count(Piwik_UsersManager_API::getInstance()->getUsers()) > 0) - { - $view->showReuseExistingTables = true; - // when the user reuses the same tables we skip the website creation step - // workaround ZF-1743 - $tmp = $this->session->skipThisStep; - $tmp['firstWebsiteSetup'] = true; - $tmp['displayJavascriptCode'] = true; - $this->session->skipThisStep = $tmp; - } - } - else - { - Piwik::createTables(); - Piwik::createAnonymousUser(); - - $updater = new Piwik_Updater(); - $updater->recordComponentSuccessfullyUpdated('core', Piwik_Version::VERSION); - $view->tablesCreated = true; - $view->showNextStep = true; - } - - $this->session->currentStepDone = __FUNCTION__; - echo $view->render(); - } - - /** - * Installation Step 6: General Set-up (superuser login/password/email and subscriptions) - */ - function generalSetup() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - $view = new Piwik_Installation_View( - $this->pathView . 'generalSetup.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - - $form = new Piwik_Installation_FormGeneralSetup(); - - if($form->validate()) - { - $superUserInfos = array( - 'login' => $form->getSubmitValue('login'), - 'password' => md5( $form->getSubmitValue('password') ), - 'email' => $form->getSubmitValue('email'), - 'salt' => Piwik_Common::generateUniqId(), - ); - - $this->session->superuser_infos = $superUserInfos; - - $url = Piwik_Config::getInstance()->General['api_service_url']; - $url .= '/1.0/subscribeNewsletter/'; - $params = array( - 'email' => $form->getSubmitValue('email'), - 'security' => $form->getSubmitValue('subscribe_newsletter_security'), - 'community' => $form->getSubmitValue('subscribe_newsletter_community'), - 'url' => Piwik_Url::getCurrentUrlWithoutQueryString(), - ); - if($params['security'] == '1' - || $params['community'] == '1') - { - if( !isset($params['security'])) { $params['security'] = '0'; } - if( !isset($params['community'])) { $params['community'] = '0'; } - $url .= '?' . http_build_query($params, '', '&'); - try { - Piwik_Http::sendHttpRequest($url, $timeout = 2); - } catch(Exception $e) { - // e.g., disable_functions = fsockopen; allow_url_open = Off - } - } - $this->redirectToNextStep( __FUNCTION__ ); - } - $view->addForm($form); - - echo $view->render(); - } - - /** - * Installation Step 7: Configure first web-site - */ - public function firstWebsiteSetup() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - $view = new Piwik_Installation_View( - $this->pathView . 'firstWebsiteSetup.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - - $form = new Piwik_Installation_FormFirstWebsiteSetup(); - if( !isset($this->session->generalSetupSuccessMessage)) - { - $view->displayGeneralSetupSuccess = true; - $this->session->generalSetupSuccessMessage = true; - } - - $this->initObjectsToCallAPI(); - if($form->validate()) - { - $name = urlencode($form->getSubmitValue('siteName')); - $url = urlencode($form->getSubmitValue('url')); - $ecommerce = (int)$form->getSubmitValue('ecommerce'); - - $request = new Piwik_API_Request(" + // public so plugins can add/delete installation steps + public $steps = array( + 'welcome' => 'Installation_Welcome', + 'systemCheck' => 'Installation_SystemCheck', + 'databaseSetup' => 'Installation_DatabaseSetup', + 'databaseCheck' => 'Installation_DatabaseCheck', + 'tablesCreation' => 'Installation_Tables', + 'generalSetup' => 'Installation_SuperUser', + 'firstWebsiteSetup' => 'Installation_SetupWebsite', + 'displayJavascriptCode' => 'Installation_JsTag', + 'finished' => 'Installation_Congratulations', + ); + + protected $pathView = 'Installation/templates/'; + + protected $session; + + public function __construct() + { + $this->session = new Piwik_Session_Namespace('Piwik_Installation'); + if (!isset($this->session->currentStepDone)) { + $this->session->currentStepDone = ''; + $this->session->skipThisStep = array(); + } + + Piwik_PostEvent('InstallationController.construct', $this); + } + + /** + * Get installation steps + * + * @return array installation steps + */ + public function getInstallationSteps() + { + return $this->steps; + } + + /** + * Get default action (first installation step) + * + * @return string function name + */ + function getDefaultAction() + { + $steps = array_keys($this->steps); + return $steps[0]; + } + + /** + * Installation Step 1: Welcome + */ + function welcome($message = false) + { + // Delete merged js/css files to force regenerations based on updated activated plugin list + Piwik::deleteAllCacheOnUpdate(); + + $view = new Piwik_Installation_View( + $this->pathView . 'welcome.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $view->newInstall = !file_exists(Piwik_Config::getLocalConfigPath()); + $view->errorMessage = $message; + $this->skipThisStep(__FUNCTION__); + $view->showNextStep = $view->newInstall; + $this->session->currentStepDone = __FUNCTION__; + echo $view->render(); + } + + /** + * Installation Step 2: System Check + */ + function systemCheck() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + $view = new Piwik_Installation_View( + $this->pathView . 'systemCheck.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + + $view->duringInstall = true; + + $this->setupSystemCheckView($view); + $this->session->general_infos = $view->infos['general_infos']; + + // make sure DB sessions are used if the filesystem is NFS + if ($view->infos['is_nfs']) { + $this->session->general_infos['session_save_handler'] = 'dbtable'; + } + + $view->showNextStep = !$view->problemWithSomeDirectories + && $view->infos['phpVersion_ok'] + && count($view->infos['adapters']) + && !count($view->infos['missing_extensions']) + && !count($view->infos['missing_functions']); + // On the system check page, if all is green, display Next link at the top + $view->showNextStepAtTop = $view->showNextStep; + + $this->session->currentStepDone = __FUNCTION__; + + echo $view->render(); + } + + /** + * Installation Step 3: Database Set-up + * @throws Exception|Zend_Db_Adapter_Exception + */ + function databaseSetup() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + // case the user hits the back button + $this->session->skipThisStep = array( + 'firstWebsiteSetup' => false, + 'displayJavascriptCode' => false, + ); + + $view = new Piwik_Installation_View( + $this->pathView . 'databaseSetup.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + + $view->showNextStep = false; + + $form = new Piwik_Installation_FormDatabaseSetup(); + + if ($form->validate()) { + try { + $dbInfos = $form->createDatabaseObject(); + $this->session->databaseCreated = true; + + Piwik::checkDatabaseVersion(); + $this->session->databaseVersionOk = true; + + $this->session->db_infos = $dbInfos; + $this->redirectToNextStep(__FUNCTION__); + } catch (Exception $e) { + $view->errorMessage = Piwik_Common::sanitizeInputValue($e->getMessage()); + } + } + $view->addForm($form); + + echo $view->render(); + } + + /** + * Installation Step 4: Database Check + */ + function databaseCheck() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + $view = new Piwik_Installation_View( + $this->pathView . 'databaseCheck.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + + $error = false; + $this->skipThisStep(__FUNCTION__); + + if (isset($this->session->databaseVersionOk) + && $this->session->databaseVersionOk === true + ) { + $view->databaseVersionOk = true; + } else { + $error = true; + } + + if (isset($this->session->databaseCreated) + && $this->session->databaseCreated === true + ) { + $dbInfos = $this->session->db_infos; + $view->databaseName = $dbInfos['dbname']; + $view->databaseCreated = true; + } else { + $error = true; + } + + $this->createDbFromSessionInformation(); + $db = Zend_Registry::get('db'); + + try { + $db->checkClientVersion(); + } catch (Exception $e) { + $view->clientVersionWarning = $e->getMessage(); + $error = true; + } + + if (!Piwik::isDatabaseConnectionUTF8()) { + $dbInfos = $this->session->db_infos; + $dbInfos['charset'] = 'utf8'; + $this->session->db_infos = $dbInfos; + } + + $view->showNextStep = true; + $this->session->currentStepDone = __FUNCTION__; + + if ($error === false) { + $this->redirectToNextStep(__FUNCTION__); + } + echo $view->render(); + } + + /** + * Installation Step 5: Table Creation + */ + function tablesCreation() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + $view = new Piwik_Installation_View( + $this->pathView . 'tablesCreation.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + $this->createDbFromSessionInformation(); + + if (Piwik_Common::getRequestVar('deleteTables', 0, 'int') == 1) { + Piwik::dropTables(); + $view->existingTablesDeleted = true; + + // when the user decides to drop the tables then we dont skip the next steps anymore + // workaround ZF-1743 + $tmp = $this->session->skipThisStep; + $tmp['firstWebsiteSetup'] = false; + $tmp['displayJavascriptCode'] = false; + $this->session->skipThisStep = $tmp; + } + + $tablesInstalled = Piwik::getTablesInstalled(); + $tablesToInstall = Piwik::getTablesNames(); + $view->tablesInstalled = ''; + if (count($tablesInstalled) > 0) { + // we have existing tables + $view->tablesInstalled = implode(', ', $tablesInstalled); + $view->someTablesInstalled = true; + + $minimumCountPiwikTables = 17; + $baseTablesInstalled = preg_grep('/archive_numeric|archive_blob/', $tablesInstalled, PREG_GREP_INVERT); + + Piwik::createAccessObject(); + Piwik::setUserIsSuperUser(); + if (count($baseTablesInstalled) >= $minimumCountPiwikTables && + count(Piwik_SitesManager_API::getInstance()->getAllSitesId()) > 0 && + count(Piwik_UsersManager_API::getInstance()->getUsers()) > 0 + ) { + $view->showReuseExistingTables = true; + // when the user reuses the same tables we skip the website creation step + // workaround ZF-1743 + $tmp = $this->session->skipThisStep; + $tmp['firstWebsiteSetup'] = true; + $tmp['displayJavascriptCode'] = true; + $this->session->skipThisStep = $tmp; + } + } else { + Piwik::createTables(); + Piwik::createAnonymousUser(); + + $updater = new Piwik_Updater(); + $updater->recordComponentSuccessfullyUpdated('core', Piwik_Version::VERSION); + $view->tablesCreated = true; + $view->showNextStep = true; + } + + $this->session->currentStepDone = __FUNCTION__; + echo $view->render(); + } + + /** + * Installation Step 6: General Set-up (superuser login/password/email and subscriptions) + */ + function generalSetup() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + $view = new Piwik_Installation_View( + $this->pathView . 'generalSetup.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + + $form = new Piwik_Installation_FormGeneralSetup(); + + if ($form->validate()) { + $superUserInfos = array( + 'login' => $form->getSubmitValue('login'), + 'password' => md5($form->getSubmitValue('password')), + 'email' => $form->getSubmitValue('email'), + 'salt' => Piwik_Common::generateUniqId(), + ); + + $this->session->superuser_infos = $superUserInfos; + + $url = Piwik_Config::getInstance()->General['api_service_url']; + $url .= '/1.0/subscribeNewsletter/'; + $params = array( + 'email' => $form->getSubmitValue('email'), + 'security' => $form->getSubmitValue('subscribe_newsletter_security'), + 'community' => $form->getSubmitValue('subscribe_newsletter_community'), + 'url' => Piwik_Url::getCurrentUrlWithoutQueryString(), + ); + if ($params['security'] == '1' + || $params['community'] == '1' + ) { + if (!isset($params['security'])) { + $params['security'] = '0'; + } + if (!isset($params['community'])) { + $params['community'] = '0'; + } + $url .= '?' . http_build_query($params, '', '&'); + try { + Piwik_Http::sendHttpRequest($url, $timeout = 2); + } catch (Exception $e) { + // e.g., disable_functions = fsockopen; allow_url_open = Off + } + } + $this->redirectToNextStep(__FUNCTION__); + } + $view->addForm($form); + + echo $view->render(); + } + + /** + * Installation Step 7: Configure first web-site + */ + public function firstWebsiteSetup() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + $view = new Piwik_Installation_View( + $this->pathView . 'firstWebsiteSetup.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + + $form = new Piwik_Installation_FormFirstWebsiteSetup(); + if (!isset($this->session->generalSetupSuccessMessage)) { + $view->displayGeneralSetupSuccess = true; + $this->session->generalSetupSuccessMessage = true; + } + + $this->initObjectsToCallAPI(); + if ($form->validate()) { + $name = urlencode($form->getSubmitValue('siteName')); + $url = urlencode($form->getSubmitValue('url')); + $ecommerce = (int)$form->getSubmitValue('ecommerce'); + + $request = new Piwik_API_Request(" method=SitesManager.addSite &siteName=$name &urls=$url @@ -398,616 +382,573 @@ class Piwik_Installation_Controller extends Piwik_Controller_Admin &format=original "); - try { - $result = $request->process(); - $this->session->site_idSite = $result; - $this->session->site_name = $name; - $this->session->site_url = $url; - - $this->redirectToNextStep( __FUNCTION__ ); - } catch(Exception $e) { - $view->errorMessage = $e->getMessage(); - } - - } - $view->addForm($form); - echo $view->render(); - } - - /** - * Installation Step 8: Display JavaScript tracking code - */ - public function displayJavascriptCode() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - $view = new Piwik_Installation_View( - $this->pathView . 'displayJavascriptCode.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - - if( !isset($this->session->firstWebsiteSetupSuccessMessage)) - { - $view->displayfirstWebsiteSetupSuccess = true; - $this->session->firstWebsiteSetupSuccessMessage = true; - } - $siteName = $this->session->site_name; - $siteName = Piwik_Common::sanitizeInputValue( urldecode($siteName) ); - $idSite = $this->session->site_idSite; - - // Load the Tracking code and help text from the SitesManager - $viewTrackingHelp = new Piwik_View('SitesManager/templates/DisplayJavascriptCode.tpl'); - $viewTrackingHelp->displaySiteName = $siteName; - $viewTrackingHelp->jsTag = Piwik::getJavascriptCode($idSite, Piwik_Url::getCurrentUrlWithoutFileName()); - $viewTrackingHelp->idSite = $idSite; - $viewTrackingHelp->piwikUrl = Piwik_Url::getCurrentUrlWithoutFileName(); - - // Assign the html output to a smarty variable - $view->trackingHelp = $viewTrackingHelp->render(); - $view->displaySiteName = $siteName; - - $view->showNextStep = true; - - $this->session->currentStepDone = __FUNCTION__; - echo $view->render(); - } - - /** - * Installation Step 9: Finished! - */ - public function finished() - { - $this->checkPreviousStepIsValid( __FUNCTION__ ); - - $view = new Piwik_Installation_View( - $this->pathView . 'finished.tpl', - $this->getInstallationSteps(), - __FUNCTION__ - ); - $this->skipThisStep( __FUNCTION__ ); - - if(!file_exists(Piwik_Config::getLocalConfigPath())) - { + try { + $result = $request->process(); + $this->session->site_idSite = $result; + $this->session->site_name = $name; + $this->session->site_url = $url; + + $this->redirectToNextStep(__FUNCTION__); + } catch (Exception $e) { + $view->errorMessage = $e->getMessage(); + } + + } + $view->addForm($form); + echo $view->render(); + } + + /** + * Installation Step 8: Display JavaScript tracking code + */ + public function displayJavascriptCode() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + $view = new Piwik_Installation_View( + $this->pathView . 'displayJavascriptCode.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + + if (!isset($this->session->firstWebsiteSetupSuccessMessage)) { + $view->displayfirstWebsiteSetupSuccess = true; + $this->session->firstWebsiteSetupSuccessMessage = true; + } + $siteName = $this->session->site_name; + $siteName = Piwik_Common::sanitizeInputValue(urldecode($siteName)); + $idSite = $this->session->site_idSite; + + // Load the Tracking code and help text from the SitesManager + $viewTrackingHelp = new Piwik_View('SitesManager/templates/DisplayJavascriptCode.tpl'); + $viewTrackingHelp->displaySiteName = $siteName; + $viewTrackingHelp->jsTag = Piwik::getJavascriptCode($idSite, Piwik_Url::getCurrentUrlWithoutFileName()); + $viewTrackingHelp->idSite = $idSite; + $viewTrackingHelp->piwikUrl = Piwik_Url::getCurrentUrlWithoutFileName(); + + // Assign the html output to a smarty variable + $view->trackingHelp = $viewTrackingHelp->render(); + $view->displaySiteName = $siteName; + + $view->showNextStep = true; + + $this->session->currentStepDone = __FUNCTION__; + echo $view->render(); + } + + /** + * Installation Step 9: Finished! + */ + public function finished() + { + $this->checkPreviousStepIsValid(__FUNCTION__); + + $view = new Piwik_Installation_View( + $this->pathView . 'finished.tpl', + $this->getInstallationSteps(), + __FUNCTION__ + ); + $this->skipThisStep(__FUNCTION__); + + if (!file_exists(Piwik_Config::getLocalConfigPath())) { // $this->addTrustedHosts(); - $this->writeConfigFileFromSession(); - } - - $view->showNextStep = false; - - $this->session->currentStepDone = __FUNCTION__; - echo $view->render(); - - $this->session->unsetAll(); - } - - /** - * This controller action renders an admin tab that runs the installation - * system check, so people can see if there are any issues w/ their running - * Piwik installation. - * - * This admin tab is only viewable by the super user. - */ - public function systemCheckPage() - { - Piwik::checkUserIsSuperUser(); - - $view = Piwik_View::factory('systemCheckPage'); - $this->setBasicVariablesView($view); - $view->menu = Piwik_GetAdminMenu(); - - $view->duringInstall = false; - - $this->setupSystemCheckView($view); - - $infos = $view->infos; - $infos['extra'] = self::performAdminPageOnlySystemCheck(); - $view->infos = $infos; - - echo $view->render(); - } - - /** - * Instantiate access and log objects - */ - protected function initObjectsToCallAPI() - { - // connect to the database using the DB infos currently in the session - $this->createDbFromSessionInformation(); - - Piwik::createAccessObject(); - Piwik::setUserIsSuperUser(); - Piwik::createLogObject(); - } - - /** - * Create database connection from session-store - */ - protected function createDbFromSessionInformation() - { - $dbInfos = $this->session->db_infos; - Piwik_Config::getInstance()->database = $dbInfos; - Piwik::createDatabaseObject($dbInfos); - } - - /** - * Write configuration file from session-store - */ - protected function writeConfigFileFromSession() - { - if(!isset($this->session->superuser_infos) - || !isset($this->session->db_infos)) - { - return; - } - - $config = Piwik_Config::getInstance(); - try { - // expect exception since config.ini.php doesn't exist yet - $config->init(); - } catch(Exception $e) { - $config->superuser = $this->session->superuser_infos; - $config->database = $this->session->db_infos; - - if(!empty($this->session->general_infos)) - { - $config->General = $this->session->general_infos; - } - - $config->forceSave(); - } - - unset($this->session->superuser_infos); - unset($this->session->db_infos); - unset($this->session->general_infos); - } - - /** - * Save language selection in session-store - */ - public function saveLanguage() - { - $language = Piwik_Common::getRequestVar('language'); - Piwik_LanguagesManager::setLanguageForSession($language); - Piwik_Url::redirectToReferer(); - } - - /** - * The previous step is valid if it is either - * - any step before (OK to go back) - * - the current step (case when validating a form) - * If step is invalid, then exit. - * - * @param string $currentStep Current step - */ - protected function checkPreviousStepIsValid( $currentStep ) - { - $error = false; - - if(empty($this->session->currentStepDone)) - { - $error = true; - } - else if($currentStep == 'finished' && $this->session->currentStepDone == 'finished') - { - // ok to refresh this page or use language selector - } - else - { - if(file_exists(Piwik_Config::getLocalConfigPath())) - { - $error = true; - } - - $steps = array_keys($this->steps); - - // the currentStep - $currentStepId = array_search($currentStep, $steps); - - // the step before - $previousStepId = array_search($this->session->currentStepDone, $steps); - - // not OK if currentStepId > previous+1 - if( $currentStepId > $previousStepId + 1 ) - { - $error = true; - } - } - if($error) - { - Piwik_Login_Controller::clearSession(); - $message = Piwik_Translate('Installation_ErrorInvalidState', - array( '<br /><b>', - '</b>', - '<a href=\''.Piwik_Common::sanitizeInputValue(Piwik_Url::getCurrentUrlWithoutFileName()).'\'>', - '</a>') - ); - Piwik::exitWithErrorMessage( $message ); - } - } - - /** - * Redirect to next step - * - * @param string Current step - * @return none - */ - protected function redirectToNextStep($currentStep) - { - $steps = array_keys($this->steps); - $this->session->currentStepDone = $currentStep; - $nextStep = $steps[1 + array_search($currentStep, $steps)]; - Piwik::redirectToModule('Installation' , $nextStep); - } - - /** - * Skip this step (typically to mark the current function as completed) - * - * @param string function name - */ - protected function skipThisStep( $step ) - { - $skipThisStep = $this->session->skipThisStep; - if(isset($skipThisStep[$step]) && $skipThisStep[$step]) - { - $this->redirectToNextStep($step); - } - } - - /** - * Extract host from URL - * - * @param string $url URL - * - * @return string|false - */ - protected function extractHost($url) - { - $urlParts = parse_url($url); - if (isset($urlParts['host']) && strlen($host = $urlParts['host'])) - { - return $host; - } - - return false; - } - - /** - * Add trusted hosts - */ - protected function addTrustedHosts() - { - $trustedHosts = array(); - - // extract host from the request header - if (($host = $this->extractHost('http://'.Piwik_Url::getHost())) !== false) - { - $trustedHosts[] = $host; - } - - // extract host from first web site - if (($host = $this->extractHost(urldecode($this->session->site_url))) !== false) - { - $trustedHosts[] = $host; - } - - $trustedHosts = array_unique($trustedHosts); - if (count($trustedHosts)) - { - $this->session->general_infos['trusted_hosts'] = $trustedHosts; - } - } - - /** - * Get system information - */ - public static function getSystemInformation() - { - global $piwik_minimumPHPVersion; - $minimumMemoryLimit = Piwik_Config::getInstance()->General['minimum_memory_limit']; - - $infos = array(); - - $infos['general_infos'] = array(); - $infos['directories'] = Piwik::checkDirectoriesWritable(); - $infos['can_auto_update'] = Piwik::canAutoUpdate(); - - if(Piwik_Common::isIIS()) - { - Piwik::createWebConfigFiles(); - } - else - { - Piwik::createHtAccessFiles(); - } - Piwik::createWebRootFiles(); - - $infos['phpVersion_minimum'] = $piwik_minimumPHPVersion; - $infos['phpVersion'] = PHP_VERSION; - $infos['phpVersion_ok'] = version_compare( $piwik_minimumPHPVersion, $infos['phpVersion']) === -1; - - // critical errors - $extensions = @get_loaded_extensions(); - $needed_extensions = array( - 'zlib', - 'SPL', - 'iconv', - 'Reflection', - ); - $infos['needed_extensions'] = $needed_extensions; - $infos['missing_extensions'] = array(); - foreach($needed_extensions as $needed_extension) - { - if(!in_array($needed_extension, $extensions)) - { - $infos['missing_extensions'][] = $needed_extension; - } - } - - $infos['pdo_ok'] = false; - if(in_array('PDO', $extensions)) - { - $infos['pdo_ok'] = true; - } - - $infos['adapters'] = Piwik_Db_Adapter::getAdapters(); - - $needed_functions = array( - 'debug_backtrace', - 'create_function', - 'eval', - 'gzcompress', - 'gzuncompress', - 'pack', - ); - $infos['needed_functions'] = $needed_functions; - $infos['missing_functions'] = array(); - foreach($needed_functions as $needed_function) - { - if(!self::functionExists($needed_function)) - { - $infos['missing_functions'][] = $needed_function; - } - } - - // warnings - $desired_extensions = array( - 'json', - 'libxml', - 'dom', - 'SimpleXML', - ); - $infos['desired_extensions'] = $desired_extensions; - $infos['missing_desired_extensions'] = array(); - foreach($desired_extensions as $desired_extension) - { - if(!in_array($desired_extension, $extensions)) - { - $infos['missing_desired_extensions'][] = $desired_extension; - } - } - - $desired_functions = array( - 'set_time_limit', - 'mail', - 'parse_ini_file', - 'glob', - ); - $infos['desired_functions'] = $desired_functions; - $infos['missing_desired_functions'] = array(); - foreach($desired_functions as $desired_function) - { - if(!self::functionExists($desired_function)) - { - $infos['missing_desired_functions'][] = $desired_function; - } - } - - $infos['openurl'] = Piwik_Http::getTransportMethod(); - - $infos['gd_ok'] = Piwik::isGdExtensionEnabled(); - - $infos['hasMbstring'] = false; - $infos['multibyte_ok'] = true; - if(function_exists('mb_internal_encoding')) - { - $infos['hasMbstring'] = true; - if (((int) ini_get('mbstring.func_overload')) != 0) - { - $infos['multibyte_ok'] = false; - } - } - - $serverSoftware = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ''; - $infos['serverVersion'] = addslashes($serverSoftware); - $infos['serverOs'] = @php_uname(); - $infos['serverTime'] = date('H:i:s'); - - $infos['registerGlobals_ok'] = ini_get('register_globals') == 0; - $infos['memoryMinimum'] = $minimumMemoryLimit; - - $infos['memory_ok'] = true; - $infos['memoryCurrent'] = ''; - - $raised = Piwik::raiseMemoryLimitIfNecessary(); - if(($memoryValue = Piwik::getMemoryLimitValue()) > 0) - { - $infos['memoryCurrent'] = $memoryValue.'M'; - $infos['memory_ok'] = $memoryValue >= $minimumMemoryLimit; - } - - $infos['isWindows'] = Piwik_Common::isWindows(); - - $integrityInfo = Piwik::getFileIntegrityInformation(); - $infos['integrity'] = $integrityInfo[0]; - - $infos['integrityErrorMessages'] = array(); - if(isset($integrityInfo[1])) - { - if($infos['integrity'] == false) - { - $infos['integrityErrorMessages'][] = '<b>'.Piwik_Translate('General_FileIntegrityWarningExplanation').'</b>'; - } - $infos['integrityErrorMessages'] = array_merge($infos['integrityErrorMessages'], array_slice($integrityInfo, 1)); - } - - $infos['timezone'] = Piwik::isTimezoneSupportEnabled(); - - $infos['tracker_status'] = Piwik_Common::getRequestVar('trackerStatus', 0, 'int'); - - $infos['protocol'] = Piwik_ProxyHeaders::getProtocolInformation(); - if(!Piwik::isHttps() && $infos['protocol'] !== null) - { - $infos['general_infos']['assume_secure_protocol'] = '1'; - } - if(count($headers = Piwik_ProxyHeaders::getProxyClientHeaders()) > 0) - { - $infos['general_infos']['proxy_client_headers'] = $headers; - } - if(count($headers = Piwik_ProxyHeaders::getProxyHostHeaders()) > 0) - { - $infos['general_infos']['proxy_host_headers'] = $headers; - } - - // check if filesystem is NFS, if it is file based sessions won't work properly - $infos['is_nfs'] = Piwik::checkIfFileSystemIsNFS(); - - // determine whether there are any errors/warnings from the checks done above - $infos['has_errors'] = false; - $infos['has_warnings'] = false; - if (in_array(0, $infos['directories']) // if a directory is not writable - || !$infos['phpVersion_ok'] - || !empty($infos['missing_extensions']) - || empty($infos['adapters']) - || !empty($infos['missing_functions'])) - { - $infos['has_errors'] = true; - } - - if (!$infos['can_auto_update'] - || !empty($infos['missing_desired_extensions']) - || !$infos['gd_ok'] - || !$infos['multibyte_ok'] - || !$infos['registerGlobals_ok'] - || !$infos['memory_ok'] - || !empty($infos['integrityErrorMessages']) - || !$infos['timezone'] // if timezone support isn't available - || $infos['tracker_status'] != 0 - || $infos['is_nfs']) - { - $infos['has_warnings'] = true; - } - - return $infos; - } - - /** - * Test if function exists. Also handles case where function is disabled via Suhosin. - * - * @param string $functionName Function name - * @return bool True if function exists (not disabled); False otherwise. - */ - public static function functionExists($functionName) - { - // eval() is a language construct - if($functionName == 'eval') - { - // does not check suhosin.executor.eval.whitelist (or blacklist) - if(extension_loaded('suhosin')) - { - return @ini_get("suhosin.executor.disable_eval") != "1"; - } - return true; - } - - $exists = function_exists($functionName); - if(extension_loaded('suhosin')) - { - $blacklist = @ini_get("suhosin.executor.func.blacklist"); - if(!empty($blacklist)) - { - $blacklistFunctions = array_map('strtolower', array_map('trim', explode(',', $blacklist))); - return $exists && !in_array($functionName, $blacklistFunctions); - } - - } - return $exists; - } - - /** - * Utility function, sets up a view that will display system check info. - * - * @param Piwik_View $view - */ - private function setupSystemCheckView( $view ) - { - $view->infos = self::getSystemInformation(); - - $view->helpMessages = array( - 'zlib' => 'Installation_SystemCheckZlibHelp', - 'SPL' => 'Installation_SystemCheckSplHelp', - 'iconv' => 'Installation_SystemCheckIconvHelp', - 'Reflection' => 'Required extension that is built in PHP, see http://www.php.net/manual/en/book.reflection.php', - 'json' => 'Installation_SystemCheckWarnJsonHelp', - 'libxml' => 'Installation_SystemCheckWarnLibXmlHelp', - 'dom' => 'Installation_SystemCheckWarnDomHelp', - 'SimpleXML' => 'Installation_SystemCheckWarnSimpleXMLHelp', - 'set_time_limit' => 'Installation_SystemCheckTimeLimitHelp', - 'mail' => 'Installation_SystemCheckMailHelp', - 'parse_ini_file' => 'Installation_SystemCheckParseIniFileHelp', - 'glob' => 'Installation_SystemCheckGlobHelp', - 'debug_backtrace' => 'Installation_SystemCheckDebugBacktraceHelp', - 'create_function' => 'Installation_SystemCheckCreateFunctionHelp', - 'eval' => 'Installation_SystemCheckEvalHelp', - 'gzcompress' => 'Installation_SystemCheckGzcompressHelp', - 'gzuncompress' => 'Installation_SystemCheckGzuncompressHelp', - 'pack' => 'Installation_SystemCheckPackHelp', - ); - - $view->problemWithSomeDirectories = (false !== array_search(false, $view->infos['directories'])); - } - - /** - * Performs extra system checks for the 'System Check' admin page. These - * checks are not performed during Installation. - * - * The following checks are performed: - * - Check for whether LOAD DATA INFILE can be used. The result of the check - * is stored in $result['load_data_infile_available']. The error message is - * stored in $result['load_data_infile_error']. - * - * @return array - */ - public static function performAdminPageOnlySystemCheck() - { - $result = array(); - - // check if LOAD DATA INFILE works - $optionTable = Piwik_Common::prefixTable('option'); - $testOptionNames = array('test_system_check1', 'test_system_check2'); - - $result['load_data_infile_available'] = false; - try - { - $result['load_data_infile_available'] = Piwik::tableInsertBatch( - $optionTable, - array('option_name', 'option_value'), - array( - array($testOptionNames[0], '1'), - array($testOptionNames[1], '2'), - ), - $throwException = true - ); - } - catch (Exception $ex) - { - $result['load_data_infile_error'] = str_replace("\n","<br/>", $ex->getMessage()); - } - - // delete the temporary rows that were created - Piwik_Exec("DELETE FROM `$optionTable` WHERE option_name IN ('".implode("','", $testOptionNames)."')"); - - return $result; - } + $this->writeConfigFileFromSession(); + } + + $view->showNextStep = false; + + $this->session->currentStepDone = __FUNCTION__; + echo $view->render(); + + $this->session->unsetAll(); + } + + /** + * This controller action renders an admin tab that runs the installation + * system check, so people can see if there are any issues w/ their running + * Piwik installation. + * + * This admin tab is only viewable by the super user. + */ + public function systemCheckPage() + { + Piwik::checkUserIsSuperUser(); + + $view = Piwik_View::factory('systemCheckPage'); + $this->setBasicVariablesView($view); + $view->menu = Piwik_GetAdminMenu(); + + $view->duringInstall = false; + + $this->setupSystemCheckView($view); + + $infos = $view->infos; + $infos['extra'] = self::performAdminPageOnlySystemCheck(); + $view->infos = $infos; + + echo $view->render(); + } + + /** + * Instantiate access and log objects + */ + protected function initObjectsToCallAPI() + { + // connect to the database using the DB infos currently in the session + $this->createDbFromSessionInformation(); + + Piwik::createAccessObject(); + Piwik::setUserIsSuperUser(); + Piwik::createLogObject(); + } + + /** + * Create database connection from session-store + */ + protected function createDbFromSessionInformation() + { + $dbInfos = $this->session->db_infos; + Piwik_Config::getInstance()->database = $dbInfos; + Piwik::createDatabaseObject($dbInfos); + } + + /** + * Write configuration file from session-store + */ + protected function writeConfigFileFromSession() + { + if (!isset($this->session->superuser_infos) + || !isset($this->session->db_infos) + ) { + return; + } + + $config = Piwik_Config::getInstance(); + try { + // expect exception since config.ini.php doesn't exist yet + $config->init(); + } catch (Exception $e) { + $config->superuser = $this->session->superuser_infos; + $config->database = $this->session->db_infos; + + if (!empty($this->session->general_infos)) { + $config->General = $this->session->general_infos; + } + + $config->forceSave(); + } + + unset($this->session->superuser_infos); + unset($this->session->db_infos); + unset($this->session->general_infos); + } + + /** + * Save language selection in session-store + */ + public function saveLanguage() + { + $language = Piwik_Common::getRequestVar('language'); + Piwik_LanguagesManager::setLanguageForSession($language); + Piwik_Url::redirectToReferer(); + } + + /** + * The previous step is valid if it is either + * - any step before (OK to go back) + * - the current step (case when validating a form) + * If step is invalid, then exit. + * + * @param string $currentStep Current step + */ + protected function checkPreviousStepIsValid($currentStep) + { + $error = false; + + if (empty($this->session->currentStepDone)) { + $error = true; + } else if ($currentStep == 'finished' && $this->session->currentStepDone == 'finished') { + // ok to refresh this page or use language selector + } else { + if (file_exists(Piwik_Config::getLocalConfigPath())) { + $error = true; + } + + $steps = array_keys($this->steps); + + // the currentStep + $currentStepId = array_search($currentStep, $steps); + + // the step before + $previousStepId = array_search($this->session->currentStepDone, $steps); + + // not OK if currentStepId > previous+1 + if ($currentStepId > $previousStepId + 1) { + $error = true; + } + } + if ($error) { + Piwik_Login_Controller::clearSession(); + $message = Piwik_Translate('Installation_ErrorInvalidState', + array('<br /><b>', + '</b>', + '<a href=\'' . Piwik_Common::sanitizeInputValue(Piwik_Url::getCurrentUrlWithoutFileName()) . '\'>', + '</a>') + ); + Piwik::exitWithErrorMessage($message); + } + } + + /** + * Redirect to next step + * + * @param string Current step + * @return none + */ + protected function redirectToNextStep($currentStep) + { + $steps = array_keys($this->steps); + $this->session->currentStepDone = $currentStep; + $nextStep = $steps[1 + array_search($currentStep, $steps)]; + Piwik::redirectToModule('Installation', $nextStep); + } + + /** + * Skip this step (typically to mark the current function as completed) + * + * @param string function name + */ + protected function skipThisStep($step) + { + $skipThisStep = $this->session->skipThisStep; + if (isset($skipThisStep[$step]) && $skipThisStep[$step]) { + $this->redirectToNextStep($step); + } + } + + /** + * Extract host from URL + * + * @param string $url URL + * + * @return string|false + */ + protected function extractHost($url) + { + $urlParts = parse_url($url); + if (isset($urlParts['host']) && strlen($host = $urlParts['host'])) { + return $host; + } + + return false; + } + + /** + * Add trusted hosts + */ + protected function addTrustedHosts() + { + $trustedHosts = array(); + + // extract host from the request header + if (($host = $this->extractHost('http://' . Piwik_Url::getHost())) !== false) { + $trustedHosts[] = $host; + } + + // extract host from first web site + if (($host = $this->extractHost(urldecode($this->session->site_url))) !== false) { + $trustedHosts[] = $host; + } + + $trustedHosts = array_unique($trustedHosts); + if (count($trustedHosts)) { + $this->session->general_infos['trusted_hosts'] = $trustedHosts; + } + } + + /** + * Get system information + */ + public static function getSystemInformation() + { + global $piwik_minimumPHPVersion; + $minimumMemoryLimit = Piwik_Config::getInstance()->General['minimum_memory_limit']; + + $infos = array(); + + $infos['general_infos'] = array(); + $infos['directories'] = Piwik::checkDirectoriesWritable(); + $infos['can_auto_update'] = Piwik::canAutoUpdate(); + + if (Piwik_Common::isIIS()) { + Piwik::createWebConfigFiles(); + } else { + Piwik::createHtAccessFiles(); + } + Piwik::createWebRootFiles(); + + $infos['phpVersion_minimum'] = $piwik_minimumPHPVersion; + $infos['phpVersion'] = PHP_VERSION; + $infos['phpVersion_ok'] = version_compare($piwik_minimumPHPVersion, $infos['phpVersion']) === -1; + + // critical errors + $extensions = @get_loaded_extensions(); + $needed_extensions = array( + 'zlib', + 'SPL', + 'iconv', + 'Reflection', + ); + $infos['needed_extensions'] = $needed_extensions; + $infos['missing_extensions'] = array(); + foreach ($needed_extensions as $needed_extension) { + if (!in_array($needed_extension, $extensions)) { + $infos['missing_extensions'][] = $needed_extension; + } + } + + $infos['pdo_ok'] = false; + if (in_array('PDO', $extensions)) { + $infos['pdo_ok'] = true; + } + + $infos['adapters'] = Piwik_Db_Adapter::getAdapters(); + + $needed_functions = array( + 'debug_backtrace', + 'create_function', + 'eval', + 'gzcompress', + 'gzuncompress', + 'pack', + ); + $infos['needed_functions'] = $needed_functions; + $infos['missing_functions'] = array(); + foreach ($needed_functions as $needed_function) { + if (!self::functionExists($needed_function)) { + $infos['missing_functions'][] = $needed_function; + } + } + + // warnings + $desired_extensions = array( + 'json', + 'libxml', + 'dom', + 'SimpleXML', + ); + $infos['desired_extensions'] = $desired_extensions; + $infos['missing_desired_extensions'] = array(); + foreach ($desired_extensions as $desired_extension) { + if (!in_array($desired_extension, $extensions)) { + $infos['missing_desired_extensions'][] = $desired_extension; + } + } + + $desired_functions = array( + 'set_time_limit', + 'mail', + 'parse_ini_file', + 'glob', + ); + $infos['desired_functions'] = $desired_functions; + $infos['missing_desired_functions'] = array(); + foreach ($desired_functions as $desired_function) { + if (!self::functionExists($desired_function)) { + $infos['missing_desired_functions'][] = $desired_function; + } + } + + $infos['openurl'] = Piwik_Http::getTransportMethod(); + + $infos['gd_ok'] = Piwik::isGdExtensionEnabled(); + + $infos['hasMbstring'] = false; + $infos['multibyte_ok'] = true; + if (function_exists('mb_internal_encoding')) { + $infos['hasMbstring'] = true; + if (((int)ini_get('mbstring.func_overload')) != 0) { + $infos['multibyte_ok'] = false; + } + } + + $serverSoftware = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ''; + $infos['serverVersion'] = addslashes($serverSoftware); + $infos['serverOs'] = @php_uname(); + $infos['serverTime'] = date('H:i:s'); + + $infos['registerGlobals_ok'] = ini_get('register_globals') == 0; + $infos['memoryMinimum'] = $minimumMemoryLimit; + + $infos['memory_ok'] = true; + $infos['memoryCurrent'] = ''; + + $raised = Piwik::raiseMemoryLimitIfNecessary(); + if (($memoryValue = Piwik::getMemoryLimitValue()) > 0) { + $infos['memoryCurrent'] = $memoryValue . 'M'; + $infos['memory_ok'] = $memoryValue >= $minimumMemoryLimit; + } + + $infos['isWindows'] = Piwik_Common::isWindows(); + + $integrityInfo = Piwik::getFileIntegrityInformation(); + $infos['integrity'] = $integrityInfo[0]; + + $infos['integrityErrorMessages'] = array(); + if (isset($integrityInfo[1])) { + if ($infos['integrity'] == false) { + $infos['integrityErrorMessages'][] = '<b>' . Piwik_Translate('General_FileIntegrityWarningExplanation') . '</b>'; + } + $infos['integrityErrorMessages'] = array_merge($infos['integrityErrorMessages'], array_slice($integrityInfo, 1)); + } + + $infos['timezone'] = Piwik::isTimezoneSupportEnabled(); + + $infos['tracker_status'] = Piwik_Common::getRequestVar('trackerStatus', 0, 'int'); + + $infos['protocol'] = Piwik_ProxyHeaders::getProtocolInformation(); + if (!Piwik::isHttps() && $infos['protocol'] !== null) { + $infos['general_infos']['assume_secure_protocol'] = '1'; + } + if (count($headers = Piwik_ProxyHeaders::getProxyClientHeaders()) > 0) { + $infos['general_infos']['proxy_client_headers'] = $headers; + } + if (count($headers = Piwik_ProxyHeaders::getProxyHostHeaders()) > 0) { + $infos['general_infos']['proxy_host_headers'] = $headers; + } + + // check if filesystem is NFS, if it is file based sessions won't work properly + $infos['is_nfs'] = Piwik::checkIfFileSystemIsNFS(); + + // determine whether there are any errors/warnings from the checks done above + $infos['has_errors'] = false; + $infos['has_warnings'] = false; + if (in_array(0, $infos['directories']) // if a directory is not writable + || !$infos['phpVersion_ok'] + || !empty($infos['missing_extensions']) + || empty($infos['adapters']) + || !empty($infos['missing_functions']) + ) { + $infos['has_errors'] = true; + } + + if (!$infos['can_auto_update'] + || !empty($infos['missing_desired_extensions']) + || !$infos['gd_ok'] + || !$infos['multibyte_ok'] + || !$infos['registerGlobals_ok'] + || !$infos['memory_ok'] + || !empty($infos['integrityErrorMessages']) + || !$infos['timezone'] // if timezone support isn't available + || $infos['tracker_status'] != 0 + || $infos['is_nfs'] + ) { + $infos['has_warnings'] = true; + } + + return $infos; + } + + /** + * Test if function exists. Also handles case where function is disabled via Suhosin. + * + * @param string $functionName Function name + * @return bool True if function exists (not disabled); False otherwise. + */ + public static function functionExists($functionName) + { + // eval() is a language construct + if ($functionName == 'eval') { + // does not check suhosin.executor.eval.whitelist (or blacklist) + if (extension_loaded('suhosin')) { + return @ini_get("suhosin.executor.disable_eval") != "1"; + } + return true; + } + + $exists = function_exists($functionName); + if (extension_loaded('suhosin')) { + $blacklist = @ini_get("suhosin.executor.func.blacklist"); + if (!empty($blacklist)) { + $blacklistFunctions = array_map('strtolower', array_map('trim', explode(',', $blacklist))); + return $exists && !in_array($functionName, $blacklistFunctions); + } + + } + return $exists; + } + + /** + * Utility function, sets up a view that will display system check info. + * + * @param Piwik_View $view + */ + private function setupSystemCheckView($view) + { + $view->infos = self::getSystemInformation(); + + $view->helpMessages = array( + 'zlib' => 'Installation_SystemCheckZlibHelp', + 'SPL' => 'Installation_SystemCheckSplHelp', + 'iconv' => 'Installation_SystemCheckIconvHelp', + 'Reflection' => 'Required extension that is built in PHP, see http://www.php.net/manual/en/book.reflection.php', + 'json' => 'Installation_SystemCheckWarnJsonHelp', + 'libxml' => 'Installation_SystemCheckWarnLibXmlHelp', + 'dom' => 'Installation_SystemCheckWarnDomHelp', + 'SimpleXML' => 'Installation_SystemCheckWarnSimpleXMLHelp', + 'set_time_limit' => 'Installation_SystemCheckTimeLimitHelp', + 'mail' => 'Installation_SystemCheckMailHelp', + 'parse_ini_file' => 'Installation_SystemCheckParseIniFileHelp', + 'glob' => 'Installation_SystemCheckGlobHelp', + 'debug_backtrace' => 'Installation_SystemCheckDebugBacktraceHelp', + 'create_function' => 'Installation_SystemCheckCreateFunctionHelp', + 'eval' => 'Installation_SystemCheckEvalHelp', + 'gzcompress' => 'Installation_SystemCheckGzcompressHelp', + 'gzuncompress' => 'Installation_SystemCheckGzuncompressHelp', + 'pack' => 'Installation_SystemCheckPackHelp', + ); + + $view->problemWithSomeDirectories = (false !== array_search(false, $view->infos['directories'])); + } + + /** + * Performs extra system checks for the 'System Check' admin page. These + * checks are not performed during Installation. + * + * The following checks are performed: + * - Check for whether LOAD DATA INFILE can be used. The result of the check + * is stored in $result['load_data_infile_available']. The error message is + * stored in $result['load_data_infile_error']. + * + * @return array + */ + public static function performAdminPageOnlySystemCheck() + { + $result = array(); + + // check if LOAD DATA INFILE works + $optionTable = Piwik_Common::prefixTable('option'); + $testOptionNames = array('test_system_check1', 'test_system_check2'); + + $result['load_data_infile_available'] = false; + try { + $result['load_data_infile_available'] = Piwik::tableInsertBatch( + $optionTable, + array('option_name', 'option_value'), + array( + array($testOptionNames[0], '1'), + array($testOptionNames[1], '2'), + ), + $throwException = true + ); + } catch (Exception $ex) { + $result['load_data_infile_error'] = str_replace("\n", "<br/>", $ex->getMessage()); + } + + // delete the temporary rows that were created + Piwik_Exec("DELETE FROM `$optionTable` WHERE option_name IN ('" . implode("','", $testOptionNames) . "')"); + + return $result; + } } |