/** * @see Form::validate() */ public function validate() { parent::validate(); // validate class path if (empty($this->classPath)) { throw new UserInputException('classPath'); } try { $package = new Package($this->packageID); if (!@file_exists(FileUtil::getRealPath(WCF_DIR . $package->getDir() . $this->classPath))) { throw new UserInputException('classPath', 'doesNotExist'); } } catch (SystemException $e) { throw new UserInputException('classPath', 'doesNotExist'); } try { CronjobEditor::validate($this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow); } catch (SystemException $e) { // extract field name $fieldName = ''; if (preg_match("/cronjob attribute '(.*)'/", $e->getMessage(), $match)) { $fieldName = $match[1]; } throw new UserInputException($fieldName, 'notValid'); } }
/** * @see PackageInstallationPlugin::install() */ public function install() { parent::install(); if (!($xml = $this->getXML())) { return; } // Create an array with the data blocks (import or delete) from the xml file. $xml = $xml->getElementTree('data'); require_once WCF_DIR . 'lib/data/cronjobs/CronjobEditor.class.php'; // Loop through the array and install or uninstall cronjobs. foreach ($xml['children'] as $key => $block) { if (count($block['children'])) { // TODO: handle delete block first // Handle the import instructions if ($block['name'] == 'import') { // Loop through items and create or update them. foreach ($block['children'] as $cronjobInfo) { // Extract item properties. foreach ($cronjobInfo['children'] as $child) { if (!isset($child['cdata'])) { continue; } $cronjobInfo[$child['name']] = $child['cdata']; } // default values. $classPath = $description = $startMinute = $startHour = $startDom = $startMonth = $startDow = ''; $execMultiple = $canBeEdited = $canBeDisabled = 0; $active = 1; // make xml tags-names (keys in array) to lower case $this->keysToLowerCase($cronjobInfo); // get values. if (isset($cronjobInfo['classpath'])) { $classPath = $cronjobInfo['classpath']; } if (isset($cronjobInfo['description'])) { $description = $cronjobInfo['description']; } if (isset($cronjobInfo['startminute'])) { $startMinute = $cronjobInfo['startminute']; } if (isset($cronjobInfo['starthour'])) { $startHour = $cronjobInfo['starthour']; } if (isset($cronjobInfo['startdom'])) { $startDom = $cronjobInfo['startdom']; } if (isset($cronjobInfo['startmonth'])) { $startMonth = $cronjobInfo['startmonth']; } if (isset($cronjobInfo['startdow'])) { $startDow = $cronjobInfo['startdow']; } if (isset($cronjobInfo['execmultiple'])) { $execMultiple = intval($cronjobInfo['execmultiple']); } if (isset($cronjobInfo['active'])) { $active = intval($cronjobInfo['active']); } if (isset($cronjobInfo['canbeedited'])) { $canBeEdited = intval($cronjobInfo['canbeedited']); } if (isset($cronjobInfo['canbedisabled'])) { $canBeDisabled = intval($cronjobInfo['canbedisabled']); } // validate values CronjobEditor::validate($startMinute, $startHour, $startDom, $startMonth, $startDow); // save cronjob $sql = "INSERT INTO\twcf" . WCF_N . "_cronjobs \n\t\t\t\t\t\t\t\t\t(classPath, packageID, description, \n\t\t\t\t\t\t\t\t\tstartMinute, startHour, startDom, \n\t\t\t\t\t\t\t\t\tstartMonth, startDow, nextExec, execMultiple, \n\t\t\t\t\t\t\t\t\tactive, canBeEdited, canBeDisabled) \n\t\t\t\t\t\t\tVALUES \n\t\t\t\t\t\t\t\t\t('" . escapeString($classPath) . "', \n\t\t\t\t\t\t\t\t\t" . $this->installation->getPackageID() . ", \n\t\t\t\t\t\t\t\t\t'" . escapeString($description) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startMinute) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startHour) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startDom) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startMonth) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startDow) . "', \n\t\t\t\t\t\t\t\t\t" . TIME_NOW . ", \n\t\t\t\t\t\t\t\t\t" . escapeString($execMultiple) . ",\n\t\t\t\t\t\t\t\t\t" . escapeString($active) . ",\n\t\t\t\t\t\t\t\t\t" . escapeString($canBeEdited) . ", \n\t\t\t\t\t\t\t\t\t" . escapeString($canBeDisabled) . ")"; WCF::getDB()->sendQuery($sql); } } else { if ($block['name'] == 'delete') { if ($this->installation->getAction() == 'update') { // Loop through items and delete them. $cronjobNames = ''; foreach ($block['children'] as $cronjobInfo) { // check required attributes if (!isset($cronjobInfo['attrs']['name'])) { throw new SystemException("Required 'name' attribute for 'cronjob'-tag is missing.", 13023); } // Create a string with all item names which should be deleted (comma separated). if (!empty($cronjobNames)) { $cronjobNames .= ','; } $cronjobNames .= "'" . escapeString($cronjobInfo['attrs']['name']) . "'"; } // Delete items. if (!empty($cronjobNames)) { $sql = "DELETE FROM\twcf" . WCF_N . "_cronjobs\n\t\t\t\t\t\t\t\tWHERE\t\tclassPath IN (" . $cronjobNames . ")\n\t\t\t\t\t\t\t\t\t\tAND packageID = " . $this->installation->getPackageID(); WCF::getDB()->sendQuery($sql); } } } } } } }