Spaces:
Sleeping
Sleeping
processmaker-community / processmaker-files /workflow /engine /methods /enterprise /addonsStoreAction.php
| use ProcessMaker\Core\System; | |
| use ProcessMaker\Plugins\PluginRegistry; | |
| function runBgProcessmaker($task, $log) | |
| { | |
| require_once (PATH_CORE . "bin/tasks/cliAddons.php"); | |
| $task = str_replace("\"", null, $task); | |
| $data = explode(" ", $task); | |
| $elem = array_shift($data); //delete first element | |
| run_addon_core_install($data); | |
| } | |
| try { | |
| if (isset($_REQUEST["action"])) { | |
| $action = $_REQUEST["action"]; | |
| } else { | |
| throw (new Exception("Action undefined")); | |
| } | |
| if (isset($_REQUEST['addon']) && isset($_REQUEST['store'])) { | |
| require_once (PATH_CORE . 'classes/model/AddonsManagerPeer.php'); | |
| $addon = AddonsManagerPeer::retrieveByPK($_REQUEST['addon'], $_REQUEST['store']); | |
| $addonId = $_REQUEST['addon']; | |
| $storeId = $_REQUEST['store']; | |
| if ($addon === null) { | |
| throw (new Exception("Unable to find addon (id: '{$_REQUEST['addon']}', store: '{$_REQUEST['store']}')")); | |
| } | |
| } else { | |
| $addon = null; | |
| } | |
| $result = array(); | |
| switch (strtolower($action)) { | |
| case "importlicense": | |
| if (sizeof($_FILES) > 0) { | |
| $aInfoLoadFile = $_FILES["upLicense"]; | |
| $aExtentionFile = explode(".", $aInfoLoadFile["name"]); | |
| //validating the extention before to upload it | |
| if (trim($aExtentionFile[sizeof($aExtentionFile) - 1]) != "dat") { | |
| //G::SendTemporalMessage("ID_ISNT_LICENSE", "tmp-info", "labels"); | |
| $result["errors"] = "Filename does not end with .dat"; | |
| $result["success"] = false; | |
| } else { | |
| $dir = PATH_DATA_SITE; | |
| G::uploadFile($aInfoLoadFile["tmp_name"], $dir, $aInfoLoadFile["name"]); | |
| //reading the file that was uploaded | |
| $oPmLicenseManager = &PmLicenseManager::getSingleton(); | |
| $response = $oPmLicenseManager->installLicense($dir . $aInfoLoadFile["name"]); | |
| /////// | |
| //This command also find the following file "AddonsStore.php" | |
| $licenseManager = &PmLicenseManager::getSingleton(); | |
| preg_match("/^license_(.*).dat$/", $licenseManager->file, $matches); | |
| $realId = urlencode($matches[1]); | |
| $workspace = (isset($licenseManager->workspace)) ? $licenseManager->workspace : 'pmLicenseSrv'; | |
| $addonLocation = "http://{$licenseManager->server}/sys".$workspace."/en/green/services/addonsStore?action=getInfo&licId=$realId"; | |
| /////// | |
| $cnn = Propel::getConnection("workflow"); | |
| $oCriteriaSelect = new Criteria("workflow"); | |
| $oCriteriaSelect->add(AddonsStorePeer::STORE_ID, $licenseManager->id); | |
| $oCriteriaUpdate = new Criteria("workflow"); | |
| $oCriteriaUpdate->add(AddonsStorePeer::STORE_ID, $licenseManager->id); | |
| $oCriteriaUpdate->add(AddonsStorePeer::STORE_LOCATION, $addonLocation); | |
| BasePeer::doUpdate($oCriteriaSelect, $oCriteriaUpdate, $cnn); | |
| //are all the plugins that are enabled in the workspace | |
| $pluginRegistry = PluginRegistry::loadSingleton(); | |
| /** @var \ProcessMaker\Plugins\Interfaces\PluginDetail $plugin */ | |
| foreach ($pluginRegistry->getAllPluginsDetails() as $plugin) { | |
| if ($plugin->isEnabled() && !in_array($plugin->getNamespace(), $licenseManager->features)) { | |
| $pluginRegistry->disablePlugin($plugin->getNamespace()); | |
| // In order to keep the custom plugins state, it is required to set the attribute before saving the info | |
| $plugin->setEnabled(true); | |
| $pluginRegistry->savePlugin($plugin->getNamespace()); | |
| } | |
| } | |
| } | |
| } | |
| break; | |
| case "cancel": | |
| if ($addon === null) { | |
| throw new Exception("No addon specified to $action"); | |
| } | |
| if ($addon->getAddonState() == "download") { | |
| $addon->setState("cancel"); | |
| } | |
| break; | |
| case "uninstall": | |
| $status = 1; | |
| try { | |
| if ($addon === null) { | |
| throw new Exception("No addon specified to $action"); | |
| } | |
| $r = $addon->uninstall(); | |
| $result["status"] = "OK"; | |
| } catch (Exception $e) { | |
| $result["message"] = $e->getMessage(); | |
| $status = 0; | |
| } | |
| if ($status == 0) { | |
| $result["status"] = "ERROR"; | |
| } | |
| break; | |
| case "finish": | |
| if ($addon === null) { | |
| throw new Exception("No addon specified to $action"); | |
| } | |
| $addon->setState(); | |
| break; | |
| case "disable": | |
| case "enable": | |
| if ($addon === null) { | |
| throw new Exception("No addon specified to $action"); | |
| } | |
| $result["success"] = $addon->setEnabled(($action == "enable")); | |
| if ($action == "enable") { | |
| G::auditLog("EnablePlugin", "Plugin Name: ".$_REQUEST['addon']); | |
| } else { | |
| G::auditLog("DisablePlugin", "Plugin Name: ".$_REQUEST['addon']); | |
| } | |
| break; | |
| case "install": | |
| $status = 1; | |
| try { | |
| if (EnterpriseUtils::getInternetConnection() == 0) { | |
| throw (new Exception("Enterprise Plugins Manager no connected to internet.")); | |
| } | |
| /////// | |
| $aux = explode("?", $addon->getAddonDownloadUrl()); | |
| $url = $aux[0]; | |
| if (EnterpriseUtils::checkConnectivity($url) == false) { | |
| throw (new Exception("Server $url not available.")); | |
| } | |
| if ($addon === null) { | |
| throw new Exception("No addon specified to $action"); | |
| } | |
| /////// | |
| $workspace = config("system.workspace"); | |
| $dbAdapter = DB_ADAPTER; | |
| $addon->setAddonState("download-start"); | |
| $addon->save(); | |
| $log = $addon->getDownloadDirectory() . "/download"; | |
| runBgProcessmaker("addon-install \"$workspace\" \"$storeId\" \"$addonId\" \"$dbAdapter\"", $log); | |
| //Check if the background process started successfully. | |
| $failed = false; | |
| $max_retries = 15; | |
| $retries = 0; | |
| while (true) { | |
| sleep(1); | |
| $addon->refresh(); | |
| if ($addon->getAddonState() != "download-start") { | |
| break; | |
| } | |
| $retries += 1; | |
| if ($retries > $max_retries) { | |
| $failed = true; | |
| break; | |
| } | |
| } | |
| $result["status"] = "OK"; | |
| } catch (Exception $e) { | |
| $result["message"] = $e->getMessage(); | |
| $status = 0; | |
| } | |
| if ($status == 0) { | |
| $result["status"] = "ERROR"; | |
| } | |
| break; | |
| case "available": | |
| $addonId = $_POST["addonId"]; | |
| $response = array(); | |
| $status = 1; | |
| try { | |
| if (EnterpriseUtils::getInternetConnection() == 0) { | |
| throw (new Exception("Enterprise Plugins Manager no connected to internet.")); | |
| } | |
| /////// | |
| $licenseManager = &PmLicenseManager::getSingleton(); | |
| $server = $licenseManager->server; | |
| $workspace = (isset($licenseManager->workspace)) ? $licenseManager->workspace : 'pmLicenseSrv'; | |
| $url = "http://$server/sys".$workspace."/en/green/services/rest"; | |
| if (EnterpriseUtils::checkConnectivity($url) == false) { | |
| throw (new Exception("Server \"$server\" not available.")); | |
| } | |
| /////// | |
| $boundary = "---------------------" . substr(G::encryptOld(rand(0, 32000)), 0, 10); | |
| $data = null; | |
| $data = $data . "--$boundary\n"; | |
| $data = $data . "Content-Disposition: form-data; name=\"action\"\n\n" . "requestToSales" . "\n"; | |
| $data = $data . "--$boundary\n"; | |
| $data = $data . "Content-Disposition: form-data; name=\"OBJ_NAME\"\n\n" . $addonId . "\n"; | |
| $data = $data . "--$boundary\n"; | |
| /////// | |
| //$licenseManager = &pmLicenseManager::getSingleton(); | |
| $activeLicense = $licenseManager->getActiveLicense(); | |
| $data = $data . "Content-Disposition: form-data; name=\"licenseFile\"; filename=\"" . $licenseManager->file . "\"\n"; | |
| $data = $data . "Content-Type: text/plain\n"; | |
| $data = $data . "Content-Transfer-Encoding: binary\n\n"; | |
| $data = $data . file_get_contents($activeLicense["LICENSE_PATH"]) . "\n"; | |
| $data = $data . "--$boundary\n"; | |
| /////// | |
| $option = array( | |
| "http" => array( | |
| "method" => "POST", | |
| "header" => "Content-Type: multipart/form-data; boundary=" . $boundary, | |
| "content" => $data | |
| ) | |
| ); | |
| // Proxy settings | |
| $sysConf = System::getSystemConfiguration(); | |
| if ($sysConf['proxy_host'] != '') { | |
| if (!is_array($option['http'])) { | |
| $option['http'] = array(); | |
| } | |
| $option['http']['request_fulluri'] = true; | |
| $option['http']['proxy'] = 'tcp://' . $sysConf['proxy_host'] . ($sysConf['proxy_port'] != '' ? ':' . $sysConf['proxy_port'] : ''); | |
| if ($sysConf['proxy_user'] != '') { | |
| if (!isset($option['http']['header'])) { | |
| $option['http']['header'] = ''; | |
| } | |
| $option['http']['header'] .= 'Proxy-Authorization: Basic ' . base64_encode($sysConf['proxy_user'] . ($sysConf['proxy_pass'] != '' ? ':' . $sysConf['proxy_pass'] : '')); | |
| } | |
| } | |
| $context = stream_context_create($option); | |
| /////// | |
| $fileData = file_get_contents($url, false, $context); | |
| ////////// | |
| $r = G::json_decode($fileData); | |
| if ($r->status == "OK") { | |
| $response["status"] = $r->status; //OK | |
| } else { | |
| throw (new Exception($r->message)); | |
| } | |
| } catch (Exception $e) { | |
| $response["message"] = $e->getMessage(); | |
| $status = 0; | |
| } | |
| if ($status == 0) { | |
| $response["status"] = "ERROR"; | |
| } | |
| echo G::json_encode($response); | |
| exit(0); | |
| break; | |
| case "addonslist": | |
| $type = (isset($_REQUEST['type'])) ? $_REQUEST['type']: 'plugin'; | |
| $result = AddonsStore::addonList($type); | |
| break; | |
| break; | |
| default: | |
| throw (new Exception("Action \"$action\" is not valid")); | |
| } | |
| if (!isset($result["success"])) { | |
| $result["success"] = true; | |
| } | |
| if (isset($result["addons"])) { | |
| $result["addons"] = array_values($result["addons"]); | |
| } else { | |
| $result["addons"] = array(); | |
| } | |
| G::outRes( G::json_encode($result) ); | |
| } catch (Exception $e) { | |
| $token = strtotime("now"); | |
| PMException::registerErrorLog($e, $token); | |
| G::outRes( | |
| G::json_encode(array( | |
| "success" => false, | |
| "errors" => G::LoadTranslation("ID_EXCEPTION_LOG_INTERFAZ", array($token)) | |
| )) | |
| ); | |
| } | |