Beispiel #1
0
 /**
  * Get update info
  *
  * @param  boolean $live
  * @return \ArrayObject
  */
 public function getUpdates($live = true)
 {
     $updates = ['phirecms' => null, 'modules' => []];
     if ($live) {
         $headers = ['Authorization: ' . base64_encode('phire-updater-' . time()), 'User-Agent: ' . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0')];
         $curl = new Curl('http://updates.phirecms.org/latest/phirecms', [CURLOPT_HTTPHEADER => $headers]);
         $curl->send();
         if ($curl->getCode() == 200) {
             $json = json_decode($curl->getBody(), true);
             $updates['phirecms'] = $json['version'];
         }
         $modules = Table\Modules::findAll();
         if ($modules->hasRows()) {
             foreach ($modules->rows() as $module) {
                 $curl = new Curl('http://updates.phirecms.org/latest/' . $module->name, [CURLOPT_HTTPHEADER => $headers]);
                 $curl->send();
                 if ($curl->getCode() == 200) {
                     $json = json_decode($curl->getBody(), true);
                     $updates['modules'][$module->name] = $json['version'];
                 }
             }
         }
     }
     return new \ArrayObject($updates, \ArrayObject::ARRAY_AS_PROPS);
 }
Beispiel #2
0
 /**
  * Drop field table
  *
  * @param  string $name
  * @return void
  */
 protected function dropFieldTable($name)
 {
     $sql = Table\Fields::sql();
     $db = $sql->getDb();
     $table = $sql->quoteId(DB_PREFIX . 'field_' . $name);
     $db->query('DROP TABLE ' . $table);
     $module = \Phire\Table\Modules::findBy(['folder' => 'phire-fields']);
     if (isset($module->id)) {
         $assets = unserialize($module->assets);
         if (in_array(DB_PREFIX . 'field_' . $name, $assets['tables'])) {
             unset($assets['tables'][array_search(DB_PREFIX . 'field_' . $name, $assets['tables'])]);
         }
         $module->assets = serialize($assets);
         $module->save();
     }
 }
Beispiel #3
0
if (stripos(php_sapi_name(), 'cli') === false || stripos(php_sapi_name(), 'server') !== false) {
    header('Content-Type: text/html');
    echo '<!DOCTYPE html>' . PHP_EOL . '<html><head><title>HTTP 403 (Forbidden)</title>' . '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="robots" content="none" /></head>' . '<body><h1>HTTP 403 (Forbidden)</h1></body></html>';
    exit;
}
require_once __DIR__ . '/../config.php';
set_time_limit(0);
try {
    // Check the app constants
    if (!defined('BASE_PATH') || !defined('APP_PATH') || !defined('APP_URI') || !defined('DB_INTERFACE') || !defined('DB_NAME')) {
        throw new \Exception('Error: The config file is not properly configured. Please check the config file or install the system.');
    }
    // Get the autoloader
    $autoloader = (require APP_ABS_PATH . '/vendor/autoload.php');
    $appConfig = (include APP_ABS_PATH . '/config/application.php');
    $config = (include MODULES_PATH . '/phire-console-1.0/config/module.php');
    $config['phire-console']['services'] = $appConfig['services'];
    $config['phire-console']['routes'] = $config['phire-console']['cli-routes'];
    $autoloader->addPsr4($config['phire-console']['prefix'], $config['phire-console']['src']);
    // Create and run the app as a self-contained console app
    $app = new Pop\Application($autoloader, $config['phire-console']);
    $app->register('phire', new Phire\Console\Module\Module($app));
    if (!\Phire\Table\Modules::findBy(['name' => 'phire-console'])->active) {
        $app->trigger('app.route.pre');
        throw new \Phire\Exception('The Phire Console module is not active.');
    }
    $app->run();
} catch (Exception $exception) {
    $phire = new Phire\Console\Module\Module();
    $phire->error($exception);
}
Beispiel #4
0
 /**
  * Method for post update code for Phire or for a module,
  * usually for database modification or file cleanup
  *
  * @return void
  */
 public function runPost()
 {
     $i = count($this->previousUpdates) > 0 ? max($this->previousUpdates) + 1 : 1;
     $method = 'update' . $i;
     while (method_exists($this, $method)) {
         $this->{$method}();
         $this->previousUpdates[] = $i;
         $i++;
         $method = 'update' . $i;
     }
     if (null === $this->module) {
         $updates = Table\Config::findById('updates');
         $updates->value = implode('|', $this->previousUpdates);
         $updates->save();
         $updated = Table\Config::findById('updated_on');
         $updated->value = date('Y-m-d H:i:s');
         $updated->save();
     } else {
         $module = Table\Modules::findBy(['name' => $this->module]);
         if (isset($module->id)) {
             $module->updates = implode('|', $this->previousUpdates);
             $module->updated_on = date('Y-m-d H:i:s');
             $module->save();
         }
     }
 }
Beispiel #5
0
 /**
  * Update action method
  *
  * @param  int $id
  * @return void
  */
 public function update($id)
 {
     $module = new Model\Module();
     $module->getById($id);
     if (isset($module->id) && isset($this->sess->updates->modules[$module->name]) && version_compare($module->version, $this->sess->updates->modules[$module->name]) < 0) {
         if ($this->request->getQuery('update') == 2 && is_writable(MODULES_ABS_PATH) && is_writable(MODULES_ABS_PATH . '/' . $module->folder) && is_writable(MODULES_ABS_PATH . '/' . $module->folder . '.zip')) {
             clearstatcache();
             $updaterClass = $module->prefix . 'Updater';
             if (class_exists($updaterClass)) {
                 $updater = new $updaterClass($module->name);
                 $updater->runPost();
             }
             $mod = \Phire\Table\Modules::findById($id);
             if (isset($mod->id)) {
                 $mod->version = $this->sess->updates->modules[$module->name];
                 $mod->updated_on = date('Y-m-d H:i:s');
                 $mod->save();
             }
             $this->redirect(BASE_PATH . APP_URI . '/modules/complete/' . $id);
         } else {
             if ($this->request->getQuery('update') == 1 && is_writable(MODULES_ABS_PATH) && is_writable(MODULES_ABS_PATH . '/' . $module->folder) && is_writable(MODULES_ABS_PATH . '/' . $module->folder . '.zip')) {
                 $updater = new \Phire\Updater($module->name);
                 $updater->getUpdate($module->name, $this->sess->updates->modules[$module->name], $module->version, $id);
                 $this->redirect(BASE_PATH . APP_URI . '/modules/update/' . $id . '?update=2');
             } else {
                 $this->prepareView('phire/modules/update.phtml');
                 $this->view->title = 'Update ' . $module->name;
                 $this->view->module_id = $module->id;
                 $this->view->module_name = $module->name;
                 $this->view->module_update_version = $this->sess->updates->modules[$module->name];
                 if (is_writable(MODULES_ABS_PATH) && is_writable(MODULES_ABS_PATH . '/' . $module->folder) && is_writable(MODULES_ABS_PATH . '/' . $module->folder . '.zip')) {
                     $this->view->writable = true;
                 } else {
                     $this->view->writable = false;
                 }
                 $this->send();
             }
         }
     } else {
         $this->redirect(BASE_PATH . APP_URI . '/modules');
     }
 }
Beispiel #6
0
 /**
  * Load application modules
  *
  * @return Module
  */
 public function registerModules()
 {
     if ($this->application->config()['db']) {
         $modulesPath = MODULES_ABS_PATH;
         $moduleFolders = [];
         $modules = Table\Modules::findBy(['active' => 1], ['order' => 'order DESC']);
         foreach ($modules->rows() as $module) {
             if (file_exists($modulesPath . '/' . $module->folder . '/src/Module.php')) {
                 include $modulesPath . '/' . $module->folder . '/src/Module.php';
                 $moduleClass = $module->prefix . 'Module';
             } else {
                 $moduleClass = 'Phire\\Module\\Module';
             }
             if (file_exists($modulesPath . '/' . $module->folder . '/config/module.php')) {
                 $moduleConfig = (include $modulesPath . '/' . $module->folder . '/config/module.php');
                 // Load and register each module
                 if (file_exists(CONTENT_ABS_PATH . '/phire/config/' . $module->name . '.php')) {
                     $moduleConfig = array_merge($moduleConfig[$module->name], include CONTENT_ABS_PATH . '/phire/config/' . $module->name . '.php');
                 } else {
                     $moduleConfig = $moduleConfig[$module->name];
                 }
                 if (strpos($modulesPath, 'vendor') !== false) {
                     unset($moduleConfig['prefix']);
                     unset($moduleConfig['src']);
                 }
                 $newModule = new $moduleClass($moduleConfig, $this->application);
             } else {
                 $newModule = new $moduleClass($this->application);
             }
             $this->application->register($module->name, $newModule);
             $moduleFolders[$module->name] = $module->folder;
         }
         // Check module configs for Phire-specific configs
         foreach ($this->application->modules() as $module => $config) {
             // Load module assets
             if (isset($moduleFolders[$module]) && file_exists($modulesPath . '/' . $moduleFolders[$module] . '/data/assets')) {
                 $this->loadAssets($modulesPath . '/' . $moduleFolders[$module] . '/data/assets', strtolower($module));
             }
         }
     }
     return $this;
 }
Beispiel #7
0
 /**
  * Finalize module install
  *
  * @param  string               $module
  * @param  string               $folder
  * @param  string               $modulesPath
  * @param  \Pop\Service\Locator $services
  * @return void
  */
 protected function finalizeInstall($module, $folder, $modulesPath, $services)
 {
     // Get module config and module info from config file
     $config = (include $modulesPath . '/' . $folder . '/config/module.php');
     $info = $this->getInfo(file_get_contents($modulesPath . '/' . $folder . '/config/module.php'));
     $name = key($config);
     $descName = '';
     if (isset($info['name'])) {
         $descName = $info['name'];
     } else {
         if (isset($info['Name'])) {
             $descName = $info['Name'];
         } else {
             if (isset($info['NAME'])) {
                 $descName = $info['NAME'];
             } else {
                 if (isset($info['module name'])) {
                     $descName = $info['module name'];
                 } else {
                     if (isset($info['Module Name'])) {
                         $descName = $info['Module Name'];
                     } else {
                         if (isset($info['MODULE NAME'])) {
                             $descName = $info['MODULE NAME'];
                         }
                     }
                 }
             }
         }
     }
     $info['Desc Name'] = $descName;
     if (isset($info['version'])) {
         $version = $info['version'];
     } else {
         if (isset($info['Version'])) {
             $version = $info['Version'];
         } else {
             if (isset($info['VERSION'])) {
                 $version = $info['VERSION'];
             } else {
                 $version = 'N/A';
             }
         }
     }
     // Get SQL, if exists
     $sqlType = strtolower(DB_INTERFACE == 'pdo' ? DB_TYPE : DB_INTERFACE);
     $sqlFile = $modulesPath . '/' . $folder . '/data/' . $name . '.' . $sqlType . '.sql';
     if (!file_exists($sqlFile)) {
         $sqlFile = null;
     }
     $tables = null !== $sqlFile ? $this->getTables(file_get_contents($sqlFile)) : [];
     // Save module in the database
     $mod = new Table\Modules(['file' => $module, 'folder' => $folder, 'name' => $name, 'prefix' => isset($config[$name]['prefix']) ? $config[$name]['prefix'] : '', 'version' => $version, 'active' => 1, 'order' => (int) Table\Modules::findAll()->count() + 1, 'assets' => serialize(['tables' => $tables, 'info' => $info]), 'installed_on' => date('Y-m-d H:i:s')]);
     $mod->save();
     $this->sendStats($name, $version);
     // Execute any SQL that came with the module
     if (null !== $sqlFile) {
         Db::install($sqlFile, ['database' => DB_NAME, 'username' => DB_USER, 'password' => DB_PASS, 'host' => DB_HOST, 'prefix' => DB_PREFIX, 'type' => DB_TYPE], ucfirst(strtolower(DB_INTERFACE)));
     }
     // Run any install functions
     if (isset($config[$name]) && isset($config[$name]['install']) && !empty($config[$name]['install'])) {
         call_user_func_array($config[$name]['install'], [$services]);
     }
 }
Beispiel #8
0
 /**
  * Process and save seo config
  *
  * @param  array $exclude
  * @return void
  */
 public function saveAnalysis(array $exclude = [])
 {
     $config = Table\Config::findById('seo_config');
     $cfg = isset($config->value) && !empty($config->value) && $config->value != '' ? unserialize($config->value) : [];
     $analysis = ['tracking' => false, 'sitemap' => false, 'robots' => false, 'caching' => false, 'site-verify' => false, 'content' => ['good' => [], 'bad' => []]];
     if (!empty($cfg['tracking']) && $cfg['tracking'] != '') {
         $analysis['tracking'] = true;
     }
     $sitemap = \Phire\Table\Modules::findBy(['name' => 'phire-sitemap']);
     if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . '/sitemap.xml') || isset($sitemap->id) && $sitemap->active) {
         $analysis['sitemap'] = true;
     }
     if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . '/robots.txt') || isset($cfg['robots']) && !empty($cfg['robots']) && $cfg['robots'] != '') {
         $analysis['robots'] = true;
     }
     $cacheDetect = false;
     $curl = new Curl('http://' . $_SERVER['HTTP_HOST'] . BASE_PATH);
     if ($curl->getCode() == 200 && null !== $curl->getHeader('Cache-Control') && null !== $curl->getHeader('Expires') && null !== $curl->getHeader('Last-Modified') && null !== $curl->getHeader('Etag')) {
         $cacheDetect = true;
     }
     $cache = \Phire\Table\Modules::findBy(['name' => 'phire-cache']);
     if ($cacheDetect || isset($cache->id) && $cache->active) {
         $analysis['caching'] = true;
     }
     $dir = new Dir($_SERVER['DOCUMENT_ROOT'] . BASE_PATH, ['relative' => true, 'filesOnly' => true]);
     $googleFileDetect = false;
     foreach ($dir->getFiles() as $file) {
         if (substr($file, 0, 6) == 'google' && strpos(file_get_contents($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . '/' . $file), 'google-site-verification') !== false) {
             $googleFileDetect = true;
         }
     }
     $googleMetaDetect = false;
     if (isset($cfg['meta'])) {
         foreach ($cfg['meta'] as $meta) {
             if ($meta['name'] == 'google-site-verification') {
                 $googleMetaDetect = true;
             }
         }
     }
     if ($googleFileDetect || $googleMetaDetect) {
         $analysis['site-verify'] = true;
     } else {
         if (function_exists('dns_get_record') && $_SERVER['HTTP_HOST'] != 'localhost') {
             $dns = dns_get_record($_SERVER['HTTP_HOST'], DNS_TXT);
             if (count($dns) > 0) {
                 foreach ($dns as $record) {
                     if (isset($record['txt']) && strpos($record['txt'], 'google-site-verification') !== false) {
                         $analysis['site-verify'] = true;
                     }
                 }
             }
         }
     }
     $fields = ['seo_title' => '', 'description' => '', 'keywords' => ''];
     $seoTitle = \Phire\Fields\Table\Fields::findBy(['name' => 'seo_title']);
     $description = \Phire\Fields\Table\Fields::findBy(['name' => 'description']);
     $keywords = \Phire\Fields\Table\Fields::findBy(['name' => 'keywords']);
     if (isset($seoTitle->id)) {
         $fields['seo_title'] = $seoTitle->id;
     }
     if (isset($description->id)) {
         $fields['description'] = $description->id;
     }
     if (isset($keywords->id)) {
         $fields['keywords'] = $keywords->id;
     }
     $content = \Phire\Content\Table\Content::findAll();
     foreach ($content->rows() as $c) {
         if (!in_array($c->type_id, $exclude)) {
             $seoTitle = '';
             $metaDesc = '';
             $metaKeys = '';
             if ($fields['seo_title'] != '') {
                 $seoTitleField = \Phire\Fields\Table\FieldValues::findById([$fields['seo_title'], $c->id, "Phire\\Content\\Model\\Content"]);
                 if (isset($seoTitleField->field_id)) {
                     $seoTitle = json_decode($seoTitleField->value);
                 }
             }
             if ($fields['description'] != '') {
                 $descriptionField = \Phire\Fields\Table\FieldValues::findById([$fields['description'], $c->id, "Phire\\Content\\Model\\Content"]);
                 if (isset($descriptionField->field_id)) {
                     $metaDesc = json_decode($descriptionField->value);
                 }
             }
             if ($fields['keywords'] != '') {
                 $keywordsField = \Phire\Fields\Table\FieldValues::findById([$fields['keywords'], $c->id, "Phire\\Content\\Model\\Content"]);
                 if (isset($keywordsField->field_id)) {
                     $metaKeys = json_decode($keywordsField->value);
                 }
             }
             if (strlen($seoTitle) > 0 && strlen($seoTitle) <= 60 && strlen($metaDesc) > 0 && strlen($metaDesc) <= 160 && strlen($metaKeys) > 0 && strlen($metaKeys) <= 255) {
                 $analysis['content']['good'][$c->id] = ['title' => $c->title, 'uri' => $c->uri];
             } else {
                 $analysis['content']['bad'][$c->id] = ['title' => $c->title, 'type_id' => $c->type_id, 'uri' => $c->uri, 'issues' => []];
                 if (strlen($seoTitle) == 0) {
                     $analysis['content']['bad'][$c->id]['issues'][] = 'No SEO Title';
                 } else {
                     if (strlen($seoTitle) > 60) {
                         $analysis['content']['bad'][$c->id]['issues'][] = 'SEO Title is too long';
                     }
                 }
                 if (strlen($metaDesc) == 0) {
                     $analysis['content']['bad'][$c->id]['issues'][] = 'No description meta tag';
                 } else {
                     if (strlen($metaDesc) > 160) {
                         $analysis['content']['bad'][$c->id]['issues'][] = 'Description meta tag is too long';
                     }
                 }
                 if (strlen($metaKeys) == 0) {
                     $analysis['content']['bad'][$c->id]['issues'][] = 'No keywords meta tag';
                 } else {
                     if (strlen($metaKeys) > 255) {
                         $analysis['content']['bad'][$c->id]['issues'][] = 'Keywords meta tag is too long';
                     }
                 }
             }
         }
     }
     $config = Table\Config::findById('seo_analysis');
     $config->value = serialize($analysis);
     $config->save();
 }
 /**
  * Get module id
  *
  * @return int
  */
 protected function getModuleId()
 {
     $modules = Table\Modules::findAll()->rows();
     $module = new Model\Module();
     $new = $module->detectNew();
     $moduleIds = [];
     if ($new > 0) {
         $this->console->append('[' . $new . ' New Module' . ($new > 1 ? 's' : '') . ' Detected]' . PHP_EOL);
     }
     $this->console->append("ID  \tActive\t\tModule");
     $this->console->append("----\t------\t\t------");
     foreach ($modules as $module) {
         $moduleIds[] = $module->id;
         $this->console->append($module->id . "\t" . ($module->active ? 'Yes' : 'No') . "\t\t" . $module->folder);
     }
     $this->console->append();
     $this->console->send();
     $moduleId = null;
     while (!is_numeric($moduleId) || !in_array($moduleId, $moduleIds)) {
         $moduleId = $this->console->prompt($this->console->getIndent() . 'Select Module ID: ');
     }
     return $moduleId;
 }