diff --git a/gulliver/bin/gulliver.php b/gulliver/bin/gulliver.php index b251c4555..6f06dadc2 100644 --- a/gulliver/bin/gulliver.php +++ b/gulliver/bin/gulliver.php @@ -1,6 +1,12 @@ make(Kernel::class)->bootstrap(); + +error_reporting(error_reporting() & ~E_DEPRECATED & ~E_STRICT); if (!PATH_THIRDPARTY) { die("You must launch gulliver command line with the gulliver script\n"); diff --git a/gulliver/bin/tasks/pakeGulliver.php b/gulliver/bin/tasks/pakeGulliver.php index 9c885069c..f624f959e 100644 --- a/gulliver/bin/tasks/pakeGulliver.php +++ b/gulliver/bin/tasks/pakeGulliver.php @@ -491,52 +491,57 @@ function addTarFolder($tar, $pathBase, $pluginHome) { } } -function run_pack_plugin($task, $args) { - ini_set('display_errors', 'on'); - ini_set('error_reporting', E_ERROR); +function run_pack_plugin($task, $args) +{ + ini_set('display_errors', 'on'); + ini_set('error_reporting', E_ERROR); - // the environment for poedit always is Development - define('G_ENVIRONMENT', G_DEV_ENV); + // the environment for poedit always is Development + define('G_ENVIRONMENT', G_DEV_ENV); - //the plugin name in the first argument - if( ! isset($args[0]) ) { - printf("Error: %s\n", pakeColor::colorize('you must specify a valid name for the plugin', 'ERROR')); - exit(0); - } - $pluginName = $args[0]; + //the plugin name in the first argument + if (!isset($args[0])) { + printf("Error: %s\n", pakeColor::colorize('you must specify a valid name for the plugin', 'ERROR')); + exit(0); + } + $pluginName = $args[0]; - $pluginDirectory = PATH_PLUGINS . $pluginName; - $pluginOutDirectory = PATH_OUTTRUNK . 'plugins' . PATH_SEP . $pluginName; - $pluginHome = PATH_OUTTRUNK . 'plugins' . PATH_SEP . $pluginName; + $pluginHome = PATH_OUTTRUNK . 'plugins' . PATH_SEP . $pluginName; - //verify if plugin exists, - $pluginClassFilename = PATH_PLUGINS . $pluginName . PATH_SEP . 'class.' . $pluginName . '.php'; - $pluginFilename = PATH_PLUGINS . $pluginName . '.php'; - if( ! is_file($pluginClassFilename) ) { - printf("The plugin %s does not exist in this file %s \n", pakeColor::colorize($pluginName, 'ERROR'), pakeColor::colorize($pluginClassFilename, 'INFO')); - die(); - } + //verify if plugin exists, + $pluginClassFilename = PATH_PLUGINS . $pluginName . PATH_SEP . 'class.' . $pluginName . '.php'; + $pluginFilename = PATH_PLUGINS . $pluginName . '.php'; + if (!is_file($pluginClassFilename)) { + printf("The plugin %s does not exist in this file %s \n", pakeColor::colorize($pluginName, 'ERROR'), pakeColor::colorize($pluginClassFilename, 'INFO')); + die(); + } - require_once ($pluginFilename); + if (!file_exists($pluginFilename)) { + printf("Error: %s\n", pakeColor::colorize('you must specify a valid name for the plugin', 'ERROR')); + exit(0); + } - $oPluginRegistry = PluginRegistry::loadSingleton(); - $pluginDetail = $oPluginRegistry->getPluginDetails($pluginName . '.php'); - $fileTar = $pluginHome . PATH_SEP . $pluginName . '-' . $pluginDetail->iVersion . '.tar'; + if (preg_match_all('/->iVersion(.*)=(.*);/i', file_get_contents($pluginFilename), $result)) { + $version = trim($result[2][0], ' "'); + } else { + $version = 1; + } + $fileTar = $pluginHome . PATH_SEP . $pluginName . '-' . $version . '.tar'; - $tar = new Archive_Tar($fileTar); - $tar->_compress = false; + $tar = new Archive_Tar($fileTar); + $tar->_compress = false; - $pathBase = $pluginHome . PATH_SEP . $pluginName . PATH_SEP; - $tar->createModify($pluginHome . PATH_SEP . $pluginName . '.php', '', $pluginHome); - addTarFolder($tar, $pathBase, $pluginHome); - $aFiles = $tar->listContent(); + $pathBase = $pluginHome . PATH_SEP . $pluginName . PATH_SEP; + $tar->createModify($pluginHome . PATH_SEP . $pluginName . '.php', '', $pluginHome); + addTarFolder($tar, $pathBase, $pluginHome); + $aFiles = $tar->listContent(); - foreach( $aFiles as $key => $val ) { - printf(" %6d %s \n", $val['size'], pakeColor::colorize($val['filename'], 'INFO')); - } - printf("File created in %s \n", pakeColor::colorize($fileTar, 'INFO')); - $filesize = sprintf("%5.2f", filesize($fileTar) / 1024); - printf("Filesize %s Kb \n", pakeColor::colorize($filesize, 'INFO')); + foreach ($aFiles as $key => $val) { + printf(" %6d %s \n", $val['size'], pakeColor::colorize($val['filename'], 'INFO')); + } + printf("File created in %s \n", pakeColor::colorize($fileTar, 'INFO')); + $filesize = sprintf("%5.2f", filesize($fileTar) / 1024); + printf("Filesize %s Kb \n", pakeColor::colorize($filesize, 'INFO')); } function run_new_plugin($task, $args) { @@ -2218,23 +2223,24 @@ function run_check_standard_code ( $task, $options) { function run_update_plugin_attributes($task, $args) { try { - //Verify data if (!isset($args[0])) { throw new Exception("Error: You must specify the name of a plugin"); } - //Set variables $pluginName = $args[0]; - - //Update plugin attributes - $pmPluginRegistry = PluginRegistry::loadSingleton(); - - $pmPluginRegistry->updatePluginAttributesInAllWorkspaces($pluginName); + // virtual SYS_SYS for cache + define('SYS_SYS', uniqid()); + foreach (PmSystem::listWorkspaces() as $value) { + \ProcessMaker\Util\Cnn::connect($value->name); + //Update plugin attributes + $pmPluginRegistry = PluginRegistry::newInstance(); + $pmPluginRegistry->updatePluginAttributesInAllWorkspaces($value->name, $pluginName); + } echo "Done!\n"; } catch (Exception $e) { - error_log( $e->getMessage() . "\n" ); + error_log($e->getMessage() . "\n"); } } @@ -2242,7 +2248,7 @@ function run_check_plugin_disabled_code($task, $args) { try { //Set variables - $option = (isset($args[0]))? trim($args[0]) : ""; + $option = (isset($args[0])) ? trim($args[0]) : ""; $option2 = strtoupper($option); switch ($option2) { @@ -2268,10 +2274,10 @@ function run_check_plugin_disabled_code($task, $args) if (is_file(PATH_PLUGINS . $pluginName . ".php") && is_dir(PATH_PLUGINS . $pluginName)) { if (preg_match( - '/^.*class\s+' . $pluginName . 'Plugin\s+extends\s+(\w*)\s*\{.*$/i', - str_replace(["\n", "\r", "\t"], ' ', file_get_contents(PATH_PLUGINS . $pluginName . '.php')), - $arrayMatch - ) + '/^.*class\s+' . $pluginName . 'Plugin\s+extends\s+(\w*)\s*\{.*$/i', + str_replace(["\n", "\r", "\t"], ' ', file_get_contents(PATH_PLUGINS . $pluginName . '.php')), + $arrayMatch + ) ) { $pluginParentClassName = $arrayMatch[1]; @@ -2320,13 +2326,13 @@ function run_check_plugin_disabled_code($task, $args) $arrayFoundDisabledCode = array_merge($cs->checkDisabledCode("FILE", PATH_PLUGINS . $pluginName . ".php"), $cs->checkDisabledCode("PATH", PATH_PLUGINS . $pluginName)); if (!empty($arrayFoundDisabledCode)) { - $strFoundDisabledCode .= (($strFoundDisabledCode != "")? "\n\n" : "") . "> " . $pluginName; + $strFoundDisabledCode .= (($strFoundDisabledCode != "") ? "\n\n" : "") . "> " . $pluginName; foreach ($arrayFoundDisabledCode as $key2 => $value2) { $strCodeAndLine = ""; foreach ($value2 as $key3 => $value3) { - $strCodeAndLine .= (($strCodeAndLine != "")? ", " : "") . $key3 . " (Lines " . implode(", ", $value3) . ")"; + $strCodeAndLine .= (($strCodeAndLine != "") ? ", " : "") . $key3 . " (Lines " . implode(", ", $value3) . ")"; } $strFoundDisabledCode .= "\n- " . str_replace(PATH_PLUGINS, "", $key2) . ": " . $strCodeAndLine; @@ -2345,7 +2351,7 @@ function run_check_plugin_disabled_code($task, $args) echo "Done!\n"; } catch (Exception $e) { - error_log( $e->getMessage() . "\n" ); + error_log($e->getMessage() . "\n"); } } diff --git a/thirdparty/pear/Archive/Tar.php b/thirdparty/pear/Archive/Tar.php index 8197d94aa..2dd69cf98 100644 --- a/thirdparty/pear/Archive/Tar.php +++ b/thirdparty/pear/Archive/Tar.php @@ -39,8 +39,6 @@ * @link http://pear.php.net/package/Archive_Tar */ -require_once 'PEAR.php'; - define('ARCHIVE_TAR_ATT_SEPARATOR', 90001); define('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); diff --git a/workflow/engine/src/ProcessMaker/Plugins/PluginRegistry.php b/workflow/engine/src/ProcessMaker/Plugins/PluginRegistry.php index 9d1891927..39f924f2f 100644 --- a/workflow/engine/src/ProcessMaker/Plugins/PluginRegistry.php +++ b/workflow/engine/src/ProcessMaker/Plugins/PluginRegistry.php @@ -129,6 +129,21 @@ class PluginRegistry $this->_aPluginDetails[$Namespace] = $detail; } + /** + * Unregister the plugin in the class + * @param string $namespace Name Plugin + * @return PluginDetail + */ + public function unregisterPlugin($namespace) + { + $detail = null; + if (isset($this->_aPluginDetails[$namespace])) { + $detail = $this->_aPluginDetails[$namespace]; + unset($this->_aPluginDetails[$namespace]); + } + return $detail; + } + /** * Get setup Plugins * @return int @@ -1371,85 +1386,32 @@ class PluginRegistry /** * Update the plugin attributes in all workspaces - * @param string $Namespace Name of Plugin + * @param string $workspace Name workspace + * @param string $namespace Name of Plugin * @throws Exception */ - public function updatePluginAttributesInAllWorkspaces($Namespace) + public function updatePluginAttributesInAllWorkspaces($workspace, $namespace) { try { - G::LoadClass("wsTools"); - //Set variables - $pluginFileName = $Namespace . ".php"; + $pluginFileName = $namespace . ".php"; //Verify data if (!file_exists(PATH_PLUGINS . $pluginFileName)) { throw new Exception("Error: The plugin not exists"); } - //Update plugin attributes + //remove old data plugin + $pmPluginRegistry = PluginRegistry::loadSingleton(); + $pluginDetails = $pmPluginRegistry->unregisterPlugin($namespace); + + //Load plugin attributes require_once(PATH_PLUGINS . $pluginFileName); - $pmPluginRegistry = PluginRegistry::loadSingleton(); - - $pluginDetails = $pmPluginRegistry->getPluginDetails($pluginFileName); - - if (is_array($pluginDetails->getWorkspaces()) && - count($pluginDetails->getWorkspaces()) > 0 - ) { - $arrayWorkspace = array(); - - foreach (PmSystem::listWorkspaces() as $value) { - $workspaceTools = $value; - - $arrayWorkspace[] = $workspaceTools->name; - } - //Workspaces to update - $arrayWorkspaceAux = array_diff($arrayWorkspace, $pluginDetails->getWorkspaces()); - $strWorkspaceNoWritable = ""; - - $arrayWorkspace = array(); - - foreach ($arrayWorkspaceAux as $value) { - $workspace = $value; - - $workspacePathDataSite = PATH_DATA . "sites" . PATH_SEP . $workspace . PATH_SEP; - - if (file_exists($workspacePathDataSite . "plugin.singleton")) { - $pmPluginRegistry = PluginRegistry::loadSingleton(); - - if (isset($pmPluginRegistry->_aPluginDetails[$Namespace])) { - if (!is_writable($workspacePathDataSite . "plugin.singleton")) { - $strWorkspaceNoWritable .= (($strWorkspaceNoWritable != "") ? ", " : "") . $workspace; - } - - $arrayWorkspace[] = $workspace; - } - } - } - - //Verify data - if ($strWorkspaceNoWritable != "") { - throw new Exception( - 'Error: The workspaces ' . - $strWorkspaceNoWritable . - ' has problems of permissions of write in file "plugin.singleton", solve this problem' - ); - } - - //Update plugin attributes - foreach ($arrayWorkspace as $value) { - $workspace = $value; - - $workspacePathDataSite = PATH_DATA . "sites" . PATH_SEP . $workspace . PATH_SEP; - - $pmPluginRegistry = PluginRegistry::loadSingleton(); - - $pmPluginRegistry->disablePlugin($Namespace); - - $pmPluginRegistry->savePlugin($Namespace); - } + if (is_array($pluginDetails->getWorkspaces()) && !in_array($workspace, $pluginDetails->getWorkspaces())) { + $pmPluginRegistry->disablePlugin($namespace); } + $pmPluginRegistry->savePlugin($namespace); } catch (Exception $e) { throw $e; } diff --git a/workflow/engine/src/ProcessMaker/Util/Cnn.php b/workflow/engine/src/ProcessMaker/Util/Cnn.php new file mode 100644 index 000000000..ca08710b9 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Util/Cnn.php @@ -0,0 +1,122 @@ +workspace = $workspace; + Propel::initConfiguration($cnn->buildParams()); + } + + /** + * Loads the parameters required to connect to each workspace database + * @return array + */ + public function buildParams() + { + if ($this->readFileDBWorkspace()) { + return $this->prepareDataSources(); + } + return []; + } + + /** + * Reads the workspace db.php file + * @return bool + */ + private function readFileDBWorkspace() + { + if (file_exists(PATH_DB . $this->workspace . PATH_SEP . 'db.php')) { + $this->dbFile = file_get_contents(PATH_DB . $this->workspace . PATH_SEP . 'db.php'); + return true; + } + return false; + } + + /** + * Prepares data resources + * @return array + */ + private function prepareDataSources() + { + $phpCode = preg_replace( + '/define\s*\(\s*[\x22\x27](.*)[\x22\x27]\s*,\s*(\x22.*\x22|\x27.*\x27)\s*\)\s*;/i', + '$$1 = $2;', + $this->dbFile + ); + $phpCode = str_replace([''], '', $phpCode); + + eval($phpCode); + + $dataSources = []; + $dataSources['datasources'] = array( + 'workflow' => array( + 'connection' => $this->buildDsnString( + $DB_ADAPTER, + $DB_HOST, + $DB_NAME, + $DB_USER, + urlencode($DB_PASS) + ), + 'adapter' => "mysql" + ), + 'rbac' => array( + 'connection' => $this->buildDsnString( + $DB_ADAPTER, + $DB_RBAC_HOST, + $DB_RBAC_NAME, + $DB_RBAC_USER, + urlencode($DB_RBAC_PASS) + ), + 'adapter' => "mysql" + ), + 'report' => array( + 'connection' => $this->buildDsnString( + $DB_ADAPTER, + $DB_REPORT_HOST, + $DB_REPORT_NAME, + $DB_REPORT_USER, + urlencode($DB_REPORT_PASS) + ), + 'adapter' => "mysql" + ) + ); + return $dataSources; + } + + /** + * Builds the DSN string to be used by PROPEL + * @param string $adapter + * @param string $host + * @param string $name + * @param string $user + * @param string $pass + * @return string + */ + private function buildDsnString($adapter, $host, $name, $user, $pass) + { + $dns = $adapter . "://" . $user . ":" . $pass . "@" . $host . "/" . $name; + switch ($adapter) { + case 'mysql': + $dns .= '?encoding=utf8'; + break; + } + return $dns; + } +}