/** * Begin installation * * @return @e void */ public function start() { /* INIT */ $app_directory = IPSText::alphanumericalClean($this->request['app_directory']); $type = 'upgrade'; $data = array(); $ok = 1; $errors = array(); $localfiles = array(DOC_IPS_ROOT_PATH . 'cache/skin_cache'); $info = array(); /* Init Data */ $data = IPSSetUp::fetchXmlAppInformation($app_directory, $this->settings['gb_char_set']); $_numbers = IPSSetUp::fetchAppVersionNumbers($app_directory); $_files = IPSSetUp::fetchXmlAppWriteableFiles($app_directory); /* Grab Data */ $data['app_directory'] = $app_directory; $data['current_version'] = $_numbers['current'][0] ? $_numbers['current'][0] : $this->lang->words['cur_version_none']; $data['latest_version'] = $_numbers['latest'][1]; $data['next_version'] = $_numbers['next'][0]; /* Install, or upgrade? */ if (!$_numbers['current'][0]) { $type = 'install'; } else { @header("Location: {$this->settings['board_url']}/" . CP_DIRECTORY . "/upgrade/"); exit; } /* Version Check */ if ($data['current_version'] > 0 and $data['current_version'] == $data['latest_version']) { $this->registry->output->global_message = $this->lang->words['error__up_to_date']; $this->registry->output->silentRedirectWithMessage($this->settings['base_url']); return; } /* Check local files */ foreach ($localfiles as $_path) { if (!file_exists($_path)) { if ($data['dir']) { if (!@mkdir($_path, IPS_FOLDER_PERMISSION, TRUE)) { $info['notexist'][] = $_path; } } else { $info['notexist'][] = $_path; } } else { if (!is_writeable($_path)) { if (!@chmod($_path, is_dir($_path) ? IPS_FOLDER_PERMISSION : IPS_FILE_PERMISSION)) { $info['notwrite'][] = $_path; } } } } /* Check files... */ if (is_array($_files) and count($_files)) { $info = array_merge($info, $_files); } if (count($info['notexist'])) { foreach ($info['notexist'] as $path) { $errors[] = sprintf($this->lang->words['error__file_missing'], $path); } } if (count($info['notwrite'])) { foreach ($info['notwrite'] as $path) { $errors[] = sprintf($this->lang->words['error__file_chmod'], $path); } } /** * Custom errors */ if (count($info['other'])) { foreach ($info['other'] as $error) { $errors[] = $error; } } /* Check for xml files */ $required_xml = array("information"); foreach ($required_xml as $r) { if (!is_file($this->app_full_path . "xml/{$r}.xml")) { $errors[] = sprintf($this->lang->words['error__file_needed'], $this->app_full_path . "xml/{$r}.xml"); } } /* Show splash */ $this->registry->output->html .= $this->html->setup_splash_screen($data, $errors, $type); }
/** * Execute selected method * * @access public * @param object Registry object * @return @e void */ public function doExecute(ipsRegistry $registry) { /* Check input? */ if ($this->request['do'] == 'check') { /* Check Directory */ if (!is_array($_POST['apps']) or !count($_POST['apps'])) { $this->registry->output->addError('You must select to install at least one application'); } else { /* Save Form Data */ IPSSetUp::setSavedData('install_apps', implode(',', array_keys($_POST['apps']))); /* Check writeable files */ foreach (array_keys($_POST['apps']) as $appDir) { $info = IPSSetUp::fetchXmlAppWriteableFiles($appDir); if (count($info['notexist'])) { foreach ($info['notexist'] as $path) { $this->registry->output->addWarning('File or directory does not exist: "' . $path . '", please create it via FTP'); } } if (count($info['notwrite'])) { foreach ($info['notwrite'] as $path) { $this->registry->output->addWarning('File or directory is not writeable: "' . $path . '", please CHMOD via FTP'); } } /** * Custom errors */ if (count($info['other'])) { foreach ($info['other'] as $error) { $this->registry->output->addWarning($error); } } } /* Do we have errors? */ if (!count($this->registry->output->fetchWarnings())) { /* Next Action */ $this->registry->autoLoadNextAction('address'); } } } /* Generate apps... */ $apps = array('core' => array(), 'ips' => array(), 'other' => array()); foreach (array('applications', 'applications_addon/ips', 'applications_addon/other') as $_pBit) { $path = IPS_ROOT_PATH . $_pBit; $handle = opendir($path); while (($file = readdir($handle)) !== FALSE) { if (!preg_match("#^\\.#", $file)) { if (is_dir($path . '/' . $file)) { //----------------------------------------- // Get it! //----------------------------------------- if (!is_file(IPS_ROOT_PATH . $_pBit . '/' . $file . '/xml/information.xml')) { continue; } $data = IPSSetUp::fetchXmlAppInformation($file, $this->settings['gb_char_set']); switch ($_pBit) { case 'applications': $apps['core'][$file] = $data; break; case 'applications_addon/ips': $apps['ips'][$file] = $data; break; case 'applications_addon/other': $apps['other'][$file] = $data; break; } } } } closedir($handle); } /* We don't want IP.SEO to be installed on future versions. Bad things happen. */ unset($apps['ips']['ipseo']); unset($apps['other']['ipseo']); /* Reorder the array so that core is first */ $new_array = array(); $new_array['core'] = $apps['core']['core']; foreach ($apps['core'] as $app => $data) { if ($app == 'core') { continue; } $new_array[$app] = $data; } $apps['core'] = $new_array; /* Page Output */ $this->registry->output->setTitle("Applications"); $this->registry->output->setNextAction('apps&do=check'); $this->registry->output->addContent($this->registry->output->template()->page_apps($apps)); $this->registry->output->sendOutput(); }