function handleRequest(DevblocksHttpRequest $request) { @set_time_limit(0); // no timelimit (when possible) DevblocksPlatform::clearCache(); $stack = $request->path; array_shift($stack); // update switch (array_shift($stack)) { case 'locked': if (!DevblocksPlatform::versionConsistencyCheck()) { $url = DevblocksPlatform::getUrlService(); echo "<h1>PortSensor Portal</h1>"; echo "The application is currently waiting for an administrator to finish upgrading. " . "Please wait a few minutes and then " . sprintf("<a href='%s'>try again</a>.<br><br>", $url->write('c=update&a=locked')); echo sprintf("If you're an admin you may <a href='%s'>finish the upgrade</a>.", $url->write('c=update')); } else { DevblocksPlatform::redirect(new DevblocksHttpResponse(array('home'))); } break; default: $path = DEVBLOCKS_PATH . 'tmp' . DIRECTORY_SEPARATOR; $file = $path . 'psupdate_lock'; if (!file_exists($file) || @filectime($file) + 600 < time()) { // 10 min lock touch($file); // $settings = CerberusSettings::getInstance(); // $authorized_ips_str = $settings->get(CerberusSettings::AUTHORIZED_IPS); // $authorized_ips = CerberusApplication::parseCrlfString($authorized_ips_str); // // $authorized_ip_defaults = CerberusApplication::parseCsvString(AUTHORIZED_IPS_DEFAULTS); // $authorized_ips = array_merge($authorized_ips, $authorized_ip_defaults); // // $pass = false; // foreach ($authorized_ips as $ip) // { // if(substr($ip,0,strlen($ip)) == substr($_SERVER['REMOTE_ADDR'],0,strlen($ip))) // { $pass=true; break; } // } $pass = true; if (!$pass) { echo 'Your IP address (' . $_SERVER['REMOTE_ADDR'] . ') is not authorized to update this helpdesk.'; return; } //echo "Running plugin patches...<br>"; if (DevblocksPlatform::runPluginPatches()) { @unlink($file); DevblocksPlatform::redirect(new DevblocksHttpResponse(array('home'))); } else { @unlink($file); echo "Failure!"; // [TODO] Needs elaboration } break; } else { echo "Another administrator is currently running update. Please wait..."; } } exit; }
function savePluginsAction() { $translate = DevblocksPlatform::getTranslationService(); $worker = CerberusApplication::getActiveWorker(); if (!$worker || !$worker->is_superuser) { echo $translate->_('common.access_denied'); return; } if (DEMO_MODE) { DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config', 'plugins'))); return; } @($plugins_enabled = DevblocksPlatform::importGPC($_REQUEST['plugins_enabled'], 'array')); $pluginStack = DevblocksPlatform::getPluginRegistry(); if (is_array($plugins_enabled)) { foreach ($plugins_enabled as $plugin_id) { $plugin = $pluginStack[$plugin_id]; $plugin->setEnabled(true); unset($pluginStack[$plugin_id]); } } // [JAS]: Clear unchecked plugins foreach ($pluginStack as $plugin) { // [JAS]: We can't force disable core here [TODO] Improve if ($plugin->id == 'cerberusweb.core') { continue; } $plugin->setEnabled(false); } DevblocksPlatform::clearCache(); // Run any enabled plugin patches // [TODO] Should the platform do this automatically on enable in order? $patchMgr = DevblocksPlatform::getPatchService(); $patches = DevblocksPlatform::getExtensions("devblocks.patch.container", false, true); if (is_array($patches)) { foreach ($patches as $patch_manifest) { /* @var $patch_manifest DevblocksExtensionManifest */ $container = $patch_manifest->createInstance(); /* @var $container DevblocksPatchContainerExtension */ $patchMgr->registerPatchContainer($container); } } if (!$patchMgr->run()) { // fail die("Failed updating plugins."); // [TODO] Make this more graceful } // Reload plugin translations DAO_Translation::reloadPluginStrings(); DevblocksPlatform::redirect(new DevblocksHttpResponse(array('config', 'plugins'))); }
function saveTabPluginsAction() { $translate = DevblocksPlatform::getTranslationService(); $worker = FegApplication::getActiveWorker(); if (!$worker || !$worker->is_superuser) { echo $translate->_('common.access_denied'); return; } $pluginStack = DevblocksPlatform::getPluginRegistry(); @($plugins_enabled = DevblocksPlatform::importGPC($_REQUEST['plugins_enabled'])); if (is_array($pluginStack)) { foreach ($pluginStack as $plugin) { /* @var $plugin DevblocksPluginManifest */ switch ($plugin->id) { case 'devblocks.core': case 'feg.core': case 'feg.auditlog': $plugin->setEnabled(true); break; default: if (null !== $plugins_enabled && false !== array_search($plugin->id, $plugins_enabled)) { $plugin->setEnabled(true); } else { $plugin->setEnabled(false); } break; } } } try { FegApplication::update(); } catch (Exception $e) { // [TODO] ... } DevblocksPlatform::clearCache(); // Reload plugin translations DAO_Translation::reloadPluginStrings(); DevblocksPlatform::redirect(new DevblocksHttpResponse(array('setup', 'plugins'))); }
/** * Reads and caches manifests from the plugin directory. * * @static * @return DevblocksPluginManifest[] */ static function readPlugins() { $dir = DEVBLOCKS_PLUGIN_PATH; $plugins = array(); if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if ($file == "." || $file == ".." || 0 == strcasecmp($file, "CVS")) { continue; } $path = $dir . '/' . $file; if (is_dir($path) && file_exists($path . '/plugin.xml')) { $manifest = self::_readPluginManifest($file); /* @var $manifest DevblocksPluginManifest */ if (null != $manifest) { $plugins[] = $manifest; } /* * [TODO] Somehow here we need to cache the classes from the plugin so * we don't have to load up the file unless we need it. * * The main place this happens is when some class from a plugin gets * persisted in the session. */ // $instance = $manifest->createInstance(); // $instance->load($manifest); } } closedir($dh); } } // [TODO] Instance the plugins in dependency order // $plugin_instance = $manifest->createInstance(); // if(!$plugin_instance->install($manifest)) // return; DAO_Platform::cleanupPluginTables(); DevblocksPlatform::clearCache(); return $plugins; // [TODO] Move this to the DB }
private function _createTable($namespace) { $rs = mysql_query("SHOW TABLES", $this->_db); $tables = array(); while ($row = mysql_fetch_row($rs)) { $tables[$row[0]] = true; } $namespace = $this->escapeNamespace($namespace); if (isset($tables['fulltext_' . $namespace])) { return true; } $result = mysql_query(sprintf("CREATE TABLE IF NOT EXISTS fulltext_%s (\n\t\t\t\tid INT UNSIGNED NOT NULL DEFAULT 0,\n\t\t\t\tcontent LONGTEXT,\n\t\t\t\tPRIMARY KEY (id),\n\t\t\t\tFULLTEXT content (content)\n\t\t\t) ENGINE=MyISAM CHARACTER SET=utf8;", $this->escapeNamespace($namespace)), $this->_db); DevblocksPlatform::clearCache(DevblocksPlatform::CACHE_TABLES); return false !== $result ? true : false; }
$plugins = DevblocksPlatform::getPluginRegistry(); // Tailor which plugins are enabled by default if (is_array($plugins)) { foreach ($plugins as $plugin_manifest) { /* @var $plugin_manifest DevblocksPluginManifest */ switch ($plugin_manifest->id) { case "app.core": $plugin_manifest->setEnabled(true); break; default: $plugin_manifest->setEnabled(false); break; } } } DevblocksPlatform::clearCache(); // Run enabled plugin patches $patches = DevblocksPlatform::getExtensions("devblocks.patch.container"); if (is_array($patches)) { foreach ($patches as $patch_manifest) { /* @var $patch_manifest DevblocksExtensionManifest */ $container = $patch_manifest->createInstance(); /* @var $container DevblocksPatchContainerExtension */ $patchMgr->registerPatchContainer($container); } } if (!$patchMgr->run()) { // fail $tpl->assign('template', 'steps/step_init_db.tpl.php'); } else { // success
static function cleanupPluginTables() { DevblocksPlatform::clearCache(); $db = DevblocksPlatform::getDatabaseService(); $prefix = APP_DB_PREFIX != '' ? APP_DB_PREFIX . '_' : ''; // [TODO] Cleanup $sql = sprintf("SELECT id FROM %splugin ", $prefix); $rs = $db->Execute($sql) or die(__CLASS__ . '(' . __LINE__ . ')' . ':' . $db->ErrorMsg()); /* @var $rs ADORecordSet */ $plugins = DevblocksPlatform::getPluginRegistry(); // [JAS]: Remove any plugins that are no longer in the filesystem while (!$rs->EOF) { $plugin_id = $rs->fields['id']; if (!isset($plugins[$plugin_id])) { $db->Execute(sprintf("DELETE FROM %splugin WHERE id = %s", $prefix, $db->qstr($plugin_id))); $db->Execute(sprintf("DELETE FROM %sextension WHERE id = %s", $prefix, $db->qstr($plugin_id))); $db->Execute(sprintf("DELETE FROM %sproperty_store WHERE id = %s", $prefix, $db->qstr($plugin_id))); } $rs->MoveNext(); } }
static function cleanupPluginTables() { $db = DevblocksPlatform::getDatabaseService(); $prefix = APP_DB_PREFIX != '' ? APP_DB_PREFIX . '_' : ''; // [TODO] Cleanup /* * Make sure this uses the DB directly and not the registry, since * that automatically filters out bad rows and we'd never purge them. */ $sql = sprintf("SELECT p.* " . "FROM %splugin p " . "ORDER BY p.enabled DESC, p.name ASC ", $prefix); $results = $db->GetArray($sql); foreach ($results as $row) { $plugin = new DevblocksPluginManifest(); @($plugin->id = $row['id']); @($plugin->dir = $row['dir']); if (!file_exists(APP_PATH . '/' . $plugin->dir)) { $plugin->purge(); } } DevblocksPlatform::clearCache(); }
private function _createTable($namespace) { $rs = mysql_query("SHOW TABLES", $this->_db); $tables = array(); while ($row = mysql_fetch_row($rs)) { $tables[$row[0]] = true; } $namespace = $this->escapeNamespace($namespace); if (isset($tables['storage_' . $namespace])) { return true; } $result = mysql_query(sprintf("CREATE TABLE IF NOT EXISTS storage_%s (\n\t\t\t\tid INT UNSIGNED NOT NULL DEFAULT 0,\n\t\t\t\tdata BLOB,\n\t\t\t\tchunk SMALLINT UNSIGNED DEFAULT 1,\n\t\t\t\tINDEX id (id),\n\t\t\t\tINDEX chunk (chunk)\n\t\t\t) ENGINE=MyISAM;", $this->escapeNamespace($namespace)), $this->_db); DevblocksPlatform::clearCache(DevblocksPlatform::CACHE_TABLES); return false !== $result ? true : false; }
/** * Reads and caches manifests from the features + plugins directories. * * @static * @return DevblocksPluginManifest[] */ static function readPlugins() { $scan_dirs = array('features', 'storage/plugins'); $plugins = array(); if (is_array($scan_dirs)) { foreach ($scan_dirs as $scan_dir) { $scan_path = APP_PATH . '/' . $scan_dir; if (is_dir($scan_path)) { if ($dh = opendir($scan_path)) { while (($file = readdir($dh)) !== false) { if ($file == "." || $file == "..") { continue; } $plugin_path = $scan_path . '/' . $file; $rel_path = $scan_dir . '/' . $file; if (is_dir($plugin_path) && file_exists($plugin_path . '/plugin.xml')) { $manifest = self::_readPluginManifest($rel_path); /* @var $manifest DevblocksPluginManifest */ if (null != $manifest) { $plugins[] = $manifest; } } } closedir($dh); } } } } // [TODO] Instance the plugins in dependency order DAO_Platform::cleanupPluginTables(); DevblocksPlatform::clearCache(); return $plugins; }