diff --git a/workflow/engine/bin/tasks/cliAddons.php b/workflow/engine/bin/tasks/cliAddons.php new file mode 100644 index 000000000..c9abc8ffa --- /dev/null +++ b/workflow/engine/bin/tasks/cliAddons.php @@ -0,0 +1,94 @@ +unSerializeInstance(file_get_contents($sSerializedFile)); + } + /////// + //echo "** Installation starting... (workspace: $workspace, store: $storeId, id: $addonName)\n"; + $ws = new workspaceTools($workspace); + $ws->initPropel(false); + + require_once PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . 'enterprise.php'; + require_once PATH_CORE . 'classes' . PATH_SEP . 'model' . PATH_SEP . 'AddonsManagerPeer.php'; + + $addon = AddonsManagerPeer::retrieveByPK($addonName, $storeId); + if ($addon == null) { + throw new Exception("Id $addonName not found in store $storeId"); + } + //echo "Downloading...\n"; + $download = $addon->download(); + //echo "Installing...\n"; + $addon->install(); + + if ($addon->isCore()) { + $ws = new workspaceTools($workspace); + $ws->initPropel(false); + $addon->setState("install-finish"); + } else { + $addon->setState(); + } + } catch (Exception $e) { + $addon->setState("error"); + //fwrite(STDERR, "\n[ERROR: {$e->getMessage()}]\n"); + //fwrite(STDOUT, "\n[ERROR: {$e->getMessage()}]\n"); + } + //echo "** Installation finished\n"; +} + diff --git a/workflow/engine/classes/class.Upgrade.php b/workflow/engine/classes/class.Upgrade.php new file mode 100644 index 000000000..b7a06ef12 --- /dev/null +++ b/workflow/engine/classes/class.Upgrade.php @@ -0,0 +1,143 @@ +addon = $addon; + } + + public function install() + { + //echo "Starting core installation...\n"; + $start = microtime(1); + $filename = $this->addon->getDownloadFilename(); + $time = microtime(1); + G::LoadThirdParty( 'pear/Archive','Tar'); + $archive = new Archive_Tar ($filename); + //printf("Time to open archive: %f\n", microtime(1) - $time); + $time = microtime(1); + $extractDir = dirname($this->addon->getDownloadFilename()) . "/extract"; + $backupDir = dirname($this->addon->getDownloadFilename()) . "/backup"; + if (file_exists($extractDir)) { + G::rm_dir($extractDir); + } + if (file_exists($backupDir)) { + G::rm_dir($backupDir); + } + if (!is_dir($backupDir)) { + mkdir($backupDir); + } + //printf("Time to remove old directory: %f\n", microtime(1) - $time); + $time = microtime(1); + echo "Extracting files...\n"; + $archive->extractModify($extractDir, 'processmaker'); + //printf("Time to extract all files: %f\n", microtime(1) - $time); + //$time = microtime(1); + //$files = $archive->listContent(); + //printf("Time to get list of contents: %f\n", microtime(1) - $time); + /*$time = microtime(1); + foreach ($files as $fileinfo) + if (basename($fileinfo['filename']) == 'checksum.txt') { + $checksumFile = $archive->extractInString($fileinfo['filename']); + break; + } + printf("Time to get checksum.txt: %f\n", microtime(1) - $time); + */ + $checksumFile = file_get_contents("$extractDir/checksum.txt"); + $time = microtime(1); + $checksums = array(); + foreach (explode("\n", $checksumFile) as $line) { + $checksums[trim(substr($line, 33))] = substr($line, 0, 32); + } + //printf("Time to assemble list of checksums: %f\n", microtime(1) - $time); + $checksum = array(); + $changedFiles = array(); + $time = microtime(1); + $files = ls_dir($extractDir); + //printf("Time to list files: %f\n", microtime(1) - $time); + echo "Updating ProcessMaker files...\n"; + $time = microtime(1); + $checksumTime = 0; + foreach ($checksums as $filename => $checksum) { + if (is_dir("$extractDir/$filename")) { + print $filename; + continue; + } + $installedFile = PATH_TRUNK . "/$filename"; + if (!file_exists($installedFile)) { + $installedMD5 = ""; + } else { + $time = microtime(1); + $installedMD5 = md5_file($installedFile); + $checksumTime += microtime(1) - $time; + } + $archiveMD5 = $checksum; + if (strcasecmp($archiveMD5, $installedMD5) != 0) { + $changedFiles[] = $filename; + if (!is_dir(dirname("$backupDir/$filename"))) { + mkdir(dirname("$backupDir/$filename"), 0777, true); + } + if (file_exists($installedFile) && is_file($installedFile)) { + copy($installedFile, "$backupDir/$filename"); + } + if (!is_dir(dirname($installedFile))) { + mkdir(dirname($installedFile), 0777, true); + } + if (!copy("$extractDir/$filename", $installedFile)) { + throw new Exception("Could not overwrite '$filename'"); + } + } + } + //printf("Time to create all checksums: %f\n", $checksumTime); + //printf("Time to copy files: %f\n", microtime(1) - $time); + printf("Updated %d files\n", count($changedFiles)); + printf("Clearing cache...\n"); + if (defined('PATH_C')) { + G::rm_dir(PATH_C); + mkdir(PATH_C, 0777, true); + } + $workspaces = System::listWorkspaces(); + $count = count($workspaces); + $first = true; + $num = 0; + foreach ($workspaces as $index => $workspace) { + try { + $num += 1; + printf("Upgrading workspaces ($num/$count): {$workspace->name}\n"); + $workspace->upgrade($first); + $workspace->close(); + $first = false; + } catch (Exception $e) { + printf("Errors upgrading workspace {$workspace->name}: {$e->getMessage()}\n"); + //$errors = true; + } + } + //printf("Time to install: %f\n", microtime(1) - $start); + } +} + diff --git a/workflow/engine/classes/class.enterprise.php b/workflow/engine/classes/class.enterprise.php new file mode 100644 index 000000000..46e5202b8 --- /dev/null +++ b/workflow/engine/classes/class.enterprise.php @@ -0,0 +1,125 @@ +addSelectColumn(UsersPeer::USR_UID); + //FROM + //WHERE + $criteria->add(UsersPeer::USR_USERNAME, $user->lName); //$user->lPassword + $criteria->add(UsersPeer::USR_ROLE, "PROCESSMAKER_ADMIN"); + + //query + $rsSQLUSR = UsersPeer::doSelectRS($criteria); + $rsSQLUSR->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $sw = 0; + + if (UsersPeer::doCount($criteria) > 0) { + //if ($rsSQLUSR->getRecordCount() > 0) { + $sw = 1; + } + + /* + $cnn = Propel::getConnection("workflow"); + $stmt = $cnn->createStatement(); + + $sql = "SELECT USR.USR_UID + FROM USERS AS USR + WHERE USR.USR_USERNAME = '" . $user->lName . "' AND USR.USR_ROLE = 'PROCESSMAKER_ADMIN'"; + $rsSQLUSR = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); + + $sw = 0; + + if ($rsSQLUSR->getRecordCount() > 0) { + $sw = 1; + } + */ + + if ($sw == 1) { + //Upgrade available + $swUpgrade = 0; + + $addonList = AddonsStore::addonList(); + $addon = $addonList["addons"]; + + if (count($addon) > 0) { + $status = array("ready", "upgrade", "available"); + $pmVersion = EnterpriseUtils::pmVersion(PM_VERSION); + + foreach ($addon as $index => $value) { + if ($addon[$index]["id"] == "processmaker") { + if (version_compare($pmVersion . "", (EnterpriseUtils::pmVersion($addon[$index]["version"])) . "", "<")) { + $swUpgrade = 1; + break; + } + } else { + if (in_array($addon[$index]["status"], $status)) { + $swUpgrade = 1; + break; + } + } + } + } + + if ($swUpgrade == 1) { + $_SESSION["__ENTERPRISE_SYSTEM_UPDATE__"] = 1; + } + } + } + + public function enterpriseLimitCreateUser() + { + G::LoadClass('serverConfiguration'); + $oServerConf = &serverConf::getSingleton(); + $infoLicense =$oServerConf->getProperty('LICENSE_INFO'); + if (isset($infoLicense[SYS_SYS]['LIMIT_USERS'])) { + $criteria = new Criteria('workflow'); + $criteria->add(UsersPeer::USR_STATUS, 'CLOSED', Criteria::NOT_EQUAL); + $count = UsersPeer::doCount($criteria); + if ($count >= $infoLicense[SYS_SYS]['LIMIT_USERS'] ) { + throw new Exception("You can\'t add more users to the System, this reach the limit of allowed users by license that it has installed now"); + } + } + } +} + +if (!class_exists("pmLicenseManager")) { + require_once (PATH_PLUGINS . 'enterprise/class.pmLicenseManager.php'); +} + diff --git a/workflow/engine/classes/class.enterpriseUtils.php b/workflow/engine/classes/class.enterpriseUtils.php new file mode 100644 index 000000000..b8209754f --- /dev/null +++ b/workflow/engine/classes/class.enterpriseUtils.php @@ -0,0 +1,152 @@ +addSelectColumn(ConfigurationPeer::CFG_VALUE); + $criteria->add(ConfigurationPeer::CFG_UID, "EE"); + $criteria->add(ConfigurationPeer::OBJ_UID, "enterpriseConfiguration"); + $rsCriteria = ConfigurationPeer::doSelectRS($criteria); + + if ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + $data = unserialize($row[0]); + } + + return ((isset($data["internetConnection"]))? intval($data["internetConnection"]) : 1); + } + + public static function checkConnectivity($url) + { + try { + if (extension_loaded('curl')) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); + curl_setopt($ch, CURLOPT_AUTOREFERER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_TIMEOUT, 20); + curl_setopt($ch, CURLOPT_VERBOSE, true); + + //Apply proxy settings + $sysConf = System::getSystemConfiguration(); + if (isset($sysConf['proxy_host'])) { + if ($sysConf['proxy_host'] != '') { + curl_setopt($ch, CURLOPT_PROXY, $sysConf['proxy_host'] . ($sysConf['proxy_port'] != '' ? ':' . $sysConf['proxy_port'] : '')); + if ($sysConf['proxy_port'] != '') { + curl_setopt($ch, CURLOPT_PROXYPORT, $sysConf['proxy_port']); + } + if ($sysConf['proxy_user'] != '') { + curl_setopt($ch, CURLOPT_PROXYUSERPWD, $sysConf['proxy_user'] . ($sysConf['proxy_pass'] != '' ? ':' . $sysConf['proxy_pass'] : '')); + } + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); + } + } + + $content = curl_exec($ch); + $headers = curl_getinfo($ch); + $content = substr($content, $headers['header_size']); + + if ($headers['http_code'] === 200) { + return $content; + } + } else { + throw (new Exception('The "CURL" extension not loaded.')); + } + } catch (Exception $e) { + //Log the error + } + + return false; + } + + public static function checkFolderPermissions($folderPath, $result) + { + $directorio = opendir($folderPath); + + if (is_writable ($folderPath)) { + while (false !== ($archivo = readdir($directorio)) && $result == true) { + if ($archivo != '.') { + if ($archivo != '..') { + if (is_dir("$folderPath/$archivo")) { + $result = self::checkFolderPermissions($folderPath."/".$archivo, $result); + } else { + if (!is_writable ($folderPath."/".$archivo)) { + $result = false; + + return $result; + } + } + } + } + } + } else { + $result = false; + + return $result; + } + + closedir($directorio); + + return $result; + } + + public static function pmVersion($version) + { + if (preg_match("/^([\d\.]+).*$/", $version, $matches)) { + $version = $matches[1]; + } + + return $version; + } + + public static function getUrlServerName() + { + $s = (empty($_SERVER["HTTPS"]))? null : (($_SERVER["HTTPS"] == "on")? "s" : null); + $p = strtolower($_SERVER["SERVER_PROTOCOL"]); + + $protocol = substr($p, 0, strpos($p, "/")) . $s; + $port = ($_SERVER["SERVER_PORT"] == "80")? null : ":" . $_SERVER["SERVER_PORT"]; + + return ($protocol . "://" . $_SERVER["SERVER_NAME"] . $port); + } + + public static function getUrl() + { + return (self::getUrlServerName() . $_SERVER["REQUEST_URI"]); + } + + public static function getUrlPartSetup() + { + $setup = "setup/main"; + + if (substr(SYS_SKIN, 0, 2) == "ux" && SYS_SKIN != "uxs") { + $setup = "setup/main_init"; + } + + return $setup; + } + + public static function skinIsUx() + { + $sw = 0; + + if (substr(SYS_SKIN, 0, 2) == "ux" && SYS_SKIN != "uxs") { + $sw = 1; + } + + return $sw; + } +} + diff --git a/workflow/engine/classes/class.license.app.php b/workflow/engine/classes/class.license.app.php new file mode 100644 index 000000000..9dc09eed8 --- /dev/null +++ b/workflow/engine/classes/class.license.app.php @@ -0,0 +1,507 @@ + + * @history--------------------------------------------- + * see CHANGELOG + */ +class license_application extends padl +{ + /** + * The number of allowed differences between the $_SERVER vars and the vars + * stored in the key + * + * @var number + */ + public $_ALLOWED_SERVER_DIFS = 0; + /** + * The number of allowed differences between the $ip vars in the key and the ip + * vars collected from the server + * + * @var number + */ + public $_ALLOWED_IP_DIFS = 0; + /** + * the path of the license key file, remember this would be relative to the + * include path of the class file. + */ + public $_LICENSE_PATH; + + /** + * Constructor + * + * @access public + * @param $use_mcrypt boolean Determines if mcrypt encryption is used or not (defaults to true, + * however if mcrypt is not available, it is set to false) + * @param $use_time boolean Sets if time binding should be used in the key (defaults to true) + * @param $use_server boolean Sets if server binding should be used in the key (defaults to true) + * @param $allow_local boolean Sets if server binding is in use then localhost servers are valid (defaults to false) + * */ + public function license_application($license_path = 'license.dat', $use_mcrypt = true, $use_time = true, $use_server = true, $allow_local = false, $challenge = false) + { + # check to see if the class has been secured + unset($_SESSION['__sw__']); + if ($challenge) { + $_SESSION['__sw__'] = true; + } + $this->_check_secure(); + $this->_LICENSE_PATH = $license_path; + $this->init($use_mcrypt, $use_time, $use_server, $allow_local); + if ($this->USE_SERVER) { + $this->_MAC = $this->_get_mac_address(); + } + } + + /** + * set_server_vars + * + * to protect against spoofing you should copy the $_SERVER vars into a + * seperate array right at the first line of your script so parameters can't + * be changed in unencoded php files. This doesn't have to be set. If it is + * not set then the $_SERVER is copied when _get_server_info (private) function + * is called. + * + * @access public + * @param $array array The copied $_SERVER array + * */ + public function set_server_vars($array) + { + # check to see if the class has been secured + $this->_check_secure(); + $this->_SERVER_VARS = $array; + # some of the ip data is dependant on the $_SERVER vars, so update them + # after the vars have been set + $this->_IPS = $this->_get_ip_address(); + # update the server info + $this->_SERVER_INFO = $this->_get_server_info(); + } + + /** + * _get_os_var + * + * gets various vars depending on the os type + * + * @access private + * @return string various values + * */ + public function _get_os_var($var_name, $os) + { + $var_name = strtolower($var_name); + # switch between the os's + switch ($os) { + # not sure if the string is correct for FreeBSD + # not tested + case 'freebsd': + # not sure if the string is correct for NetBSD + # not tested + case 'netbsd': + # not sure if the string is correct for Solaris + # not tested + case 'solaris': + # not sure if the string is correct for SunOS + # not tested + case 'sunos': + # darwin is mac os x + # tested only on the client os + case 'darwin': + # switch the var name + switch ($var_name) { + case 'conf': + $var = '/sbin/ifconfig'; + break; + case 'mac': + $var = 'ether'; + break; + case 'ip': + $var = 'inet '; + break; + } + break; + # linux variation + # tested on server + case 'linux': + # switch the var name + switch ($var_name) { + case 'conf': + $var = '/sbin/ifconfig'; + break; + case 'mac': + $var = 'HWaddr'; + break; + case 'ip': + $var = 'inet addr:'; + break; + } + break; + } + return $var; + } + + /** + * _get_config + * + * gets the server config file and returns it. tested on Linux, + * Darwin (Mac OS X), and Win XP. It may work with others as some other + * os's have similar ifconfigs to Darwin but they haven't been tested + * + * @access private + * @return string config file data + * */ + public function _get_config() + { + # check to see if the class has been secured + $this->_check_secure(); + if (ini_get('safe_mode')) { + # returns invalid because server is in safe mode thus not allowing + # sbin reads but will still allow it to open. a bit weird that one. + return 'SAFE_MODE'; + } + # if anyone has any clues for windows environments + # or other server types let me know + $os = strtolower(PHP_OS); + if (substr($os, 0, 3) == 'win') { + # this windows version works on xp running apache + # based server. it has not been tested with anything + # else, however it should work with NT, and 2000 also + # execute the ipconfig + @exec('ipconfig/all', $lines); + # count number of lines, if none returned return MAC_404 + # thanks go to Gert-Rainer Bitterlich + if (count($lines) == 0) { + return 'ERROR_OPEN'; + } + # $path the lines together + $conf = implode($this->_LINEBREAK, $lines); + } else { + # get the conf file name + $os_file = $this->_get_os_var('conf', $os); + # open the ipconfig + $fp = @popen($os_file, "rb"); + # returns invalid, cannot open ifconfig + if (!$fp) { + return 'ERROR_OPEN'; + } + # read the config + $conf = @fread($fp, 4096); + @pclose($fp); + } + return $conf; + } + + /** + * _get_ip_address + * + * Used to get the MAC address of the host server. It works with Linux, + * Darwin (Mac OS X), and Win XP. It may work with others as some other + * os's have similar ifconfigs to Darwin but they haven't been tested + * + * @access private + * @return array IP Address(s) if found (Note one machine may have more than one ip) + * @return string ERROR_OPEN means config can't be found and thus not opened + * @return string IP_404 means ip adress doesn't exist in the config file and can't be found in the $_SERVER + * @return string SAFE_MODE means server is in safe mode so config can't be read + * */ + public function _get_ip_address() + { + $ips = array(); + # get the cofig file + $conf = $this->_get_config(); + # if the conf has returned and error return it + if ($conf != 'SAFE_MODE' && $conf != 'ERROR_OPEN') { + # if anyone has any clues for windows environments + # or other server types let me know + $os = strtolower(PHP_OS); + if (substr($os, 0, 3) == 'win') { + # anyone any clues on win ip's + } else { + # explode the conf into seperate lines for searching + $lines = explode($this->_LINEBREAK, $conf); + # get the ip delim + $ip_delim = $this->_get_os_var('ip', $os); + + # ip pregmatch + $num = "(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])"; + # seperate the lines + foreach ($lines as $key => $line) { + # check for the ip signature in the line + if (!preg_match("/^$num\\.$num\\.$num\\.$num$/", $line) && strpos($line, $ip_delim)) { + # seperate out the ip + $ip = substr($line, strpos($line, $ip_delim) + strlen($ip_delim)); + $ip = trim(substr($ip, 0, strpos($ip, " "))); + # add the ip to the collection + if (!isset($ips[$ip])) { + $ips[$ip] = $ip; + } + } + } + } + } + + # if the conf has returned nothing + # attempt to use the $_SERVER data + if (isset($this->_SERVER_VARS['SERVER_NAME'])) { + $ip = gethostbyname($this->_SERVER_VARS['SERVER_NAME']); + if (!isset($ips[$ip])) { + $ips[$ip] = $ip; + } + } + + if (isset($this->_SERVER_VARS['SERVER_ADDR'])) { + $name = gethostbyaddr($this->_SERVER_VARS['SERVER_ADDR']); + $ip = gethostbyname($name); + if (!isset($ips[$ip])) { + $ips[$ip] = $ip; + } + # if the $_SERVER addr is not the same as the returned ip include it aswell + if ($ip != $this->_SERVER_VARS['SERVER_ADDR']) { + if (!isset($ips[$this->_SERVER_VARS['SERVER_ADDR']])) { + $ips[$this->_SERVER_VARS['SERVER_ADDR']] = $this->_SERVER_VARS['SERVER_ADDR']; + } + } + } + # count return ips and return if found + if (count($ips) > 0) { + return $ips; + } + # failed to find an ip check for conf error or return 404 + if ($conf == 'SAFE_MODE' || $conf == 'ERROR_OPEN') { + return $conf; + } + return 'IP_404'; + } + + /** + * _get_mac_address + * + * Used to get the MAC address of the host server. It works with Linux, + * Darwin (Mac OS X), and Win XP. It may work with others as some other + * os's have similar ifconfigs to Darwin but they haven't been tested + * + * @access private + * @return string Mac address if found + * @return string ERROR_OPEN means config can't be found and thus not opened + * @return string MAC_404 means mac adress doesn't exist in the config file + * @return string SAFE_MODE means server is in safe mode so config can't be read + * */ + public function _get_mac_address() + { + # open the config file + $conf = $this->_get_config(); + + # if anyone has any clues for windows environments + # or other server types let me know + $os = strtolower(PHP_OS); + if (substr($os, 0, 3) == 'win') { + # explode the conf into lines to search for the mac + $lines = explode($this->_LINEBREAK, $conf); + # seperate the lines for analysis + foreach ($lines as $key => $line) { + # check for the mac signature in the line + # originally the check was checking for the existence of string 'physical address' + # however Gert-Rainer Bitterlich pointed out this was for english language + # based servers only. preg_match updated by Gert-Rainer Bitterlich. Thanks + if (preg_match("/([0-9a-f][0-9a-f][-:]){5}([0-9a-f][0-9a-f])/i", $line)) { + $trimmed_line = trim($line); + # take of the mac addres and return + return trim(substr($trimmed_line, strrpos($trimmed_line, " "))); + } + } + } else { + # get the mac delim + $mac_delim = $this->_get_os_var('mac', $os); + + # get the pos of the os_var to look for + $pos = strpos($conf, $mac_delim); + if ($pos) { + # seperate out the mac address + $str1 = trim(substr($conf, ($pos + strlen($mac_delim)))); + return trim(substr($str1, 0, strpos($str1, "\n"))); + } + } + # failed to find the mac address + return 'MAC_404'; + } + + /** + * _get_server_info + * + * used to generate the server binds when server binding is needed. + * + * @access private + * @return array server bindings + * @return boolean false means that the number of bindings failed to + * meet the required number + * */ + public function _get_server_info() + { + if (empty($this->_SERVER_VARS)) { + $this->set_server_vars($_SERVER); + } + # get the server specific uris + $a = array(); + if (isset($this->_SERVER_VARS['SERVER_ADDR']) && (!strrpos($this->_SERVER_VARS['SERVER_ADDR'], '127.0.0.1') || $this->ALLOW_LOCAL)) { + $a['SERVER_ADDR'] = $this->_SERVER_VARS['SERVER_ADDR']; + } + # corrected by Gert-Rainer Bitterlich , Thanks + if (isset($this->_SERVER_VARS['HTTP_HOST']) && (!strrpos($this->_SERVER_VARS['HTTP_HOST'], '127.0.0.1') || $this->ALLOW_LOCAL)) { + $a['HTTP_HOST'] = $this->_SERVER_VARS['HTTP_HOST']; + } + if (isset($this->_SERVER_VARS['SERVER_NAME'])) { + $a['SERVER_NAME'] = $this->_SERVER_VARS['SERVER_NAME']; + } + if (isset($this->_SERVER_VARS['PATH_TRANSLATED'])) { + $a['PATH_TRANSLATED'] = substr($this->_SERVER_VARS['PATH_TRANSLATED'], 0, strrpos($this->_SERVER_VARS['PATH_TRANSLATED'], '/')); + } elseif (isset($this->_SERVER_VARS['SCRIPT_FILENAME'])) { + $a['SCRIPT_FILENAME'] = substr($this->_SERVER_VARS['SCRIPT_FILENAME'], 0, strrpos($this->_SERVER_VARS['SCRIPT_FILENAME'], '/')); + } + if (isset($_SERVER['SCRIPT_URI'])) { + $a['SCRIPT_URI'] = substr($this->_SERVER_VARS['SCRIPT_URI'], 0, strrpos($this->_SERVER_VARS['SCRIPT_URI'], '/')); + } + + # if the number of different uris is less than the required amount, + # fail the request + if (count($a) < $this->REQUIRED_URIS) { + return 'SERVER_FAILED'; + } + + return $a; + } + + /** + * validate + * + * validates the server key and returns a data array. + * + * @access public + * @return array Main object in array is 'RESULT', it contains the result + * of the validation. + * OK - key is valid + * CORRUPT - key has been tampered with + * TMINUS - the key is being used before the valid start date + * EXPIRED - the key has expired + * ILLEGAL - the key is not on the same server the license was registered to + * ILLEGAL_LOCAL - the key is not allowed to be installed on a local machine + * INVALID - the the encryption key used to encrypt the key differs or the key is not complete + * EMPTY - the the key is empty + * 404 - the the key is missing + * */ + public function validate($str = false, $dialhome = false, $dialhost = "", $dialpath = "", $dialport = "80") + { + # check to see if the class has been secured + $this->_check_secure(); + # get the dat string + $dat_str = (!$str) ? @file_get_contents($this->_LICENSE_PATH) : $str; + if (strlen($dat_str) > 0) { + # decrypt the data + $DATA = $this->_unwrap_license($dat_str); + if (is_array($DATA)) { + # missing / incorrect id therefore it has been tampered with + if ($DATA['ID'] != md5($this->ID1)) { + $DATA['RESULT'] = 'CORRUPT'; + } + if ($this->USE_TIME) { + # the license is being used before it's official start + if ($DATA['DATE']['START'] > time() + $this->START_DIF) { + $DATA['RESULT'] = 'TMINUS'; + } + # the license has expired + if ($DATA['DATE']['END'] - time() < 0 && $DATA['DATE']['SPAN'] != 'NEVER' && $DATA['DATE']['SPAN'] != '~') { + $DATA['RESULT'] = 'EXPIRED'; + } + $DATA['DATE']['HUMAN']['START'] = date($this->DATE_STRING, $DATA['DATE']['START']); + if (($DATA['DATE']['END'] == "") || ($DATA['DATE']['END'] == "NEVER")) { + $DATA['DATE']['HUMAN']['END'] = "PERPETUAL"; + } else { + $DATA['DATE']['HUMAN']['END'] = date($this->DATE_STRING, $DATA['DATE']['END']); + } + } + if ($this->USE_SERVER) { + $mac = $DATA['SERVER']['MAC'] == $this->_MAC; + $path = count(array_diff($this->_SERVER_INFO, $DATA['SERVER']['PATH'])) <= $this->_ALLOWED_SERVER_DIFS; + $domain = $this->_compare_domain_ip($DATA['SERVER']['DOMAIN'], $this->_IPS); + $ip = count(array_diff($this->_IPS, $DATA['SERVER']['IP'])) <= $this->_ALLOWED_IP_DIFS; + + # the server details + if (!$mac || !$path || !$domain || !$ip) { + $DATA['RESULT'] = 'ILLEGAL'; + } + + # check if local + $local = $this->ALLOW_LOCAL && (in_array('127.0.0.1', $DATA['SERVER']['IP']) || $DATA['PATH']['SERVER_ADDR'] == '127.0.0.1' || $DATA['PATH']['HTTP_HOST'] == '127.0.0.1'); + if (!$local) { + $DATA['RESULT'] = 'ILLEGAL_LOCAL'; + } + } + # passed all current test so license is ok + if (!isset($DATA['RESULT'])) { + # dial to home server if required + if ($dialhome) { + # create the details to send to the home server + $stuff_to_send = array(); + $stuff_to_send['LICENSE_DATA'] = $DATA; + $stuff_to_send['LICENSE_DATA']['KEY'] = md5($dat_str); + # dial home + $DATA['RESULT'] = $this->_call_home($stuff_to_send, $dialhost, $dialpath, $dialport); + } else { + # result is ok all test passed, license is legal + $DATA['RESULT'] = 'OK'; + } + } + /* + */ + # data is returned for use + return $DATA; + } else { + # the are two reason that mean a invalid return + # 1 - the other hash key is different + # 2 - the key has been tampered with + return array('RESULT' => 'INVALID'); + } + } + # returns empty because there is nothing in the dat_string + return array('RESULT' => 'EMPTY'); + } + + /** + * _call_home + * + * calls the dial home server (your server) andvalidates the clients license + * with the info in the mysql db + * + * @access private + * @param $data array Array that contains the info to be validated + * @param $dialhost string Host name of the server to be contacted + * @param $dialpath string Path of the script for the data to be sent to + * @param $dialport number Port Number to send the data through + * @return string Returns: the encrypted server validation result from the dial home call + * : SOCKET_FAILED => socket failed to connect to the server + * */ + public function _call_home($data, $dialhost, $dialpath, $dialport) + { + print "_call_home($data, $dialhost, $dialpath, $dialport)"; + # post the data home + $data = $this->_post_data($dialhost, $dialpath, $data, $dialport); + return (empty($data['RESULT'])) ? 'SOCKET_FAILED' : $data['RESULT']; + } +} + diff --git a/workflow/engine/classes/class.license.lib.php b/workflow/engine/classes/class.license.lib.php new file mode 100644 index 000000000..fb351ac81 --- /dev/null +++ b/workflow/engine/classes/class.license.lib.php @@ -0,0 +1,704 @@ + + * @version 0.1 + * @history--------------------------------------------- + * see CHANGELOG + */ +class padl +{ + /** + * hash key 1 used to encrypt the generate key data. + * hash key 2 used to encrypt the request data + * hash key 3 used to encrypt the dial home data + * NOTE1 : there are three different hash keys for the three different operations + * NOTE2 : these hash key's are for use by both mcrypt and alternate cryptions + * and although mcrypts keys are typically short they should be kept long + * for the sake of the other functions + * + * @var string + * @var string + * @var string + */ + public $HASH_KEY1 = 'YmUzYWM2sNGU24NbA363zA7IDSDFGDFGB5aVi35BDFGQ3YNO36ycDFGAATq4sYmSFVDFGDFGps7XDYEzGDDw96OnMW3kjCFJ7M+UV2kHe1WTTEcM09UMHHT'; + public $HASH_KEY2 = '80dSbqylf4Cu5e5OYdAoAVkzpRDWAt7J1Vp27sYDU52ZBJprdRL1KE0il8KQXuKCK3sdA51P9w8U60wohX2gdmBu7uVhjxbS8g4y874Ht8L12W54Q6T4R4a'; + public $HASH_KEY3 = 'ant9pbc3OK28Li36Mi4d3fsWJ4tQSN4a9Z2qa8W66qR7ctFbljsOc9J4wa2Bh6j8KB3vbEXB18i6gfbE0yHS0ZXQCceIlG7jwzDmN7YT06mVwcM9z0vy62T'; + /** + * You may not want to use mcrypt even if your system has it installed + * make this false to use a regular encryption method + * + * @var boolean + */ + public $USE_MCRYPT = true; + /** + * The algorythm to be used by mcrypt + * + * @var string + */ + public $ALGORITHM = 'blowfish'; + /** + * use time binding vars inited. + */ + public $USE_TIME; + /** + * time checking start period difference allowance ie if the user has slightly different time + * setting on their server make an allowance for the diff period. carefull to not make it too + * much otherwise they could just reset their server to a time period before the license expires. + * + * @var number (seconds) + */ + public $START_DIF = 129600; + /** + * id 1 used to validate license keys + * id 2 used to validate license key requests + * id 2 used to validate dial home data + * + * @var string + * @var string + * @var string + */ + # id to check for to validate source + public $ID1 = 'nSpkAHRiFfM2hE588eB'; + public $ID2 = 'NWCy0s0JpGubCVKlkkK'; + public $ID3 = 'G95ZP2uS782cFey9x5A'; + /** + * begining and end strings + * + * @var strings + */ + public $BEGIN1 = 'BEGIN LICENSE KEY'; + public $END1 = 'END LICENSE KEY'; + /** + * wrap key settings + * + * @var number + * @var string + * @var string + */ + public $_WRAPTO = 80; + public $_PAD = "-"; + /** + * init the linebreak var + */ + public $_LINEBREAK; + /** + * dial home return query deliminators + * + * @var string + * @var string + */ + public $BEGIN2 = '_DATA{'; + public $END2 = '}DATA_'; + /** + * init the key data array. + * + * @var array + */ + public $_DATA = array(); + /** + * use server binding vars inited. + */ + public $USE_SERVER; + public $_SERV; + public $_MAC; + public $ALLOW_LOCAL; + public $_SERVER_INFO = array(); + /** + * this is the number of required server stats for the key generation to be successfull + * if the server can't produce this number of details then the key fails to be generated + * you can set it to however many you wish, the max is 5 + * + * @var number + */ + public $REQUIRED_URIS = 2; + /** + * the date string for human readable format + * + * @var string + */ + public $DATE_STRING = 'M/d/Y H:i:s'; + + /** + * Constructor + * + * @access private + * */ + public function padl() + { + # check to see if the class has been secured + $this->_check_secure(); + } + + /** + * init + * + * init the license class + * + * @access public + * @param $use_mcrypt boolean Determines if mcrypt encryption is used or not (defaults to true, + * however if mcrypt is not available, it is set to false) + * @param $use_time boolean Sets if time binding should be used in the key (defaults to true) + * @param $use_server boolean Sets if server binding should be used in the key (defaults to true) + * @param $allow_local boolean Sets if server binding is in use then localhost servers are valid (defaults to false) + * */ + public function init($use_mcrypt = true, $use_time = true, $use_server = true, $allow_local = false, $challenge = false) + { + # check to see if the class has been secured + if (!$challenge) { + $this->_check_secure(); + } + $this->USE_MCRYPT = ($use_mcrypt && function_exists('mcrypt_generic')); + $this->USE_TIME = $use_time; + $this->ALLOW_LOCAL = $allow_local; + $this->USE_SERVER = $use_server; + $this->_LINEBREAK = $this->_get_os_linebreak(); + } + + /** + * _get_os_linebreak + * + * get's the os linebreak + * + * @access private + * @param $true_val boolean If the true value is needed for writing files, make true + * defaults to false + * @return string Returns the os linebreak + * */ + public function _get_os_linebreak($true_val = false) + { + $os = strtolower(PHP_OS); + switch ($os) { + # not sure if the string is correct for FreeBSD + # not tested + case 'freebsd': + # not sure if the string is correct for NetBSD + # not tested + case 'netbsd': + # not sure if the string is correct for Solaris + # not tested + case 'solaris': + # not sure if the string is correct for SunOS + # not tested + case 'sunos': + # linux variation + # tested on server + case 'linux': + $nl = "\n"; + break; + # darwin is mac os x + # tested only on the client os + case 'darwin': + # note os x has \r line returns however it appears that the ifcofig + # file used to source much data uses \n. let me know if this is + # just my setup and i will attempt to fix. + if ($true_val) { + $nl = "\r"; + } else { + $nl = "\n"; + } + break; + # defaults to a win system format; + default: + $nl = "\r\n"; + } + return $nl; + } + + public function do_post_request($url, $data, $optional_headers = null) + { + $params = array('http' => array( + 'method' => 'POST', + 'content' => $data + )); + if ($optional_headers !== null) { + $params['http']['header'] = $optional_headers; + } + + // Proxy settings + $sysConf = System::getSystemConfiguration(); + if ($sysConf['proxy_host'] != '') { + if (!is_array($params['http'])) { + $params['http'] = array(); + } + $params['http']['request_fulluri'] = true; + $params['http']['proxy'] = 'tcp://' . $sysConf['proxy_host'] . ($sysConf['proxy_port'] != '' ? ':' . $sysConf['proxy_port'] : ''); + if ($sysConf['proxy_user'] != '') { + if (!isset($params['http']['header'])) { + $params['http']['header'] = ''; + } + $params['http']['header'] .= 'Proxy-Authorization: Basic ' . base64_encode($sysConf['proxy_user'] . ($sysConf['proxy_pass'] != '' ? ':' . $sysConf['proxy_pass'] : '')); + } + } + + $ctx = stream_context_create($params); + //G::pr($ctx); + $fp = @fopen($url, 'rb', false, $ctx); + //G::pr($fp); + if (!$fp) { + throw new Exception("Problem with $url, $php_errormsg"); + } + $response = @stream_get_contents($fp); + if ($response === false) { + throw new Exception("Problem reading data from $url, $php_errormsg"); + } + return $response; + } + + /** + * _post_data + * + * Posts data to and recieves data from dial home server. Returned info + * contains the dial home validation result + * + * @access private + * @param $host string Host name of the server to be contacted + * @param $path string Path of the script for the data to be sent to + * @param $query_array array Array that contains the license key info to be validated + * @param $port number Port Number to send the data through + * @return array Result of the dialhome validation + * @return string - SOCKET_FAILED will be returned if it was not possible to open a socket to the home server + * */ + public function _post_data($host, $path, $query_array, $port = 80) + { + # generate the post query info + $query = 'POSTDATA=' . $this->_encrypt($query_array, 'HOMEKEY'); + $query .= '&MCRYPT=' . $this->USE_MCRYPT; + $query .= '&TYPE=' . $query_array['DATA']['TYPE']; + $query .= '&PLAN=' . $query_array['DATA']['PLAN']; + //G::pr($path); + //G::pr($query); + # init the return string + //$return = ''; + //$return=$this->do_post_request($host.$path, $query); + # separate out the data using the delims + //$leftpos = strpos($return, $this->BEGIN2)+strlen($this->BEGIN2); + //$rightpos = strpos($return, $this->END2)-$leftpos; + # decrypt and return the data + //return $this->_decrypt(substr($return, $leftpos, $rightpos), 'HOMEKEY'); + //die; + # generate the post headers + $post = "POST $path HTTP/1.1\r\n"; + $post .= "Host: $host\r\n"; + $post .= "Content-type: application/x-www-form-urlencoded\r\n"; + $post .= "Content-length: " . strlen($query) . "\r\n"; + $post .= "Connection: close\r\n"; + $post .= "\r\n"; + $post .= $query; + + # open a socket + $ip = gethostbyname($host); + if ($ip == $host) { + $ip = rtrim(`/usr/bin/dig $host A +short | /usr/bin/tail -1`); + } + $header = @fsockopen($ip, $port); + //print "fsockopen($host, $port)"; + //G::pr($header); + if (!$header) { + # if the socket fails return failed + return array('RESULT' => 'SOCKET_FAILED'); + } + @fputs($header, $post); + //G::pr($post); + # read the returned data + while (!@feof($header)) { + $return .= @ fgets($header, 1024); + } + fclose($header); + + # separate out the data using the delims + $leftpos = strpos($return, $this->BEGIN2) + strlen($this->BEGIN2); + $rightpos = strpos($return, $this->END2) - $leftpos; + + #trace($return); + # decrypt and return the data + return $this->_decrypt(substr($return, $leftpos, $rightpos), 'HOMEKEY'); + } + + /** + * _compare_domain_ip + * + * uses the supplied domain in the key and runs a check against the collected + * ip addresses. If there are matching ips it returns true as the domain + * and ip address match up + * + * @access private + * @return boolean + * */ + public function _compare_domain_ip($domain, $ips = false) + { + # if no ips are supplied get the ip addresses for the server + if (!$ips) { + $ips = $this->_get_ip_address(); + } + # get the domain ip list + $domain_ips = gethostbynamel($domain); + # loop through the collected ip's searching for matches against the domain ips + if (is_array($domain_ips) && count($domain_ips) > 0) { + foreach ($domain_ips as $ip) { + if (in_array($ip, $ips)) { + return true; + } + } + } + return false; + } + + /** + * _pad + * + * pad out the begin and end seperators + * + * @access private + * @param $str string The string to be padded + * @return string Returns the padded string + * */ + public function _pad($str) + { + $str_len = strlen($str); + $spaces = ($this->_WRAPTO - $str_len) / 2; + $str1 = ''; + for ($i = 0; $i < $spaces; $i++) { + $str1 = $str1 . $this->_PAD; + } + if ($spaces / 2 != round($spaces / 2)) { + $str = substr($str1, 0, strlen($str1) - 1) . $str; + } else { + $str = $str1 . $str; + } + $str = $str . $str1; + return $str; + } + + /** + * _get_key + * + * gets the hash key for the current encryption + * + * @access private + * @param $key_type string The license key type being produced + * @return string Returns the hash key + * */ + public function _get_key($key_type) + { + switch ($key_type) { + case 'KEY': + return $this->HASH_KEY1; + case 'REQUESTKEY': + return $this->HASH_KEY2; + case 'HOMEKEY': + return $this->HASH_KEY3; + default: + } + } + + /** + * _get_begin + * + * gets the begining license key seperator text + * + * @access private + * @param $key_type string The license key type being produced + * @return string Returns the begining string + * */ + public function _get_begin($key_type) + { + switch ($key_type) { + case 'KEY': + return $this->BEGIN1; + case 'REQUESTKEY': + return $this->BEGIN2; + case 'HOMEKEY': + return ''; + } + } + + /** + * _get_end + * + * gets the ending license key seperator text + * + * @access private + * @param $key_type string The license key type being produced + * @return string Returns the ending string + * */ + public function _get_end($key_type) + { + switch ($key_type) { + case 'KEY': + return $this->END1; + case 'REQUESTKEY': + return $this->_END2; + case 'HOMEKEY': + return ''; + } + } + + /** + * _generate_random_string + * + * generates a random string + * + * @access private + * @param $length number The length of the random string + * @param $seeds string The string to pluck the characters from + * @return string Returns random string + * */ + public function _generate_random_string($length = 10, $seeds = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789') + { + $str = ''; + $seeds_count = strlen($seeds); + + list($usec, $sec) = explode(' ', microtime()); + $seed = (float) $sec + ((float) $usec * 100000); + mt_srand($seed); + + for ($i = 0; $length > $i; $i++) { + $str .= $seeds{mt_rand(0, $seeds_count - 1)}; + } + return $str; + } + + /** + * _encrypt + * + * encrypts the key + * + * @access private + * @param $src_array array The data array that contains the key data + * @return string Returns the encrypted string + * */ + public function _encrypt($src_array, $key_type = 'KEY') + { + # check to see if the class has been secured + $this->_check_secure(); + + $rand_add_on = $this->_generate_random_string(3); + # get the key + $key = $this->_get_key($key_type); + $key = $rand_add_on . $key; + + # check to see if mycrypt exists + if ($this->USE_MCRYPT) { + # openup mcrypt + $td = mcrypt_module_open($this->ALGORITHM, '', 'ecb', ''); + $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); + # process the key + $key = substr($key, 0, mcrypt_enc_get_key_size($td)); + # init mcrypt + mcrypt_generic_init($td, $key, $iv); + + # encrypt data + # double base64 gets makes all the characters alpha numeric + # and gets rig of the special characters + $crypt = mcrypt_generic($td, serialize($src_array)); + + # shutdown mcrypt + mcrypt_generic_deinit($td); + mcrypt_module_close($td); + } else { + # if mcrypt doesn't exist use regular encryption method + # init the vars + $crypt = ''; + $str = serialize($src_array); + + # loop through the str and encrypt it + for ($i = 1; $i <= strlen($str); $i++) { + $char = substr($str, $i - 1, 1); + $keychar = substr($key, ($i % strlen($key)) - 1, 1); + $char = chr(ord($char) + ord($keychar)); + $crypt .= $char; + } + } + # return the key + return $rand_add_on . base64_encode(base64_encode(trim($crypt))); + } + + /** + * _decrypt + * + * decrypts the key + * + * @access private + * @param $enc_string string The key string that contains the data + * @return array Returns decrypted array + * */ + public function _decrypt($str, $key_type = 'KEY') + { + # check to see if the class has been secured + $this->_check_secure(); + + $rand_add_on = substr($str, 0, 3); + $str = base64_decode(base64_decode(substr($str, 3))); + # get the key + $key = $rand_add_on . $this->_get_key($key_type); + + # check to see if mycrypt exists + if ($this->USE_MCRYPT) { + # openup mcrypt + $td = mcrypt_module_open($this->ALGORITHM, '', 'ecb', ''); + $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); + # process the key + $key = substr($key, 0, mcrypt_enc_get_key_size($td)); + # init mcrypt + mcrypt_generic_init($td, $key, $iv); + + # decrypt the data and return + $decrypt = mdecrypt_generic($td, $str); + + # shutdown mcrypt + mcrypt_generic_deinit($td); + mcrypt_module_close($td); + } else { + # if mcrypt doesn't exist use regular decryption method + # init the decrypt vars + $decrypt = ''; + + # loop through the text and decode the string + for ($i = 1; $i <= strlen($str); $i++) { + $char = substr($str, $i - 1, 1); + $keychar = substr($key, ($i % strlen($key)) - 1, 1); + $char = chr(ord($char) - ord($keychar)); + $decrypt .= $char; + } + } + # return the key + return unserialize($decrypt); + } + + /** + * _wrap_license + * + * wraps up the license key in a nice little package + * + * @access private + * @param $src_array array The array that needs to be turned into a license str + * @param $key_type string The type of key to be wrapped (KEY=license key, REQUESTKEY=license request key) + * @return string Returns encrypted and formatted license key + * */ + public function _wrap_license($src_array, $key_type = 'KEY') + { + # sort the variables + $begin = $this->_pad($this->_get_begin($key_type)); + $end = $this->_pad($this->_get_end($key_type)); + + # encrypt the data + $str = $this->_encrypt($src_array, $key_type); + + # return the wrap + return $begin . $this->_LINEBREAK . wordwrap($str, $this->_WRAPTO, $this->_LINEBREAK, 1) . $this->_LINEBREAK . $end; + } + + /** + * _unwrap_license + * + * unwraps license key back into it's data array + * + * @access private + * @param $enc_str string The encrypted license key string that needs to be decrypted + * @param $key_type string The type of key to be unwrapped (KEY=license key, REQUESTKEY=license request key) + * @return array Returns license data array + * */ + public function _unwrap_license($enc_str, $key_type = 'KEY') + { + # sort the variables + $begin = $this->_pad($this->_get_begin($key_type)); + $end = $this->_pad($this->_get_end($key_type)); + + # get string without seperators + $str = trim(str_replace(array($begin, $end, "\r", "\n", "\t"), '', $enc_str)); + + # decrypt and return the key + return $this->_decrypt($str, $key_type); + } + + /** + * make_secure + * + * deletes all class values to prevent re-writing of a key; + * + * @access public + * */ + public function make_secure($report = false) + { + if ($report) { + define('_PADL_REPORT_ABUSE_', true); + } + # walkthrough and delete the class vars + foreach (array_keys(get_object_vars($this)) as $value) { + unset($this->$value); + } + # define that class is secure + define('_PADL_SECURE_', 1); + } + + /** + * _check_secure + * + * checks to see if the class has been made secure + * + * @access private + * */ + public function _check_secure() + { + if (!isset($_SESSION['__sw__'])) { + # check to see if padl has been made secure + if (defined('_PADL_SECURE_')) { + # if(defined('_PADL_REPORT_ABUSE_')) $this->_post_data($this->_HOST, $this->_PATH, array()); + # trigger the error because user has attempted to access secured functions + # after the call has been made to 'make_secure' + trigger_error("

The PHP Application Distribution License System (PADL) has been made secure.
You have attempted to use functions that have been protected and this has terminated your script.

", E_USER_ERROR); + exit; + } + } + } +} + +/** + * custom functions to aid in debugging + * + * @var mixed + */ +function trace() +{ + $message = ''; + for ($i = 0; $i < func_num_args(); $i++) { + if (is_array(func_get_arg($i))) { + trace_r(func_get_arg($i)); + } else { + $message .= func_get_arg($i); + } + if ($i <= func_num_args() - 2) { + $message.=' : '; + } + } + echo "
\r\r" . $message . "\r\r"; +} + +function trace_r($array = "array is empty") +{ + echo "
\r\r";
+    print_r($array);
+    echo "\r\r
"; +} + diff --git a/workflow/engine/classes/class.plugin.php b/workflow/engine/classes/class.plugin.php index 0365290b1..f625bb3f5 100755 --- a/workflow/engine/classes/class.plugin.php +++ b/workflow/engine/classes/class.plugin.php @@ -83,7 +83,7 @@ class PMPlugin public function registerMenu($menuId, $menuFilename) { $oPluginRegistry =& PMPluginRegistry::getSingleton(); - $sMenuFilename = PATH_PLUGINS . $this->sPluginFolder . PATH_SEP . $menuFilename; + $sMenuFilename = ($this->sClassName == 'enterprisePlugin') ? PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . $menuFilename : PATH_PLUGINS . $this->sPluginFolder . PATH_SEP . $menuFilename; $oPluginRegistry->registerMenu($this->sNamespace, $menuId, $sMenuFilename); } diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index 013134054..9bad6de30 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -32,6 +32,7 @@ require_once 'class.plugin.php'; + class pluginDetail { public $sNamespace; @@ -294,17 +295,19 @@ class PMPluginRegistry */ public function disablePlugin ($sNamespace, $eventPlugin = 1) { + //require_once PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . 'enterprise.php'; $sw = false; - + //G::pr($this->_aPluginDetails);die; foreach ($this->_aPluginDetails as $namespace => $detail) { if ($namespace == $sNamespace) { + //G::pr($detail);die; unset( $this->_aPluginDetails[$sNamespace] ); if ($eventPlugin == 1) { - $plugin = new $detail->sClassName( $detail->sNamespace, $detail->sFilename ); - $this->_aPlugins[$detail->sNamespace] = $plugin; - if (method_exists( $plugin, "disable" )) { - $plugin->disable(); + //$plugin = new $detail->sClassName( $detail->sNamespace, $detail->sFilename ); + $this->_aPlugins[$detail->sNamespace] = $detail; + if (method_exists( $detail, "disable" )) { + $detail->disable(); } } diff --git a/workflow/engine/classes/class.pmLicenseManager.php b/workflow/engine/classes/class.pmLicenseManager.php new file mode 100644 index 000000000..8c2386a44 --- /dev/null +++ b/workflow/engine/classes/class.pmLicenseManager.php @@ -0,0 +1,502 @@ +setProperty('LOGIN_NO_WS', true); + + //to do: this files probably needs to be in core, since they are GPL2 + //include_once (PATH_PLUGINS . 'enterprise' . PATH_SEP . 'classes' . PATH_SEP . 'class.license.lib.php'); + //include_once (PATH_PLUGINS . 'enterprise' . PATH_SEP . 'classes' . PATH_SEP . 'class.license.app.php'); + + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.license.lib.php'; + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.license.app.php'; + + //searching .dat files in workspace folder + $server_array = $_SERVER; + $licfile = glob(PATH_DATA_SITE . "*.dat"); + + if (count($licfile) > 0 && is_file($licfile[0])) { + $oServerConf->setProperty('ACTIVE_LICENSE', array(SYS_SYS => "")); + } + + $activeLicenseSetting = $oServerConf->getProperty('ACTIVE_LICENSE'); + + if ((isset($activeLicenseSetting[SYS_SYS])) && (file_exists($activeLicenseSetting[SYS_SYS]))) { + $licenseFile = $activeLicenseSetting[SYS_SYS]; + } else { + $activeLicense = $this->getActiveLicense(); + $oServerConf->setProperty('ACTIVE_LICENSE', array(SYS_SYS => $activeLicense ['LICENSE_PATH'])); + $licenseFile = $activeLicense['LICENSE_PATH']; + } + + $application = new license_application($licenseFile, false, true, false, true); + $application->set_server_vars($server_array); + $application->DATE_STRING = 'Y-m-d H:i:s'; + $results = $application->validate(); + $application->make_secure(); + $validStatus = array( + 'OK', + 'EXPIRED', + 'TMINUS' + ); + + $this->result = $results['RESULT']; + if (in_array($this->result, $validStatus)) { + $this->serial="3ptta7Xko2prrptrZnSd356aqmPXvMrayNPFj6CLdaR1pWtrW6qPw9jV0OHjxrDGu8LVxtmSm9nP5kR23HRpdZWccpeui+bKkK°DoqCt2Kqgpq6Vg37s"; + $info['FIRST_NAME'] = $results['DATA']['FIRST_NAME']; + $info['LAST_NAME'] = $results['DATA']['LAST_NAME']; + $info['DOMAIN_WORKSPACE'] = $results['DATA']['DOMAIN_WORKSPACE']; + $this->date = $results ['DATE']; + $this->info = $info; + $this->type = $results ['DATA']['TYPE']; + $this->plan = isset($results ['DATA']['PLAN'])?$results ['DATA']['PLAN']:""; + $this->id = $results ['ID']; + $this->expireIn = $this->getExpireIn (); + $this->features = $this->result!='TMINUS'?isset($results ['DATA']['CUSTOMER_PLUGIN'])?$results ['DATA']['CUSTOMER_PLUGIN']:$this->getActiveFeatures():array(); + $this->status = $this->getCurrentLicenseStatus (); + + if (isset ( $results ['LIC'] )) { + $resultsRegister = $results['LIC']; + $this->server = $results['LIC']['SRV']; + $this->file = $results['LIC']['FILE']; + $this->licenseSerial = (isset($results['LIC']['SERIAL'])) ? $results['LIC']['SERIAL'] : ''; + $this->supportStartDate = (isset($results['DATA']['SUPPORT_START_DATE'])) ? $results['DATA']['SUPPORT_START_DATE'] : ''; + $this->supportEndDate = (isset($results['DATA']['SUPPORT_END_DATE'])) ? $results['DATA']['SUPPORT_END_DATE'] : ''; + $this->supportStartDate = date("Y-m-d H:i:s", strtotime($this->supportStartDate)); + $this->supportEndDate = date("Y-m-d H:i:s", strtotime($this->supportEndDate)); + + G::LoadClass( "configuration" ); + $conf = new Configurations(); + if ( defined('SYS_SYS') && $conf->exists("ENVIRONMENT_SETTINGS")) { + $this->supportStartDate = $conf->getSystemDate($this->supportStartDate); + $this->supportEndDate = $conf->getSystemDate($this->supportEndDate); + } else { + $this->supportStartDate = G::getformatedDate($this->supportStartDate, 'M d, yyyy', SYS_LANG); + $this->supportEndDate = G::getformatedDate($this->supportEndDate, 'M d, yyyy', SYS_LANG); + } + } else { + $resultsRegister=array(); + $resultsRegister['ID']=$results ['DATA'] ['DOMAIN_WORKSPACE']; + $this->server = null; + $this->file = null; + } + + $resultsRegister['date'] = $results ['DATE']; + $resultsRegister['info'] = $info; + $resultsRegister['type'] = $results ['DATA'] ['TYPE']; + if ($oServerConf->getProperty ( 'LICENSE_INFO')) { + $licInfoA = $oServerConf->getProperty ( 'LICENSE_INFO'); + } else { + $licInfoA = array(); + } + $licInfoA[SYS_SYS]=$resultsRegister; + $oServerConf->setProperty ( 'LICENSE_INFO', $licInfoA ); + } + + $this->activateFeatures (); + } + + public function &getSingleton() + { + if (self::$instance == null) { + self::$instance = new pmLicenseManager (); + } + return self::$instance; + } + + public function serializeInstance() + { + return serialize ( self::$instance ); + } + + public function activateFeatures() + { + //Get a list of all Enterprise plugins and active/inactive them + if (file_exists ( PATH_PLUGINS . 'enterprise/data/default' )) { + if ($this->result=="OK") { + //Disable + if (file_exists ( PATH_PLUGINS . 'enterprise/data/data' )) { + $oPluginRegistry = & PMPluginRegistry::getSingleton (); + $aPlugins = unserialize ( trim ( file_get_contents ( PATH_PLUGINS . 'enterprise/data/data' ) ) ); + foreach ($aPlugins as $aPlugin) { + $sClassName = substr ( $aPlugin ['sFilename'], 0, strpos ( $aPlugin ['sFilename'], '-' ) ); + require_once PATH_PLUGINS . $sClassName . '.php'; + $oDetails = $oPluginRegistry->getPluginDetails ( $sClassName . '.php' ); + $oPluginRegistry->disablePlugin ( $oDetails->sNamespace ); + file_put_contents ( PATH_DATA_SITE . 'plugin.singleton', $oPluginRegistry->serializeInstance () ); + } + unlink(PATH_PLUGINS . 'enterprise/data/data'); + } + + //Enable + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $aPlugins = unserialize(trim(file_get_contents(PATH_PLUGINS . "enterprise/data/default"))); + + foreach ($aPlugins as $aPlugin) { + if ($aPlugin ["bActive"]) { + $sClassName = substr($aPlugin["sFilename"], 0, strpos($aPlugin["sFilename"], "-")); + require_once (PATH_PLUGINS . $sClassName . ".php"); + $oDetails = $oPluginRegistry->getPluginDetails($sClassName . ".php"); + $oPluginRegistry->enablePlugin($oDetails->sNamespace); + file_put_contents ( PATH_DATA_SITE . 'plugin.singleton', $oPluginRegistry->serializeInstance () ); + } + } + + if (file_exists(PATH_DATA_SITE . "ee")) { + $aPlugins = unserialize ( trim ( file_get_contents ( PATH_DATA_SITE.'ee' ) ) ); + $aDenied=array(); + foreach ($aPlugins as $aPlugin) { + $sClassName = substr ( $aPlugin ['sFilename'], 0, strpos ( $aPlugin ['sFilename'], '-' ) ); + if (!(in_array($sClassName,$this->features))) { + if (file_exists(PATH_PLUGINS . $sClassName . '.php')) { + require_once PATH_PLUGINS . $sClassName . '.php'; + $oDetails = $oPluginRegistry->getPluginDetails ( $sClassName . '.php' ); + $oPluginRegistry->disablePlugin ( $oDetails->sNamespace ); + file_put_contents ( PATH_DATA_SITE . 'plugin.singleton', $oPluginRegistry->serializeInstance () ); + $aDenied[]=$oDetails->sNamespace; + } + } + } + if (!(empty($aDenied))) { + if ((SYS_COLLECTION=="enterprise")&&(SYS_TARGET=="pluginsList")) { + G::SendMessageText("The following plugins were restricted due to your enterprise license: ".implode(", ",$aDenied),"INFO"); + } + } + } + } else { + //Disable + $oPluginRegistry = & PMPluginRegistry::getSingleton (); + $aPlugins = unserialize ( trim ( file_get_contents ( PATH_PLUGINS . 'enterprise/data/default' ) ) ); + foreach ($aPlugins as $aPlugin) { + $sClassName = substr ( $aPlugin ['sFilename'], 0, strpos ( $aPlugin ['sFilename'], '-' ) ); + //To avoid self disable + if (($sClassName != "pmLicenseManager") && ($sClassName != "pmTrial") && ($sClassName != "enterprise")) { + require_once PATH_PLUGINS . $sClassName . '.php'; + $oDetails = $oPluginRegistry->getPluginDetails ( $sClassName . '.php' ); + $oPluginRegistry->disablePlugin ( $oDetails->sNamespace ); + } else { + //Enable default and required plugins + require_once PATH_PLUGINS . $sClassName . '.php'; + $oDetails = $oPluginRegistry->getPluginDetails ( $sClassName . '.php' ); + $oPluginRegistry->enablePlugin ( $oDetails->sNamespace ); + } + } + + if (file_exists(PATH_DATA_SITE.'ee')) { + $aPlugins = unserialize ( trim ( file_get_contents ( PATH_DATA_SITE.'ee' ) ) ); + + foreach ($aPlugins as $aPlugin) { + $sClassName = substr ( $aPlugin ['sFilename'], 0, strpos ( $aPlugin ['sFilename'], '-' ) ); + if ( strlen($sClassName) > 0 ) { + if (!class_exists($sClassName)) { + require_once PATH_PLUGINS . $sClassName . '.php'; + } + $oDetails = $oPluginRegistry->getPluginDetails ( $sClassName . '.php' ); + if ($oDetails) { + $oPluginRegistry->disablePlugin ( $oDetails->sNamespace ); + } + } + } + } + file_put_contents ( PATH_DATA_SITE . 'plugin.singleton', $oPluginRegistry->serializeInstance () ); + } + } + } + + public function getCurrentLicenseStatus() + { + $result = array (); + switch ($this->result) { + case 'OK': + $result ['result'] = 'ok'; + $result ['message'] = ""; + break; + case 'TMINUS': + $result ['result'] = 'tminus'; + $startDateA=explode(" ",$this->date['HUMAN']['START']); + $result ['message'] = "License will be active on ".$startDateA[0]; + break; + case 'EXPIRED': + $result ['result'] = 'expired'; + $result ['message'] = "License Expired"; + break; + case 'ILLEGAL': + $result ['result'] = 'illegal'; + $result ['message'] = "Illegal License"; + break; + case 'ILLEGAL_LOCAL': + $result ['result'] = 'illegal'; + $result ['message'] = "Illegal Local License"; + break; + case 'INVALID': + $result ['result'] = 'invalid'; + $result ['message'] = "Invalid License"; + break; + case 'EMPTY': + $result ['result'] = 'empty'; + $result ['message'] = "Empty License"; + if (defined ( 'write_error' )) { + $result ['message'] = "Write error" . $result ['message']; + } + break; + default: + break; + } + return $result; + } + + public function unSerializeInstance($serialized) + { + if (self::$instance == null) { + self::$instance = new PMPluginRegistry (); + } + $instance = unserialize ( $serialized ); + self::$instance = $instance; + } + + public function getExpireIn() + { + $status = $this->getCurrentLicenseStatus (); + $expireIn = 0; + if ($status ['result'] == 'ok') { + if ($this->date ['END']!="NEVER") { + $expireIn = ceil ( ($this->date ['END'] - time ()) / 60 / 60 / 24 ); + } else { + $expireIn = "NEVER"; + } + } + return $expireIn; + } + + public function getLicenseInfo() + { + $validStatus = array ( + 'ok', + 'expired' + ); + $status = $this->getCurrentLicenseStatus (); + $infoText = ""; + if (in_array ( $status ['result'], $validStatus )) { + $start = explode ( " ", $this->date ['HUMAN'] ['START'] ); + $end = explode ( " ", $this->date ['HUMAN'] ['END'] ); + $infoText .= "" . "Issued to" . ": " . $this->info ['FIRST_NAME'] . " " . $this->info ['LAST_NAME'] . "
"; + $infoText .= "" . G::LoadTranslation('ID_WORKSPACE') .": " . $this->info ['DOMAIN_WORKSPACE'] . "
"; + $infoText .= "" . G::LoadTranslation('ID_VALID_FROM') . " " . $start [0] . " " . G::LoadTranslation('ID_TO') . " " . $end [0] . ""; + } + if ($status ['message'] != "") { + $infoText .= " - " . $status ['message'] . ""; + } + $info ['infoText'] = $infoText; + $info ['infoLabel'] = $status ['message']; + return $info; + } + + public function getExpireInLabel() + { + $linkText = null; + + if ($this->getExpireIn() != "NEVER" && ((int)$this->getExpireIn() <= 30) && ((int)$this->getExpireIn() > 0)) { + $infoO = $this->getLicenseInfo(); + $infoText = $infoO['infoText']; + $js = (EnterpriseUtils::skinIsUx() == 1)? "Ext.MessageBox.show({title: '', msg: '$infoText', buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.INFO});" : "msgBox('$infoText');"; + $linkText = $linkText . "" . G::LoadTranslation('ID_EXPIRES_IN') ." " . $this->getExpireIn () . " " . G::LoadTranslation('ID_DAYS') .""; + } else { + if ($this->getExpireIn() != "NEVER" && (int)$this->getExpireIn() <= 0) { + $infoO = $this->getLicenseInfo(); + $infoText = $infoO['infoText']; + $infoLabel = $infoO['infoLabel']; + $js = (EnterpriseUtils::skinIsUx() == 1)? "Ext.MessageBox.show({title: '', msg: '$infoText', buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.INFO});" : "msgBox('$infoText');"; + $linkText = $linkText . "" . $infoLabel . ""; + } + } + + if (class_exists('pmTrialPlugin')) { + $linkText = $linkText . " "; + } + + if (isset($_SESSION["__ENTERPRISE_SYSTEM_UPDATE__"]) && $_SESSION["__ENTERPRISE_SYSTEM_UPDATE__"] == 1) { + $aOnclick = "onclick=\"this.href='" . EnterpriseUtils::getUrlServerName() . "/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN . "/setup/main?s=PMENTERPRISE';\""; + if (EnterpriseUtils::skinIsUx() == 1) { + $aOnclick = "onclick=\"Ext.ComponentMgr.get('mainTabPanel').setActiveTab('pm-option-setup'); Ext.ComponentMgr.get('pm-option-setup').setLocation(Ext.ComponentMgr.get('pm-option-setup').defaultSrc + 's=PMENTERPRISE', true); return (false);\""; + } + $linkText = $linkText . (($linkText != null)? " | " : null) . "" . G::LoadTranslation('ID_UPGRADE_SYSTEM') . ""; + } + $linkText = ($linkText != null)? $linkText . ((EnterpriseUtils::skinIsUx() == 1)? null : " |") : null; + return ($linkText); + } + + public function validateLicense($path) + { + $application = new license_application ( $path, false, true, false, true, true ); + $results = $application->validate ( false, false, "", "", "80", true ); + + if ($results ['RESULT'] != 'OK') { + return true; + } else { + return false; + } + } + + public function installLicense($path, $redirect = true) + { + $application = new license_application ( $path, false, true, false, true, true ); + $results = $application->validate ( false, false, "", "", "80", true ); + //if the result is ok then it is saved into DB + $res = $results ['RESULT']; + if (( $res != 'OK') && ($res != 'EXPIRED' ) && ($res != 'TMINUS') ) { + G::SendTemporalMessage ( 'ID_ISNT_LICENSE', 'tmp-info', 'labels' ); + return false; + } else { + G::LoadClass ( 'serverConfiguration' ); + $oServerConf = & serverConf::getSingleton (); + $oServerConf->setProperty ( 'ACTIVE_LICENSE',array(SYS_SYS => $path)); + $this->saveDataLicense( $results, $path, $redirect ); + if ($redirect) { + G::Header ( 'location: licenseManagerList' ); + } else { + return true; + } + } + } + /* + get Active License + */ + public function getActiveLicense() + { + //Autoinstall license if exists in data folder and move to license folder + $dirData = PATH_DATA; + $dirDataSite = PATH_DATA_SITE; + $dirDataSiteLic = PATH_DATA_SITE . "licenses"; + + G::verifyPath($dirDataSiteLic, true); + + $licfile = glob($dirDataSite . "*.dat"); + if (count($licfile) > 0 && is_file($licfile[0])) { + $file = $licfile[0]; + @copy($file, $dirDataSiteLic . PATH_SEP . basename($file)); + $this->installLicense($dirDataSiteLic . PATH_SEP . basename($file), false); + @unlink($file); + } + + //get license from database, table LICENSE_MANAGER + try { + $aRow = array(); + require_once ("classes/model/LicenseManager.php"); + $oCriteria = new Criteria('workflow'); + $oCriteria->addSelectColumn(LicenseManagerPeer::LICENSE_USER); + $oCriteria->addSelectColumn(LicenseManagerPeer::LICENSE_START); + $oCriteria->addSelectColumn(LicenseManagerPeer::LICENSE_PATH); + $oCriteria->addSelectColumn(LicenseManagerPeer::LICENSE_DATA); + $oCriteria->add(LicenseManagerPeer::LICENSE_STATUS, 'ACTIVE'); + $oDataset = LicenseManagerPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $aRow = $oDataset->getRow(); + } catch (Exception $e) { + G::pr ($e); + } + return $aRow; + } + + public function lookForStatusLicense() + { + require_once ("classes/model/LicenseManager.php"); + //obtening info in a row that has ACTIVE status + $oCtia = new Criteria ( 'workflow' ); + $oCtia->add ( LicenseManagerPeer::LICENSE_STATUS, 'ACTIVE' ); + $oDataset = LicenseManagerPeer::doSelectRS ( $oCtia ); + $oDataset->next (); + $aRow = $oDataset->getRow (); + + $oCtiaA = new Criteria ( 'workflow' ); + $oCtiaA->add ( LicenseManagerPeer::LICENSE_UID, $aRow [0] ); + + $oCtiaB = new Criteria ( 'workflow' ); + $oCtiaB->add ( LicenseManagerPeer::LICENSE_STATUS, 'INACTIVE' ); + BasePeer::doUpdate ( $oCtiaA, $oCtiaB, Propel::getConnection ( 'workflow' ) ); + return 'ACTIVE'; + } + + public function saveDataLicense($results, $path) + { + try { + //getting info about file + $LicenseUid = G::generateUniqueID (); + $LicenseUser = $results ['DATA'] ['FIRST_NAME'] . ' ' . $results ['DATA'] ['LAST_NAME']; + $LicenseStart = $results ['DATE'] ['START']; + $LicenseEnd = $results ['DATE'] ['END']; + $LicenseSpan = $results ['DATE'] ['SPAN']; + $LicenseStatus = $this->lookForStatusLicense(); //we're looking for a status ACTIVE + + //getting the content from file + $handle = fopen ( $path, "r" ); + $contents = fread ( $handle, filesize ( $path ) ); + fclose ( $handle ); + $LicenseData = $contents; + $LicensePath = $path; + $LicenseWorkspace = isset($results['DATA']['DOMAIN_WORKSPACE']) ? $results['DATA']['DOMAIN_WORKSPACE'] : ''; + $LicenseType = $results['DATA']['TYPE']; + + require_once ("classes/model/LicenseManager.php"); + + //if exists the row in the database propel will update it, otherwise will insert. + $tr = LicenseManagerPeer::retrieveByPK ( $LicenseUid ); + if (! (is_object ( $tr ) && get_class ( $tr ) == 'LicenseManager')) { + $tr = new LicenseManager (); + } + $tr->setLicenseUid ( $LicenseUid ); + $tr->setLicenseUser ( $LicenseUser ); + $tr->setLicenseStart ( $LicenseStart ); + $tr->setLicenseEnd ( $LicenseEnd ); + $tr->setLicenseSpan ( $LicenseSpan ); + $tr->setLicenseStatus ( $LicenseStatus ); + $tr->setLicenseData ( $LicenseData ); + $tr->setLicensePath ( $LicensePath ); + $tr->setLicenseWorkspace ( $LicenseWorkspace ); + $tr->setLicenseType ( $LicenseType ); + + $res = $tr->save (); + } catch ( Exception $e ) { + G::pr($e); + } + } + + public function getResultQry($sNameTable, $sfield, $sCondition) + { + try { + require_once ("classes/model/LicenseManager.php"); + $oCriteria = new Criteria ( 'workflow' ); + $oCriteria->addSelectColumn ( LicenseManagerPeer::LICENSE_USER ); + $oCriteria->addSelectColumn ( LicenseManagerPeer::LICENSE_START ); + $oCriteria->addSelectColumn ( LicenseManagerPeer::LICENSE_PATH ); + $oCriteria->addSelectColumn ( LicenseManagerPeer::LICENSE_DATA ); + $oCriteria->add ( LicenseManagerPeer::LICENSE_STATUS, 'ACTIVE' ); + $oDataset = LicenseManagerPeer::doSelectRS ( $oCriteria ); + $oDataset->setFetchmode ( ResultSet::FETCHMODE_ASSOC ); + $oDataset->next (); + $aRow = $oDataset->getRow (); + } catch (Exception $e) { + G::pr ( $e ); + $aRow = array (); + } + return $aRow; + } + + public function getActiveFeatures() + { + return unserialize(G::decrypt($this->serial, file_get_contents(PATH_PLUGINS . 'enterprise/data/default'))); + } +} + diff --git a/workflow/engine/classes/model/AddonsManager.php b/workflow/engine/classes/model/AddonsManager.php new file mode 100644 index 000000000..fa3f9f69e --- /dev/null +++ b/workflow/engine/classes/model/AddonsManager.php @@ -0,0 +1,454 @@ +getAddonDownloadFilename(); + if (!isset($filename) || empty($filename)) { + $filename = "download.tar"; + } + $dir = $this->getDownloadDirectory(); + return "$dir/$filename"; + } + + public function getDownloadDirectory() + { + $dir = PATH_DATA . "upgrade/{$this->getStoreId()}_{$this->getAddonName()}"; + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + return ($dir); + } + + /** + * Check to see if the download file exists and has the right data. + * + * @return mixed true if exists and md5 is good, false otherwise. Returns null + * if file exists but md5 for the download is not available. + */ + public function checkDownload() + { + $filename = $this->getDownloadFilename(); + if (!file_exists($filename)) { + return false; + } + $download_md5 = $this->getAddonDownloadMd5(); + if ($download_md5 == null) { + return null; + } + return (strcasecmp(md5_file($filename), $download_md5) == 0); + } + + /** + * Returns if this addon is of type 'plugin' + * + * @return bool true if is of type 'plugin', false otherwise + */ + public function isPlugin() + { + return ($this->getAddonType() == 'plugin'); + } + + /** + * Returns if this addon is of type 'core' + * + * @return bool true if is of type 'core', false otherwise + */ + public function isCore() + { + return ($this->getAddonType() == 'core'); + } + + /** + * Returns if this addon is installed or not- + * + * @return bool true if installed, false otherwise + */ + public function isInstalled() + { + if ($this->isCore()) { + return ($this->getAddonVersion() == $this->getInstalledVersion()); + } elseif ($this->isPlugin()) { + return (file_exists(PATH_PLUGINS . "{$this->getAddonName()}.php")); + } else { + throw new Exception("Addon type '{$this->getAddonType()}' unsupported"); + } + } + + /** + * Returns if this addon is enabled or not. + * + * @return bool true if enabled, false otherwise + */ + public function isEnabled() + { + if ($this->isCore()) { + return $this->isInstalled(); + } elseif ($this->isPlugin()) { + if (!$this->isInstalled()) { + return false; + } + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $status = $oPluginRegistry->getStatusPlugin($this->getAddonName()); + return (strcmp($status, "enabled") == 0); + } else { + throw new Exception("Addon type '{$this->getAddonType()}' unsupported"); + } + } + + public function setEnabled($enable = true) + { + if (!$this->isInstalled() || !$this->isPlugin()) { + return false; + } + if ($this->getAddonName() == "enterprise") { + return false; + } + + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + + require_once (PATH_PLUGINS . $this->getAddonName() . ".php"); + + if ($enable) { + //$oDetails = $oPluginRegistry->getPluginDetails($this->getAddonName()); + //$oPluginRegistry->enablePlugin($oDetails->sNamespace); + //require_once (PATH_PLUGINS . $this->getAddonName() . ".php"); //ok + $oPluginRegistry->enablePlugin($this->getAddonName()); + } else { + //$oDetails = $oPluginRegistry->getPluginDetails($this->getAddonName()); + //$oPluginRegistry->disablePlugin($oDetails->sNamespace); + $oPluginRegistry->disablePlugin($this->getAddonName()); + } + + //$oPluginRegistry->setupPlugins(); + file_put_contents(PATH_DATA_SITE . "plugin.singleton", $oPluginRegistry->serializeInstance()); + return true; + } + + /** + * Returns the currently installed version of this addon. + * + * @return string the installed version or an empty string otherwise. + */ + public function getInstalledVersion() + { + if ($this->isCore()) { + G::LoadClass("system"); + return (EnterpriseUtils::pmVersion(System::getVersion())); + } else { + if ($this->isPlugin()) { + if (!$this->isInstalled()) { + return (null); + } + + /////// + if (file_exists(PATH_PLUGINS . $this->getAddonName() . PATH_SEP . "VERSION")) { + return (trim(file_get_contents(PATH_PLUGINS . $this->getAddonName() . PATH_SEP . "VERSION"))); + } + + /////// + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $details = $oPluginRegistry->getPluginDetails($this->getAddonName() . ".php"); + + $v = (!($details == null))? $details->iVersion : null; + return ($v); + } else { + if ($this->getAddonType() == "core") { + throw new Exception("Addon type \"" . $this->getAddonType() . "\" unsupported"); + } + } + } + } + + public function refresh() + { + /* Update our information from the db */ + $rs = $this->getPeer()->doSelectRS($this->buildPkeyCriteria()); + $rs->first(); + $this->hydrate($rs); + } + + /** + * Download this addon from the download url. + * + * @return bool true on success, false otherwise. + */ + public function download() + { + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.pmLicenseManager.php'; + + $this->setState("download"); + + /////// + $aux = explode("?", $this->getAddonDownloadUrl()); + + $url = $aux[0]; + $var = explode("&", $aux[1]); + + /////// + $boundary = "---------------------" . substr(md5(rand(0, 32000)), 0, 10); + $data = null; + + for ($i = 0; $i <= count($var) - 1; $i++) { + $aux = explode("=", $var[$i]); + + $data = $data . "--$boundary\n"; + $data = $data . "Content-Disposition: form-data; name=\"" . $aux[0] . "\"\n\n" . $aux[1] . "\n"; + } + + if (count($var) > 0) { + $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-Type: image/jpeg\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", + //"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); + + /////// + $handle = fopen($url, "rb", false, $context); + + if ($handle === false) { + throw new Exception("Could not open download url."); + } + + $this->setAddonDownloadFilename(null); + + //Try to get the download size and filename (ok if it fails) + $meta = stream_get_meta_data($handle); + $totalSize = 0; + + if ($meta["wrapper_type"] == "http") { + foreach ($meta["wrapper_data"] as $info) { + $info = explode(":", $info); + if (strcasecmp(trim($info[0]), "Content-Length") == 0) { + $totalSize = intval(trim($info[1])); + } + if (strcasecmp(trim($info[0]), "Content-Disposition") == 0) { + foreach (explode(";", $info[1]) as $params) { + $params = explode("=", $params); + if (count($params) <= 1) { + continue; + } + if (strcasecmp(trim($params[0]), "filename") == 0) { + $this->setAddonDownloadFilename(trim($params[1], "\" ")); + } + } + } + } + } + + //Save the filename + $this->save(); + + $units = array(" B", " KB", " MB", " GB", " TB"); + //if ($totalSize) { + // $bytes = $totalSize; + // for ($i = 0; $bytes >= 1024 && $i < 4; $i++) $bytes /= 1024; + // printf("Download size: %.2f%s\n", round($bytes, 2), $units[$i]); + //} + + $downloadFile = $this->getDownloadFilename(); + $file = @fopen($downloadFile, "wb"); + + if ($file === false) { + throw new Exception("Could not open destination file."); + } + + $start = microtime(true); + + while (!feof($handle)) { + $this->refresh(); + /* Check if download was cancelled from the ui */ + if ($this->getAddonState() == "cancel" || $this->getAddonState() == "") { + $this->setState(); + break; + } + /* Update the database information to show we are still alive */ + $this->setState("download"); + $data = fread($handle, BUFSIZE); + //TODO: We should use these values for something + $elapsed = microtime(true) - $start; + $position = ftell($handle); + $rate = $position / $elapsed; + if ($totalSize) { + $progress = 100 * ($position / $totalSize); + $this->setAddonDownloadProgress($progress); + $this->save(); + } + /* Just to be safe, check all error conditions */ + if ($data === "" or $data === false) { + break; + } + if (fwrite($file, $data) === false) { + break; + } + } + fclose($handle); + fclose($file); + + if ($elapsed > 60) { + $time = sprintf("%.0f minutes and %.0f seconds", round($elapsed / 60), round($elapsed) % 60); + } else { + $time = sprintf("%.0f seconds", round($elapsed)); + } + + for ($i = 0; $position >= 1024 && $i < 4; $i++) { + $position /= 1024; + } + for ($j = 0; $rate >= 1024 && $j < 4; $j++) { + $rate /= 1024; + } + //printf("Downloaded %.2f%s in %s (rate: %.2f%s/s)\n", $position, $units[$i], $time, $rate, $units[$j]); + + return ($this->checkDownload()); + } + + /** + * Install this addon from the downloaded file. + */ + public function install() + { + $this->setState("install"); + + $filename = $this->getDownloadFilename(); + //if ($this->checkDownload() === false) { + // throw new Exception("Download file is invalid"); + //} + + if ($this->isPlugin()) { + if ($this->getAddonId() == "enterprise") { + $_SESSION["__ENTERPRISE_INSTALL__"] = 1; + } + + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $oPluginRegistry->installPluginArchive($filename, $this->getAddonName()); + + $this->setState(); + } else { + if ($this->getAddonType() == "core") { + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.Upgrade.php'; + $upgrade = new Upgrade($this); + + $upgrade->install(); + } else { + throw new Exception("Addon type {$this->getAddonType()} not supported."); + } + } + } + + public function uninstall() + { + if ($this->isPlugin()) { + if (!$this->isInstalled()) { + return false; + } + + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $oPluginRegistry->uninstallPlugin($this->getAddonName()); + + return true; + } + } + + public function getInstallLog() + { + $logFile = $this->getDownloadDirectory() . "/download.log"; + $contents = false; + if (file_exists($logFile)) { + $contents = @file_get_contents($logFile); + } + if ($contents === false) { + return null; + } + return $contents; + } + + public function setState($state = "") + { + $this->setAddonState($state); + $this->setAddonStateChanged('now'); + $this->save(); + } + + public function checkState() + { + if ($this->getAddonState() == 'error') { + $this->setState(); + return false; + } + if ($this->getAddonState() == '' || $this->getAddonState() == 'install-finish') { + return true; + } + $elapsed = time() - strtotime($this->getAddonStateChanged()); + $timeout = 3; + if ($this->isCore()) { + $timeout = 10; + } + if ($elapsed > $timeout * 60) { + $this->setState(); + return false; + } + return true; + } +} + diff --git a/workflow/engine/classes/model/AddonsManagerPeer.php b/workflow/engine/classes/model/AddonsManagerPeer.php new file mode 100644 index 000000000..ce8c2c152 --- /dev/null +++ b/workflow/engine/classes/model/AddonsManagerPeer.php @@ -0,0 +1,24 @@ +setStoreId($storeId); + $store->setStoreLocation($storeLocation); + $store->setStoreVersion($storeVersion); + $store->setStoreType($storeType); + + return AddonsStorePeer::doInsert($store); + } + + /** + * Check if the current license has a store and removes unwanted stores. + * + * @return bool true if a store was added, false otherwise. + */ + public static function checkLicenseStore() + { + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.pmLicenseManager.php'; + + //getting the licenseManager.... + $licenseManager = &pmLicenseManager::getSingleton(); + + if (isset($licenseManager->id)) { + //Remove any license store that is not the active license + $criteria = new Criteria(AddonsStorePeer::DATABASE_NAME); + $criteria->addSelectColumn("*"); + $criteria->add(AddonsStorePeer::STORE_TYPE, "license", Criteria::EQUAL); + $criteria->add(AddonsStorePeer::STORE_ID, $licenseManager->id, Criteria::NOT_EQUAL); + + foreach (AddonsStorePeer::doSelect($criteria) as $store) { + $store->clear(); + } + + AddonsStorePeer::doDelete($criteria); + + //If the active license doesn't have a store, add one for it + if (AddonsStorePeer::retrieveByPK($licenseManager->id) === null) { + preg_match("/^license_(.*).dat$/", $licenseManager->file, $matches); + $realId = urlencode($matches[1]); + $addonLocation = "http://{$licenseManager->server}/syspmLicenseSrv/en/green/services/addonsStore?action=getInfo&licId=$realId"; + + self::addStore($licenseManager->id, $addonLocation); + + return true; + } + } + + return false; + } + + public static function addonList() + { + $result = array(); + + AddonsStore::checkLicenseStore(); + + $licenseManager = &pmLicenseManager::getSingleton(); //Getting the licenseManager + + $result["store_errors"] = array(); + list($stores, $errors) = AddonsStore::updateAll(false); + + foreach ($errors as $store_id => $store_error) { + $result["store_errors"][] = array("id" => $store_id, "msg" => $store_error); + } + + $result["addons"] = array(); + $result["errors"] = array(); + + $criteria = new Criteria(); + $criteria->addAscendingOrderByColumn(AddonsManagerPeer::ADDON_TYPE); + $criteria->addAscendingOrderByColumn(AddonsManagerPeer::ADDON_ID); + $addons = AddonsManagerPeer::doSelect($criteria); + + foreach ($addons as $addon) { + $status = $addon->getAddonStatus(); + $version = $addon->getAddonVersion(); + $enabled = null; + + if (!$addon->checkState()) { + $result["errors"][] = array("addonId" => $addon->getAddonId(), "storeId" => $addon->getStoreId()); + } + + $sw = 1; + $addonInLicense = in_array($addon->getAddonId(), $licenseManager->features); + + if ($sw == 1 && $addon->getAddonId() != "enterprise" && !$addonInLicense) { + $sw = 0; + } + + if ($sw == 1 && $addon->isInstalled()) { + if ($addon->isEnabled()) { + $status = "installed"; + } else { + $status = "disabled"; + } + + $version = $addon->getInstalledVersion(); + + if (version_compare($version . "", $addon->getAddonVersion() . "", "<")) { + $status = "upgrade"; + } + + $enabled = $addon->isEnabled(); + $sw = 0; + } + + if ($sw == 1 && $addonInLicense) { + $status = "ready"; + $sw = 0; + } + + $state = $addon->getAddonState(); + $log = null; + + if ($state != null) { + $status = $state; + $log = $addon->getInstallLog(); + } + if ($addon->getAddonId() == "enterprise" && $status== 'ready') { + $status = 'installed'; + } + + $result["addons"][$addon->getAddonId()] = array( + "id" => $addon->getAddonId(), + "store" => $addon->getStoreId(), + "name" => $addon->getAddonName(), + "nick" => $addon->getAddonNick(), + "version" => $version, + "enabled" => $enabled, + "latest_version" => $addon->getAddonVersion(), + "type" => $addon->getAddonType(), + "release_type" => $addon->getAddonReleaseType(), + "url" => $addon->getAddonDownloadUrl(), + "publisher" => $addon->getAddonPublisher(), + "description" => $addon->getAddonDescription(), + "status" => $status, + "log" => $log, + "progress" => round($addon->getAddonDownloadProgress()) + ); + } + + return $result; + } + + /** + * Returns all stores as AddonsStore objects. + * + * @return array of AddonsStore objects + */ + public static function listStores() + { + $criteria = new Criteria(AddonsStorePeer::DATABASE_NAME); + + return AddonsStorePeer::doSelect($criteria); + } + + /** + * Updates all stores + * + * @return array containing a 'stores' array and a 'errors' array + */ + public static function updateAll($force = false) + { + $stores = array(); + $errors = array(); + + foreach (self::listStores() as $store) { + try { + $stores[$store->getStoreId()] = $store->update($force); + } catch (Exception $e) { + $errors[$store->getStoreId()] = $e->getMessage(); + } + } + + return array($stores, $errors); + } + + /** + * Clear this store addons + * + * @return int number of addons removed + */ + public function clear() + { + /* Remove old items from this store */ + $criteria = new Criteria(AddonsManagerPeer::DATABASE_NAME); + $criteria->add(AddonsManagerPeer::STORE_ID, $this->getStoreId(), Criteria::EQUAL); + + return AddonsManagerPeer::doDelete($criteria); + } + + /** + * Update this store information from the store location. + * + * @return bool true if updated, false otherwise + */ + public function update($force = false) + { + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.pmLicenseManager.php'; + + if (!class_exists('AddonsManagerPeer')) { + require_once ('classes/model/AddonsManager.php'); + } + + //If we have any addon that is installing or updating, don't update store + $criteria = new Criteria(AddonsManagerPeer::DATABASE_NAME); + $criteria->add(AddonsManagerPeer::ADDON_STATE, '', Criteria::NOT_EQUAL); + + if (AddonsManagerPeer::doCount($criteria) > 0) { + return false; + } + + $this->clear(); + + //Fill with local information + + //List all plugins installed + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $aPluginsPP = array(); + + if (file_exists(PATH_DATA_SITE . 'ee')) { + $aPluginsPP = unserialize(trim(file_get_contents(PATH_DATA_SITE . 'ee'))); + } + + $pmLicenseManagerO = &pmLicenseManager::getSingleton(); + $localPlugins = array(); + + foreach ($aPluginsPP as $aPlugin) { + $sClassName = substr($aPlugin['sFilename'], 0, strpos($aPlugin['sFilename'], '-')); + + if (file_exists(PATH_PLUGINS . $sClassName . '.php')) { + require_once PATH_PLUGINS . $sClassName . '.php'; + + $oDetails = $oPluginRegistry->getPluginDetails($sClassName . '.php'); + + if ($oDetails) { + $sStatus = $oDetails->enabled ? G::LoadTranslation('ID_ENABLED') : G::LoadTranslation('ID_DISABLED'); + + if (isset($oDetails->aWorkspaces)) { + if (!in_array(SYS_SYS, $oDetails->aWorkspaces)) { + continue; + } + } + + if ($sClassName == "pmLicenseManager" || $sClassName == "pmTrial") { + continue; + } + + $sEdit = (($oDetails->sSetupPage != '') && ($oDetails->enabled)? G::LoadTranslation('ID_SETUP') : ' '); + $aPlugin = array(); + $aPluginId = $sClassName; + $aPluginTitle = $oDetails->sFriendlyName; + $aPluginDescription = $oDetails->sDescription; + $aPluginVersion = $oDetails->iVersion; + + if (@in_array($sClassName, $pmLicenseManagerO->features)) { + $aPluginStatus = $sStatus; + $aPluginLinkStatus = 'pluginsChange?id=' . $sClassName . '.php&status=' . $oDetails->enabled; + $aPluginEdit = $sEdit; + $aPluginLinkEdit = 'pluginsSetup?id=' . $sClassName . '.php'; + $aPluginStatusA = $sStatus == "Enabled" ? "installed" : 'disabled'; + $enabledStatus = true; + } else { + $aPluginStatus = ""; + $aPluginLinkStatus = ''; + $aPluginEdit = ''; + $aPluginLinkEdit = ''; + $aPluginStatusA = 'minus-circle'; + $enabledStatus = false; + } + + $addon = new AddonsManager(); + //G::pr($addon); + $addon->setAddonId($aPluginId); + $addon->setStoreId($this->getStoreId()); + //Don't trust external data + $addon->setAddonName($aPluginId); + $addon->setAddonDescription($aPluginDescription); + $addon->setAddonNick($aPluginTitle); + $addon->setAddonVersion(""); + $addon->setAddonStatus($aPluginStatusA); + $addon->setAddonType("plugin"); + $addon->setAddonPublisher("Colosa"); + $addon->setAddonDownloadUrl(""); + $addon->setAddonDownloadMd5(""); + $addon->setAddonReleaseDate(null); + $addon->setAddonReleaseType('localRegistry'); + $addon->setAddonReleaseNotes(""); + $addon->setAddonState(""); + + $addon->save(); + + $localPlugins[$aPluginId] = $addon; + } + } + } + + $this->setStoreLastUpdated(time()); + $this->save(); + + $url = $this->getStoreLocation(); + + //Validate url + $licenseInfo = $pmLicenseManagerO->getActiveLicense(); + $licenseId = str_replace('.dat', '', str_replace('license_', '', basename($licenseInfo['LICENSE_PATH']))); + + $url = explode('&', $url); + $url[count($url) - 1] = 'licId=' . urlencode($licenseId); + $url = implode('&', $url); + + if (EnterpriseUtils::getInternetConnection() == 1 && EnterpriseUtils::checkConnectivity($url) == true) { + $option = array( + "http" => array( + "method" => "POST", + "header" => "Content-type: application/x-www-form-urlencoded\r\n", + "content" => http_build_query( + array( + "pmVersion" => System::getVersion(), + "version" => STORE_VERSION + ) + ) + ) + ); + + // Proxy settings + $sysConf = System::getSystemConfiguration(); + if (isset($sysConf['proxy_host'])) { + 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); + + //This may block for a while, always use AJAX to call this method + $data = file_get_contents($url, false, $context); + + if ($data === false) { + throw new Exception("Could not contact store"); + } + + $serverData = G::json_decode($data); + + //Don't trust external data + if (empty($serverData)) { + throw (new Exception("Store data invalid ('$data')")); + } + + if (isset($serverData->error)) { + throw (new Exception("Store sent us an error: {$serverData->error}")); + } + + if (!isset($serverData->version)) { + throw (new Exception("Store version not found")); + } + + if ($serverData->version != STORE_VERSION) { + throw (new Exception("Store version '{$serverData->version}' unsupported")); + } + + if (!isset($serverData->addons)) { + throw (new Exception("Addons not found on store data")); + } + + $this->clear(); + + try { + //Add each item to this stores addons + $addons = @get_object_vars($serverData->addons); + + if (!empty($addons)) { + foreach (get_object_vars($serverData->addons) as $addonId => $addonInfo) { + $addon = new AddonsManager(); + $addon->setAddonId($addonId); + $addon->setStoreId($this->getStoreId()); + //Don't trust external data + $addon->setAddonName(isset($addonInfo->name)? $addonInfo->name : $addonId); + $addon->setAddonDescription(isset($addonInfo->description)? $addonInfo->description : ""); + $addon->setAddonNick(isset($addonInfo->nick)? $addonInfo->nick : ""); + $addon->setAddonVersion(isset($addonInfo->version)? $addonInfo->version : ""); + $addon->setAddonStatus(isset($addonInfo->status)? $addonInfo->status : ""); + $addon->setAddonType(isset($addonInfo->type)? $addonInfo->type : ""); + $addon->setAddonPublisher(isset($addonInfo->publisher)? $addonInfo->publisher : ""); + $addon->setAddonDownloadUrl(isset($addonInfo->download_url)? $addonInfo->download_url : "http://" . $pmLicenseManagerO->server . "/syspmLicenseSrv/en/green/services/rest?action=getPlugin&OBJ_UID=" . $addonInfo->guid); + $addon->setAddonDownloadMd5(isset($addonInfo->download_md5)? $addonInfo->download_md5 : ""); + $addon->setAddonReleaseDate(isset($addonInfo->release_date)? $addonInfo->release_date : ""); + $addon->setAddonReleaseType(isset($addonInfo->release_type)? $addonInfo->release_type : ''); + $addon->setAddonReleaseNotes(isset($addonInfo->release_notes)? $addonInfo->release_notes : ""); + $addon->setAddonState(""); + + $addon->save(); + + if (isset($localPlugins[$addonId])) { + unset($localPlugins[$addonId]); + } + } + + foreach ($localPlugins as $keyPlugin => $addonA) { + //G::pr($addonA ); + //$addonA->save(); + $addon = new AddonsManager(); + //G::pr($addon); + $addon->setAddonId($addonA->getAddonId()); + $addon->setStoreId($addonA->getStoreId()); + //Don't trust external data + $addon->setAddonName($addonA->getAddonName()); + $addon->setAddonDescription($addonA->getAddonDescription()); + $addon->setAddonNick($addonA->getAddonNick()); + $addon->setAddonVersion(""); + $addon->setAddonStatus($addonA->getAddonStatus()); + $addon->setAddonType($addonA->getAddonType()); + $addon->setAddonPublisher($addonA->getAddonPublisher()); + $addon->setAddonDownloadUrl($addonA->getAddonDownloadUrl()); + $addon->setAddonDownloadMd5($addonA->getAddonDownloadMd5()); + $addon->setAddonReleaseDate(null); + $addon->setAddonReleaseType('localRegistry'); + $addon->setAddonReleaseNotes(""); + $addon->setAddonState(""); + + $addon->save(); + } + } + + $this->setStoreLastUpdated(time()); + $this->save(); + } catch (Exception $e) { + //If we had issues, don't keep only a part of the items + $this->clear(); + + throw $e; + } + } + + return true; + } +} + diff --git a/workflow/engine/classes/model/AddonsStorePeer.php b/workflow/engine/classes/model/AddonsStorePeer.php new file mode 100644 index 000000000..bee770ccf --- /dev/null +++ b/workflow/engine/classes/model/AddonsStorePeer.php @@ -0,0 +1,24 @@ +dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('propel'); + $tMap = $this->dbMap->addTable('ADDON_STORE'); + $tMap->setPhpName('AddonStore'); + + $tMap->setUseIdGenerator(false); + $tMap->addPrimaryKey('STORE_ID', 'StoreId', 'string', CreoleTypes::VARCHAR, true, 32); + $tMap->addColumn('STORE_VERSION', 'StoreVersion', 'int', CreoleTypes::INTEGER, false, null); + $tMap->addColumn('STORE_LOCATION', 'StoreLocation', 'string', CreoleTypes::VARCHAR, true, 2048); + $tMap->addColumn('LAST_UPDATED', 'LastUpdated', 'int', CreoleTypes::TIMESTAMP, false, null); + } +} + diff --git a/workflow/engine/classes/model/map/AddonsManagerMapBuilder.php b/workflow/engine/classes/model/map/AddonsManagerMapBuilder.php new file mode 100644 index 000000000..2b6d6c065 --- /dev/null +++ b/workflow/engine/classes/model/map/AddonsManagerMapBuilder.php @@ -0,0 +1,101 @@ +dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('workflow'); + + $tMap = $this->dbMap->addTable('ADDONS_MANAGER'); + + $tMap->setPhpName('AddonsManager'); + + $tMap->setUseIdGenerator(false); + + $tMap->addPrimaryKey('ADDON_ID', 'AddonId', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addPrimaryKey('STORE_ID', 'StoreId', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('ADDON_NAME', 'AddonName', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('ADDON_NICK', 'AddonNick', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('ADDON_DOWNLOAD_FILENAME', 'AddonDownloadFilename', 'string', CreoleTypes::VARCHAR, false, 1024); + + $tMap->addColumn('ADDON_DESCRIPTION', 'AddonDescription', 'string', CreoleTypes::VARCHAR, false, 2048); + + $tMap->addColumn('ADDON_STATE', 'AddonState', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('ADDON_STATE_CHANGED', 'AddonStateChanged', 'int', CreoleTypes::TIMESTAMP, false, null); + + $tMap->addColumn('ADDON_STATUS', 'AddonStatus', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('ADDON_VERSION', 'AddonVersion', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('ADDON_TYPE', 'AddonType', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('ADDON_PUBLISHER', 'AddonPublisher', 'string', CreoleTypes::VARCHAR, false, 255); + + $tMap->addColumn('ADDON_RELEASE_DATE', 'AddonReleaseDate', 'int', CreoleTypes::TIMESTAMP, false, null); + + $tMap->addColumn('ADDON_RELEASE_TYPE', 'AddonReleaseType', 'string', CreoleTypes::VARCHAR, false, 255); + + $tMap->addColumn('ADDON_RELEASE_NOTES', 'AddonReleaseNotes', 'string', CreoleTypes::VARCHAR, false, 255); + + $tMap->addColumn('ADDON_DOWNLOAD_URL', 'AddonDownloadUrl', 'string', CreoleTypes::VARCHAR, false, 2048); + + $tMap->addColumn('ADDON_DOWNLOAD_PROGRESS', 'AddonDownloadProgress', 'double', CreoleTypes::FLOAT, false, null); + + $tMap->addColumn('ADDON_DOWNLOAD_MD5', 'AddonDownloadMd5', 'string', CreoleTypes::VARCHAR, false, 32); + } +} + diff --git a/workflow/engine/classes/model/map/AddonsStoreMapBuilder.php b/workflow/engine/classes/model/map/AddonsStoreMapBuilder.php new file mode 100644 index 000000000..d97d723a5 --- /dev/null +++ b/workflow/engine/classes/model/map/AddonsStoreMapBuilder.php @@ -0,0 +1,80 @@ +dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('workflow'); + + $tMap = $this->dbMap->addTable('ADDONS_STORE'); + + $tMap->setPhpName('AddonsStore'); + + $tMap->setUseIdGenerator(false); + + $tMap->addPrimaryKey('STORE_ID', 'StoreId', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('STORE_VERSION', 'StoreVersion', 'int', CreoleTypes::INTEGER, false, null); + + $tMap->addColumn('STORE_LOCATION', 'StoreLocation', 'string', CreoleTypes::VARCHAR, true, 2048); + + $tMap->addColumn('STORE_TYPE', 'StoreType', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('STORE_LAST_UPDATED', 'StoreLastUpdated', 'int', CreoleTypes::TIMESTAMP, false, null); + } +} + diff --git a/workflow/engine/classes/model/map/LicenseManagerMapBuilder.php b/workflow/engine/classes/model/map/LicenseManagerMapBuilder.php new file mode 100644 index 000000000..83c6b193f --- /dev/null +++ b/workflow/engine/classes/model/map/LicenseManagerMapBuilder.php @@ -0,0 +1,88 @@ +dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('workflow'); + + $tMap = $this->dbMap->addTable('LICENSE_MANAGER'); + + $tMap->setPhpName('LicenseManager'); + + $tMap->setUseIdGenerator(false); + + $tMap->addPrimaryKey('LICENSE_UID', 'LicenseUid', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('LICENSE_USER', 'LicenseUser', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('LICENSE_START', 'LicenseStart', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('LICENSE_END', 'LicenseEnd', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('LICENSE_SPAN', 'LicenseSpan', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('LICENSE_STATUS', 'LicenseStatus', 'string', CreoleTypes::VARCHAR, false, 100); + + $tMap->addColumn('LICENSE_DATA', 'LicenseData', 'string', CreoleTypes::LONGVARCHAR, true, null); + + $tMap->addColumn('LICENSE_PATH', 'LicensePath', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('LICENSE_WORKSPACE', 'LicenseWorkspace', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('LICENSE_TYPE', 'LicenseType', 'string', CreoleTypes::VARCHAR, true, 32); + } +} + diff --git a/workflow/engine/classes/model/map/UpgradeManagerMapBuilder.php b/workflow/engine/classes/model/map/UpgradeManagerMapBuilder.php new file mode 100644 index 000000000..a5c491ae1 --- /dev/null +++ b/workflow/engine/classes/model/map/UpgradeManagerMapBuilder.php @@ -0,0 +1,79 @@ +dbMap !== null); + } + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('workflow'); + + $tMap = $this->dbMap->addTable('UPGRADE_MANAGER'); + + $tMap->setPhpName('UpgradeManager'); + + $tMap->setUseIdGenerator(false); + + $tMap->addPrimaryKey('COMPONENT_NAME', 'ComponentName', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('COMPONENT_NICK', 'ComponentNick', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('COMPONENT_STATE', 'ComponentState', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('COMPONENT_STATUS', 'ComponentStatus', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('COMPONENT_VERSION', 'ComponentVersion', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('COMPONENT_TYPE', 'ComponentType', 'string', CreoleTypes::VARCHAR, true, 255); + + $tMap->addColumn('STORE_ID', 'StoreId', 'string', CreoleTypes::VARCHAR, true, 32); + } +} + diff --git a/workflow/engine/classes/model/map/UpgradeStoreMapBuilder.php b/workflow/engine/classes/model/map/UpgradeStoreMapBuilder.php new file mode 100644 index 000000000..252fd7ffd --- /dev/null +++ b/workflow/engine/classes/model/map/UpgradeStoreMapBuilder.php @@ -0,0 +1,74 @@ +dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('workflow'); + + $tMap = $this->dbMap->addTable('UPGRADE_STORE'); + + $tMap->setPhpName('UpgradeStore'); + + $tMap->setUseIdGenerator(false); + + $tMap->addPrimaryKey('STORE_ID', 'StoreId', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('STORE_VERSION', 'StoreVersion', 'int', CreoleTypes::INTEGER, false, null); + + $tMap->addColumn('STORE_LOCATION', 'StoreLocation', 'string', CreoleTypes::VARCHAR, true, 2048); + + $tMap->addColumn('LAST_UPDATED', 'LastUpdated', 'int', CreoleTypes::TIMESTAMP, false, null); + } +} + diff --git a/workflow/engine/classes/model/om/BaseAddonsManager.php b/workflow/engine/classes/model/om/BaseAddonsManager.php new file mode 100644 index 000000000..a399db26b --- /dev/null +++ b/workflow/engine/classes/model/om/BaseAddonsManager.php @@ -0,0 +1,1468 @@ +addon_id; + } + + /** + * Get the [store_id] column value. + * + * @return string + */ + public function getStoreId () + { + return $this->store_id; + } + + /** + * Get the [addon_name] column value. + * + * @return string + */ + public function getAddonName () + { + return $this->addon_name; + } + + /** + * Get the [addon_nick] column value. + * + * @return string + */ + public function getAddonNick () + { + return $this->addon_nick; + } + + /** + * Get the [addon_download_filename] column value. + * + * @return string + */ + public function getAddonDownloadFilename () + { + return $this->addon_download_filename; + } + + /** + * Get the [addon_description] column value. + * + * @return string + */ + public function getAddonDescription () + { + return $this->addon_description; + } + + /** + * Get the [addon_state] column value. + * + * @return string + */ + public function getAddonState () + { + return $this->addon_state; + } + + /** + * Get the [optionally formatted] [addon_state_changed] column value. + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function getAddonStateChanged ($format = 'Y-m-d H:i:s') + { + if ($this->addon_state_changed === null || $this->addon_state_changed === '') { + return null; + } elseif (! is_int( $this->addon_state_changed )) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime( $this->addon_state_changed ); + if ($ts === - 1 || $ts === false) { + // in PHP 5.1 return value changes to FALSE + throw new PropelException( "Unable to parse value of [addon_state_changed] as date/time value: " . var_export( $this->addon_state_changed, true ) ); + } + } else { + $ts = $this->addon_state_changed; + } + if ($format === null) { + return $ts; + } elseif (strpos( $format, '%' ) !== false) { + return strftime( $format, $ts ); + } else { + return date( $format, $ts ); + } + } + + /** + * Get the [addon_status] column value. + * + * @return string + */ + public function getAddonStatus () + { + return $this->addon_status; + } + + /** + * Get the [addon_version] column value. + * + * @return string + */ + public function getAddonVersion () + { + return $this->addon_version; + } + + /** + * Get the [addon_type] column value. + * + * @return string + */ + public function getAddonType () + { + return $this->addon_type; + } + + /** + * Get the [addon_publisher] column value. + * + * @return string + */ + public function getAddonPublisher () + { + return $this->addon_publisher; + } + + /** + * Get the [optionally formatted] [addon_release_date] column value. + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function getAddonReleaseDate ($format = 'Y-m-d H:i:s') + { + if ($this->addon_release_date === null || $this->addon_release_date === '') { + return null; + } elseif (! is_int( $this->addon_release_date )) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime( $this->addon_release_date ); + if ($ts === - 1 || $ts === false) { + // in PHP 5.1 return value changes to FALSE + throw new PropelException( "Unable to parse value of [addon_release_date] as date/time value: " . var_export( $this->addon_release_date, true ) ); + } + } else { + $ts = $this->addon_release_date; + } + if ($format === null) { + return $ts; + } elseif (strpos( $format, '%' ) !== false) { + return strftime( $format, $ts ); + } else { + return date( $format, $ts ); + } + } + + /** + * Get the [addon_release_type] column value. + * + * @return string + */ + public function getAddonReleaseType () + { + return $this->addon_release_type; + } + + /** + * Get the [addon_release_notes] column value. + * + * @return string + */ + public function getAddonReleaseNotes () + { + return $this->addon_release_notes; + } + + /** + * Get the [addon_download_url] column value. + * + * @return string + */ + public function getAddonDownloadUrl () + { + return $this->addon_download_url; + } + + /** + * Get the [addon_download_progress] column value. + * + * @return double + */ + public function getAddonDownloadProgress () + { + return $this->addon_download_progress; + } + + /** + * Get the [addon_download_md5] column value. + * + * @return string + */ + public function getAddonDownloadMd5 () + { + return $this->addon_download_md5; + } + + /** + * Set the value of [addon_id] column. + * + * @param string $v new value + * @return void + */ + public function setAddonId ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_id !== $v) { + $this->addon_id = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_ID; + } + } // setAddonId() + + /** + * Set the value of [store_id] column. + * + * @param string $v new value + * @return void + */ + public function setStoreId ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->store_id !== $v) { + $this->store_id = $v; + $this->modifiedColumns[] = AddonsManagerPeer::STORE_ID; + } + } // setStoreId() + + /** + * Set the value of [addon_name] column. + * + * @param string $v new value + * @return void + */ + public function setAddonName ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_name !== $v) { + $this->addon_name = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_NAME; + } + } // setAddonName() + + /** + * Set the value of [addon_nick] column. + * + * @param string $v new value + * @return void + */ + public function setAddonNick ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_nick !== $v) { + $this->addon_nick = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_NICK; + } + + } // setAddonNick() + + /** + * Set the value of [addon_download_filename] column. + * + * @param string $v new value + * @return void + */ + public function setAddonDownloadFilename ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_download_filename !== $v) { + $this->addon_download_filename = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_DOWNLOAD_FILENAME; + } + } // setAddonDownloadFilename() + + /** + * Set the value of [addon_description] column. + * + * @param string $v new value + * @return void + */ + public function setAddonDescription ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_description !== $v) { + $this->addon_description = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_DESCRIPTION; + } + } // setAddonDescription() + + /** + * Set the value of [addon_state] column. + * + * @param string $v new value + * @return void + */ + public function setAddonState ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_state !== $v) { + $this->addon_state = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_STATE; + } + } // setAddonState() + + /** + * Set the value of [addon_state_changed] column. + * + * @param int $v new value + * @return void + */ + public function setAddonStateChanged ($v) + { + if ($v !== null && ! is_int( $v )) { + $ts = strtotime( $v ); + if ($ts === - 1 || $ts === false) { + // in PHP 5.1 return value changes to FALSE + throw new PropelException( "Unable to parse date/time value for [addon_state_changed] from input: " . var_export( $v, true ) ); + } + } else { + $ts = $v; + } + if ($this->addon_state_changed !== $ts) { + $this->addon_state_changed = $ts; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_STATE_CHANGED; + } + } // setAddonStateChanged() + + /** + * Set the value of [addon_status] column. + * + * @param string $v new value + * @return void + */ + public function setAddonStatus ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_status !== $v) { + $this->addon_status = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_STATUS; + } + } // setAddonStatus() + + /** + * Set the value of [addon_version] column. + * + * @param string $v new value + * @return void + */ + public function setAddonVersion ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_version !== $v) { + $this->addon_version = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_VERSION; + } + } // setAddonVersion() + + /** + * Set the value of [addon_type] column. + * + * @param string $v new value + * @return void + */ + public function setAddonType ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_type !== $v) { + $this->addon_type = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_TYPE; + } + } // setAddonType() + + /** + * Set the value of [addon_publisher] column. + * + * @param string $v new value + * @return void + */ + public function setAddonPublisher ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->addon_publisher !== $v) { + $this->addon_publisher = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_PUBLISHER; + } + } // setAddonPublisher() + + /** + * Set the value of [addon_release_date] column. + * + * @param int $v new value + * @return void + */ + public function setAddonReleaseDate ($v) + { + if ($v !== null && ! is_int( $v )) { + $ts = strtotime( $v ); + if ($ts === - 1 || $ts === false) { + // in PHP 5.1 return value changes to FALSE + throw new PropelException( "Unable to parse date/time value for [addon_release_date] from input: " . var_export( $v, true ) ); + } + } else { + $ts = $v; + } + if ($this->addon_release_date !== $ts) { + $this->addon_release_date = $ts; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_RELEASE_DATE; + } + } // setAddonReleaseDate() + + /** + * Set the value of [addon_release_type] column. + * + * @param string $v new value + * @return void + */ + public function setAddonReleaseType ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->addon_release_type !== $v) { + $this->addon_release_type = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_RELEASE_TYPE; + } + + } // setAddonReleaseType() + + /** + * Set the value of [addon_release_notes] column. + * + * @param string $v new value + * @return void + */ + public function setAddonReleaseNotes ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->addon_release_notes !== $v) { + $this->addon_release_notes = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_RELEASE_NOTES; + } + + } // setAddonReleaseNotes() + + /** + * Set the value of [addon_download_url] column. + * + * @param string $v new value + * @return void + */ + public function setAddonDownloadUrl ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->addon_download_url !== $v) { + $this->addon_download_url = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_DOWNLOAD_URL; + } + } // setAddonDownloadUrl() + + /** + * Set the value of [addon_download_progress] column. + * + * @param double $v new value + * @return void + */ + public function setAddonDownloadProgress ($v) + { + if ($this->addon_download_progress !== $v) { + $this->addon_download_progress = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_DOWNLOAD_PROGRESS; + } + } // setAddonDownloadProgress() + + /** + * Set the value of [addon_download_md5] column. + * + * @param string $v new value + * @return void + */ + public function setAddonDownloadMd5 ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->addon_download_md5 !== $v) { + $this->addon_download_md5 = $v; + $this->modifiedColumns[] = AddonsManagerPeer::ADDON_DOWNLOAD_MD5; + } + + } // setAddonDownloadMd5() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate (ResultSet $rs, $startcol = 1) + { + try { + + $this->addon_id = $rs->getString( $startcol + 0 ); + + $this->store_id = $rs->getString( $startcol + 1 ); + + $this->addon_name = $rs->getString( $startcol + 2 ); + + $this->addon_nick = $rs->getString( $startcol + 3 ); + + $this->addon_download_filename = $rs->getString( $startcol + 4 ); + + $this->addon_description = $rs->getString( $startcol + 5 ); + + $this->addon_state = $rs->getString( $startcol + 6 ); + + $this->addon_state_changed = $rs->getTimestamp( $startcol + 7, null ); + + $this->addon_status = $rs->getString( $startcol + 8 ); + + $this->addon_version = $rs->getString( $startcol + 9 ); + + $this->addon_type = $rs->getString( $startcol + 10 ); + + $this->addon_publisher = $rs->getString( $startcol + 11 ); + + $this->addon_release_date = $rs->getTimestamp( $startcol + 12, null ); + + $this->addon_release_type = $rs->getString( $startcol + 13 ); + + $this->addon_release_notes = $rs->getString( $startcol + 14 ); + + $this->addon_download_url = $rs->getString( $startcol + 15 ); + + $this->addon_download_progress = $rs->getFloat( $startcol + 16 ); + + $this->addon_download_md5 = $rs->getString( $startcol + 17 ); + + $this->resetModified(); + + $this->setNew( false ); + + // FIXME - using NUM_COLUMNS may be clearer. + return $startcol + 18; // 18 = AddonsManagerPeer::NUM_COLUMNS - AddonsManagerPeer::NUM_LAZY_LOAD_COLUMNS). + + } catch (Exception $e) { + throw new PropelException( "Error populating AddonsManager object", $e ); + } + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param Connection $con + * @return void + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete ($con = null) + { + if ($this->isDeleted()) { + throw new PropelException( "This object has already been deleted." ); + } + + if ($con === null) { + $con = Propel::getConnection( AddonsManagerPeer::DATABASE_NAME ); + } + + try { + $con->begin(); + AddonsManagerPeer::doDelete( $this, $con ); + $this->setDeleted( true ); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save ($con = null) + { + if ($this->isDeleted()) { + throw new PropelException( "You cannot save an object that has been deleted." ); + } + + if ($con === null) { + $con = Propel::getConnection( AddonsManagerPeer::DATABASE_NAME ); + } + + try { + $con->begin(); + $affectedRows = $this->doSave( $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave ($con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (! $this->alreadyInSave) { + $this->alreadyInSave = true; + + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = AddonsManagerPeer::doInsert( $this, $con ); + $affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which + // should always be true here (even though technically + // BasePeer::doInsert() can insert multiple rows). + $this->setNew( false ); + } else { + $affectedRows += AddonsManagerPeer::doUpdate( $this, $con ); + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } + + $this->alreadyInSave = false; + } + return $affectedRows; + } // doSave() + + /** + * Array of ValidationFailed objects. + * + * @var array ValidationFailed[] + */ + protected $validationFailures = array (); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures () + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate ($columns = null) + { + $res = $this->doValidate( $columns ); + if ($res === true) { + $this->validationFailures = array (); + return true; + } else { + $this->validationFailures = $res; + return false; + } + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. + */ + protected function doValidate ($columns = null) + { + if (! $this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array (); + + if (($retval = AddonsManagerPeer::doValidate( $this, $columns )) !== true) { + $failureMap = array_merge( $failureMap, $retval ); + } + + $this->alreadyInValidation = false; + } + + return (! empty( $failureMap ) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + public function getByName ($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = AddonsManagerPeer::translateFieldName( $name, $type, BasePeer::TYPE_NUM ); + return $this->getByPosition( $pos ); + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition ($pos) + { + switch ($pos) { + case 0: + return $this->getAddonId(); + break; + case 1: + return $this->getStoreId(); + break; + case 2: + return $this->getAddonName(); + break; + case 3: + return $this->getAddonNick(); + break; + case 4: + return $this->getAddonDownloadFilename(); + break; + case 5: + return $this->getAddonDescription(); + break; + case 6: + return $this->getAddonState(); + break; + case 7: + return $this->getAddonStateChanged(); + break; + case 8: + return $this->getAddonStatus(); + break; + case 9: + return $this->getAddonVersion(); + break; + case 10: + return $this->getAddonType(); + break; + case 11: + return $this->getAddonPublisher(); + break; + case 12: + return $this->getAddonReleaseDate(); + break; + case 13: + return $this->getAddonReleaseType(); + break; + case 14: + return $this->getAddonReleaseNotes(); + break; + case 15: + return $this->getAddonDownloadUrl(); + break; + case 16: + return $this->getAddonDownloadProgress(); + break; + case 17: + return $this->getAddonDownloadMd5(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + public function toArray ($keyType = BasePeer::TYPE_PHPNAME) + { + $keys = AddonsManagerPeer::getFieldNames( $keyType ); + $result = array ( + $keys[0] => $this->getAddonId(), + $keys[1] => $this->getStoreId(), + $keys[2] => $this->getAddonName(), + $keys[3] => $this->getAddonNick(), + $keys[4] => $this->getAddonDownloadFilename(), + $keys[5] => $this->getAddonDescription(), + $keys[6] => $this->getAddonState(), + $keys[7] => $this->getAddonStateChanged(), + $keys[8] => $this->getAddonStatus(), + $keys[9] => $this->getAddonVersion(), + $keys[10] => $this->getAddonType(), + $keys[11] => $this->getAddonPublisher(), + $keys[12] => $this->getAddonReleaseDate(), + $keys[13] => $this->getAddonReleaseType(), + $keys[14] => $this->getAddonReleaseNotes(), + $keys[15] => $this->getAddonDownloadUrl(), + $keys[16] => $this->getAddonDownloadProgress(), + $keys[17] => $this->getAddonDownloadMd5() + ); + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function setByName ($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = AddonsManagerPeer::translateFieldName( $name, $type, BasePeer::TYPE_NUM ); + return $this->setByPosition( $pos, $value ); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition ($pos, $value) + { + switch ($pos) { + case 0: + $this->setAddonId( $value ); + break; + case 1: + $this->setStoreId( $value ); + break; + case 2: + $this->setAddonName( $value ); + break; + case 3: + $this->setAddonNick( $value ); + break; + case 4: + $this->setAddonDownloadFilename( $value ); + break; + case 5: + $this->setAddonDescription( $value ); + break; + case 6: + $this->setAddonState( $value ); + break; + case 7: + $this->setAddonStateChanged( $value ); + break; + case 8: + $this->setAddonStatus( $value ); + break; + case 9: + $this->setAddonVersion( $value ); + break; + case 10: + $this->setAddonType( $value ); + break; + case 11: + $this->setAddonPublisher( $value ); + break; + case 12: + $this->setAddonReleaseDate( $value ); + break; + case 13: + $this->setAddonReleaseType( $value ); + break; + case 14: + $this->setAddonReleaseNotes( $value ); + break; + case 15: + $this->setAddonDownloadUrl( $value ); + break; + case 16: + $this->setAddonDownloadProgress( $value ); + break; + case 17: + $this->setAddonDownloadMd5( $value ); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray ($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = AddonsManagerPeer::getFieldNames( $keyType ); + + if (array_key_exists( $keys[0], $arr )) { + $this->setAddonId( $arr[$keys[0]] ); + } + if (array_key_exists( $keys[1], $arr )) { + $this->setStoreId( $arr[$keys[1]] ); + } + if (array_key_exists( $keys[2], $arr )) { + $this->setAddonName( $arr[$keys[2]] ); + } + if (array_key_exists( $keys[3], $arr )) { + $this->setAddonNick( $arr[$keys[3]] ); + } + if (array_key_exists( $keys[4], $arr )) { + $this->setAddonDownloadFilename( $arr[$keys[4]] ); + } + if (array_key_exists( $keys[5], $arr )) { + $this->setAddonDescription( $arr[$keys[5]] ); + } + if (array_key_exists( $keys[6], $arr )) { + $this->setAddonState( $arr[$keys[6]] ); + } + if (array_key_exists( $keys[7], $arr )) { + $this->setAddonStateChanged( $arr[$keys[7]] ); + } + if (array_key_exists( $keys[8], $arr )) { + $this->setAddonStatus( $arr[$keys[8]] ); + } + if (array_key_exists( $keys[9], $arr )) { + $this->setAddonVersion( $arr[$keys[9]] ); + } + if (array_key_exists( $keys[10], $arr )) { + $this->setAddonType( $arr[$keys[10]] ); + } + if (array_key_exists( $keys[11], $arr )) { + $this->setAddonPublisher( $arr[$keys[11]] ); + } + if (array_key_exists( $keys[12], $arr )) { + $this->setAddonReleaseDate( $arr[$keys[12]] ); + } + if (array_key_exists( $keys[13], $arr )) { + $this->setAddonReleaseType( $arr[$keys[13]] ); + } + if (array_key_exists( $keys[14], $arr )) { + $this->setAddonReleaseNotes( $arr[$keys[14]] ); + } + if (array_key_exists( $keys[15], $arr )) { + $this->setAddonDownloadUrl( $arr[$keys[15]] ); + } + if (array_key_exists( $keys[16], $arr )) { + $this->setAddonDownloadProgress( $arr[$keys[16]] ); + } + if (array_key_exists( $keys[17], $arr )) { + $this->setAddonDownloadMd5( $arr[$keys[17]] ); + } + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria () + { + $criteria = new Criteria( AddonsManagerPeer::DATABASE_NAME ); + + if ($this->isColumnModified( AddonsManagerPeer::ADDON_ID )) { + $criteria->add( AddonsManagerPeer::ADDON_ID, $this->addon_id ); + } + if ($this->isColumnModified( AddonsManagerPeer::STORE_ID )) { + $criteria->add( AddonsManagerPeer::STORE_ID, $this->store_id ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_NAME )) { + $criteria->add( AddonsManagerPeer::ADDON_NAME, $this->addon_name ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_NICK )) { + $criteria->add( AddonsManagerPeer::ADDON_NICK, $this->addon_nick ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_DOWNLOAD_FILENAME )) { + $criteria->add( AddonsManagerPeer::ADDON_DOWNLOAD_FILENAME, $this->addon_download_filename ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_DESCRIPTION )) { + $criteria->add( AddonsManagerPeer::ADDON_DESCRIPTION, $this->addon_description ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_STATE )) { + $criteria->add( AddonsManagerPeer::ADDON_STATE, $this->addon_state ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_STATE_CHANGED )) { + $criteria->add( AddonsManagerPeer::ADDON_STATE_CHANGED, $this->addon_state_changed ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_STATUS )) { + $criteria->add( AddonsManagerPeer::ADDON_STATUS, $this->addon_status ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_VERSION )) { + $criteria->add( AddonsManagerPeer::ADDON_VERSION, $this->addon_version ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_TYPE )) { + $criteria->add( AddonsManagerPeer::ADDON_TYPE, $this->addon_type ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_PUBLISHER )) { + $criteria->add( AddonsManagerPeer::ADDON_PUBLISHER, $this->addon_publisher ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_RELEASE_DATE )) { + $criteria->add( AddonsManagerPeer::ADDON_RELEASE_DATE, $this->addon_release_date ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_RELEASE_TYPE )) { + $criteria->add( AddonsManagerPeer::ADDON_RELEASE_TYPE, $this->addon_release_type ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_RELEASE_NOTES )) { + $criteria->add( AddonsManagerPeer::ADDON_RELEASE_NOTES, $this->addon_release_notes ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_DOWNLOAD_URL )) { + $criteria->add( AddonsManagerPeer::ADDON_DOWNLOAD_URL, $this->addon_download_url ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_DOWNLOAD_PROGRESS )) { + $criteria->add( AddonsManagerPeer::ADDON_DOWNLOAD_PROGRESS, $this->addon_download_progress ); + } + if ($this->isColumnModified( AddonsManagerPeer::ADDON_DOWNLOAD_MD5 )) { + $criteria->add( AddonsManagerPeer::ADDON_DOWNLOAD_MD5, $this->addon_download_md5 ); + } + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria () + { + $criteria = new Criteria( AddonsManagerPeer::DATABASE_NAME ); + + $criteria->add( AddonsManagerPeer::ADDON_ID, $this->addon_id ); + $criteria->add( AddonsManagerPeer::STORE_ID, $this->store_id ); + + return $criteria; + } + + /** + * Returns the composite primary key for this object. + * The array elements will be in same order as specified in XML. + * + * @return array + */ + public function getPrimaryKey () + { + $pks = array (); + + $pks[0] = $this->getAddonId(); + + $pks[1] = $this->getStoreId(); + + return $pks; + } + + /** + * Set the [composite] primary key. + * + * @param array $keys The elements of the composite key (order must match the order in XML file). + * @return void + */ + public function setPrimaryKey ($keys) + { + + $this->setAddonId( $keys[0] ); + + $this->setStoreId( $keys[1] ); + + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of AddonsManager (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @throws PropelException + */ + public function copyInto ($copyObj, $deepCopy = false) + { + $copyObj->setAddonName( $this->addon_name ); + + $copyObj->setAddonNick( $this->addon_nick ); + + $copyObj->setAddonDownloadFilename( $this->addon_download_filename ); + + $copyObj->setAddonDescription( $this->addon_description ); + + $copyObj->setAddonState( $this->addon_state ); + + $copyObj->setAddonStateChanged( $this->addon_state_changed ); + + $copyObj->setAddonStatus( $this->addon_status ); + + $copyObj->setAddonVersion( $this->addon_version ); + + $copyObj->setAddonType( $this->addon_type ); + + $copyObj->setAddonPublisher( $this->addon_publisher ); + + $copyObj->setAddonReleaseDate( $this->addon_release_date ); + + $copyObj->setAddonReleaseType( $this->addon_release_type ); + + $copyObj->setAddonReleaseNotes( $this->addon_release_notes ); + + $copyObj->setAddonDownloadUrl( $this->addon_download_url ); + + $copyObj->setAddonDownloadProgress( $this->addon_download_progress ); + + $copyObj->setAddonDownloadMd5( $this->addon_download_md5 ); + + $copyObj->setNew( true ); + + $copyObj->setAddonId( null ); // this is a pkey column, so set to default value + + $copyObj->setStoreId( null ); // this is a pkey column, so set to default value + + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return AddonsManager Clone of current object. + * @throws PropelException + */ + public function copy ($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class( $this ); + $copyObj = new $clazz(); + $this->copyInto( $copyObj, $deepCopy ); + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return AddonsManagerPeer + */ + public function getPeer () + { + if (self::$peer === null) { + self::$peer = new AddonsManagerPeer(); + } + return self::$peer; + } +} + diff --git a/workflow/engine/classes/model/om/BaseAddonsManagerPeer.php b/workflow/engine/classes/model/om/BaseAddonsManagerPeer.php new file mode 100644 index 000000000..bafd9deb4 --- /dev/null +++ b/workflow/engine/classes/model/om/BaseAddonsManagerPeer.php @@ -0,0 +1,699 @@ + array ('AddonId','StoreId','AddonName','AddonNick','AddonDownloadFilename','AddonDescription','AddonState','AddonStateChanged','AddonStatus','AddonVersion','AddonType','AddonPublisher','AddonReleaseDate','AddonReleaseType','AddonReleaseNotes','AddonDownloadUrl','AddonDownloadProgress','AddonDownloadMd5'), + BasePeer::TYPE_COLNAME => array (AddonsManagerPeer::ADDON_ID,AddonsManagerPeer::STORE_ID,AddonsManagerPeer::ADDON_NAME,AddonsManagerPeer::ADDON_NICK,AddonsManagerPeer::ADDON_DOWNLOAD_FILENAME,AddonsManagerPeer::ADDON_DESCRIPTION,AddonsManagerPeer::ADDON_STATE,AddonsManagerPeer::ADDON_STATE_CHANGED,AddonsManagerPeer::ADDON_STATUS,AddonsManagerPeer::ADDON_VERSION,AddonsManagerPeer::ADDON_TYPE,AddonsManagerPeer::ADDON_PUBLISHER,AddonsManagerPeer::ADDON_RELEASE_DATE,AddonsManagerPeer::ADDON_RELEASE_TYPE,AddonsManagerPeer::ADDON_RELEASE_NOTES,AddonsManagerPeer::ADDON_DOWNLOAD_URL,AddonsManagerPeer::ADDON_DOWNLOAD_PROGRESS,AddonsManagerPeer::ADDON_DOWNLOAD_MD5), + BasePeer::TYPE_FIELDNAME => array ('ADDON_ID','STORE_ID','ADDON_NAME','ADDON_NICK','ADDON_DOWNLOAD_FILENAME','ADDON_DESCRIPTION','ADDON_STATE','ADDON_STATE_CHANGED','ADDON_STATUS','ADDON_VERSION','ADDON_TYPE','ADDON_PUBLISHER','ADDON_RELEASE_DATE','ADDON_RELEASE_TYPE','ADDON_RELEASE_NOTES','ADDON_DOWNLOAD_URL','ADDON_DOWNLOAD_PROGRESS','ADDON_DOWNLOAD_MD5'), + BasePeer::TYPE_NUM => array (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + private static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('AddonId' => 0,'StoreId' => 1,'AddonName' => 2,'AddonNick' => 3,'AddonDownloadFilename' => 4,'AddonDescription' => 5,'AddonState' => 6,'AddonStateChanged' => 7,'AddonStatus' => 8,'AddonVersion' => 9,'AddonType' => 10,'AddonPublisher' => 11,'AddonReleaseDate' => 12,'AddonReleaseType' => 13,'AddonReleaseNotes' => 14,'AddonDownloadUrl' => 15,'AddonDownloadProgress' => 16,'AddonDownloadMd5' => 17), + BasePeer::TYPE_COLNAME => array (AddonsManagerPeer::ADDON_ID => 0,AddonsManagerPeer::STORE_ID => 1,AddonsManagerPeer::ADDON_NAME => 2,AddonsManagerPeer::ADDON_NICK => 3,AddonsManagerPeer::ADDON_DOWNLOAD_FILENAME => 4,AddonsManagerPeer::ADDON_DESCRIPTION => 5,AddonsManagerPeer::ADDON_STATE => 6,AddonsManagerPeer::ADDON_STATE_CHANGED => 7,AddonsManagerPeer::ADDON_STATUS => 8,AddonsManagerPeer::ADDON_VERSION => 9,AddonsManagerPeer::ADDON_TYPE => 10,AddonsManagerPeer::ADDON_PUBLISHER => 11,AddonsManagerPeer::ADDON_RELEASE_DATE => 12,AddonsManagerPeer::ADDON_RELEASE_TYPE => 13,AddonsManagerPeer::ADDON_RELEASE_NOTES => 14,AddonsManagerPeer::ADDON_DOWNLOAD_URL => 15,AddonsManagerPeer::ADDON_DOWNLOAD_PROGRESS => 16,AddonsManagerPeer::ADDON_DOWNLOAD_MD5 => 17), + BasePeer::TYPE_FIELDNAME => array ('ADDON_ID' => 0,'STORE_ID' => 1,'ADDON_NAME' => 2,'ADDON_NICK' => 3,'ADDON_DOWNLOAD_FILENAME' => 4,'ADDON_DESCRIPTION' => 5,'ADDON_STATE' => 6,'ADDON_STATE_CHANGED' => 7,'ADDON_STATUS' => 8,'ADDON_VERSION' => 9,'ADDON_TYPE' => 10,'ADDON_PUBLISHER' => 11,'ADDON_RELEASE_DATE' => 12,'ADDON_RELEASE_TYPE' => 13,'ADDON_RELEASE_NOTES' => 14,'ADDON_DOWNLOAD_URL' => 15,'ADDON_DOWNLOAD_PROGRESS' => 16,'ADDON_DOWNLOAD_MD5' => 17), + BasePeer::TYPE_NUM => array (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) + ); + + /** + * + * @return MapBuilder the map builder for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getMapBuilder () + { + include_once 'classes/model/map/AddonsManagerMapBuilder.php'; + return BasePeer::getMapBuilder( 'classes.model.map.AddonsManagerMapBuilder' ); + } + + /** + * Gets a map (hash) of PHP names to DB column names. + * + * @return array The PHP to DB name map for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @deprecated Use the getFieldNames() and translateFieldName() methods instead of this. + */ + public static function getPhpNameMap () + { + if (self::$phpNameMap === null) { + $map = AddonsManagerPeer::getTableMap(); + $columns = $map->getColumns(); + $nameMap = array (); + foreach ($columns as $column) { + $nameMap[$column->getPhpName()] = $column->getColumnName(); + } + self::$phpNameMap = $nameMap; + } + return self::$phpNameMap; + } + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + static public function translateFieldName ($name, $fromType, $toType) + { + $toNames = self::getFieldNames( $toType ); + $key = isset( self::$fieldKeys[$fromType][$name] ) ? self::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException( "'$name' could not be found in the field names of type '$fromType'. These are: " . print_r( self::$fieldKeys[$fromType], true ) ); + } + return $toNames[$key]; + } + + /** + * Returns an array of of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return array A list of field names + */ + + static public function getFieldNames ($type = BasePeer::TYPE_PHPNAME) + { + if (! array_key_exists( $type, self::$fieldNames )) { + throw new PropelException( 'Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.' ); + } + return self::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. AddonsManagerPeer::COLUMN_NAME). + * @return string + */ + public static function alias ($alias, $column) + { + return str_replace( AddonsManagerPeer::TABLE_NAME . '.', $alias . '.', $column ); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param criteria object containing the columns to add. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns (Criteria $criteria) + { + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_ID ); + + $criteria->addSelectColumn( AddonsManagerPeer::STORE_ID ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_NAME ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_NICK ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_DOWNLOAD_FILENAME ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_DESCRIPTION ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_STATE ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_STATE_CHANGED ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_STATUS ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_VERSION ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_TYPE ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_PUBLISHER ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_RELEASE_DATE ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_RELEASE_TYPE ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_RELEASE_NOTES ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_DOWNLOAD_URL ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_DOWNLOAD_PROGRESS ); + + $criteria->addSelectColumn( AddonsManagerPeer::ADDON_DOWNLOAD_MD5 ); + + } + + const COUNT = 'COUNT(ADDONS_MANAGER.ADDON_ID)'; + const COUNT_DISTINCT = 'COUNT(DISTINCT ADDONS_MANAGER.ADDON_ID)'; + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria). + * @param Connection $con + * @return int Number of matching rows. + */ + public static function doCount (Criteria $criteria, $distinct = false, $con = null) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // clear out anything that might confuse the ORDER BY clause + $criteria->clearSelectColumns()->clearOrderByColumns(); + if ($distinct || in_array( Criteria::DISTINCT, $criteria->getSelectModifiers() )) { + $criteria->addSelectColumn( AddonsManagerPeer::COUNT_DISTINCT ); + } else { + $criteria->addSelectColumn( AddonsManagerPeer::COUNT ); + } + + // just in case we're grouping: add those columns to the select statement + foreach ($criteria->getGroupByColumns() as $column) { + $criteria->addSelectColumn( $column ); + } + + $rs = AddonsManagerPeer::doSelectRS( $criteria, $con ); + if ($rs->next()) { + return $rs->getInt( 1 ); + } else { + // no rows returned; we infer that means 0 matches. + return 0; + } + } + + /** + * Method to select one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param Connection $con + * @return AddonsManager + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne (Criteria $criteria, $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit( 1 ); + $objects = AddonsManagerPeer::doSelect( $critcopy, $con ); + if ($objects) { + return $objects[0]; + } + return null; + } + + /** + * Method to do selects. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect (Criteria $criteria, $con = null) + { + return AddonsManagerPeer::populateObjects( AddonsManagerPeer::doSelectRS( $criteria, $con ) ); + } + + /** + * Prepares the Criteria object and uses the parent doSelect() + * method to get a ResultSet. + * + * Use this method directly if you want to just get the resultset + * (instead of an array of objects). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return ResultSet The resultset object with numerically-indexed fields. + * @see BasePeer::doSelect() + */ + public static function doSelectRS (Criteria $criteria, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + if (! $criteria->getSelectColumns()) { + $criteria = clone $criteria; + AddonsManagerPeer::addSelectColumns( $criteria ); + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + // BasePeer returns a Creole ResultSet, set to return + // rows indexed numerically. + return BasePeer::doSelect( $criteria, $con ); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects (ResultSet $rs) + { + $results = array (); + + // set the class once to avoid overhead in the loop + $cls = AddonsManagerPeer::getOMClass(); + $cls = Propel::import( $cls ); + // populate the object(s) + while ($rs->next()) { + + $obj = new $cls(); + $obj->hydrate( $rs ); + $results[] = $obj; + + } + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap () + { + return Propel::getDatabaseMap( self::DATABASE_NAME )->getTable( self::TABLE_NAME ); + } + + /** + * The class that the Peer will make instances of. + * + * This uses a dot-path notation which is tranalted into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @return string path.to.ClassName + */ + public static function getOMClass () + { + return AddonsManagerPeer::CLASS_DEFAULT; + } + + /** + * Method perform an INSERT on the database, given a AddonsManager or Criteria object. + * + * @param mixed $values Criteria or AddonsManager object containing data that is used to create the INSERT statement. + * @param Connection $con the connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from AddonsManager object + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->begin(); + $pk = BasePeer::doInsert( $criteria, $con ); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + + return $pk; + } + + /** + * Method perform an UPDATE on the database, given a AddonsManager or Criteria object. + * + * @param mixed $values Criteria or AddonsManager object containing data that is used to create the UPDATE statement. + * @param Connection $con The connection to use (specify Connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $selectCriteria = new Criteria( self::DATABASE_NAME ); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison( AddonsManagerPeer::ADDON_ID ); + $selectCriteria->add( AddonsManagerPeer::ADDON_ID, $criteria->remove( AddonsManagerPeer::ADDON_ID ), $comparison ); + + $comparison = $criteria->getComparison( AddonsManagerPeer::STORE_ID ); + $selectCriteria->add( AddonsManagerPeer::STORE_ID, $criteria->remove( AddonsManagerPeer::STORE_ID ), $comparison ); + + } else { + // $values is AddonsManager object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + return BasePeer::doUpdate( $selectCriteria, $criteria, $con ); + } + + /** + * Method to DELETE all rows from the ADDONS_MANAGER table. + * + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll ($con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + $affectedRows += BasePeer::doDeleteAll( AddonsManagerPeer::TABLE_NAME, $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Method perform a DELETE on the database, given a AddonsManager or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or AddonsManager object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param Connection $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( AddonsManagerPeer::DATABASE_NAME ); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } elseif ($values instanceof AddonsManager) { + $criteria = $values->buildPkeyCriteria(); + } else { + // it must be the primary key + $criteria = new Criteria( self::DATABASE_NAME ); + // primary key is composite; we therefore, expect + // the primary key passed to be an array of pkey + // values + if (count( $values ) == count( $values, COUNT_RECURSIVE )) { + // array is not multi-dimensional + $values = array ( + $values + ); + } + $vals = array (); + foreach ($values as $value) { + $vals[0][] = $value[0]; + $vals[1][] = $value[1]; + } + $criteria->add( AddonsManagerPeer::ADDON_ID, $vals[0], Criteria::IN ); + $criteria->add( AddonsManagerPeer::STORE_ID, $vals[1], Criteria::IN ); + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + + $affectedRows += BasePeer::doDelete( $criteria, $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Validates all modified columns of given AddonsManager object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param AddonsManager $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate (AddonsManager $obj, $cols = null) + { + $columns = array (); + + if ($cols) { + $dbMap = Propel::getDatabaseMap( AddonsManagerPeer::DATABASE_NAME ); + $tableMap = $dbMap->getTable( AddonsManagerPeer::TABLE_NAME ); + + if (! is_array( $cols )) { + $cols = array ( + $cols + ); + } + + foreach ($cols as $colName) { + if ($tableMap->containsColumn( $colName )) { + $get = 'get' . $tableMap->getColumn( $colName )->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate( AddonsManagerPeer::DATABASE_NAME, AddonsManagerPeer::TABLE_NAME, $columns ); + } + + /** + * Retrieve object using using composite pkey values. + * + * @param string $addon_id + * @param string $store_id + * + * @param Connection $con + * @return AddonsManager + */ + public static function retrieveByPK ($addon_id, $store_id, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + $criteria = new Criteria(); + $criteria->add( AddonsManagerPeer::ADDON_ID, $addon_id ); + $criteria->add( AddonsManagerPeer::STORE_ID, $store_id ); + $v = AddonsManagerPeer::doSelect( $criteria, $con ); + + return ! empty( $v ) ? $v[0] : null; + } +} + +// static code to register the map builder for this Peer with the main Propel class +if (Propel::isInit()) { + // the MapBuilder classes register themselves with Propel during initialization + // so we need to load them here. + try { + BaseAddonsManagerPeer::getMapBuilder(); + } catch (Exception $e) { + Propel::log( 'Could not initialize Peer: ' . $e->getMessage(), Propel::LOG_ERR ); + } +} else { + // even if Propel is not yet initialized, the map builder class can be registered + // now and then it will be loaded when Propel initializes. + require_once 'classes/model/map/AddonsManagerMapBuilder.php'; + Propel::registerMapBuilder( 'classes.model.map.AddonsManagerMapBuilder' ); +} + diff --git a/workflow/engine/classes/model/om/BaseAddonsStore.php b/workflow/engine/classes/model/om/BaseAddonsStore.php new file mode 100644 index 000000000..ed59c666b --- /dev/null +++ b/workflow/engine/classes/model/om/BaseAddonsStore.php @@ -0,0 +1,728 @@ +store_id; + } + + /** + * Get the [store_version] column value. + * + * @return int + */ + public function getStoreVersion () + { + return $this->store_version; + } + + /** + * Get the [store_location] column value. + * + * @return string + */ + public function getStoreLocation () + { + return $this->store_location; + } + + /** + * Get the [store_type] column value. + * + * @return string + */ + public function getStoreType () + { + return $this->store_type; + } + + /** + * Get the [optionally formatted] [store_last_updated] column value. + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function getStoreLastUpdated ($format = 'Y-m-d H:i:s') + { + if ($this->store_last_updated === null || $this->store_last_updated === '') { + return null; + } elseif (! is_int( $this->store_last_updated )) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime( $this->store_last_updated ); + if ($ts === - 1 || $ts === false) { + // in PHP 5.1 return value changes to FALSE + throw new PropelException( "Unable to parse value of [store_last_updated] as date/time value: " . var_export( $this->store_last_updated, true ) ); + } + } else { + $ts = $this->store_last_updated; + } + if ($format === null) { + return $ts; + } elseif (strpos( $format, '%' ) !== false) { + return strftime( $format, $ts ); + } else { + return date( $format, $ts ); + } + } + + /** + * Set the value of [store_id] column. + * + * @param string $v new value + * @return void + */ + public function setStoreId ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->store_id !== $v) { + $this->store_id = $v; + $this->modifiedColumns[] = AddonsStorePeer::STORE_ID; + } + } // setStoreId() + + /** + * Set the value of [store_version] column. + * + * @param int $v new value + * @return void + */ + public function setStoreVersion ($v) + { + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && ! is_int( $v ) && is_numeric( $v )) { + $v = (int) $v; + } + if ($this->store_version !== $v) { + $this->store_version = $v; + $this->modifiedColumns[] = AddonsStorePeer::STORE_VERSION; + } + } // setStoreVersion() + + /** + * Set the value of [store_location] column. + * + * @param string $v new value + * @return void + */ + public function setStoreLocation ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->store_location !== $v) { + $this->store_location = $v; + $this->modifiedColumns[] = AddonsStorePeer::STORE_LOCATION; + } + } // setStoreLocation() + + /** + * Set the value of [store_type] column. + * + * @param string $v new value + * @return void + */ + public function setStoreType ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->store_type !== $v) { + $this->store_type = $v; + $this->modifiedColumns[] = AddonsStorePeer::STORE_TYPE; + } + } // setStoreType() + + /** + * Set the value of [store_last_updated] column. + * + * @param int $v new value + * @return void + */ + public function setStoreLastUpdated ($v) + { + if ($v !== null && ! is_int( $v )) { + $ts = strtotime( $v ); + if ($ts === - 1 || $ts === false) { + // in PHP 5.1 return value changes to FALSE + throw new PropelException( "Unable to parse date/time value for [store_last_updated] from input: " . var_export( $v, true ) ); + } + } else { + $ts = $v; + } + if ($this->store_last_updated !== $ts) { + $this->store_last_updated = $ts; + $this->modifiedColumns[] = AddonsStorePeer::STORE_LAST_UPDATED; + } + } // setStoreLastUpdated() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate (ResultSet $rs, $startcol = 1) + { + try { + + $this->store_id = $rs->getString( $startcol + 0 ); + + $this->store_version = $rs->getInt( $startcol + 1 ); + + $this->store_location = $rs->getString( $startcol + 2 ); + + $this->store_type = $rs->getString( $startcol + 3 ); + + $this->store_last_updated = $rs->getTimestamp( $startcol + 4, null ); + + $this->resetModified(); + + $this->setNew( false ); + + // FIXME - using NUM_COLUMNS may be clearer. + return $startcol + 5; // 5 = AddonsStorePeer::NUM_COLUMNS - AddonsStorePeer::NUM_LAZY_LOAD_COLUMNS). + + } catch (Exception $e) { + throw new PropelException( "Error populating AddonsStore object", $e ); + } + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param Connection $con + * @return void + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete ($con = null) + { + if ($this->isDeleted()) { + throw new PropelException( "This object has already been deleted." ); + } + if ($con === null) { + $con = Propel::getConnection( AddonsStorePeer::DATABASE_NAME ); + } + try { + $con->begin(); + AddonsStorePeer::doDelete( $this, $con ); + $this->setDeleted( true ); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save ($con = null) + { + if ($this->isDeleted()) { + throw new PropelException( "You cannot save an object that has been deleted." ); + } + if ($con === null) { + $con = Propel::getConnection( AddonsStorePeer::DATABASE_NAME ); + } + try { + $con->begin(); + $affectedRows = $this->doSave( $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave ($con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (! $this->alreadyInSave) { + $this->alreadyInSave = true; + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = AddonsStorePeer::doInsert( $this, $con ); + $affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which + // should always be true here (even though technically + // BasePeer::doInsert() can insert multiple rows). + $this->setNew( false ); + } else { + $affectedRows += AddonsStorePeer::doUpdate( $this, $con ); + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } + $this->alreadyInSave = false; + } + return $affectedRows; + } // doSave() + + /** + * Array of ValidationFailed objects. + * + * @var array ValidationFailed[] + */ + protected $validationFailures = array (); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures () + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate ($columns = null) + { + $res = $this->doValidate( $columns ); + if ($res === true) { + $this->validationFailures = array (); + return true; + } else { + $this->validationFailures = $res; + return false; + } + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. + */ + protected function doValidate ($columns = null) + { + if (! $this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + $failureMap = array (); + if (($retval = AddonsStorePeer::doValidate( $this, $columns )) !== true) { + $failureMap = array_merge( $failureMap, $retval ); + } + $this->alreadyInValidation = false; + } + return (! empty( $failureMap ) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + public function getByName ($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = AddonsStorePeer::translateFieldName( $name, $type, BasePeer::TYPE_NUM ); + return $this->getByPosition( $pos ); + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition ($pos) + { + switch ($pos) { + case 0: + return $this->getStoreId(); + break; + case 1: + return $this->getStoreVersion(); + break; + case 2: + return $this->getStoreLocation(); + break; + case 3: + return $this->getStoreType(); + break; + case 4: + return $this->getStoreLastUpdated(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + public function toArray ($keyType = BasePeer::TYPE_PHPNAME) + { + $keys = AddonsStorePeer::getFieldNames( $keyType ); + $result = array ( + $keys[0] => $this->getStoreId(), + $keys[1] => $this->getStoreVersion(), + $keys[2] => $this->getStoreLocation(), + $keys[3] => $this->getStoreType(), + $keys[4] => $this->getStoreLastUpdated() + ); + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function setByName ($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = AddonsStorePeer::translateFieldName( $name, $type, BasePeer::TYPE_NUM ); + return $this->setByPosition( $pos, $value ); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition ($pos, $value) + { + switch ($pos) { + case 0: + $this->setStoreId( $value ); + break; + case 1: + $this->setStoreVersion( $value ); + break; + case 2: + $this->setStoreLocation( $value ); + break; + case 3: + $this->setStoreType( $value ); + break; + case 4: + $this->setStoreLastUpdated( $value ); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray ($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = AddonsStorePeer::getFieldNames( $keyType ); + + if (array_key_exists( $keys[0], $arr )) { + $this->setStoreId( $arr[$keys[0]] ); + } + if (array_key_exists( $keys[1], $arr )) { + $this->setStoreVersion( $arr[$keys[1]] ); + } + if (array_key_exists( $keys[2], $arr )) { + $this->setStoreLocation( $arr[$keys[2]] ); + } + if (array_key_exists( $keys[3], $arr )) { + $this->setStoreType( $arr[$keys[3]] ); + } + if (array_key_exists( $keys[4], $arr )) { + $this->setStoreLastUpdated( $arr[$keys[4]] ); + } + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria () + { + $criteria = new Criteria( AddonsStorePeer::DATABASE_NAME ); + + if ($this->isColumnModified( AddonsStorePeer::STORE_ID )) { + $criteria->add( AddonsStorePeer::STORE_ID, $this->store_id ); + } + if ($this->isColumnModified( AddonsStorePeer::STORE_VERSION )) { + $criteria->add( AddonsStorePeer::STORE_VERSION, $this->store_version ); + } + if ($this->isColumnModified( AddonsStorePeer::STORE_LOCATION )) { + $criteria->add( AddonsStorePeer::STORE_LOCATION, $this->store_location ); + } + if ($this->isColumnModified( AddonsStorePeer::STORE_TYPE )) { + $criteria->add( AddonsStorePeer::STORE_TYPE, $this->store_type ); + } + if ($this->isColumnModified( AddonsStorePeer::STORE_LAST_UPDATED )) { + $criteria->add( AddonsStorePeer::STORE_LAST_UPDATED, $this->store_last_updated ); + } + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria () + { + $criteria = new Criteria( AddonsStorePeer::DATABASE_NAME ); + + $criteria->add( AddonsStorePeer::STORE_ID, $this->store_id ); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * + * @return string + */ + public function getPrimaryKey () + { + return $this->getStoreId(); + } + + /** + * Generic method to set the primary key (store_id column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey ($key) + { + $this->setStoreId( $key ); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of AddonsStore (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @throws PropelException + */ + public function copyInto ($copyObj, $deepCopy = false) + { + $copyObj->setStoreVersion( $this->store_version ); + + $copyObj->setStoreLocation( $this->store_location ); + + $copyObj->setStoreType( $this->store_type ); + + $copyObj->setStoreLastUpdated( $this->store_last_updated ); + + $copyObj->setNew( true ); + + $copyObj->setStoreId( null ); // this is a pkey column, so set to default value + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return AddonsStore Clone of current object. + * @throws PropelException + */ + public function copy ($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class( $this ); + $copyObj = new $clazz(); + $this->copyInto( $copyObj, $deepCopy ); + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return AddonsStorePeer + */ + public function getPeer () + { + if (self::$peer === null) { + self::$peer = new AddonsStorePeer(); + } + return self::$peer; + } +} + diff --git a/workflow/engine/classes/model/om/BaseAddonsStorePeer.php b/workflow/engine/classes/model/om/BaseAddonsStorePeer.php new file mode 100644 index 000000000..c1bb8f9cd --- /dev/null +++ b/workflow/engine/classes/model/om/BaseAddonsStorePeer.php @@ -0,0 +1,605 @@ + array ('StoreId','StoreVersion','StoreLocation','StoreType','StoreLastUpdated'), + BasePeer::TYPE_COLNAME => array (AddonsStorePeer::STORE_ID,AddonsStorePeer::STORE_VERSION,AddonsStorePeer::STORE_LOCATION,AddonsStorePeer::STORE_TYPE,AddonsStorePeer::STORE_LAST_UPDATED), + BasePeer::TYPE_FIELDNAME => array ('STORE_ID','STORE_VERSION','STORE_LOCATION','STORE_TYPE','STORE_LAST_UPDATED'), + BasePeer::TYPE_NUM => array (0,1,2,3,4) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + private static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('StoreId' => 0,'StoreVersion' => 1,'StoreLocation' => 2,'StoreType' => 3,'StoreLastUpdated' => 4), + BasePeer::TYPE_COLNAME => array (AddonsStorePeer::STORE_ID => 0,AddonsStorePeer::STORE_VERSION => 1,AddonsStorePeer::STORE_LOCATION => 2,AddonsStorePeer::STORE_TYPE => 3,AddonsStorePeer::STORE_LAST_UPDATED => 4), + BasePeer::TYPE_FIELDNAME => array ('STORE_ID' => 0,'STORE_VERSION' => 1,'STORE_LOCATION' => 2,'STORE_TYPE' => 3,'STORE_LAST_UPDATED' => 4), + BasePeer::TYPE_NUM => array (0,1,2,3,4) + ); + + /** + * + * @return MapBuilder the map builder for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getMapBuilder () + { + include_once 'classes/model/map/AddonsStoreMapBuilder.php'; + return BasePeer::getMapBuilder( 'classes.model.map.AddonsStoreMapBuilder' ); + } + + /** + * Gets a map (hash) of PHP names to DB column names. + * + * @return array The PHP to DB name map for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @deprecated Use the getFieldNames() and translateFieldName() methods instead of this. + */ + public static function getPhpNameMap () + { + if (self::$phpNameMap === null) { + $map = AddonsStorePeer::getTableMap(); + $columns = $map->getColumns(); + $nameMap = array (); + foreach ($columns as $column) { + $nameMap[$column->getPhpName()] = $column->getColumnName(); + } + self::$phpNameMap = $nameMap; + } + return self::$phpNameMap; + } + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + static public function translateFieldName ($name, $fromType, $toType) + { + $toNames = self::getFieldNames( $toType ); + $key = isset( self::$fieldKeys[$fromType][$name] ) ? self::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException( "'$name' could not be found in the field names of type '$fromType'. These are: " . print_r( self::$fieldKeys[$fromType], true ) ); + } + return $toNames[$key]; + } + + /** + * Returns an array of of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return array A list of field names + */ + + static public function getFieldNames ($type = BasePeer::TYPE_PHPNAME) + { + if (! array_key_exists( $type, self::$fieldNames )) { + throw new PropelException( 'Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.' ); + } + return self::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. AddonsStorePeer::COLUMN_NAME). + * @return string + */ + public static function alias ($alias, $column) + { + return str_replace( AddonsStorePeer::TABLE_NAME . '.', $alias . '.', $column ); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param criteria object containing the columns to add. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns (Criteria $criteria) + { + + $criteria->addSelectColumn( AddonsStorePeer::STORE_ID ); + + $criteria->addSelectColumn( AddonsStorePeer::STORE_VERSION ); + + $criteria->addSelectColumn( AddonsStorePeer::STORE_LOCATION ); + + $criteria->addSelectColumn( AddonsStorePeer::STORE_TYPE ); + + $criteria->addSelectColumn( AddonsStorePeer::STORE_LAST_UPDATED ); + + } + + const COUNT = 'COUNT(ADDONS_STORE.STORE_ID)'; + const COUNT_DISTINCT = 'COUNT(DISTINCT ADDONS_STORE.STORE_ID)'; + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria). + * @param Connection $con + * @return int Number of matching rows. + */ + public static function doCount (Criteria $criteria, $distinct = false, $con = null) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // clear out anything that might confuse the ORDER BY clause + $criteria->clearSelectColumns()->clearOrderByColumns(); + if ($distinct || in_array( Criteria::DISTINCT, $criteria->getSelectModifiers() )) { + $criteria->addSelectColumn( AddonsStorePeer::COUNT_DISTINCT ); + } else { + $criteria->addSelectColumn( AddonsStorePeer::COUNT ); + } + + // just in case we're grouping: add those columns to the select statement + foreach ($criteria->getGroupByColumns() as $column) { + $criteria->addSelectColumn( $column ); + } + + $rs = AddonsStorePeer::doSelectRS( $criteria, $con ); + if ($rs->next()) { + return $rs->getInt( 1 ); + } else { + // no rows returned; we infer that means 0 matches. + return 0; + } + } + + /** + * Method to select one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param Connection $con + * @return AddonsStore + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne (Criteria $criteria, $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit( 1 ); + $objects = AddonsStorePeer::doSelect( $critcopy, $con ); + if ($objects) { + return $objects[0]; + } + return null; + } + + /** + * Method to do selects. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect (Criteria $criteria, $con = null) + { + return AddonsStorePeer::populateObjects( AddonsStorePeer::doSelectRS( $criteria, $con ) ); + } + + /** + * Prepares the Criteria object and uses the parent doSelect() + * method to get a ResultSet. + * + * Use this method directly if you want to just get the resultset + * (instead of an array of objects). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return ResultSet The resultset object with numerically-indexed fields. + * @see BasePeer::doSelect() + */ + public static function doSelectRS (Criteria $criteria, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + if (! $criteria->getSelectColumns()) { + $criteria = clone $criteria; + AddonsStorePeer::addSelectColumns( $criteria ); + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + // BasePeer returns a Creole ResultSet, set to return + // rows indexed numerically. + return BasePeer::doSelect( $criteria, $con ); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects (ResultSet $rs) + { + $results = array (); + + // set the class once to avoid overhead in the loop + $cls = AddonsStorePeer::getOMClass(); + $cls = Propel::import( $cls ); + // populate the object(s) + while ($rs->next()) { + + $obj = new $cls(); + $obj->hydrate( $rs ); + $results[] = $obj; + + } + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap () + { + return Propel::getDatabaseMap( self::DATABASE_NAME )->getTable( self::TABLE_NAME ); + } + + /** + * The class that the Peer will make instances of. + * + * This uses a dot-path notation which is tranalted into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @return string path.to.ClassName + */ + public static function getOMClass () + { + return AddonsStorePeer::CLASS_DEFAULT; + } + + /** + * Method perform an INSERT on the database, given a AddonsStore or Criteria object. + * + * @param mixed $values Criteria or AddonsStore object containing data that is used to create the INSERT statement. + * @param Connection $con the connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from AddonsStore object + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->begin(); + $pk = BasePeer::doInsert( $criteria, $con ); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + + return $pk; + } + + /** + * Method perform an UPDATE on the database, given a AddonsStore or Criteria object. + * + * @param mixed $values Criteria or AddonsStore object containing data that is used to create the UPDATE statement. + * @param Connection $con The connection to use (specify Connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $selectCriteria = new Criteria( self::DATABASE_NAME ); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + $comparison = $criteria->getComparison( AddonsStorePeer::STORE_ID ); + $selectCriteria->add( AddonsStorePeer::STORE_ID, $criteria->remove( AddonsStorePeer::STORE_ID ), $comparison ); + } else { + // $values is AddonsStore object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + return BasePeer::doUpdate( $selectCriteria, $criteria, $con ); + } + + /** + * Method to DELETE all rows from the ADDONS_STORE table. + * + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll ($con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + $affectedRows += BasePeer::doDeleteAll( AddonsStorePeer::TABLE_NAME, $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Method perform a DELETE on the database, given a AddonsStore or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or AddonsStore object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param Connection $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( AddonsStorePeer::DATABASE_NAME ); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } elseif ($values instanceof AddonsStore) { + $criteria = $values->buildPkeyCriteria(); + } else { + // it must be the primary key + $criteria = new Criteria( self::DATABASE_NAME ); + $criteria->add( AddonsStorePeer::STORE_ID, (array) $values, Criteria::IN ); + } + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + $affectedRows += BasePeer::doDelete( $criteria, $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Validates all modified columns of given AddonsStore object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param AddonsStore $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate (AddonsStore $obj, $cols = null) + { + $columns = array (); + if ($cols) { + $dbMap = Propel::getDatabaseMap( AddonsStorePeer::DATABASE_NAME ); + $tableMap = $dbMap->getTable( AddonsStorePeer::TABLE_NAME ); + if (! is_array( $cols )) { + $cols = array ( + $cols); + } + foreach ($cols as $colName) { + if ($tableMap->containsColumn( $colName )) { + $get = 'get' . $tableMap->getColumn( $colName )->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + return BasePeer::doValidate( AddonsStorePeer::DATABASE_NAME, AddonsStorePeer::TABLE_NAME, $columns ); + } + + /** + * Retrieve a single object by pkey. + * + * @param mixed $pk the primary key. + * @param Connection $con the connection to use + * @return AddonsStore + */ + public static function retrieveByPK ($pk, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $criteria = new Criteria( AddonsStorePeer::DATABASE_NAME ); + + $criteria->add( AddonsStorePeer::STORE_ID, $pk ); + + $v = AddonsStorePeer::doSelect( $criteria, $con ); + + return ! empty( $v ) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs ($pks, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $objs = null; + if (empty( $pks )) { + $objs = array (); + } else { + $criteria = new Criteria(); + $criteria->add( AddonsStorePeer::STORE_ID, $pks, Criteria::IN ); + $objs = AddonsStorePeer::doSelect( $criteria, $con ); + } + return $objs; + } +} + +// static code to register the map builder for this Peer with the main Propel class +if (Propel::isInit()) { + // the MapBuilder classes register themselves with Propel during initialization + // so we need to load them here. + try { + BaseAddonsStorePeer::getMapBuilder(); + } catch (Exception $e) { + Propel::log( 'Could not initialize Peer: ' . $e->getMessage(), Propel::LOG_ERR ); + } +} else { + // even if Propel is not yet initialized, the map builder class can be registered + // now and then it will be loaded when Propel initializes. + require_once 'classes/model/map/AddonsStoreMapBuilder.php'; + Propel::registerMapBuilder( 'classes.model.map.AddonsStoreMapBuilder' ); +} + diff --git a/workflow/engine/classes/model/om/BaseLicenseManager.php b/workflow/engine/classes/model/om/BaseLicenseManager.php new file mode 100644 index 000000000..b351a4432 --- /dev/null +++ b/workflow/engine/classes/model/om/BaseLicenseManager.php @@ -0,0 +1,989 @@ +license_uid; + } + + /** + * Get the [license_user] column value. + * + * @return string + */ + public function getLicenseUser () + { + return $this->license_user; + } + + /** + * Get the [license_start] column value. + * + * @return int + */ + public function getLicenseStart () + { + return $this->license_start; + } + + /** + * Get the [license_end] column value. + * + * @return int + */ + public function getLicenseEnd () + { + return $this->license_end; + } + + /** + * Get the [license_span] column value. + * + * @return int + */ + public function getLicenseSpan () + { + return $this->license_span; + } + + /** + * Get the [license_status] column value. + * + * @return string + */ + public function getLicenseStatus () + { + return $this->license_status; + } + + /** + * Get the [license_data] column value. + * + * @return string + */ + public function getLicenseData () + { + return $this->license_data; + } + + /** + * Get the [license_path] column value. + * + * @return string + */ + public function getLicensePath () + { + return $this->license_path; + } + + /** + * Get the [license_workspace] column value. + * + * @return string + */ + public function getLicenseWorkspace () + { + return $this->license_workspace; + } + + /** + * Get the [license_type] column value. + * + * @return string + */ + public function getLicenseType () + { + return $this->license_type; + } + + /** + * Set the value of [license_uid] column. + * + * @param string $v new value + * @return void + */ + public function setLicenseUid ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->license_uid !== $v || $v === '') { + $this->license_uid = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_UID; + } + } // setLicenseUid() + + /** + * Set the value of [license_user] column. + * + * @param string $v new value + * @return void + */ + public function setLicenseUser ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->license_user !== $v || $v === '0') { + $this->license_user = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_USER; + } + } // setLicenseUser() + + /** + * Set the value of [license_start] column. + * + * @param int $v new value + * @return void + */ + public function setLicenseStart ($v) + { + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && ! is_int( $v ) && is_numeric( $v )) { + $v = (int) $v; + } + if ($this->license_start !== $v || $v === 0) { + $this->license_start = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_START; + } + } // setLicenseStart() + + /** + * Set the value of [license_end] column. + * + * @param int $v new value + * @return void + */ + public function setLicenseEnd ($v) + { + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && ! is_int( $v ) && is_numeric( $v )) { + $v = (int) $v; + } + + if ($this->license_end !== $v || $v === 0) { + $this->license_end = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_END; + } + + } // setLicenseEnd() + + /** + * Set the value of [license_span] column. + * + * @param int $v new value + * @return void + */ + public function setLicenseSpan ($v) + { + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && ! is_int( $v ) && is_numeric( $v )) { + $v = (int) $v; + } + + if ($this->license_span !== $v || $v === 0) { + $this->license_span = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_SPAN; + } + } // setLicenseSpan() + + /** + * Set the value of [license_status] column. + * + * @param string $v new value + * @return void + */ + public function setLicenseStatus ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->license_status !== $v || $v === '') { + $this->license_status = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_STATUS; + } + } // setLicenseStatus() + + /** + * Set the value of [license_data] column. + * + * @param string $v new value + * @return void + */ + public function setLicenseData ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->license_data !== $v) { + $this->license_data = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_DATA; + } + + } // setLicenseData() + + /** + * Set the value of [license_path] column. + * + * @param string $v new value + * @return void + */ + public function setLicensePath ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + if ($this->license_path !== $v || $v === '0') { + $this->license_path = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_PATH; + } + } // setLicensePath() + + /** + * Set the value of [license_workspace] column. + * + * @param string $v new value + * @return void + */ + public function setLicenseWorkspace ($v) + { + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->license_workspace !== $v || $v === '0') { + $this->license_workspace = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_WORKSPACE; + } + } // setLicenseWorkspace() + + /** + * Set the value of [license_type] column. + * + * @param string $v new value + * @return void + */ + public function setLicenseType ($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && ! is_string( $v )) { + $v = (string) $v; + } + + if ($this->license_type !== $v || $v === '0') { + $this->license_type = $v; + $this->modifiedColumns[] = LicenseManagerPeer::LICENSE_TYPE; + } + } // setLicenseType() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate (ResultSet $rs, $startcol = 1) + { + try { + + $this->license_uid = $rs->getString( $startcol + 0 ); + + $this->license_user = $rs->getString( $startcol + 1 ); + + $this->license_start = $rs->getInt( $startcol + 2 ); + + $this->license_end = $rs->getInt( $startcol + 3 ); + + $this->license_span = $rs->getInt( $startcol + 4 ); + + $this->license_status = $rs->getString( $startcol + 5 ); + + $this->license_data = $rs->getString( $startcol + 6 ); + + $this->license_path = $rs->getString( $startcol + 7 ); + + $this->license_workspace = $rs->getString( $startcol + 8 ); + + $this->license_type = $rs->getString( $startcol + 9 ); + + $this->resetModified(); + + $this->setNew( false ); + + // FIXME - using NUM_COLUMNS may be clearer. + return $startcol + 10; // 10 = LicenseManagerPeer::NUM_COLUMNS - LicenseManagerPeer::NUM_LAZY_LOAD_COLUMNS). + + } catch (Exception $e) { + throw new PropelException( "Error populating LicenseManager object", $e ); + } + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param Connection $con + * @return void + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete ($con = null) + { + if ($this->isDeleted()) { + throw new PropelException( "This object has already been deleted." ); + } + + if ($con === null) { + $con = Propel::getConnection( LicenseManagerPeer::DATABASE_NAME ); + } + + try { + $con->begin(); + LicenseManagerPeer::doDelete( $this, $con ); + $this->setDeleted( true ); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save ($con = null) + { + if ($this->isDeleted()) { + throw new PropelException( "You cannot save an object that has been deleted." ); + } + + if ($con === null) { + $con = Propel::getConnection( LicenseManagerPeer::DATABASE_NAME ); + } + + try { + $con->begin(); + $affectedRows = $this->doSave( $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave ($con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (! $this->alreadyInSave) { + $this->alreadyInSave = true; + + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = LicenseManagerPeer::doInsert( $this, $con ); + $affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which + // should always be true here (even though technically + // BasePeer::doInsert() can insert multiple rows). + $this->setNew( false ); + } else { + $affectedRows += LicenseManagerPeer::doUpdate( $this, $con ); + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } + $this->alreadyInSave = false; + } + return $affectedRows; + } // doSave() + + /** + * Array of ValidationFailed objects. + * + * @var array ValidationFailed[] + */ + protected $validationFailures = array (); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures () + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate ($columns = null) + { + $res = $this->doValidate( $columns ); + if ($res === true) { + $this->validationFailures = array (); + return true; + } else { + $this->validationFailures = $res; + return false; + } + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. + */ + protected function doValidate ($columns = null) + { + if (! $this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array (); + + if (($retval = LicenseManagerPeer::doValidate( $this, $columns )) !== true) { + $failureMap = array_merge( $failureMap, $retval ); + } + + $this->alreadyInValidation = false; + } + + return (! empty( $failureMap ) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + public function getByName ($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = LicenseManagerPeer::translateFieldName( $name, $type, BasePeer::TYPE_NUM ); + return $this->getByPosition( $pos ); + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition ($pos) + { + switch ($pos) { + case 0: + return $this->getLicenseUid(); + break; + case 1: + return $this->getLicenseUser(); + break; + case 2: + return $this->getLicenseStart(); + break; + case 3: + return $this->getLicenseEnd(); + break; + case 4: + return $this->getLicenseSpan(); + break; + case 5: + return $this->getLicenseStatus(); + break; + case 6: + return $this->getLicenseData(); + break; + case 7: + return $this->getLicensePath(); + break; + case 8: + return $this->getLicenseWorkspace(); + break; + case 9: + return $this->getLicenseType(); + break; + default: + return null; + break; + } + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + public function toArray ($keyType = BasePeer::TYPE_PHPNAME) + { + $keys = LicenseManagerPeer::getFieldNames( $keyType ); + $result = array ( + $keys[0] => $this->getLicenseUid(), + $keys[1] => $this->getLicenseUser(), + $keys[2] => $this->getLicenseStart(), + $keys[3] => $this->getLicenseEnd(), + $keys[4] => $this->getLicenseSpan(), + $keys[5] => $this->getLicenseStatus(), + $keys[6] => $this->getLicenseData(), + $keys[7] => $this->getLicensePath(), + $keys[8] => $this->getLicenseWorkspace(), + $keys[9] => $this->getLicenseType() + ); + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function setByName ($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = LicenseManagerPeer::translateFieldName( $name, $type, BasePeer::TYPE_NUM ); + return $this->setByPosition( $pos, $value ); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition ($pos, $value) + { + switch ($pos) { + case 0: + $this->setLicenseUid( $value ); + break; + case 1: + $this->setLicenseUser( $value ); + break; + case 2: + $this->setLicenseStart( $value ); + break; + case 3: + $this->setLicenseEnd( $value ); + break; + case 4: + $this->setLicenseSpan( $value ); + break; + case 5: + $this->setLicenseStatus( $value ); + break; + case 6: + $this->setLicenseData( $value ); + break; + case 7: + $this->setLicensePath( $value ); + break; + case 8: + $this->setLicenseWorkspace( $value ); + break; + case 9: + $this->setLicenseType( $value ); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray ($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = LicenseManagerPeer::getFieldNames( $keyType ); + + if (array_key_exists( $keys[0], $arr )) { + $this->setLicenseUid( $arr[$keys[0]] ); + } + if (array_key_exists( $keys[1], $arr )) { + $this->setLicenseUser( $arr[$keys[1]] ); + } + if (array_key_exists( $keys[2], $arr )) { + $this->setLicenseStart( $arr[$keys[2]] ); + } + if (array_key_exists( $keys[3], $arr )) { + $this->setLicenseEnd( $arr[$keys[3]] ); + } + if (array_key_exists( $keys[4], $arr )) { + $this->setLicenseSpan( $arr[$keys[4]] ); + } + if (array_key_exists( $keys[5], $arr )) { + $this->setLicenseStatus( $arr[$keys[5]] ); + } + if (array_key_exists( $keys[6], $arr )) { + $this->setLicenseData( $arr[$keys[6]] ); + } + if (array_key_exists( $keys[7], $arr )) { + $this->setLicensePath( $arr[$keys[7]] ); + } + if (array_key_exists( $keys[8], $arr )) { + $this->setLicenseWorkspace( $arr[$keys[8]] ); + } + if (array_key_exists( $keys[9], $arr )) { + $this->setLicenseType( $arr[$keys[9]] ); + } + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria () + { + $criteria = new Criteria( LicenseManagerPeer::DATABASE_NAME ); + + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_UID )) { + $criteria->add( LicenseManagerPeer::LICENSE_UID, $this->license_uid ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_USER )) { + $criteria->add( LicenseManagerPeer::LICENSE_USER, $this->license_user ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_START )) { + $criteria->add( LicenseManagerPeer::LICENSE_START, $this->license_start ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_END )) { + $criteria->add( LicenseManagerPeer::LICENSE_END, $this->license_end ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_SPAN )) { + $criteria->add( LicenseManagerPeer::LICENSE_SPAN, $this->license_span ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_STATUS )) { + $criteria->add( LicenseManagerPeer::LICENSE_STATUS, $this->license_status ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_DATA )) { + $criteria->add( LicenseManagerPeer::LICENSE_DATA, $this->license_data ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_PATH )) { + $criteria->add( LicenseManagerPeer::LICENSE_PATH, $this->license_path ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_WORKSPACE )) { + $criteria->add( LicenseManagerPeer::LICENSE_WORKSPACE, $this->license_workspace ); + } + if ($this->isColumnModified( LicenseManagerPeer::LICENSE_TYPE )) { + $criteria->add( LicenseManagerPeer::LICENSE_TYPE, $this->license_type ); + } + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria () + { + $criteria = new Criteria( LicenseManagerPeer::DATABASE_NAME ); + + $criteria->add( LicenseManagerPeer::LICENSE_UID, $this->license_uid ); + + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * + * @return string + */ + public function getPrimaryKey () + { + return $this->getLicenseUid(); + } + + /** + * Generic method to set the primary key (license_uid column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey ($key) + { + $this->setLicenseUid( $key ); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of LicenseManager (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @throws PropelException + */ + public function copyInto ($copyObj, $deepCopy = false) + { + + $copyObj->setLicenseUser( $this->license_user ); + + $copyObj->setLicenseStart( $this->license_start ); + + $copyObj->setLicenseEnd( $this->license_end ); + + $copyObj->setLicenseSpan( $this->license_span ); + + $copyObj->setLicenseStatus( $this->license_status ); + + $copyObj->setLicenseData( $this->license_data ); + + $copyObj->setLicensePath( $this->license_path ); + + $copyObj->setLicenseWorkspace( $this->license_workspace ); + + $copyObj->setLicenseType( $this->license_type ); + + $copyObj->setNew( true ); + + $copyObj->setLicenseUid( '' ); // this is a pkey column, so set to default value + + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return LicenseManager Clone of current object. + * @throws PropelException + */ + public function copy ($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class( $this ); + $copyObj = new $clazz(); + $this->copyInto( $copyObj, $deepCopy ); + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return LicenseManagerPeer + */ + public function getPeer () + { + if (self::$peer === null) { + self::$peer = new LicenseManagerPeer(); + } + return self::$peer; + } +} + diff --git a/workflow/engine/classes/model/om/BaseLicenseManagerPeer.php b/workflow/engine/classes/model/om/BaseLicenseManagerPeer.php new file mode 100644 index 000000000..c80984c72 --- /dev/null +++ b/workflow/engine/classes/model/om/BaseLicenseManagerPeer.php @@ -0,0 +1,647 @@ + array ('LicenseUid','LicenseUser','LicenseStart','LicenseEnd','LicenseSpan','LicenseStatus','LicenseData','LicensePath','LicenseWorkspace','LicenseType'), + BasePeer::TYPE_COLNAME => array (LicenseManagerPeer::LICENSE_UID,LicenseManagerPeer::LICENSE_USER,LicenseManagerPeer::LICENSE_START,LicenseManagerPeer::LICENSE_END,LicenseManagerPeer::LICENSE_SPAN,LicenseManagerPeer::LICENSE_STATUS,LicenseManagerPeer::LICENSE_DATA,LicenseManagerPeer::LICENSE_PATH,LicenseManagerPeer::LICENSE_WORKSPACE,LicenseManagerPeer::LICENSE_TYPE), + BasePeer::TYPE_FIELDNAME => array ('LICENSE_UID','LICENSE_USER','LICENSE_START','LICENSE_END','LICENSE_SPAN','LICENSE_STATUS','LICENSE_DATA','LICENSE_PATH','LICENSE_WORKSPACE','LICENSE_TYPE'), + BasePeer::TYPE_NUM => array (0,1,2,3,4,5,6,7,8,9) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + private static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('LicenseUid' => 0,'LicenseUser' => 1,'LicenseStart' => 2,'LicenseEnd' => 3,'LicenseSpan' => 4,'LicenseStatus' => 5,'LicenseData' => 6,'LicensePath' => 7,'LicenseWorkspace' => 8,'LicenseType' => 9), + BasePeer::TYPE_COLNAME => array (LicenseManagerPeer::LICENSE_UID => 0,LicenseManagerPeer::LICENSE_USER => 1,LicenseManagerPeer::LICENSE_START => 2,LicenseManagerPeer::LICENSE_END => 3,LicenseManagerPeer::LICENSE_SPAN => 4,LicenseManagerPeer::LICENSE_STATUS => 5,LicenseManagerPeer::LICENSE_DATA => 6,LicenseManagerPeer::LICENSE_PATH => 7,LicenseManagerPeer::LICENSE_WORKSPACE => 8,LicenseManagerPeer::LICENSE_TYPE => 9), + BasePeer::TYPE_FIELDNAME => array ('LICENSE_UID' => 0,'LICENSE_USER' => 1,'LICENSE_START' => 2,'LICENSE_END' => 3,'LICENSE_SPAN' => 4,'LICENSE_STATUS' => 5,'LICENSE_DATA' => 6,'LICENSE_PATH' => 7,'LICENSE_WORKSPACE' => 8,'LICENSE_TYPE' => 9), + BasePeer::TYPE_NUM => array (0,1,2,3,4,5,6,7,8,9) + ); + + /** + * + * @return MapBuilder the map builder for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getMapBuilder () + { + include_once 'classes/model/map/LicenseManagerMapBuilder.php'; + return BasePeer::getMapBuilder( 'classes.model.map.LicenseManagerMapBuilder' ); + } + + /** + * Gets a map (hash) of PHP names to DB column names. + * + * @return array The PHP to DB name map for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @deprecated Use the getFieldNames() and translateFieldName() methods instead of this. + */ + public static function getPhpNameMap () + { + if (self::$phpNameMap === null) { + $map = LicenseManagerPeer::getTableMap(); + $columns = $map->getColumns(); + $nameMap = array (); + foreach ($columns as $column) { + $nameMap[$column->getPhpName()] = $column->getColumnName(); + } + self::$phpNameMap = $nameMap; + } + return self::$phpNameMap; + } + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + static public function translateFieldName ($name, $fromType, $toType) + { + $toNames = self::getFieldNames( $toType ); + $key = isset( self::$fieldKeys[$fromType][$name] ) ? self::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException( "'$name' could not be found in the field names of type '$fromType'. These are: " . print_r( self::$fieldKeys[$fromType], true ) ); + } + return $toNames[$key]; + } + + /** + * Returns an array of of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return array A list of field names + */ + + static public function getFieldNames ($type = BasePeer::TYPE_PHPNAME) + { + if (! array_key_exists( $type, self::$fieldNames )) { + throw new PropelException( 'Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.' ); + } + return self::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. LicenseManagerPeer::COLUMN_NAME). + * @return string + */ + public static function alias ($alias, $column) + { + return str_replace( LicenseManagerPeer::TABLE_NAME . '.', $alias . '.', $column ); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param criteria object containing the columns to add. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns (Criteria $criteria) + { + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_UID ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_USER ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_START ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_END ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_SPAN ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_STATUS ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_DATA ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_PATH ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_WORKSPACE ); + + $criteria->addSelectColumn( LicenseManagerPeer::LICENSE_TYPE ); + + } + + const COUNT = 'COUNT(LICENSE_MANAGER.LICENSE_UID)'; + const COUNT_DISTINCT = 'COUNT(DISTINCT LICENSE_MANAGER.LICENSE_UID)'; + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria). + * @param Connection $con + * @return int Number of matching rows. + */ + public static function doCount (Criteria $criteria, $distinct = false, $con = null) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // clear out anything that might confuse the ORDER BY clause + $criteria->clearSelectColumns()->clearOrderByColumns(); + if ($distinct || in_array( Criteria::DISTINCT, $criteria->getSelectModifiers() )) { + $criteria->addSelectColumn( LicenseManagerPeer::COUNT_DISTINCT ); + } else { + $criteria->addSelectColumn( LicenseManagerPeer::COUNT ); + } + + // just in case we're grouping: add those columns to the select statement + foreach ($criteria->getGroupByColumns() as $column) { + $criteria->addSelectColumn( $column ); + } + + $rs = LicenseManagerPeer::doSelectRS( $criteria, $con ); + if ($rs->next()) { + return $rs->getInt( 1 ); + } else { + // no rows returned; we infer that means 0 matches. + return 0; + } + } + + /** + * Method to select one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param Connection $con + * @return LicenseManager + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne (Criteria $criteria, $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit( 1 ); + $objects = LicenseManagerPeer::doSelect( $critcopy, $con ); + if ($objects) { + return $objects[0]; + } + return null; + } + + /** + * Method to do selects. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect (Criteria $criteria, $con = null) + { + return LicenseManagerPeer::populateObjects( LicenseManagerPeer::doSelectRS( $criteria, $con ) ); + } + + /** + * Prepares the Criteria object and uses the parent doSelect() + * method to get a ResultSet. + * + * Use this method directly if you want to just get the resultset + * (instead of an array of objects). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return ResultSet The resultset object with numerically-indexed fields. + * @see BasePeer::doSelect() + */ + public static function doSelectRS (Criteria $criteria, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + if (! $criteria->getSelectColumns()) { + $criteria = clone $criteria; + LicenseManagerPeer::addSelectColumns( $criteria ); + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + // BasePeer returns a Creole ResultSet, set to return + // rows indexed numerically. + return BasePeer::doSelect( $criteria, $con ); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects (ResultSet $rs) + { + $results = array (); + + // set the class once to avoid overhead in the loop + $cls = LicenseManagerPeer::getOMClass(); + $cls = Propel::import( $cls ); + // populate the object(s) + while ($rs->next()) { + $obj = new $cls(); + $obj->hydrate( $rs ); + $results[] = $obj; + } + return $results; + } + + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap () + { + return Propel::getDatabaseMap( self::DATABASE_NAME )->getTable( self::TABLE_NAME ); + } + + /** + * The class that the Peer will make instances of. + * + * This uses a dot-path notation which is tranalted into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @return string path.to.ClassName + */ + public static function getOMClass () + { + return LicenseManagerPeer::CLASS_DEFAULT; + } + + /** + * Method perform an INSERT on the database, given a LicenseManager or Criteria object. + * + * @param mixed $values Criteria or LicenseManager object containing data that is used to create the INSERT statement. + * @param Connection $con the connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from LicenseManager object + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->begin(); + $pk = BasePeer::doInsert( $criteria, $con ); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + + return $pk; + } + + /** + * Method perform an UPDATE on the database, given a LicenseManager or Criteria object. + * + * @param mixed $values Criteria or LicenseManager object containing data that is used to create the UPDATE statement. + * @param Connection $con The connection to use (specify Connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $selectCriteria = new Criteria( self::DATABASE_NAME ); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + $comparison = $criteria->getComparison( LicenseManagerPeer::LICENSE_UID ); + $selectCriteria->add( LicenseManagerPeer::LICENSE_UID, $criteria->remove( LicenseManagerPeer::LICENSE_UID ), $comparison ); + + } else { + // $values is LicenseManager object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + return BasePeer::doUpdate( $selectCriteria, $criteria, $con ); + } + + /** + * Method to DELETE all rows from the LICENSE_MANAGER table. + * + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll ($con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + $affectedRows += BasePeer::doDeleteAll( LicenseManagerPeer::TABLE_NAME, $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Method perform a DELETE on the database, given a LicenseManager or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or LicenseManager object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param Connection $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete ($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( LicenseManagerPeer::DATABASE_NAME ); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } elseif ($values instanceof LicenseManager) { + $criteria = $values->buildPkeyCriteria(); + } else { + // it must be the primary key + $criteria = new Criteria( self::DATABASE_NAME ); + $criteria->add( LicenseManagerPeer::LICENSE_UID, (array) $values, Criteria::IN ); + } + + // Set the correct dbName + $criteria->setDbName( self::DATABASE_NAME ); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + + $affectedRows += BasePeer::doDelete( $criteria, $con ); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Validates all modified columns of given LicenseManager object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param LicenseManager $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate (LicenseManager $obj, $cols = null) + { + $columns = array (); + + if ($cols) { + $dbMap = Propel::getDatabaseMap( LicenseManagerPeer::DATABASE_NAME ); + $tableMap = $dbMap->getTable( LicenseManagerPeer::TABLE_NAME ); + + if (! is_array( $cols )) { + $cols = array ( + $cols + ); + } + + foreach ($cols as $colName) { + if ($tableMap->containsColumn( $colName )) { + $get = 'get' . $tableMap->getColumn( $colName )->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate( LicenseManagerPeer::DATABASE_NAME, LicenseManagerPeer::TABLE_NAME, $columns ); + } + + /** + * Retrieve a single object by pkey. + * + * @param mixed $pk the primary key. + * @param Connection $con the connection to use + * @return LicenseManager + */ + public static function retrieveByPK ($pk, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $criteria = new Criteria( LicenseManagerPeer::DATABASE_NAME ); + + $criteria->add( LicenseManagerPeer::LICENSE_UID, $pk ); + + $v = LicenseManagerPeer::doSelect( $criteria, $con ); + + return ! empty( $v ) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs ($pks, $con = null) + { + if ($con === null) { + $con = Propel::getConnection( self::DATABASE_NAME ); + } + + $objs = null; + if (empty( $pks )) { + $objs = array (); + } else { + $criteria = new Criteria(); + $criteria->add( LicenseManagerPeer::LICENSE_UID, $pks, Criteria::IN ); + $objs = LicenseManagerPeer::doSelect( $criteria, $con ); + } + return $objs; + } +} + +// static code to register the map builder for this Peer with the main Propel class +if (Propel::isInit()) { + // the MapBuilder classes register themselves with Propel during initialization + // so we need to load them here. + try { + BaseLicenseManagerPeer::getMapBuilder(); + } catch (Exception $e) { + Propel::log( 'Could not initialize Peer: ' . $e->getMessage(), Propel::LOG_ERR ); + } +} else { + // even if Propel is not yet initialized, the map builder class can be registered + // now and then it will be loaded when Propel initializes. + require_once 'classes/model/map/LicenseManagerMapBuilder.php'; + Propel::registerMapBuilder( 'classes.model.map.LicenseManagerMapBuilder' ); +} + diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 089a2f549..0056f0f2a 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -3811,9 +3811,51 @@ - - - + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
diff --git a/workflow/engine/menus/setup.php b/workflow/engine/menus/setup.php index 9be8f306b..f57f211f0 100755 --- a/workflow/engine/menus/setup.php +++ b/workflow/engine/menus/setup.php @@ -101,4 +101,16 @@ if ($RBAC->userCanAccess("PM_SETUP") == 1) { $G_TMP_MENU->AddIdRawOption("PM_REQUIREMENTS", "../setup/systemInfo", G::LoadTranslation("ID_PROCESSMAKER_REQUIREMENTS_CHECK"), "", "", "settings"); $G_TMP_MENU->AddIdRawOption("PHP_INFO", "../setup/systemInfo?option=php", G::LoadTranslation("ID_PHP_INFO"), "", "", "settings"); //$G_TMP_MENU->AddIdRawOption("PHP_MAINTENANCE", "../admin/maintenance", 'Maintenance', "", "", "settings"); -} \ No newline at end of file +} + + +require_once PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . 'enterprise.php'; + +$enterprise = new enterprisePlugin('enterprise'); + +if (!file_exists(PATH_DATA_SITE . "plugin.singleton")) { + $enterprise->enable(); +} +$enterprise->setup(); + + diff --git a/workflow/engine/methods/enterprise/addonsStore.php b/workflow/engine/methods/enterprise/addonsStore.php new file mode 100644 index 000000000..a20a055c9 --- /dev/null +++ b/workflow/engine/methods/enterprise/addonsStore.php @@ -0,0 +1,82 @@ +date) && is_array($licenseManager->date)) { + G::LoadClass( "configuration" ); + $conf = new Configurations(); + if ( defined('SYS_SYS') && $conf->exists("ENVIRONMENT_SETTINGS")) { + $licenseManager->date['START'] = date("Y-m-d H:i:s", strtotime($licenseManager->date['HUMAN']['START'])); + $licenseManager->date['END'] = date("Y-m-d H:i:s", strtotime($licenseManager->date['HUMAN']['END'])); + $licenseManager->date['START'] = $conf->getSystemDate($licenseManager->date['START']); + $licenseManager->date['END'] = $conf->getSystemDate($licenseManager->date['END']); + } else { + $licenseManager->date['START'] = date("Y-m-d H:i:s", strtotime($licenseManager->date['HUMAN']['START'])); + $licenseManager->date['END'] = date("Y-m-d H:i:s", strtotime($licenseManager->date['HUMAN']['END'])); + $licenseManager->date['START'] = G::getformatedDate($licenseManager->date['START'], 'M d, yyyy', SYS_LANG); + $licenseManager->date['END'] = G::getformatedDate($licenseManager->date['END'], 'M d, yyyy', SYS_LANG); + } +} + +if (isset($licenseManager->result) && $licenseManager->result == "OK") { + $oHeadPublisher->assign("license_start_date",$licenseManager->date["START"]); + $oHeadPublisher->assign("license_end_date", $licenseManager->expireIn!="NEVER" ? $licenseManager->date["END"]:"NA" ); + $oHeadPublisher->assign("license_user", $licenseManager->info["FIRST_NAME"] . " " . $licenseManager->info["LAST_NAME"] . " (" . $licenseManager->info["DOMAIN_WORKSPACE"] . ")"); + $oHeadPublisher->assign("license_span", $licenseManager->expireIn != "NEVER" ? ceil($licenseManager->date["SPAN"]/60/60/24) : "~"); + $oHeadPublisher->assign("license_name", $licenseManager->type); + $oHeadPublisher->assign("license_server", $licenseManager->server); + $oHeadPublisher->assign("license_expires", $licenseManager->expireIn); + $oHeadPublisher->assign("license_message", $licenseManager->status["message"]); + $oHeadPublisher->assign("licensed", true); +} +elseif (isset($licenseManager->info)) { + $oHeadPublisher->assign("license_start_date", $licenseManager->date["START"]); + $oHeadPublisher->assign("license_end_date", $licenseManager->date["END"]); + $oHeadPublisher->assign("license_span", $licenseManager->expireIn != "NEVER" ? ceil($licenseManager->date["SPAN"]/60/60/24) : "~"); + $oHeadPublisher->assign("license_user", $licenseManager->info["FIRST_NAME"] . " " . $licenseManager->info["LAST_NAME"] . " (" . $licenseManager->info["DOMAIN_WORKSPACE"] . ")"); + $oHeadPublisher->assign("license_name", $licenseManager->type); + $oHeadPublisher->assign("license_server", $licenseManager->server); + $oHeadPublisher->assign("license_expires", $licenseManager->expireIn); + $oHeadPublisher->assign("license_message", $licenseManager->status["message"]); + $oHeadPublisher->assign("licensed", false); +} else { + $oHeadPublisher->assign("license_user", ""); + $oHeadPublisher->assign("license_name", "Unlicensed"); + $oHeadPublisher->assign("license_server", "no server"); + $oHeadPublisher->assign("license_expires", ""); + + $currentLicenseStatus = $licenseManager->getCurrentLicenseStatus(); + + $oHeadPublisher->assign("license_message", $currentLicenseStatus["message"]); + $oHeadPublisher->assign("license_start_date", ""); + $oHeadPublisher->assign("license_end_date", ""); + $oHeadPublisher->assign("license_span", ""); + $oHeadPublisher->assign("licensed", false); +} +$oHeadPublisher->assign("license_serial", (isset($licenseManager->licenseSerial))? $licenseManager->licenseSerial : ''); +$oHeadPublisher->assign("SUPPORT_FLAG", ((isset($licenseManager->supportStartDate) && $licenseManager->supportStartDate == '') || !isset($licenseManager->supportStartDate)) ? true : false ); +$oHeadPublisher->assign("supportStartDate", (isset($licenseManager->supportStartDate))? $licenseManager->supportStartDate : ''); +$oHeadPublisher->assign("supportEndDate", (isset($licenseManager->supportEndDate))? $licenseManager->supportEndDate : ''); + +G::LoadClass("system"); + +$oHeadPublisher->assign("PROCESSMAKER_VERSION", System::getVersion()); +$oHeadPublisher->assign("PROCESSMAKER_URL", "/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN ); +$oHeadPublisher->assign("SYS_SKIN", SYS_SKIN); +$oHeadPublisher->assign("URL_PART_LOGIN", ((substr(SYS_SKIN, 0, 2) == "ux" && SYS_SKIN != "uxs")? "main/login" : "login/login")); +$oHeadPublisher->assign("URL_PART_SETUP", EnterpriseUtils::getUrlPartSetup()); +$oHeadPublisher->assign("PATH_PLUGINS_WRITABLE", ((is_writable(PATH_PLUGINS))? 1 : 0)); +$oHeadPublisher->assign("PATH_PLUGINS_WRITABLE_MESSAGE", "The directory " . PATH_PLUGINS . " have not writable."); +$oHeadPublisher->assign("SKIN_IS_UX", EnterpriseUtils::skinIsUx()); +$oHeadPublisher->assign("INTERNET_CONNECTION", EnterpriseUtils::getInternetConnection()); + +$oHeadPublisher->addExtJsScript("enterprise/addonsStore", true); +G::RenderPage("publish", "extJs"); + diff --git a/workflow/engine/methods/enterprise/addonsStoreAction.php b/workflow/engine/methods/enterprise/addonsStoreAction.php new file mode 100644 index 000000000..b04ed67c7 --- /dev/null +++ b/workflow/engine/methods/enterprise/addonsStoreAction.php @@ -0,0 +1,363 @@ + \"$log.log\" 2> \"$log.err\" < /dev/null &", $retval); + } + */ + + $task = str_replace("\"", null, $task); + $data = explode(" ", $task); + + $elem = array_shift($data); //delete first element + + run_addon_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]); + + $addonLocation = "http://{$licenseManager->server}/syspmLicenseSrv/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); + + /////// + //$licenseManager = &pmLicenseManager::getSingleton(); + + //plugin.singleton //are all the plugins that are enabled in the SYS_SYS + $pluginRegistry = &PMPluginRegistry::getSingleton(); + + $arrayAddon = array(); + + //ee //all plugins enterprise installed in /processmaker/workflow/engine/plugins (no matter if they are enabled/disabled) + if (file_exists(PATH_DATA_SITE . "ee")) { + $arrayAddon = unserialize(trim(file_get_contents(PATH_DATA_SITE . "ee"))); + } + + foreach ($arrayAddon as $addon) { + $sFileName = substr($addon["sFilename"], 0, strpos($addon["sFilename"], "-")); + + if (file_exists(PATH_PLUGINS . $sFileName . ".php")) { + $addonDetails = $pluginRegistry->getPluginDetails($sFileName . ".php"); + $enabled = 0; + + if ($addonDetails) { + $enabled = ($addonDetails->enabled)? 1 : 0; + } + + if ($enabled == 1 && !in_array($sFileName, $licenseManager->features)) { + require_once (PATH_PLUGINS . $sFileName . ".php"); + + $pluginRegistry->disablePlugin($sFileName); + } + } + } + + file_put_contents(PATH_DATA_SITE . "plugin.singleton", $pluginRegistry->serializeInstance()); + + /////// + $message = "A license has been correctly installed. Please login again to apply the changes"; + G::SendMessageText($message, "INFO"); + $_SESSION["___PMEE_INSTALLED_LIC___"] = $message; + + //G::header("location: ../enterprise/pluginsList"); //ok + //exit(0); + } + } + 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")); + 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 = SYS_SYS; + $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; + } + + //$logContents = file_get_contents("$log.log", false, NULL, 0, 10); + //if (!empty($logContents)) + // break; + + $retries += 1; + + if ($retries > $max_retries) { + $failed = true; + break; + } + } + + //if ($failed) { + // //$addon->clearState(); //clearState no found + // $result["success"] = false; + //} + + $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; + + $url = "http://$server/syspmLicenseSrv/en/green/services/rest"; + + if (EnterpriseUtils::checkConnectivity($url) == false) { + throw (new Exception("Server \"$server\" not available.")); + } + + /////// + $boundary = "---------------------" . substr(md5(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": + $result = AddonsStore::addonList(); + 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(); + } + echo G::json_encode($result); + +} catch (Exception $e) { + echo G::json_encode(array("success" => false, "errors" => $e->getMessage())); +} + diff --git a/workflow/engine/methods/enterprise/enterprise.php b/workflow/engine/methods/enterprise/enterprise.php new file mode 100644 index 000000000..728ea4434 --- /dev/null +++ b/workflow/engine/methods/enterprise/enterprise.php @@ -0,0 +1,364 @@ +sFriendlyName = "ProcessMaker Enterprise Edition"; + $this->sDescription = "ProcessMaker Enterprise Edition $VERSION"; + $this->sPluginFolder = "enterprise"; + $this->sSetupPage = "../enterprise/pluginsList.php"; + $this->iVersion = $VERSION; + $this->iPMVersion = "2.0.31"; + $this->aDependences = null; + $this->aWorkspaces = null; + + $this->database = "workflow"; + $this->table = array("ADDONS_STORE", "ADDONS_MANAGER", "LICENSE_MANAGER"); + + if (!isset($_SESSION["__EE_INSTALLATION__"])) { + $_SESSION["__EE_INSTALLATION__"] = 0; + } + + if (!isset($_SESSION["__EE_SW_PMLICENSEMANAGER__"])) { + $_SESSION["__EE_SW_PMLICENSEMANAGER__"] = 1; + } + + $sw = 1; + $msgf = null; + $msgd = null; + + if (file_exists(PATH_CORE . "plugins" . PATH_SEP . "pmLicenseManager.php")) { + $_SESSION["__EE_INSTALLATION__"] = 1; + $_SESSION["__EE_SW_PMLICENSEMANAGER__"] = 0; + + $plugin = "pmLicenseManager"; + $this->pluginUninstall($plugin); + + if (file_exists(PATH_CORE . "plugins" . PATH_SEP . $plugin . ".php") || file_exists(PATH_CORE . "plugins" . PATH_SEP . $plugin)) { + $msgf = $msgf . (($msgf != null)? ", " : null) . $plugin . ".php"; + $msgd = $msgd . (($msgd != null)? ", " : null) . $plugin; + $sw = 0; + } + + $plugin = "enterprise"; + $this->pluginUninstall($plugin); + + if (file_exists(PATH_CORE . "plugins" . PATH_SEP . $plugin . ".php") || file_exists(PATH_CORE . "plugins" . PATH_SEP . $plugin)) { + $msgf = $msgf . (($msgf != null)? ", " : null) . $plugin . ".php"; + $msgd = $msgd . (($msgd != null)? ", " : null) . $plugin; + $sw = 0; + } + + $this->uninstall(); + } else { + $_SESSION["__EE_INSTALLATION__"] = $_SESSION["__EE_INSTALLATION__"] + 1; + } + + if ($sw == 0) { + unset($_SESSION["__EE_INSTALLATION__"]); + unset($_SESSION["__EE_SW_PMLICENSEMANAGER__"]); + + /////// + $js = "window.open(\"/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN . "/setup/main?s=PLUGINS\", \"_top\", \"\");"; + + if (substr(SYS_SKIN, 0, 2) == "ux" && SYS_SKIN != "uxs") { + //$js = "parent.window.location.href = \"/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN . "/setup/main_init?s=PLUGINS\";"; + //$js = "window.location.href = \"/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN . "/setup/pluginsImport\";"; + $js = "window.open(\"/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN . "/main\", \"_top\", \"\");"; + } + + /////// + G::SendMessageText("ProcessMaker Enterprise plug-in can't delete the files \"$msgf\" and directories \"$msgd\" of \"" . (PATH_CORE . "plugins") . "\". Before proceeding with the installation of the plug-in must remove them.", "INFO"); + + echo ""; + exit(0); + } + + if ($_SESSION["__EE_SW_PMLICENSEMANAGER__"] == 0 && $_SESSION["__EE_INSTALLATION__"] == 2) { + unset($_SESSION["__EE_INSTALLATION__"]); + unset($_SESSION["__EE_SW_PMLICENSEMANAGER__"]); + + $this->install(); + } + + /////// + return $res; + } + + public function install() + { + } + + public function uninstall() + { + } + + public function setup() + { + $urlPart = substr(SYS_SKIN, 0, 2) == 'ux' && SYS_SKIN != 'uxs' ? 'main/login' : 'login/login'; + + $this->registerMenu("setup", "menuEnterprise.php"); + + //including the file inside the enterprise folder + require_once PATH_CORE . 'classes' . PATH_SEP . 'class.pmLicenseManager.php'; + $this->registerTrigger(PM_LOGIN, "enterpriseSystemUpdate"); + + $licenseManager = &pmLicenseManager::getSingleton(); + $oHeadPublisher = &headPublisher::getSingleton(); + + } + + public function enable() + { + $this->setConfiguration(); + $pluginRegistry = &PMPluginRegistry::getSingleton(); + + file_put_contents(PATH_DATA_SITE . "plugin.singleton", $pluginRegistry->serializeInstance()); + + require_once (PATH_CORE . 'classes/model/AddonsStore.php'); + AddonsStore::checkLicenseStore(); + $licenseManager = &pmLicenseManager::getSingleton(); + AddonsStore::updateAll(false); + } + + public function disable() + { + } + + public function setConfiguration() + { + $confEeUid = "enterpriseConfiguration"; + + $criteria = new Criteria("workflow"); + + $criteria->addSelectColumn(ConfigurationPeer::CFG_VALUE); + $criteria->add(ConfigurationPeer::CFG_UID, "EE"); + $criteria->add(ConfigurationPeer::OBJ_UID, $confEeUid); + + $rsCriteria = ConfigurationPeer::doSelectRS($criteria); + + if (!$rsCriteria->next()) { + $conf = new Configuration(); + + $data = array("internetConnection" => 1); + + $conf->create( + array( + "CFG_UID" => "EE", + "OBJ_UID" => $confEeUid, + "CFG_VALUE" => serialize($data), + "PRO_UID" => "", + "USR_UID" => "", + "APP_UID" => "" + ) + ); + } + } + + public function pluginUninstall($pluginName) + { + //define("PATH_PLUGINS", PATH_CORE . "plugins" . PATH_SEP); + + if (file_exists(PATH_CORE . "plugins" . PATH_SEP . $pluginName . ".php")) { + require_once (PATH_CORE . "plugins" . PATH_SEP . $pluginName . ".php"); + + $pluginRegistry = &PMPluginRegistry::getSingleton(); + + $pluginDetail = $pluginRegistry->getPluginDetails($pluginName . ".php"); + + if ($pluginDetail) { + $pluginRegistry->enablePlugin($pluginDetail->sNamespace); + $pluginRegistry->disablePlugin($pluginDetail->sNamespace); + + /////// + $plugin = new $pluginDetail->sClassName($pluginDetail->sNamespace, $pluginDetail->sFilename); + //$this->_aPlugins[$pluginDetail->sNamespace] = $plugin; + + if (method_exists($plugin, "uninstall")) { + $plugin->uninstall(); + } + + /////// + file_put_contents(PATH_DATA_SITE . "plugin.singleton", $pluginRegistry->serializeInstance()); + } + + /////// + unlink(PATH_CORE . "plugins" . PATH_SEP . $pluginName . ".php"); + + if (file_exists(PATH_CORE . "plugins" . PATH_SEP . $pluginName)) { + G::rm_dir(PATH_CORE . "plugins" . PATH_SEP . $pluginName); + } + } + } + + public function registerEE($pluginFile, $pluginVersion) + { + if (file_exists(PATH_DATA_SITE . "ee")) { + $this->systemAvailable = unserialize(trim(file_get_contents(PATH_DATA_SITE . "ee"))); + } + + $this->systemAvailable[$pluginFile]["sFilename"] = $pluginFile . "-" . $pluginVersion . ".tar"; + file_put_contents(PATH_DATA_SITE . "ee", serialize($this->systemAvailable)); + + return true; + } + + public function checkDependencies() + { + } + + public function tableBackup($tableBackup, $backupPrefix = "_", $backupSuffix = "_TEMP") + { + //Database Connections + $cnn = Propel::getConnection($this->database); + $stmt = $cnn->createStatement(); + + foreach ($tableBackup as $key => $table) { + $tablebak = $backupPrefix . $table . $backupSuffix; + + //First Search if the Table exists + $sqlTable = "SHOW TABLES LIKE '$table'"; + $rsTable = $stmt->executeQuery($sqlTable, ResultSet::FETCHMODE_ASSOC); + if ($rsTable->getRecordCount() > 0) { + //Table $table exists, so we can Backup + //If there are records in $table Backup + $sqlSelectTable = "SELECT * FROM $table"; + $rsSelectTable = $stmt->executeQuery($sqlSelectTable, ResultSet::FETCHMODE_ASSOC); + if ($rsSelectTable->getRecordCount() > 0) { + //There are records in $table!! Backup! + //Delete a previous Backup if exists + $sql = "DROP TABLE IF EXISTS $tablebak;"; + $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); + + //Create a COPY of $table in $tablebak :: Backup + $sql = "CREATE TABLE $tablebak SELECT * FROM $table"; + $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); + + //Delete a previous $table if exists + $sql = "DROP TABLE IF EXISTS $table;"; + $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); + } + } + } + } + + public function tableBackupRestore($tableBackup, $backupPrefix = "_", $backupSuffix = "_TEMP") + { + //Database Connections + $cnn = Propel::getConnection($this->database); + $stmt = $cnn->createStatement(); + + foreach ($tableBackup as $key => $table) { + $tablebak = $backupPrefix . $table . $backupSuffix; + + //First Search if the $tablebak exists + $sqlTablebak = "SHOW TABLES LIKE '$tablebak'"; + $rsTablebak = $stmt->executeQuery($sqlTablebak, ResultSet::FETCHMODE_ASSOC); + if ($rsTablebak->getRecordCount() > 0) { + //Table $tablebak exists, so we can Restore + $sqlSelectTablebak = "SELECT * FROM $tablebak"; + $rsSelectTablebak = $stmt->executeQuery($sqlSelectTablebak, ResultSet::FETCHMODE_ASSOC); + if ($rsSelectTablebak->getRecordCount() > 0) { + $strTable = str_replace("_", " ", strtolower($table)); + $strTable = str_replace(" ", null, ucwords($strTable)); + + require_once (PATH_PLUGINS . "enterprise" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "$strTable.php"); + + while ($rsSelectTablebak->next()) { + $row = $rsSelectTablebak->getRow(); + + //INSERT INTO TABLEN(FIELD1, FIELD2) VALUES('VALUE1', 'VALUE2') + $oTable = new $strTable(); + $oTable->fromArray($row, BasePeer::TYPE_FIELDNAME); //Fill an object from of the array //Fill attributes + $oTable->save(); + } + } + + //Delete Backup + $sql = "DROP TABLE IF EXISTS $tablebak;"; + $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); + } + } + } + + /* + public function tableIsInstalled() + { + G::LoadSystem("database_" . DB_ADAPTER); + $database = new database(DB_ADAPTER, DB_HOST, DB_USER, DB_PASS, DB_NAME); + + $cnn = Propel::getConnection($this->database); + $stmt = $cnn->createStatement(); + + $sw = true; + + foreach ($this->table as $key => $table) { + $rs = $stmt->executeQuery($database->generateShowTablesLikeSQL($table), ResultSet::FETCHMODE_ASSOC); + + if ($rs->getRecordCount() == 0) { + $sw = false; + } + } + + return ($sw); + } + */ + + public function sqlExecute($sqlFile) + { + $file = fopen($sqlFile, "r"); + + if ($file) { + $line = null; + + while (!feof($file)) { + $buffer = trim(fgets($file, 4096)); //Read a line. + + if (strlen($buffer) > 0 && $buffer[0] != "#") { + //Check for valid lines + $line = $line . $buffer; + + if ($buffer[strlen($buffer) - 1] == ";") { + $cnn = Propel::getConnection($this->database); + $stmt = $cnn->createStatement(); + $rs = $stmt->executeQuery($line, ResultSet::FETCHMODE_NUM); + $line = null; + } + } + } + + fclose($file); + } + } +} + +$oPluginRegistry = &PMPluginRegistry::getSingleton(); +$oPluginRegistry->registerPlugin('enterprise', __FILE__); //<- enterprise string must be in single quote, otherwise generate error + +//since we are placing pmLicenseManager and EE together.. after register EE, we need to require_once the pmLicenseManager +//if( !defined("PATH_PM_LICENSE_MANAGER") ) { +// define("PATH_PM_LICENSE_MANAGER", PATH_CORE . "/plugins/pmLicenseManager/"); +//} +//set_include_path( +// PATH_PM_LICENSE_MANAGER.PATH_SEPARATOR. +// get_include_path() +//); + diff --git a/workflow/engine/methods/enterprise/enterpriseAjax.php b/workflow/engine/methods/enterprise/enterpriseAjax.php new file mode 100644 index 000000000..97f4e6770 --- /dev/null +++ b/workflow/engine/methods/enterprise/enterpriseAjax.php @@ -0,0 +1,70 @@ +addSelectColumn(ConfigurationPeer::CFG_VALUE); + $criteria->add(ConfigurationPeer::CFG_UID, "EE"); + $criteria->add(ConfigurationPeer::OBJ_UID, $confEeUid); + + $rsCriteria = ConfigurationPeer::doSelectRS($criteria); + + if ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + $data = unserialize($row[0]); + + $data["internetConnection"] = $swInternetConnection; + + //Update values + $criteria1 = new Criteria("workflow"); + + $criteria1->add(ConfigurationPeer::CFG_UID, "EE"); + $criteria1->add(ConfigurationPeer::OBJ_UID, $confEeUid); + + //Update set + $criteria2 = new Criteria("workflow"); + + $criteria2->add(ConfigurationPeer::CFG_VALUE, serialize($data)); + + BasePeer::doUpdate($criteria1, $criteria2, Propel::getConnection("workflow")); + } else { + $conf = new Configuration(); + $data = array("internetConnection" => $swInternetConnection); + $conf->create( + array( + "CFG_UID" => "EE", + "OBJ_UID" => $confEeUid, + "CFG_VALUE" => serialize($data), + "PRO_UID" => "", + "USR_UID" => "", + "APP_UID" => "" + ) + ); + } + + $response["status"] = "OK"; + } catch (Exception $e) { + $response["message"] = $e->getMessage(); + $status = 0; + } + + if ($status == 0) { + $response["status"] = "ERROR"; + } + break; +} +echo G::json_encode($response); + diff --git a/workflow/engine/methods/enterprise/menuEnterprise.php b/workflow/engine/methods/enterprise/menuEnterprise.php new file mode 100644 index 000000000..22f3badf7 --- /dev/null +++ b/workflow/engine/methods/enterprise/menuEnterprise.php @@ -0,0 +1,31 @@ +getCurrentLicenseStatus(); + $licStatusMsg = null; + + if ((isset($pmLicenseManagerO->plan)) && ($pmLicenseManagerO->plan != "")) { + $lines = explode(" - ", $pmLicenseManagerO->plan); + if (isset($lines[0])) { + $licStatusMsg .= "
          " . $lines[0] . ""; + } + if ((isset($lines[1])) && ($lines[1] != $lines[0])) { + $licStatusMsg .= "
          " . $lines[1] . ""; + } + } + + if ($licenseStatusInfo["message"] != "") { + $licStatusMsg = " (" . $licenseStatusInfo["message"] . ")"; + } + + $G_TMP_MENU->AddIdRawOption("PMENTERPRISE", "../enterprise/addonsStore", "Enterprise Plugins Manager" . $licStatusMsg, "", "", "plugins"); + + if (isset($pmLicenseManagerO->result) && ($pmLicenseManagerO->result == "OK")) { + if (file_exists(PATH_HOME . "engine" . PATH_SEP . "methods" . PATH_SEP . "cases" . PATH_SEP . "casesListExtJs.php")) { + $G_TMP_MENU->AddIdRawOption("CASES_LIST_SETUP", "../enterprise/advancedTools/casesListSetup", "Cases Lists", "", "", "settings"); + } + } +} + diff --git a/workflow/engine/methods/enterprise/pluginsImportFile.php b/workflow/engine/methods/enterprise/pluginsImportFile.php new file mode 100644 index 000000000..2ef1a8c7e --- /dev/null +++ b/workflow/engine/methods/enterprise/pluginsImportFile.php @@ -0,0 +1,183 @@ +. + * + * For more information, contact Colosa Inc, 2566 Le Jeune Rd., + * Coral Gables, FL, 33134, USA, or email info@colosa.com. + * + */ + +global $RBAC; + +$RBAC->requirePermissions("PM_SETUP_ADVANCE"); +require_once PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . 'enterprise.php'; + +$response = array(); +$status = 1; + +try { + //Load the variables + G::LoadClass("plugin"); + + if (!isset($_FILES["form"]["error"]["PLUGIN_FILENAME"]) || $_FILES["form"]["error"]["PLUGIN_FILENAME"] == 1) { + $str = "There was an error uploading the file, probably the file size if greater than upload_max_filesize parameter in php.ini, please check this parameter and try again."; + throw (new Exception($str)); + } + + //save the file + if ($_FILES["form"]["error"]["PLUGIN_FILENAME"] == 0) { + $filename = $_FILES["form"]["name"]["PLUGIN_FILENAME"]; + $path = PATH_DOCUMENT . "input" . PATH_SEP ; + $tempName = $_FILES["form"]["tmp_name"]["PLUGIN_FILENAME"]; + G::uploadFile($tempName, $path, $filename ); + } + + if (!$_FILES["form"]["type"]["PLUGIN_FILENAME"] == "application/octet-stream") { + $str = "the uploaded files are invalid, expected \"application/octect-stream\" mime type file (". $_FILES["form"]["type"]["PLUGIN_FILENAME"] . ")"; + throw (new Exception($str)); + } + + G::LoadThirdParty("pear/Archive","Tar"); + $tar = new Archive_Tar($path. $filename); + $sFileName = substr($filename, 0, strrpos($filename, ".")); + $sClassName = substr($filename, 0, strpos($filename, "-")); + + $aFiles = $tar->listContent(); + $bMainFile = false; + $bClassFile = false; + + if (is_array($aFiles)) { + foreach ($aFiles as $key => $val) { + if ($val["filename"] == $sClassName . ".php") { + $bMainFile = true; + } + if ($val["filename"] == $sClassName . PATH_SEP . "class." . $sClassName . ".php") { + $bClassFile = true; + } + } + } else { + $str = "Failed to import the file default by doesn't a plugin or invalid file."; + throw (new Exception($str)); + } + + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $pluginFile = $sClassName . '.php'; + + if ($bMainFile && $bClassFile) { + $sAux = $sClassName . 'Plugin'; + $fVersionOld = 0.0; + if (file_exists(PATH_PLUGINS . $pluginFile)) { + if (!class_exists($sAux) && !class_exists($sClassName . 'plugin')) { + include PATH_PLUGINS . $pluginFile; + } + if (!class_exists($sAux)) { + $sAux = $sClassName . 'plugin'; + } + $oClass = new $sAux($sClassName); + $fVersionOld = $oClass->iVersion; + unset($oClass); + } + + $res = $tar->extract($path); + $sContent = file_get_contents($path . $pluginFile); + $sContent = str_ireplace($sAux, $sAux . '_', $sContent); + $sContent = str_ireplace('PATH_PLUGINS', "'".$path."'", $sContent); + $sContent = preg_replace("/\\\$oPluginRegistry\s*=\s*&\s*PMPluginRegistry::getSingleton\s*\(\s*\)\s*;/i", null, $sContent); + $sContent = preg_replace("/\\\$oPluginRegistry->registerPlugin\s*\(\s*[\"\']" . $sClassName . "[\"\']\s*,\s*__FILE__\s*\)\s*;/i", null, $sContent); + + //header('Content-Type: text/plain');var_dump($sClassName, $sContent);die; + file_put_contents($path . $pluginFile, $sContent); + $sAux = $sAux . '_'; + + include ($path . $pluginFile); + + $oClass = new $sAux($sClassName); + $fVersionNew = $oClass->iVersion; + if (!isset($oClass->iPMVersion)) { + $oClass->iPMVersion = 0; + } + + //if ($oClass->iPMVersion > 0) { + // G::LoadClass("system"); + // if (System::getVersion() > 0) { + // if ($oClass->iPMVersion > System::getVersion()) { + // //throw new Exception('This plugin needs version ' . $oClass->iPMVersion . ' or higher of ProcessMaker'); + // } + // } + //} + + /* + if (!isset($oClass->aDependences)) { + $oClass->aDependences = null; + } + if (!empty($oClass->aDependences)) { + foreach ($oClass->aDependences as $aDependence) { + if (file_exists(PATH_PLUGINS . $aDependence['sClassName'] . '.php')) { + require_once PATH_PLUGINS . $aDependence['sClassName'] . '.php'; + if (!$oPluginRegistry->getPluginDetails($aDependence['sClassName'] . '.php')) { + throw new Exception('This plugin needs "' . $aDependence['sClassName'] . '" plugin'); + } + } else { + throw new Exception('This plugin needs "' . $aDependence['sClassName'] . '" plugin'); + } + } + } + unset($oClass); + if ($fVersionOld > $fVersionNew) { + throw new Exception('A recent version of this plugin was already installed.'); + } + */ + + $res = $tar->extract(PATH_PLUGINS); + } else { + $str = "The file $filename doesn't contain class: $sClassName "; + throw (new Exception($str)); + } + + if (! file_exists(PATH_PLUGINS . $sClassName . '.php')) { + $str = "File '$pluginFile' doesn't exists "; + throw (new Exception($str)); + } + + require_once (PATH_PLUGINS . $pluginFile); + + $oPluginRegistry->registerPlugin($sClassName, PATH_PLUGINS . $sClassName . ".php"); + + $details = $oPluginRegistry->getPluginDetails($pluginFile); + + $oPluginRegistry->installPlugin($details->sNamespace); + $oPluginRegistry->setupPlugins(); //get and setup enabled plugins + $size = file_put_contents(PATH_DATA_SITE . "plugin.singleton", $oPluginRegistry->serializeInstance()); + + //G::header("Location: pluginsList"); + //die; + + $response["success"] = true; +} catch (Exception $e) { + $response["message"] = $e->getMessage(); + $status = 0; +} + +if ($status == 0) { + $response["success"] = false; +} + +echo G::json_encode($response); + diff --git a/workflow/engine/methods/enterprise/processMakerAjax.php b/workflow/engine/methods/enterprise/processMakerAjax.php new file mode 100644 index 000000000..877adde34 --- /dev/null +++ b/workflow/engine/methods/enterprise/processMakerAjax.php @@ -0,0 +1,369 @@ +extract(PATH_OUTTRUNK); //true on success, false on error. //directory for extract + //$swTar = $tar->extract(PATH_PLUGINS); + + if (!$swTar) { + throw (new Exception("Could not extract file.")); + } + + //Upgrade + $option = array( + "http" => array( + "method" => "POST" + ) + ); + + // Proxy settings + $sysConf = System::getSystemConfiguration(); + if (isset($sysConf['proxy_host'])) { + 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 = @fopen(EnterpriseUtils::getUrlServerName() . "/sys" . SYS_SYS . "/" . SYS_LANG . "/" . SYS_SKIN . "/enterprise/services/processMakerUpgrade", "rb", false, $context); + + if ($fileData === false) { + throw (new Exception("Could not open services url.")); + } + + $resultAux = G::json_decode(stream_get_contents($fileData)); + + if ($resultAux->status == "OK") { + $result["status"] = $resultAux->status; //OK + $result["message"] = $resultAux->message; + } else { + throw (new Exception($resultAux->message)); + } + } catch (Exception $e) { + $result["message"] = $e->getMessage(); + $status = 0; + } + + if ($status == 0) { + $result["status"] = "ERROR"; + } + + return $result; +} + + + + + +$option = (isset($_POST["option"]))? $_POST["option"] : null; + +switch ($option) { + case "install": + $uid = $_POST["uid"]; + $version = $_POST["version"]; + $versionName = $_POST["versionName"]; + $processMakerVersion = $_POST["processMakerVersion"]; + + $response = array(); + $status = 1; + + try { + if (EnterpriseUtils::getInternetConnection() == 0) { + throw (new Exception("Enterprise Plugins Manager no connected to internet.")); + } + + /////// + $versionName = EnterpriseUtils::pmVersion($versionName); + $processMakerVersion = EnterpriseUtils::pmVersion($processMakerVersion); + + if (!version_compare($processMakerVersion . "", $versionName . "", "<")) { + throw (new Exception("The system can't be upgraded to a previous version.")); + } + + /////// + $licenseManager = &pmLicenseManager::getSingleton(); + $server = isset($licenseManager->server) ? $licenseManager->server : ''; + + $url = "http://$server/syspmLicenseSrv/en/green/services/rest"; + + if (EnterpriseUtils::checkConnectivity($url) == false) { + throw (new Exception("Server '$server' not available.")); + } + + /////// + $boundary = "---------------------" . substr(md5(rand(0, 32000)), 0, 10); + $data = null; + + $data = $data . "--$boundary\n"; + $data = $data . "Content-Disposition: form-data; name=\"action\"\n\n" . "getPM" . "\n"; + $data = $data . "--$boundary\n"; + $data = $data . "Content-Disposition: form-data; name=\"OBJ_UID\"\n\n" . $uid . "\n"; + $data = $data . "--$boundary\n"; + $data = $data . "Content-Disposition: form-data; name=\"OBJ_VERSION\"\n\n" . $version . "\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 (isset($sysConf['proxy_host'])) { + 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 = @fopen($url, "rb", false, $context); + + if ($fileData === false) { + throw (new Exception("Could not open download url.")); + } + + //Try to get the download size and filename (ok if it fails) + $meta = stream_get_meta_data($fileData); + + $fileName = null; + $fileContentType = null; + $fileLength = 0; + + if ($meta["wrapper_type"] == "http") { + foreach ($meta["wrapper_data"] as $info) { + $info = explode(":", $info); + $infoVariable = (isset($info[0]))? trim($info[0]) : null; + $infoValue = (isset($info[1]))? trim($info[1]) : null; + + if (preg_match("/^.*Content-Type.*$/", $infoVariable)) { + $fileContentType = $infoValue; + } + + if (strcasecmp($infoVariable, "Content-Length") == 0) { + $fileLength = intval($infoValue); + } + + if (strcasecmp($infoVariable, "Content-Disposition") == 0) { + foreach (explode(";", $infoValue) as $params) { + $params = explode("=", $params); + + if (count($params) <= 1) { + continue; + } + + if (strcasecmp(trim($params[0]), "filename") == 0) { + $fileName = trim($params[1], "\" "); + } + } + } + } + } + + if (preg_match("/^.*json.*$/i", $fileContentType)) { + $r = G::json_decode(stream_get_contents($fileData)); + + if ($r->status == "ERROR") { + throw (new Exception($r->message)); + } + } + + /////// + $dir = PATH_DATA . "upgrade" . PATH_SEP . "processmaker"; + + G::rm_dir($dir); + G::mk_dir($dir); + + if (!file_exists($dir)) { + throw (new Exception("Could not create destination directory.")); + } + + /////// + $fileName = $dir . PATH_SEP . $fileName; + + $file = @fopen($fileName, "wb"); + + if ($file === false) { + throw (new Exception("Could not open destination file.")); + } + + while (!feof($fileData)) { + $data = fread($fileData, BUFSIZE); + + //Just to be safe, check all error conditions + if ($data === "" || $data === false) { + break; + } + + if (fwrite($file, $data) === false) { + break; + } + } + + fclose($file); + fclose($fileData); + + /////// + $path = PATH_TRUNK; + //$path = PATH_OUTTRUNK; + + if (EnterpriseUtils::checkFolderPermissions($path, true) == false) { + $str = $path . " " . "directory, its sub-directories or file is not writable. Read the wiki for Upgrading ProcessMaker.
The file is downloaded in " . $fileName . "
"; + throw (new Exception($str)); + } + + /////// + $result = install($fileName); + + if ($result["status"] == "OK") { + $response["status"] = $result["status"]; //OK + $response["message"] = $result["message"]; + } else { + throw (new Exception($result["message"])); + } + } catch (Exception $e) { + $response["message"] = $e->getMessage(); + $status = 0; + } + + if ($status == 0) { + $response["status"] = "ERROR"; + } + echo G::json_encode($response); + break; + case "list": + $status = 1; + try { + if (EnterpriseUtils::getInternetConnection() == 0) { + throw (new Exception("Enterprise Plugins Manager no connected to internet.")); + } + + /////// + $licenseManager = &pmLicenseManager::getSingleton(); + $server = (isset($licenseManager->server)) ? $licenseManager->server : ''; + + $url = "http://$server/syspmLicenseSrv/en/green/services/rest"; + + if (EnterpriseUtils::checkConnectivity($url) == false) { + throw (new Exception("Server '$server' not available.")); + } + + /////// + $option = array( + "http" => array( + "method" => "POST", + "header" => "Content-type: application/x-www-form-urlencoded\r\n", + "content" => http_build_query( + array( + "action" => "getPMList" + ) + ) + ) + ); + + // Proxy settings + $sysConf = System::getSystemConfiguration(); + if (isset($sysConf['proxy_host'])) { + 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); + + $results = file_get_contents($url, false, $context); + $results = G::json_decode($results); + $results = $results[0]; + + $pmVersion = EnterpriseUtils::pmVersion(PM_VERSION); + $versions = array(); + + foreach ($results as $key => $result) { + $version = EnterpriseUtils::pmVersion($result->OBJ_VERSION_NAME); + + if (version_compare($pmVersion . "", $version . "", "<")) { + $versions[] = $result; + } + } + + if (isset($results[0])) { + $results[0]->OBJ_VERSION_NAME .= " (Stable)"; + } + + $response->status = "OK"; + $response->results = $versions; + } catch (Exception $e) { + $response->message = $e->getMessage(); + $status = 0; + } + + if ($status == 0) { + $response->status = "ERROR"; + } + + echo G::json_encode($response); + break; +} + diff --git a/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css index f48c9554d..5341c8c91 100644 --- a/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css +++ b/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css @@ -1679,3 +1679,104 @@ padding:3px 3px 3px 5px; white-space:normal; } +/** + * Cases Interface styles + */ + + +.ICON_PMENTERPRISE { + background-image: url(/images/icon-pmlogo-15x15.png) !important; +} + +.ICON_ADDONSSTORE { + background-image: url(/images/enterprise/store-medium.png) !important; +} + +.msg .x-box-mc { + font-size:14px; +} + +#msg-div { + position:absolute; + left:35%; + top:10px; + width:250px; + z-index:20000; +} + +.x-form-display-field { + padding: 3px !important; +} + +.download-start { + background-color: #fff !important; +} + +.download { + background-color: #333333 !important; + /*padding-left: 17px !important;*/ + + background-image: url(/images/enterprise/loader-black.gif); + background-repeat: no-repeat; + background-position: 2px center; +} + +.install { + background-color: #333333 !important; + /*padding-left: 17px !important;*/ + + background-image: url(/images/enterprise/loader-black.gif); + background-repeat: no-repeat; + background-position: 2px center; +} + +.installed { + background-color: #959595 !important; + + /*background-image: url(tick-circle-frame.png);*/ + background-repeat: no-repeat; + background-position: 2px center; +} + +.disabled { + background-color: #959595 !important; + +/* background-image: url(minus-circle-frame.png);*/ + background-repeat: no-repeat; + background-position: 2px center; +} + +.upgrade { + background-color: #1da001 !important; +/* background-image: url(wooden-box--exclamation.png);*/ + background-repeat: no-repeat; + background-position: 2px center; +} + +.ready { + background-color: #1da001 !important; +/* background-image: url(wooden-box--plus.png);*/ + background-repeat: no-repeat; + background-position: 2px center; +} + +.available { + background-color: #ee2a0d !important; +/* background-image: url(store--plus.png);*/ + background-repeat: no-repeat; + background-position: 2px center; +} + +.roundedCorners{ + width: 100px; + padding: 2px; + /*border:1px solid #DDEEF6;*/ + background-color: #fffb00; + text-align: center; + text-shadow: 0 1px 0 #444444; + color: #FFFFFF !important; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + vertical-align: middle; +} diff --git a/workflow/engine/templates/enterprise/addonsStore.js b/workflow/engine/templates/enterprise/addonsStore.js new file mode 100644 index 000000000..0b86fa80a --- /dev/null +++ b/workflow/engine/templates/enterprise/addonsStore.js @@ -0,0 +1,1498 @@ +Ext.onReady(function() { + onMessageMnuContext = function (grid, rowIndex, e) { + e.stopEvent(); + var coords = e.getXY(); + mnuContext.showAt([coords[0], coords[1]]); + }; + + /////// + var storePM; + + var msgCt; + + //Stores + storePM = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: "processMakerAjax", + method: "POST" + }), + + baseParams: {"option": "list"}, + + reader: new Ext.data.JsonReader({ + root: "results", + fields: [{name: "OBJ_UID", type: "string"}, {name: "OBJ_VERSION", type: "string"}, {name: "OBJ_VERSION_NAME", type: "string"}] + }), + + autoLoad: true, //First call + + listeners: { + exception: function (proxy, type, action, options, response, args){ + var dataResponse; + var sw = 1; + + if (sw == 1 && !response.responseText) { + sw = 0; + } + if (sw == 1 && response.responseText && response.responseText != "") { + dataResponse = eval("(" + response.responseText + ")"); //json + + if (dataResponse.status && dataResponse.status == "ERROR") { + sw = 0; + } + } + + if (sw == 0) { + Ext.ComponentMgr.get("cboPmVersion").setDisabled(true); + Ext.ComponentMgr.get("btnPmUpgrade").setDisabled(true); + } + }, + load: function (store, record, option) { + Ext.ComponentMgr.get("cboPmVersion").setDisabled(false); + Ext.ComponentMgr.get("btnPmUpgrade").setDisabled(false); + + if (store.getAt(0)) { + Ext.ComponentMgr.get("cboPmVersion").setValue(store.getAt(0).get(Ext.ComponentMgr.get("cboPmVersion").valueField)); + } else { + Ext.ComponentMgr.get("cboPmVersion").setDisabled(true); + Ext.ComponentMgr.get("btnPmUpgrade").setDisabled(true); + } + } + } + }); + + function createBox(t, s){ + return ['
', + '
', + '

', t, '

', s, '
', + '
', + '
'].join(''); + } + + function message(title, arguments){ + if (!msgCt) { + msgCt = Ext.DomHelper.insertFirst(document.body, { + id:'msg-div' + }, true); + } + msgCt.alignTo(document, 't-t'); + //var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1)); + var m = Ext.DomHelper.append(msgCt, { + html:createBox(title, arguments) + }, true); + m.slideIn('t').pause(10).ghost("t", { + remove:true + }); + } + + Ext.QuickTips.init(); + Ext.form.Field.prototype.msgTarget = 'side'; + + var upgradeAddonId; + var upgradeStoreId; + + function newLocation() { + var site = ''; + if (SYS_SKIN.substring(0,2) == 'ux') { + site = PROCESSMAKER_URL + "/main?st=admin&s=PMENTERPRISE"; + } else { + site = PROCESSMAKER_URL + "/setup/main?s=PMENTERPRISE"; + } + return site; + } + function processMakerUpgrade() { + swReloadTask = 0; + var noticeWindow = new Ext.Window({ + closable: false, + autoHeight: true, + modal: true, + width: 600, + height: 350, + id: "notice_window", + title: _('ID_BEFORE_UPDATE'), + bodyStyle: "font: normal 13px sans;", + bbar: new Ext.Toolbar({ + buttonAlign: "center", + padding: 15, + items: [ + { + id: "upgrade-continue", + //text: " Continue » ", + text: _('ID_CONTINUE')+" >> ", + handler: function () { + noticeWindow.hide(); + + processMakerInstall(); + } + }, + { + id: "upgrade-cancel", + text: " "+ _('ID_CANCEL')+" ", + handler: function () { + swReloadTask = 1; + noticeWindow.hide(); + } + }] + }), + items: [{ + id: "notice", + preventBodyReset : true, + padding: 15, + html: _('ID_CAUTION_NOTICE') + }] + }); + + noticeWindow.show(); + } + + function upgradeStatus(addonId, storeId, record) { + upgradeAddonId = addonId; + upgradeStoreId = storeId; + //console.log(record); + //progressWindow.hide(); + progressWindow.show(); + //if (progress) + // Ext.ComponentMgr.get('upgrade-progress') + if (record) { + progress = record.get('progress'); + status = record.get('status'); + if (status == 'install') { + msg = _('ID_WAIT_INSTALLING_PLUGIN'); + } else if (status == 'install-finish') { + msg = _('ID_UPGRADE_FINISHED'); + } else { + msg = _('ID_UPGRADING_PLUGIN'); + } + if (status == "download" && progress) { + msg = _('ID_DOWNLOADING_UPGRADE') + " " + progress + "%"; + Ext.ComponentMgr.get('upgrade-progress').show(); + Ext.ComponentMgr.get('upgrade-progress').updateProgress(progress/100, '', true); + } else { + Ext.ComponentMgr.get('upgrade-progress').hide(); + } + Ext.ComponentMgr.get('finish-upgrade-button').setDisabled((status != "install-finish")); + msg = '

' + msg + '

'; + logMsg = record.get('log'); + while (logMsg && logMsg.indexOf("\n") > -1) { + logMsg = logMsg.replace("\n","
"); + } + if (logMsg && status != "download-start") { + Ext.ComponentMgr.get('upgrade-log').update("

" + _('ID_INSTALLATION_LOG') + "

"+logMsg+"

"); + } + } else { + msg = "

" + _('ID_UPGRADE_STARTING') + "

"; + } + Ext.ComponentMgr.get('upgrade-status').update(msg); + } + + function installError(addonId, storeId, msg) { + recordId = addonsStore.findBy(function(record) { + return (record.get("id") == addonId && record.get("store") == storeId); + }); + + downloadLink = ""; + if (recordId != -1) { + record = addonsStore.getAt(recordId); + url = record.get("url"); + downloadLink = "

" + _('ID_DOWNLOAD_MANUALLY') + "

"; + } + + if (msg === undefined) { + msg = "

"+_('ID_ERROR')+":" + _('ID_UNKNOWN') + "

"; + } else { + msg = "

"+_('ID_ERROR')+": " + msg + "

"; + } + + errorWindow = new Ext.Window({ + //applyTo: document.body, + layout: "fit", + width: 400, + height: 250, + plain: true, + modal: true, + + items: [{ + id: "error", + preventBodyReset: true, + padding: 15, + html: "

" + _('ID_INSTALL_ERROR') + "

" + + "

" + _('ID_ERROR_INSTALLING_ADDON') + "

" + + //downloadLink + + msg + }], + + buttons: [{ + text: _('ID_CLOSE'), + handler: function(){ + errorWindow.hide(); + } + }] + }); + errorWindow.show(this); + } + + function storeError(msg) { + if (msg === undefined) { + msg = "

"+_('ID_ERROR')+": " + _('ID_UNKNOWN') + "

"; + } else { + msg = "

"+_('ID_ERROR')+": " + msg + "

"; + } + + errorWindow = new Ext.Window({ + //applyTo:document.body, + layout:'fit', + width:400, + height:250, + plain: true, + modal: true, + + items: [{ + id: 'error', + preventBodyReset : true, + padding: 15, + html: '

' + _('ID_SERVER_ERROR') + '

'+ + '

' + _('ID_MARKET_SERVER_CONTACTING') + '

'+ + msg + }], + + buttons: [{ + text: _('ID_CLOSE'), + handler: function(){ + errorWindow.hide(); + } + }] + }); + errorWindow.show(this); + } + + function installAddon(addonId, storeId) + { var sw = 1; + var msg = ""; + + if (sw == 1 && PATH_PLUGINS_WRITABLE == 0) { + sw = 0; + msg = PATH_PLUGINS_WRITABLE_MESSAGE; + } + + if (sw == 1) { + swReloadTask = 0; + reloadTask.cancel(); + + recordId = addonsStore.findBy(function(record) { + return (record.get("id") == addonId && record.get("store") == storeId); + }); + + //var addonEnabled = ""; + + if (recordId != -1) { + record = addonsStore.getAt(recordId); + record.set("status", "download-start"); + record.commit(); + + //addonEnabled = record.get("enabled"); + } + + Ext.Ajax.request({ + url: "addonsStoreAction", + method: "POST", + params: { + "action": "install", + "addon": addonId, + "store": storeId + }, + + success: function (response, opts) { + var dataResponse = eval("(" + response.responseText + ")"); //json + swReloadTask = 1; + + if (dataResponse.status && dataResponse.status == "OK") { + //parent.Ext.getCmp(parent.tabItems[1].id).getRootNode().reload(); + parent.parent.window.location.href = newLocation(); + } else { + installError(addonId, storeId, dataResponse.message); + + addonsStore.load(); + } + }, + + failure: function (response, opts) { + swReloadTask = 1; + + //installError(addonId, storeId); + } + }); + } else { + Ext.MessageBox.alert(_('ID_WARNING'), msg); + } + } + + function addonAvailable(addonId) + { + if (INTERNET_CONNECTION == 1) { + swReloadTask = 0; + reloadTask.cancel(); + + Ext.MessageBox.confirm( + _('ID_CONFIRM'), + _('ID_SALES_DEPARTMENT_REQUEST'), + function (btn, text) { + if (btn == "yes") { + var myMask = new Ext.LoadMask(Ext.getBody(), {msg: _('ID_SENDING_REQUEST_SALES_DEPARTMENT')}); + myMask.show(); + + Ext.Ajax.request({ + url: "addonsStoreAction", + method: "POST", + params: { + "action": "available", + "addonId": addonId + }, + + success: function (response, opts) { + var dataResponse = eval("(" + response.responseText + ")"); //json + + swReloadTask = 1; + myMask.hide(); + + if (dataResponse.status && dataResponse.status == "OK") { + Ext.MessageBox.show({ + width: 400, + icon: Ext.MessageBox.INFO, + buttons: Ext.MessageBox.OK, + + title: _('ID_INFORMATION'), + msg: _('ID_REQUEST_SENT') + //fn: saveAddress + }); + } else { + Ext.MessageBox.alert(_('ID_WARNING'), dataResponse.message); + } + + addonsStore.load(); + }, + + failure: function (response, opts) { + swReloadTask = 1; + myMask.hide(); + } + }); + } else { + swReloadTask = 1; + + addonsStore.load(); + } + } + ); + } else { + Ext.MessageBox.alert(_('ID_INFORMATION'), _('ID_NO_INTERNET_CONECTION')); + } + } + + function processMakerInstall() + { + var myMask = new Ext.LoadMask(Ext.getBody(), {msg: _('ID_WAIT_WHILE_UPGRADING_PROCESSMAKER')}); + myMask.show(); + + var cboPm = Ext.ComponentMgr.get("cboPmVersion"); + + var record = cboPm.findRecord(cboPm.valueField, cboPm.getValue()); + var index = cboPm.store.indexOf(record); + + var uid = cboPm.store.getAt(index).get("OBJ_UID"); + var version = cboPm.getValue(); + var versionName = cboPm.store.getAt(index).get(cboPm.displayField); + + swReloadTask = 0; + reloadTask.cancel(); + + Ext.Ajax.timeout = 1800000; //milliseconds //1 millisecond = 0.001 second + + Ext.Ajax.request({ + url: "processMakerAjax", + method: "POST", + params: { + "option": "install", + "uid": uid, + "version": version, + "versionName": versionName, + "processMakerVersion": PROCESSMAKER_VERSION + }, + + success: function (response, opts) { + swReloadTask = 1; + myMask.hide(); + + var sw = 1; + var msg = ""; + + if (sw == 1 && response.responseText == "") { + sw = 0; + msg = ""; + } + + if (sw == 1 && !(/^.*\{.*\}.*$/.test(response.responseText))) { + sw = 0; + msg = "
" + response.responseText + "
"; + } + + if (sw == 1) { + var dataResponse = eval("(" + response.responseText + ")"); //json + + if (dataResponse.status && dataResponse.status == "OK") { + //window.location.href = ""; + //window.location.reload(); + Ext.MessageBox.alert(_('ID_INFORMATION'), dataResponse.message + "
" + _('ID_LOG_AGAIN'), function () { parent.parent.window.location.href = PROCESSMAKER_URL + (SYS_SKIN.substring(0,2) == 'ux')? "/main/login" :"/setup/login/login"; }); + } else { + Ext.MessageBox.alert(_('ID_WARNING'), _('ID_ERROR_UPGRADING_SYSTEM') + "
" + dataResponse.message); + addonsStore.load(); + } + } else { + Ext.MessageBox.alert(_('ID_WARNING'), _('ID_ERROR_CHECK_FOR_UPDATE_DONE') + "
" + msg, function () { parent.parent.window.location.href = PROCESSMAKER_URL + (SYS_SKIN.substring(0,2) == 'ux')? "/main/login" :"/setup/login/login"; }); + } + }, + + failure: function (response, opts) { + swReloadTask = 1; + myMask.hide(); + } + }); + } + + function enterpriseProcessAjax(option) + { + switch (option) { + case "SETUP": + var myMask = new Ext.LoadMask(Ext.getBody(), {msg: _('ID_PROCESSING')}); + myMask.show(); + break; + } + + var p = { + "option": option + }; + + switch (option) { + case "SETUP": + eval("p.internetConnection = \"" + ((Ext.getCmp("chkEeInternetConnection").checked == true)? 1 : 0) + "\""); + break; + } + + Ext.Ajax.request({ + url: "enterpriseAjax", + method: "POST", + params: p, + + success: function (response, opts) { + var dataResponse = eval("(" + response.responseText + ")"); //json + + switch (option) { + case "SETUP": + INTERNET_CONNECTION = (Ext.getCmp("chkEeInternetConnection").checked == true)? 1 : 0; + + reloadTask.cancel(); + + Ext.ComponentMgr.get("cboPmVersion").reset(); + Ext.ComponentMgr.get("cboPmVersion").store.load(); + + addonsStore.load({ + params: { + "force": true + } + }); + + Ext.getCmp("refresh-btn").setDisabled(!Ext.getCmp("chkEeInternetConnection").checked); + + myMask.hide(); + break; + } + }, + + failure: function (response, opts) { + // + } + }); + } + + var addonsStore = new Ext.data.JsonStore({ + proxy: new Ext.data.HttpProxy({ + url: "addonsStoreAction", + method: "POST" + }), + baseParams: {"action": "addonsList" + }, + + //url: "addonsStoreAction?action=addonsList", + + autoDestroy: true, + messageProperty: 'error', + storeId: 'addonsStore', + root: 'addons', + idProperty: 'id', + sortInfo: { + field: 'nick', + direction: 'ASC' // or 'DESC' (case sensitive for local sorting) + }, + fields: ['id', 'name', 'store', 'nick', 'latest_version', 'version', 'status', + 'type', 'release_type', 'url', 'enabled', 'publisher', 'description', + 'log', 'progress'], + listeners: { + 'beforeload': function(store, options) { + //if (Ext.ComponentMgr.get('latest_version').getValue() == "") + Ext.ComponentMgr.get('loading-indicator').setValue(''); + return true; + }, + "exception": function(e, type, action, options, response, arg) { + //if (type == "response") { + // message("Error", "ProcessMaker had a problem completing this action. Please try again later"); + //} else { + // message("Error", response); + //} + + Ext.ComponentMgr.get('loading-indicator').setValue(' '); + }, + "load": function(store, records, options) { + //reloadTask.delay(15000); //1 millisecond = 0.001 seconds + + //Ext.ComponentMgr.get('btnPmUpgrade').disable(); + Ext.ComponentMgr.get('loading-indicator').setValue(""); + progressWindow.hide(); + store.filterBy(function (record, id) { + if (record.get('type') == 'core') { + coreRecord = record.copy(); + + //Ext.ComponentMgr.get('btnPmUpgrade').enable(); + //console.log("Core state: " + record.get('status')); + //console.log(record); + status = record.get('status'); + if (status == "download-start" || status == "download" || status == "install" || status == "install-finish") { + upgradeStatus(record.get('id'), record.get('store'), record); + } + return false; + } + + if (record.get('status') == 'download-start' || record.get('status') == 'download' || record.get('status') == 'cancel' || record.get('status') == 'install') { + // + } + return true; + }); + + if (addonsGrid.disabled) { + addonsGrid.enable(); + } + + errors = store.reader.jsonData.errors; + for (var i = 0, n = errors.length; i"; + } + + //console.log(error_msg); + //console.log(store_errors.length); + if (store_errors.length > 0) { + Ext.ComponentMgr.get('loading-indicator').setValue(' '); + //storeError(error_msg); + reloadTask.cancel(); + } else { + Ext.ComponentMgr.get('loading-indicator').setValue(' '); + } + } + } + }); + + var upgradeStore = new Ext.data.Store({ + recordType: addonsStore.recordType + }); + + var swReloadTask = 1; + + var reloadTask = new Ext.util.DelayedTask( + function () + { + if (swReloadTask == 1) { + //addonsStore.load(); + } + } + ); + + + /********** UI Controls **********/ + + var progressWindow = new Ext.Window({ + closable:false, + autoHeight: false, + autoScroll: false, + modal: true, + width:600, + height:350, + id: 'upgrade_window', + title: _('ID_UPGRADE_LABEL'), + bodyStyle: "font: normal 13px sans;", + layout: 'vbox', + layoutConfig: { + align: 'stretch' + }, + bbar: new Ext.Toolbar({ + buttonAlign: 'center', + padding: 15, + disabled: true, + items: [{ + id: 'finish-upgrade-button', + text: ' ' + "Finish" + ' ', + handler: function() { + Ext.ComponentMgr.get('finish-upgrade-button').setDisabled(true); + Ext.Ajax.request({ + url: 'addonsStoreAction', + params: { + 'action':'finish', + 'addon': upgradeAddonId, + 'store': upgradeStoreId + } + }); + } + }] + }), + items: [{ + flex: 0, + id: 'upgrade-status', + preventBodyReset : true, + padding: 5, + html: '

' + _('ID_UPGRADE_LABEL') + '

' + },{ + flex: 0, + xtype: 'progress', + hidden: true, + id: 'upgrade-progress' + },{ + flex: 1, + id: 'upgrade-log', + preventBodyReset : true, + padding: 15, + html: '', + autoScroll: true + } + ] + }); + + var addLicenseWindow = new Ext.Window({ + title: _('ID_UPDATE_LICENSE'), + closeAction: 'hide', + id: 'upload-window', + resizeable: false, + modal: true, + //frame: true, + width: 500, + //autoHeight: true, + items: [{ + xtype: 'form', + id: 'upload-form', + fileUpload: true, + frame: true, + border: false, + //bodyStyle: 'padding: 10px 10px 0 10px;', + labelWidth: 100, + defaults: { + anchor: '90%' + }, + items: [{ + xtype: "fileuploadfield", + id: "upLicense", + emptyText: _('ID_SELECT_LICENSE_FILE'), + fieldLabel: _('ID_LICENSE_FILE'), + width: 200, + name: "upLicense" + }], + buttons: [{ + text: _('ID_UPLOAD'), + handler: function (button, event) { + var uploadForm = Ext.getCmp("upload-form"); + var sw = 1; + + var fileName = Ext.getCmp("upLicense").value; + + if (!uploadForm.getForm().isValid()) { + sw = 0; + } + if (!fileName) { + sw = 0; + Ext.MessageBox.alert(_('ID_WARNING'), _('ID_WARNING_ENTERPRISE_LICENSE_MSG')); + } + + if (fileName && !(/^.*\.dat$/.test(fileName))) { + sw = 0; + Ext.MessageBox.alert(_('ID_WARNING'), _('ID_WARNING_ENTERPRISE_LICENSE_MSG_DAT')); + } + + if (sw == 1) { + var pm = PROCESSMAKER_URL; + uploadForm.getForm().submit({ + url: "../enterprise/addonsStoreAction", + params: { + action: "importLicense" + }, + waitMsg: _('ID_UPDATING_LICENSE_MSG'), + success: function (form, o) { + //Ext.MessageBox.alert(_('ID_INFORMATION'), _('ID_SUCCESSFULLY_UPLOADED')); + //parent.parent.window.location.href = newLocation(); + Ext.MessageBox.alert(_('ID_INFORMATION'), _('ID_SUCCESSFULLY_UPLOADED'), function () { + parent.parent.window.location.href = PROCESSMAKER_URL + (SYS_SKIN.substring(0,2) == 'ux')? "/main/login" :"/setup/login/login"; + }); + }, + failure: function (form, o) { + var dataResponse = eval("(" + o.response.responseText + ")"); //json + console.log('error', dataResponse); + + Ext.MessageBox.alert(_('ID_WARNING'), (dataResponse.errors)? dataResponse.errors : _('ID_WARNING_ERROR_UPDATING')); + } + }); + } + } + }, + { + text: _('ID_CANCEL'), + handler: function() { + Ext.getCmp("upload-window").hide(); + } + } + ] + }] + }); + + var addPluginWindow = new Ext.Window({ + title: _('ID_UPLOAD_PLUGIN'), + closeAction: 'hide', + id: 'upload-plugin-window', + closeAction: 'hide', + resizable: false, + modal: true, + frame: true, + width: 400, + autoHeight: true, + items: [{ + xtype: 'form', + id: 'upload-plugin-form', + fileUpload: true, + frame: true, + border: false, + bodyStyle: 'padding: 10px 10px 0 10px;', + labelWidth: 60, + defaults: { + anchor: '100%' + }, + items: [{ + xtype: "fileuploadfield", + id: "PLUGIN_FILENAME", + + emptyText: _('ID_SELECT_PLUGIN_FILE'), + fieldLabel: _('ID_PLUGIN_FILE'), + name: "form[PLUGIN_FILENAME]" + }], + buttons: [{ + text: _('ID_UPLOAD'), + handler: function (button, event) { + var uploadForm = Ext.getCmp("upload-plugin-form"); + var sw = 1; + var msg = ""; + + if (sw == 1 && !uploadForm.getForm().isValid()) { + sw = 0; + msg = ""; + } + if (sw == 1 && !Ext.getCmp("PLUGIN_FILENAME").value) { + sw = 0; + msg = _('ID_SELECT_PLUGIN'); + } + + if (sw == 1) { + swReloadTask = 0; + reloadTask.cancel(); + + uploadForm.getForm().submit({ + url: "pluginsImportFile", + params: { + action: "installPlugin" + }, + waitMsg: _('ID_INSTALLING_PLUGIN'), + + success: function (form, action) { + var dataResponse = action.result; //json + + swReloadTask = 1; + Ext.getCmp("upload-plugin-window").hide(); + + parent.parent.window.location.href = newLocation(); + }, + + failure: function (form, action) { + var dataResponse = action.result; //json + + swReloadTask = 1; + + Ext.MessageBox.alert(_('ID_WARNING'), (dataResponse.message)? dataResponse.message : _('ID_ERROR_UPLOADING_PLUGIN')); + + addonsStore.load(); + } + }); + } else { + Ext.MessageBox.alert(_('ID_WARNING'), msg); + } + } + }, + { + text: _('ID_CANCEL'), + handler: function() { + Ext.getCmp("upload-plugin-window").hide(); + } + }] + }] + }); + + var pnlUpgrade = new Ext.FormPanel({ + frame: true, + title: _('ID_UPGRADE_SYSTEM'), + + bodyStyle: "padding: 5px 5px 5px 5px;", + disabled: !licensed, + + items: [ + { + layout: "column", + items: [ + { + columnWidth: 0.20, + xtype: "label", + text: _('ID_CURRENT_VERSION') + ":" + }, + { + columnWidth: 0.60, + xtype: "label", + text: PROCESSMAKER_VERSION + }, + { + columnWidth: 0.20, + xtype: "label", + text: "" + } + ] + }, + { + layout: "column", + style: "margin-top: 10px;", + items: [ + { + columnWidth: 0.20, + xtype: "label", + text: _('ID_LATEST_VERSION') + ":" + }, + { + columnWidth: 0.60, + xtype: "container", + items: [ + { + xtype: "combo", + id: "cboPmVersion", + editable: false, + store: storePM, + triggerAction: "all", + autoSelect: true, + mode: "local", + valueField: "OBJ_VERSION", + displayField: "OBJ_VERSION_NAME", + hidden:true, + emptyText: _('ID_NO_NEW_VERSIONS') + } + ] + }, + { + columnWidth: 0.20, + xtype: "button", + id: "btnPmUpgrade", + text: _('ID_UPGRADE_LABEL'), + disabled: true, + handler: function () { + if (INTERNET_CONNECTION == 1) { + processMakerUpgrade(); + } else { + Ext.MessageBox.alert(_('ID_INFORMATION'), _('ID_NO_INTERNET_CONECTION')); + } + } + } + ] + } + ] + }); + + var pnlSetup = new Ext.FormPanel({ + frame: true, + title: _('ID_SETUP_WEBSERVICES'), + height: 188, + bodyStyle: "padding: 5px 5px 5px 5px;", + disabled: !licensed, + + items: [ + { + layout: "column", + items: [ + { + columnWidth: 0.80, + xtype: "container", + items: [ + { + xtype: "checkbox", + id: "chkEeInternetConnection", + name: "chkEeInternetConnection", + checked: (INTERNET_CONNECTION == 1)? true : false, + boxLabel: _('ID_CHECK_UPDATES') + } + ] + }, + { + columnWidth: 0.20, + xtype: "button", + id: "btnEeSetup", + text: _('ID_SAVE'), + handler: function () { + enterpriseProcessAjax("SETUP"); + } + } + ] + } + ] + }); + + var pnlSystem = new Ext.Container({ + autoEl: "div", + //width: 550, + anchor: "right 50%", + //items: [pnlUpgrade, pnlSetup] + items: [ pnlSetup] + }); + + var licensePanel = new Ext.FormPanel( { + frame: true, + title: _('ID_YOUR_LICENSE'), + labelWidth: 150, + labelAlign: "right", + //width : '50%', + anchor: "right 50%", + bodyStyle: "padding: 5px 5px 5px 5px;", + defaultType: "displayfield", + autoHeight: true, + + items: [ + { + id: "license_name", + fieldLabel: _('ID_CURRENT_LICENSE'), + value: license_name + }, + { + id: "license_server", + fieldLabel: _('ID_LICENSE_SERVER'), + value: license_server + }, + { + id: "license_message", + fieldLabel:_('ID_STATUS'), + hidden: licensed, + hideLabel: licensed, + value: ""+license_message+" ("+license_start_date+"/"+license_end_date+")
"+license_user + }, + + { + id: "license_user", + fieldLabel: _('ID_ISSUED_TO'), + value: license_user, + hidden: !licensed, + hideLabel: !licensed + }, + + { + id: "license_expires", + fieldLabel: _('ID_EXPIRES'), + value: license_expires+'/'+license_span+" ("+license_start_date+" / "+license_end_date+")", + hidden: !licensed, + hideLabel: !licensed + }, + ], + buttons : [ + { + text: _('ID_IMPORT_LICENSE'), + disable: false, + handler: function() { + addLicenseWindow.show(); + } + }, + { + text : _('ID_RENEW'), + hidden: true, + disabled : true + } + ] + }); + + var expander = new Ext.grid.RowExpander({ + tpl : new Ext.Template( + '

'+_('ID_DESCRIPTION')+': {description}

' + ) + }); + + var btnUninstall = new Ext.Action({ + //id: "uninstall-btn", + text: _('ID_UNISTALL'), + tooltip: _('ID_UNISTALL_TIP'), + iconCls: "button_menu_ext ss_sprite ss_delete", + handler: function (b, e) { + //The plugin is activated, please deactivate first to remove it. + + var sw = 1; + var msg = ""; + + if (sw == 1 && PATH_PLUGINS_WRITABLE == 0) { + sw = 0; + msg = PATH_PLUGINS_WRITABLE_MESSAGE; + } + + if (sw == 1) { + Ext.MessageBox.confirm( + _('ID_CONFIRM'), + __('ID_CONFIRM_DELETE_PLUGIN')+"

"+__('ID_CONFIRM_DELETE_PLUGIN_WARNING'), + function (btn, text) { + if (btn == "yes") { + swReloadTask = 0; + reloadTask.cancel(); + + var record = addonsGrid.getSelectionModel().getSelected(); + addonsGrid.disable(); + + Ext.Ajax.request({ + url: "addonsStoreAction", + params: { + "action": _('ID_UNISTALL'), + "addon": record.get("id"), + "store": record.get("store") + }, + success: function (response, opts) { + var dataResponse = eval("(" + response.responseText + ")"); //json + swReloadTask = 1; + + if (dataResponse.status && dataResponse.status == "OK") { + parent.parent.window.location.href = newLocation(); + } else { + Ext.MessageBox.alert(_('ID_ERROR_UNISTALLING') + " " + record.get("name"), dataResponse.message); + addonsStore.load(); + } + } + }); + } + } + ); + } else { + Ext.MessageBox.alert(_('ID_WARNING'), msg); + } + } + }); + + var btnEnable = new Ext.Action({ + //id: "enable-btn", + text: _('ID_ENABLE'), + tooltip: _('ID_ENABLE_PLUGIN_TIP'), + iconCls: "button_menu_ext ss_sprite ss_tag_green", + disabled: true, + handler: function (b, e) { + var record = addonsGrid.getSelectionModel().getSelected(); + addonsGrid.disable(); + + Ext.Ajax.request({ + url: "addonsStoreAction", + params: { + "action":"enable", + "addon": record.get("id"), + "store": record.get("store") + }, + callback: function () { + parent.parent.window.location.href = newLocation(); + }, + success: function (response) { + var obj = eval("(" + response.responseText + ")"); //json + + if (!obj.success) { + Ext.MessageBox.alert(_('ID_ERROR_ENABLING') + " " + record.get("name"), obj.error); + } + } + }); + } + }); + + var btnDisable = new Ext.Action({ + //id: "disable-btn", + text: _('ID_DISABLE'), + tooltip: _('ID_DISABLE_PLUGIN_TIP'), + iconCls: "button_menu_ext ss_sprite ss_tag_red", + disabled: true, + handler: function (b, e) { + var record = addonsGrid.getSelectionModel().getSelected(); + addonsGrid.disable(); + + Ext.Ajax.request({ + url: "addonsStoreAction", + params: { + "action":"disable", + "addon": record.get("id"), + "store": record.get("store") + }, + callback: function () { + parent.parent.window.location.href = newLocation(); + }, + success: function (response) { + var obj = eval("(" + response.responseText + ")"); //json + + if (!obj.success) { + Ext.MessageBox.alert(_('ID_ERROR_DISABLING') + " " + record.get("name"), obj.error); + } + } + }); + } + }); + + var btnAdmin = new Ext.Action({ + text: _('ID_ADMIN'), + tooltip: _('ID_ADMIN_PLUGIN_TIP'), + //iconCls: "button_menu_ext ss_sprite ss_cog_edit", + iconCls: "button_menu_ext ss_sprite ss_cog", + disabled: true, + handler: function () { + var record = addonsGrid.getSelectionModel().getSelected(); + addonsGrid.disable(); + + window.location.href = "pluginsSetup?id=" + record.get("id") + ".php"; + } + }); + + var mnuContext = new Ext.menu.Menu({ + //items: [btnUninstall, "-", btnEnable, btnDisable] + items: [btnEnable, btnDisable, btnAdmin] + }); + + var addonsGrid = new Ext.grid.GridPanel({ + store: addonsStore, + colspan: 2, + flex: 1, + padding: 5, + disabled: !licensed, + columns: [ + expander, + { + id : 'icon-column', + header : '', + width : 30, + //sortable : true, + menuDisabled: true, + hideable : false, + dataIndex: 'status', + renderer : function (val, metadata, record, rowIndex, colIndex, store) { + return ""; + } + }, + { + id :'nick-column', + header : _('ID_NAME'), + //width : 160, + //sortable : true, + menuDisabled: true, + dataIndex: 'nick', + renderer: function (val, metadata, record, rowIndex, colIndex, store) { + if (record.get('release_type') == 'beta') { + return val + " (Beta)"; + } else if (record.get('release_type') == 'localRegistry') { + return val + " (Local)"; + } else { + return val; + } + } + }, + { + id : 'publisher-column', + header : _('ID_PUBLISHER'), + //sortable : true, + menuDisabled: true, + dataIndex: 'publisher' + }, + { + id : 'version-column', + header : _('ID_VERSION'), + //width : 160, + //sortable : true, + menuDisabled: true, + dataIndex: 'version' + }, + { + id : 'latest-version-column', + header : _('ID_LATEST_VERSION'), + //width : 160, + //sortable : true, + menuDisabled: true, + dataIndex: 'latest_version' + }, + { + id : 'enabled-column', + header : _('ID_ENABLED'), + width : 60, + //sortable : true, + menuDisabled: true, + dataIndex: 'enabled', + renderer: function (val) { + if (val === true) { + return ""; + } else if (val === false) { + return ""; + } + return ''; + } + }, + { + id : "status", + header : "", + width : 120, + //sortable : true, + menuDisabled: true, + hideable : false, + dataIndex: "status", + renderer: function (val) { + var str = ""; + var text = ""; + + switch (val) { + case "available": text = _('ID_BUY_NOW'); break; + case "installed": text = _('ID_INSTALLED'); break; + case "ready": text = _('ID_INSTALL_NOW'); break; + case "upgrade": text = _('ID_UPGRADE_NOW'); break; + case "download": text = _('ID_CANCEL'); break; + case "install": text = _('ID_INSTALLING'); break; + case "cancel": text = _('ID_CANCELLING'); break; + case "disabled": text = _('ID_DISABLED'); break; + case "download-start": text = ""; break; + default: text = val; break; + } + + switch (val) { + case "available": + case "ready": + case "upgrade": + case "download": + case "install": + case "cancel": + case "download-start": + str = "
" + text + "
"; + break; + + case "installed": + case "disabled": + str = "
" + text + "
"; + break; + + default: + str = "
" + text + "
"; + break; + } + + return (str); + } + } + ], + tbar:[/*{ + text:'Install', + tooltip:'Install this addon', + //iconCls:'add', + handler: function(b, e) { + record = addonsGrid.getSelectionModel().getSelected(); + console.log(record.get('name') + ' ' + record.get('store')); + installAddon(record.get('name'), record.get('store')); + } + }, + btnUninstall, + '-',*/ + btnEnable, + btnDisable, + btnAdmin, + '-', + { + id: "import-btn", + text: _('ID_INSTALL_FROM_FILE'), + tooltip: _('ID_INSTALL_FROM_FILE_PLUGIN_TIP'), + iconCls:"button_menu_ext ss_sprite ss_application_add", + + //ref: "../removeButton", + disabled: false, + handler: function () { + var sw = 1; + var msg = ""; + if (sw == 1 && PATH_PLUGINS_WRITABLE == 0) { + sw = 0; + msg = PATH_PLUGINS_WRITABLE_MESSAGE; + } + if (sw == 1) { + addPluginWindow.show(); + } else { + Ext.MessageBox.alert(_('ID_WARNING'), msg); + } + } + }, + '-', + { + id: 'refresh-btn', + text:_('ID_REFRESH_LABEL'), + iconCls:'button_menu_ext ss_sprite ss_database_refresh', + tooltip: _('ID_REFRESH_LABEL_PLUGIN_TIP'), + disabled: (INTERNET_CONNECTION == 1)? false : true, + handler: function (b, e) { + reloadTask.cancel(); + addonsStore.load({ + params: { + "force": true + } + }); + } + }, + '->', + { + xtype:"displayfield", + id:'loading-indicator' + } + ], + plugins: expander, + collapsible: false, + animCollapse: false, + stripeRows: true, + autoExpandColumn: 'nick-column', + title: _('ID_ENTERPRISE_PLUGINS'), + sm: new Ext.grid.RowSelectionModel({ + singleSelect:true, + listeners: { + selectionchange: function (sel) { + if (sel.getCount() == 0 || sel.getSelected().get("name") == "enterprise") { + //btnUninstall.setDisabled(true); + btnEnable.setDisabled(true); + btnDisable.setDisabled(true); + btnAdmin.setDisabled(true); + } else { + record = sel.getSelected(); + + //btnUninstall.setDisabled(!(record.get("status") == "installed" || record.get("status") == "upgrade" || record.get("status") == "disabled")); + btnEnable.setDisabled(!(record.get("enabled") === false)); + btnDisable.setDisabled(!(record.get("enabled") === true)); + btnAdmin.setDisabled(!(record.get("enabled") === true)); + } + } + } + }), + //config options for stateful behavior + stateful: true, + stateId: "grid", + listeners: { + "cellclick": function (grid, rowIndex, columnIndex, e) { + var record = grid.getStore().getAt(rowIndex); + var fieldName = grid.getColumnModel().getDataIndex(columnIndex); + //var data = record.get(fieldName); + + if (fieldName != "status") { + return; + } + + switch (record.get("status")) { + case "upgrade": + case "ready": + if (INTERNET_CONNECTION == 1) { + installAddon(record.get("id"), record.get("store")); + } else { + Ext.MessageBox.alert(_('ID_INFORMATION'), _('ID_NO_INTERNET_CONECTION')); + } + break; + case "download": + Ext.Ajax.request({ + url: "addonsStoreAction", + params: { + "action": "cancel", + "addon": record.get("id"), + "store": record.get("store") + } + }); + break; + case "available": + addonAvailable(record.get("id")); + break; + } + } + } + }); + + var topBox = new Ext.Panel({ + id:'main-panel-hbox', + baseCls:'x-plain', + layout:'hbox', + flex: 0, + //defaultMargins: "5", + //autoHeight: true, + layoutConfig: { + align : 'stretchmax', + pack : 'start' + }, + defaults: { + frame:true, + flex: 1, + height: 210 + }, + items:[licensePanel, pnlSystem] + }); + + var fullBox = new Ext.Panel({ + id:'main-panel-vbox', + baseCls:'x-plain', + anchor: "right 100%", + layout:'vbox', + //padding: 10, + //defaultMargins: "5", + layoutConfig: { + align : 'stretch', + pack : 'start' + }, + + defaults: { + frame:true + }, + items:[topBox, addonsGrid] + }); + + /////// + addonsGrid.on("rowcontextmenu", + function (grid, rowIndex, evt) { + var sm = grid.getSelectionModel(); + sm.selectRow(rowIndex, sm.isSelected(rowIndex)); + }, + this + ); + + addonsGrid.addListener("rowcontextmenu", onMessageMnuContext, this); + + /////// + var viewport = new Ext.Viewport({ + layout: "anchor", + anchorSize: { + width:800, + height:600 + }, + items:[fullBox] + }); + + if (licensed) { + addonsStore.load(); + } +}); + diff --git a/workflow/public_html/images/enterprise/available.png b/workflow/public_html/images/enterprise/available.png new file mode 100644 index 000000000..c85e6591c Binary files /dev/null and b/workflow/public_html/images/enterprise/available.png differ diff --git a/workflow/public_html/images/enterprise/cancel.png b/workflow/public_html/images/enterprise/cancel.png new file mode 100644 index 000000000..0db86f686 Binary files /dev/null and b/workflow/public_html/images/enterprise/cancel.png differ diff --git a/workflow/public_html/images/enterprise/cross-circle-frame.png b/workflow/public_html/images/enterprise/cross-circle-frame.png new file mode 100644 index 000000000..0db86f686 Binary files /dev/null and b/workflow/public_html/images/enterprise/cross-circle-frame.png differ diff --git a/workflow/public_html/images/enterprise/cross-circle.png b/workflow/public_html/images/enterprise/cross-circle.png new file mode 100644 index 000000000..20d6f5ea0 Binary files /dev/null and b/workflow/public_html/images/enterprise/cross-circle.png differ diff --git a/workflow/public_html/images/enterprise/cross-white.png b/workflow/public_html/images/enterprise/cross-white.png new file mode 100644 index 000000000..e443a6ee3 Binary files /dev/null and b/workflow/public_html/images/enterprise/cross-white.png differ diff --git a/workflow/public_html/images/enterprise/disabled.png b/workflow/public_html/images/enterprise/disabled.png new file mode 100644 index 000000000..1be08e574 Binary files /dev/null and b/workflow/public_html/images/enterprise/disabled.png differ diff --git a/workflow/public_html/images/enterprise/download-start.png b/workflow/public_html/images/enterprise/download-start.png new file mode 100644 index 000000000..1920b1bb2 Binary files /dev/null and b/workflow/public_html/images/enterprise/download-start.png differ diff --git a/workflow/public_html/images/enterprise/download.png b/workflow/public_html/images/enterprise/download.png new file mode 100644 index 000000000..1920b1bb2 Binary files /dev/null and b/workflow/public_html/images/enterprise/download.png differ diff --git a/workflow/public_html/images/enterprise/enterprise.png b/workflow/public_html/images/enterprise/enterprise.png new file mode 100644 index 000000000..ab0e19ae8 Binary files /dev/null and b/workflow/public_html/images/enterprise/enterprise.png differ diff --git a/workflow/public_html/images/enterprise/exclamation--frame.png b/workflow/public_html/images/enterprise/exclamation--frame.png new file mode 100644 index 000000000..61558838e Binary files /dev/null and b/workflow/public_html/images/enterprise/exclamation--frame.png differ diff --git a/workflow/public_html/images/enterprise/exclamation-diamond-frame.png b/workflow/public_html/images/enterprise/exclamation-diamond-frame.png new file mode 100644 index 000000000..476a9d4ae Binary files /dev/null and b/workflow/public_html/images/enterprise/exclamation-diamond-frame.png differ diff --git a/workflow/public_html/images/enterprise/exclamation-diamond.png b/workflow/public_html/images/enterprise/exclamation-diamond.png new file mode 100644 index 000000000..cb86732d8 Binary files /dev/null and b/workflow/public_html/images/enterprise/exclamation-diamond.png differ diff --git a/workflow/public_html/images/enterprise/exclamation-octagon-frame.png b/workflow/public_html/images/enterprise/exclamation-octagon-frame.png new file mode 100644 index 000000000..40826c990 Binary files /dev/null and b/workflow/public_html/images/enterprise/exclamation-octagon-frame.png differ diff --git a/workflow/public_html/images/enterprise/exclamation-octagon.png b/workflow/public_html/images/enterprise/exclamation-octagon.png new file mode 100644 index 000000000..f5b36011c Binary files /dev/null and b/workflow/public_html/images/enterprise/exclamation-octagon.png differ diff --git a/workflow/public_html/images/enterprise/exclamation-white.png b/workflow/public_html/images/enterprise/exclamation-white.png new file mode 100644 index 000000000..eeb557ace Binary files /dev/null and b/workflow/public_html/images/enterprise/exclamation-white.png differ diff --git a/workflow/public_html/images/enterprise/install.png b/workflow/public_html/images/enterprise/install.png new file mode 100644 index 000000000..1920b1bb2 Binary files /dev/null and b/workflow/public_html/images/enterprise/install.png differ diff --git a/workflow/public_html/images/enterprise/installed.png b/workflow/public_html/images/enterprise/installed.png new file mode 100644 index 000000000..3ec0ceb13 Binary files /dev/null and b/workflow/public_html/images/enterprise/installed.png differ diff --git a/workflow/public_html/images/enterprise/key.png b/workflow/public_html/images/enterprise/key.png new file mode 100644 index 000000000..82846369f Binary files /dev/null and b/workflow/public_html/images/enterprise/key.png differ diff --git a/workflow/public_html/images/enterprise/licence_1.png b/workflow/public_html/images/enterprise/licence_1.png new file mode 100644 index 000000000..0d7baed4e Binary files /dev/null and b/workflow/public_html/images/enterprise/licence_1.png differ diff --git a/workflow/public_html/images/enterprise/loader-black.gif b/workflow/public_html/images/enterprise/loader-black.gif new file mode 100644 index 000000000..dc6640f1c Binary files /dev/null and b/workflow/public_html/images/enterprise/loader-black.gif differ diff --git a/workflow/public_html/images/enterprise/loader.gif b/workflow/public_html/images/enterprise/loader.gif new file mode 100644 index 000000000..408af5cf2 Binary files /dev/null and b/workflow/public_html/images/enterprise/loader.gif differ diff --git a/workflow/public_html/images/enterprise/lock--plus.png b/workflow/public_html/images/enterprise/lock--plus.png new file mode 100644 index 000000000..df093bdd2 Binary files /dev/null and b/workflow/public_html/images/enterprise/lock--plus.png differ diff --git a/workflow/public_html/images/enterprise/minus-circle-frame.png b/workflow/public_html/images/enterprise/minus-circle-frame.png new file mode 100644 index 000000000..c3a76ad1d Binary files /dev/null and b/workflow/public_html/images/enterprise/minus-circle-frame.png differ diff --git a/workflow/public_html/images/enterprise/minus-circle.png b/workflow/public_html/images/enterprise/minus-circle.png new file mode 100644 index 000000000..0cd0ca2ba Binary files /dev/null and b/workflow/public_html/images/enterprise/minus-circle.png differ diff --git a/workflow/public_html/images/enterprise/plus-circle-frame.png b/workflow/public_html/images/enterprise/plus-circle-frame.png new file mode 100644 index 000000000..03ad9d3db Binary files /dev/null and b/workflow/public_html/images/enterprise/plus-circle-frame.png differ diff --git a/workflow/public_html/images/enterprise/plus-circle.png b/workflow/public_html/images/enterprise/plus-circle.png new file mode 100644 index 000000000..113873963 Binary files /dev/null and b/workflow/public_html/images/enterprise/plus-circle.png differ diff --git a/workflow/public_html/images/enterprise/ready.png b/workflow/public_html/images/enterprise/ready.png new file mode 100644 index 000000000..5999bd43d Binary files /dev/null and b/workflow/public_html/images/enterprise/ready.png differ diff --git a/workflow/public_html/images/enterprise/store--plus.png b/workflow/public_html/images/enterprise/store--plus.png new file mode 100644 index 000000000..c85e6591c Binary files /dev/null and b/workflow/public_html/images/enterprise/store--plus.png differ diff --git a/workflow/public_html/images/enterprise/store-medium.png b/workflow/public_html/images/enterprise/store-medium.png new file mode 100644 index 000000000..6057cd98b Binary files /dev/null and b/workflow/public_html/images/enterprise/store-medium.png differ diff --git a/workflow/public_html/images/enterprise/store.png b/workflow/public_html/images/enterprise/store.png new file mode 100644 index 000000000..901ce0b48 Binary files /dev/null and b/workflow/public_html/images/enterprise/store.png differ diff --git a/workflow/public_html/images/enterprise/tick-circle-frame.png b/workflow/public_html/images/enterprise/tick-circle-frame.png new file mode 100644 index 000000000..b3f785862 Binary files /dev/null and b/workflow/public_html/images/enterprise/tick-circle-frame.png differ diff --git a/workflow/public_html/images/enterprise/tick-circle.png b/workflow/public_html/images/enterprise/tick-circle.png new file mode 100644 index 000000000..210b1a6c3 Binary files /dev/null and b/workflow/public_html/images/enterprise/tick-circle.png differ diff --git a/workflow/public_html/images/enterprise/tick-white.png b/workflow/public_html/images/enterprise/tick-white.png new file mode 100644 index 000000000..9926e5dcb Binary files /dev/null and b/workflow/public_html/images/enterprise/tick-white.png differ diff --git a/workflow/public_html/images/enterprise/ui-list-box.png b/workflow/public_html/images/enterprise/ui-list-box.png new file mode 100644 index 000000000..60a8db537 Binary files /dev/null and b/workflow/public_html/images/enterprise/ui-list-box.png differ diff --git a/workflow/public_html/images/enterprise/upgrade.png b/workflow/public_html/images/enterprise/upgrade.png new file mode 100644 index 000000000..e71f84648 Binary files /dev/null and b/workflow/public_html/images/enterprise/upgrade.png differ diff --git a/workflow/public_html/images/enterprise/wooden-box--exclamation.png b/workflow/public_html/images/enterprise/wooden-box--exclamation.png new file mode 100644 index 000000000..274e5d0a6 Binary files /dev/null and b/workflow/public_html/images/enterprise/wooden-box--exclamation.png differ diff --git a/workflow/public_html/images/enterprise/wooden-box--plus.png b/workflow/public_html/images/enterprise/wooden-box--plus.png new file mode 100644 index 000000000..9412e2e10 Binary files /dev/null and b/workflow/public_html/images/enterprise/wooden-box--plus.png differ diff --git a/workflow/public_html/images/enterprise/wooden-box.png b/workflow/public_html/images/enterprise/wooden-box.png new file mode 100644 index 000000000..f64d76105 Binary files /dev/null and b/workflow/public_html/images/enterprise/wooden-box.png differ