public function gc($maxLifeTime) { if (eZSys::isShellExecution()) { return false; } ezpEvent::getInstance()->notify('session/gc', array($maxLifeTime)); $db = eZDB::instance(); eZSession::triggerCallback('gc_pre', array($db, $maxLifeTime)); $sfHandler = $this->storage->getSaveHandler(); if (method_exists($sfHandler, 'gc')) { $sfHandler->gc($maxLifeTime); } eZSession::triggerCallback('gc_post', array($db, $maxLifeTime)); return false; }
private static function isAllowedByCurrentIP($allowedIpList) { $ipAddress = eZSys::clientIP(); if ($ipAddress) { foreach ($allowedIpList as $itemToMatch) { if (preg_match("/^(([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+))(\\/([0-9]+)\$|\$)/", $itemToMatch, $matches)) { if ($matches[6]) { if (self::isIPInNet($ipAddress, $matches[1], $matches[7])) { return true; } } else { if ($matches[1] == $ipAddress) { return true; } } } } return false; } else { return eZSys::isShellExecution() && in_array('commandline', $allowedIpList); } }
public static function publishNode($parentNodeID, $objectID, $versionNum, $mainNodeID) { $object = eZContentObject::fetch($objectID); $nodeAssignment = eZNodeAssignment::fetch($objectID, $versionNum, $parentNodeID); $version = $object->version($versionNum); $fromNodeID = $nodeAssignment->attribute('from_node_id'); $originalObjectID = $nodeAssignment->attribute('contentobject_id'); $nodeID = $nodeAssignment->attribute('parent_node'); $opCode = $nodeAssignment->attribute('op_code'); $parentNode = eZContentObjectTreeNode::fetch($nodeID); // if parent doesn't exist, return. See issue #18320 if (!$parentNode instanceof eZContentObjectTreeNode) { eZDebug::writeError("Parent node doesn't exist. object id: {$objectID}, node_assignment id: " . $nodeAssignment->attribute('id'), __METHOD__); return; } $parentNodeID = $parentNode->attribute('node_id'); $existingNode = null; $db = eZDB::instance(); $db->begin(); if (strlen($nodeAssignment->attribute('parent_remote_id')) > 0) { $existingNode = eZContentObjectTreeNode::fetchByRemoteID($nodeAssignment->attribute('parent_remote_id')); } if (!$existingNode) { } $existingNode = eZContentObjectTreeNode::findNode($nodeID, $object->attribute('id'), true); $updateSectionID = false; // now we check the op_code to see what to do if (($opCode & 1) == eZNodeAssignment::OP_CODE_NOP) { // There is nothing to do so just return $db->commit(); if ($mainNodeID == false) { return $object->attribute('main_node_id'); } return; } $updateFields = false; if ($opCode == eZNodeAssignment::OP_CODE_MOVE || $opCode == eZNodeAssignment::OP_CODE_CREATE) { // if ( $fromNodeID == 0 || $fromNodeID == -1) if ($opCode == eZNodeAssignment::OP_CODE_CREATE || $opCode == eZNodeAssignment::OP_CODE_SET) { // If the node already exists it means we have a conflict (for 'CREATE'). // We resolve this by leaving node-assignment data be. if ($existingNode == null) { $parentNode = eZContentObjectTreeNode::fetch($nodeID); $user = eZUser::currentUser(); if (!eZSys::isShellExecution() and !$user->isAnonymous()) { eZContentBrowseRecent::createNew($user->id(), $parentNode->attribute('node_id'), $parentNode->attribute('name')); } $updateFields = true; $existingNode = $parentNode->addChild($object->attribute('id'), true); if ($fromNodeID == -1) { $updateSectionID = true; } } elseif ($opCode == eZNodeAssignment::OP_CODE_SET) { $updateFields = true; } } elseif ($opCode == eZNodeAssignment::OP_CODE_MOVE) { if ($fromNodeID == 0 || $fromNodeID == -1) { eZDebug::writeError("NodeAssignment '" . $nodeAssignment->attribute('id') . "' is marked with op_code='{$opCode}' but has no data in from_node_id. Cannot use it for moving node.", __METHOD__); } else { // clear cache for old placement. $additionalNodeIDList = array($fromNodeID); eZContentCacheManager::clearContentCacheIfNeeded($objectID, $versionNum, $additionalNodeIDList); $originalNode = eZContentObjectTreeNode::fetchNode($originalObjectID, $fromNodeID); if ($originalNode->attribute('main_node_id') == $originalNode->attribute('node_id')) { $updateSectionID = true; } $originalNode->move($parentNodeID); $existingNode = eZContentObjectTreeNode::fetchNode($originalObjectID, $parentNodeID); $updateFields = true; } } } elseif ($opCode == eZNodeAssignment::OP_CODE_REMOVE) { $db->commit(); return; } if ($updateFields) { if (strlen($nodeAssignment->attribute('parent_remote_id')) > 0) { $existingNode->setAttribute('remote_id', $nodeAssignment->attribute('parent_remote_id')); } $existingNode->setAttribute('sort_field', $nodeAssignment->attribute('sort_field')); $existingNode->setAttribute('sort_order', $nodeAssignment->attribute('sort_order')); } $existingNode->setAttribute('contentobject_is_published', 1); eZDebug::createAccumulatorGroup('nice_urls_total', 'Nice urls'); if ($mainNodeID > 0) { $existingNodeID = $existingNode->attribute('node_id'); if ($existingNodeID != $mainNodeID) { eZContentBrowseRecent::updateNodeID($existingNodeID, $mainNodeID); } $existingNode->setAttribute('main_node_id', $mainNodeID); } else { $existingNode->setAttribute('main_node_id', $existingNode->attribute('node_id')); } $existingNode->store(); if ($updateSectionID) { eZContentOperationCollection::updateSectionID($objectID, $versionNum); } $db->commit(); if ($mainNodeID == false) { return $existingNode->attribute('node_id'); } }
public function execute( $process, $event ) { $parameters = $process->attribute( 'parameter_list' ); $object = eZContentObject::fetch( $parameters['object_id'] ); $attribute = false; $dataMap = $object->attribute( 'data_map' ); foreach ( $dataMap as $attr ) { $dataType = $attr->attribute( 'data_type_string' ); if ( $dataType == 'ezfeatureselect' ) { $attribute = $attr; continue; } } // if object does not have a featureselect attribute. if ( $attribute == false ) { return eZWorkflowType::STATUS_ACCEPTED; } // if we have not the first version published, we only need to enable/disable features if ( $object->attribute( 'modified' ) != $object->attribute( 'published' ) ) { $attributeContent = $attribute->attribute( 'content' ); $installedFeatureList = $attributeContent['installed_feature_list']; $availibleFeatureList = $attributeContent['availible_feature_list']; $mainNodeID = $object->attribute( 'main_node_id' ); foreach( $availibleFeatureList as $feature => $featureName ) { $featureObject = eZContentObject::fetchByRemoteID( $mainNodeID . '_' . $feature ); if( !$featureObject ) { eZDebug::writeError( "Cannot find feature object", "eZXMLPublisherType::execute" ); continue; } $featureNode = $featureObject->attribute( 'main_node' ); if( !$featureNode ) { eZDebug::writeError( "Cannot find feature node", "eZXMLPublisherType::execute" ); continue; } if ( in_array( $feature, $installedFeatureList ) ) { if ( $featureNode->attribute( 'is_hidden' ) ) { eZContentObjectTreeNode::unhideSubTree( $featureNode ); } $featureObject = $featureNode->attribute( 'object' ); $list = $featureObject->reverseRelatedObjectList( false, 0, false, array( 'AllRelations' => eZContentObject::RELATION_ATTRIBUTE, 'IgnoreVisibility' => true ) ); if ( is_array( $list ) ) { foreach ( $list as $reverseRelatedContentObject ) { $reverseRelatedMainNode = $reverseRelatedContentObject->attribute( 'main_node' ); eZContentObjectTreeNode::unhideSubTree( $reverseRelatedMainNode ); } } } elseif ( !in_array( $feature, $installedFeatureList ) && !$featureNode->attribute( 'is_hidden' ) ) { if ( !$featureNode->attribute( 'is_hidden' ) ) { eZContentObjectTreeNode::hideSubTree( $featureNode ); } $featureObject = $featureNode->attribute( 'object' ); $list = $featureObject->reverseRelatedObjectList( false, 0, false, array( 'AllRelations' => eZContentObject::RELATION_ATTRIBUTE, 'IgnoreVisibility' => true ) ); if ( is_array( $list ) ) { foreach ( $list as $reverseRelatedContentObject ) { $reverseRelatedMainNode = $reverseRelatedContentObject->attribute( 'main_node' ); eZContentObjectTreeNode::hideSubTree( $reverseRelatedMainNode ); } } } } } // defer to cron, this is safer because we might do a lot of things here include_once( 'lib/ezutils/classes/ezsys.php' ); if ( eZSys::isShellExecution() == false ) { return eZWorkflowType::STATUS_DEFERRED_TO_CRON_REPEAT; } // if we have the first version published, we need to set up the related things. if ( $object->attribute( 'modified' ) == $object->attribute( 'published' ) ) { $classAttribute = $attribute->attribute( 'contentclass_attribute' ); $templateName = $classAttribute->attribute( 'data_text1' ); $attributeContent = $attribute->attribute( 'content' ); $installedFeatureList = $attributeContent['installed_feature_list']; $availibleFeatureList = $attributeContent['availible_feature_list']; if( $templateName == '' ) { return eZWorkflowType::STATUS_ACCEPTED; } $template = 'design:' . $templateName; $tpl = eZTemplate::factory(); $tpl->setVariable( 'tpl_info', false ); $content = $tpl->fetch( $template ); $tpl->setVariable( 'install_features', $installedFeatureList ); $userID = $object->attribute( 'owner_id' ); $tpl->setVariable( 'owner_object_id', $userID ); $nodeID = $object->attribute( 'main_node_id' ); $tpl->setVariable( 'main_node_id', $nodeID ); $content = $tpl->fetch( $template ); $xml = $tpl->variable( "xml_data" ); $doc = new DOMDocument( '1.0', 'utf-8' ); if( !$doc->loadXML( $xml ) ) { eZDebug::writeError( "Cannot parse XML", "eZXMLPublisherType::execute" ); return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } $xmlInstaller = new eZXMLInstaller( $doc ); if (! $xmlInstaller->proccessXML() ) { eZDebug::writeError( "Cannot proccess XML", "eZXMLPublisherType::execute" ); return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } return eZWorkflowType::STATUS_ACCEPTED; } // otherwise we need only to enable, disable the selected features. else { } return eZWorkflowType::STATUS_ACCEPTED; }
/** * This method is called to allow this class to provide values for the perf * variables it caters to. * In this case, it actually gets called by self::filter(). * To avoid unnecessary overhead, it cheats a little bit, and it does not provide * values for ALL variables it supports, but only for the ones it knows will * be logged. * @param string $output * @param $returnCode * @return array */ public static function measure($output, $returnCode = null) { global $scriptStartTime; // This var we want to save as it is used for logs even when not present in TrackVariables. // Also using ga / piwik logs do alter $output, making length calculation in doLog() unreliable /// @todo this way of passing data around is not really beautiful... self::$outputSize = strlen($output); if ($returnCode !== null) { self::$returnCode = (int) $returnCode; } else { // for cli scripts, set default response status to 0 instead of 200 if (eZSys::isShellExecution()) { self::$returnCode = 0; } } $out = array(); $vars = eZPerfLoggerINI::variable('GeneralSettings', 'TrackVariables'); foreach ($vars as $var) { switch ($var) { case 'output_size': // some bugs persist forever... // some bugs persist forever... case 'ouput_size': $out[$var] = self::$outputSize; break; case 'execution_time': // This global var does not exist anymore in eZP LS 5.0. // We prefer using it when available as it is slightly more accurate if ($scriptStartTime == 0) { $debug = eZDebug::instance(); $scriptStartTime = $debug->ScriptStart; } $out[$var] = round(microtime(true) - $scriptStartTime, 3); break; case 'mem_usage': $out[$var] = round(memory_get_peak_usage(true), -3); break; case 'db_queries': // (nb: only works when debug is enabled. // Also does most likely not work when logging is done directly from the eZ5 stack /// @todo fix to run from eZ5 context $dbini = eZINI::instance(); // we cannot use $db->databasename() because we get the same for mysql and mysqli $type = preg_replace('/^ez/', '', $dbini->variable('DatabaseSettings', 'DatabaseImplementation')); $type .= '_query'; // read accumulator $debug = eZDebug::instance(); if (isset($debug->TimeAccumulatorList[$type])) { $queries = $debug->TimeAccumulatorList[$type]['count']; } else { // NB: to tell difference between 0 db reqs per page and no debug we could look for ezdebug::isenabled, // but what if it was enabled at some point and later disabled?... $queries = "0"; } $out[$var] = $queries; break; case 'xhkprof_runs': $out[$var] = implode(',', eZXHProfLogger::runs()); break; case 'user_id': $out[$var] = eZUser::currentUser()->attribute('contentobject_id'); break; case 'unique_id': $out[$var] = $_SERVER['UNIQUE_ID']; break; //case 'content/nodeid': // $out[$var] = self::$nodeId; // break; //case 'content/nodeid': // $out[$var] = self::$nodeId; // break; default: // wildcard-based naming: // content-info things, useful to help group/filter recorded data if (strpos($var, 'content_info/') === 0 || strpos($var, 'module_result/') === 0) { $out[$var] = self::getModuleResultData($var); break; } // standard accumulators /// @todo fix to run from eZ5 context if (strpos($var, 'accumulators/') === 0) { $parts = explode('/', $var, 3); $type = $parts[1]; $debug = eZDebug::instance(); if (isset($debug->TimeAccumulatorList[$type])) { if (@$parts[2] === 'count') { $out[$var] = $debug->TimeAccumulatorList[$type]['count']; } else { $out[$var] = round($debug->TimeAccumulatorList[$type]['time'], 3); } } else { $out[$var] = -1; } break; } // everything in $_SERVER if (strpos($var, '_server/') === 0) { $parts = explode('/', $var, 2); $val = @$_SERVER[$parts[1]]; $out[$var] = $val; break; } } } return $out; }
/** * This is called whenever an error occurs in one of the database handlers. * * If a transaction is active it will be invalidated as well. * * @access protected * @throws eZDBException */ function reportError() { // If we have a running transaction we must mark as invalid // in which case a call to commit() will perform a rollback if ($this->TransactionCounter > 0) { $this->invalidateTransaction(); // This is the unique ID for this incidence which will also be placed in the error logs. $transID = 'TRANSID-' . md5(time() . mt_rand()); eZDebug::writeError('Transaction in progress failed due to DB error, transaction was rollbacked. Transaction ID is ' . $transID . '.', 'eZDBInterface::commit ' . $transID); $this->rollback(); if ($this->errorHandling == eZDB::ERROR_HANDLING_EXCEPTIONS) { throw new eZDBException($this->ErrorMessage, $this->ErrorNumber); } else { // Stop execution immediately while allowing other systems (session etc.) to cleanup eZExecution::cleanup(); eZExecution::setCleanExit(); // Give some feedback, and also possibly show the debug output eZDebug::setHandleType(eZDebug::HANDLE_NONE); $ini = eZINI::instance(); $adminEmail = $ini->variable('MailSettings', 'AdminEmail'); if (!eZSys::isShellExecution()) { if (!headers_sent()) { header("HTTP/1.1 500 Internal Server Error"); } $site = eZSys::serverVariable('HTTP_HOST'); $uri = eZSys::serverVariable('REQUEST_URI'); print "<div class=\"fatal-error\" style=\""; print 'margin: 0.5em 0 1em 0; ' . 'padding: 0.25em 1em 0.75em 1em;' . 'border: 4px solid #000000;' . 'background-color: #f8f8f4;' . 'border-color: #f95038;" >'; print "<b>Fatal error</b>: A database transaction in eZ Publish failed.<br/>"; print "<p>"; print "The current execution was stopped to prevent further problems.<br/>\n" . "You should contact the <a href=\"mailto:{$adminEmail}?subject=Transaction failed on {$site} and URI {$uri} with ID {$transID}\">System Administrator</a> of this site with the information on this page.<br/>\n" . "The current transaction ID is <b>{$transID}</b> and has been logged.<br/>\n" . "Please include the transaction ID and the current URL when contacting the system administrator.<br/>\n"; print "</p>"; print "</div>"; $templateResult = null; if (function_exists('eZDisplayResult')) { eZDisplayResult($templateResult); } } else { fputs(STDERR, "Fatal error: A database transaction in eZ Publish failed.\n"); fputs(STDERR, "\n"); fputs(STDERR, "The current execution was stopped to prevent further problems.\n" . "You should contact the System Administrator ({$adminEmail}) of this site.\n" . "The current transaction ID is {$transID} and has been logged.\n" . "Please include the transaction ID and the name of the current script when contacting the system administrator.\n"); fputs(STDERR, "\n"); fputs(STDERR, eZDebug::printReport(false, false, true)); } // PHP execution stops here exit(1); } } }
/** * If debugging is allowed for the current IP address. * * @param array $allowedIpList * @return bool */ private static function isAllowedByCurrentIP($allowedIpList) { $ipAddresIPV4Pattern = "/^(([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+))(\\/([0-9]+)\$|\$)/"; $ipAddressIPV6Pattern = "/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))(\\/([0-9]+)\$|\$)\$/"; $ipAddress = eZSys::clientIP(); if ($ipAddress) { foreach ($allowedIpList as $itemToMatch) { // Test for IPv6 Addresses first instead of IPv4 addresses as IPv6 // addresses can contain dot separators within them if (preg_match("/:/", $ipAddress)) { if (preg_match($ipAddressIPV6Pattern, $itemToMatch, $matches)) { if ($matches[69]) { if (self::isIPInNetIPv6($ipAddress, $itemToMatch)) { return true; } } else { if ($matches[1] == $itemToMatch) { return true; } } } } elseif (preg_match("/\\./", $ipAddress)) { if (preg_match($ipAddresIPV4Pattern, $itemToMatch, $matches)) { if ($matches[6]) { if (self::isIPInNet($ipAddress, $matches[1], $matches[7])) { return true; } } else { if ($matches[1] == $ipAddress) { return true; } } } } } return false; } else { return eZSys::isShellExecution() && in_array('commandline', $allowedIpList); } }