Page MenuHomeIn-Portal Phabricator

D232.id575.diff
No OneTemporary

File Metadata

Created
Fri, Nov 21, 3:40 PM

D232.id575.diff

Index: core/kernel/utility/debugger.php
===================================================================
--- core/kernel/utility/debugger.php
+++ core/kernel/utility/debugger.php
@@ -1774,6 +1774,9 @@
$this->_fatalErrorHash = $this->_getErrorHash($errfile, $errline);
$this->appendTrace(4);
}
+ elseif ( !kLogger::isErrorOriginAllowed($errfile) ) {
+ return;
+ }
$this->expandError($errstr, $errfile, $errline);
Index: core/kernel/utility/logger.php
===================================================================
--- core/kernel/utility/logger.php
+++ core/kernel/utility/logger.php
@@ -713,15 +713,29 @@
/**
* Writes prepared log to database or disk, when database isn't available
*
- * @param int $storage_medium
- * @return bool|int
- * @access public
- * @throws InvalidArgumentException
+ * @param integer $storage_medium Storage medium.
+ * @param boolean $check_origin Check error origin.
+ *
+ * @return integer|boolean
+ * @throws InvalidArgumentException When unknown storage medium is given.
*/
- public function write($storage_medium = self::LS_AUTOMATIC)
+ public function write($storage_medium = self::LS_AUTOMATIC, $check_origin = false)
{
- if ( !$this->_logRecord || $this->_logRecord['LogLevel'] > $this->_maxLogLevel || $this->_state == self::STATE_DISABLED ) {
- // nothing to save OR less detailed logging requested OR disabled
+ if ( $check_origin && isset($this->_logRecord['LogSourceFilename']) ) {
+ $origin_allowed = self::isErrorOriginAllowed($this->_logRecord['LogSourceFilename']);
+ }
+ else {
+ $origin_allowed = true;
+ }
+
+ if ( !$this->_logRecord
+ || $this->_logRecord['LogLevel'] > $this->_maxLogLevel
+ || !$origin_allowed
+ || $this->_state == self::STATE_DISABLED
+ ) {
+ // Nothing to save OR less detailed logging requested OR origin not allowed OR disabled.
+ $this->_logRecord = array();
+
return true;
}
@@ -998,6 +1012,49 @@
}
/**
+ * Determines if error should be logged based on it's origin.
+ *
+ * @param string $file File.
+ *
+ * @return boolean
+ */
+ public static function isErrorOriginAllowed($file)
+ {
+ static $error_origin_regexp;
+
+ // Lazy detect error origins, because they're not available at construction time.
+ if ( !$error_origin_regexp ) {
+ $error_origins = array();
+ $application = kApplication::Instance();
+
+ foreach ( $application->ModuleInfo as $module_info ) {
+ $error_origins[] = preg_quote(rtrim($module_info['Path'], '/'), '/');
+ }
+
+ $error_origins = array_unique($error_origins);
+ $error_origin_regexp = '/^' . preg_quote(FULL_PATH, '/') . '\/(' . implode('|', $error_origins) . ')\//';
+ }
+
+ // Allow dynamically generated code.
+ if ( strpos($file, 'eval()\'d code') !== false ) {
+ return true;
+ }
+
+ // Allow known modules.
+ if ( preg_match('/^' . preg_quote(MODULES_PATH, '/') . '\//', $file) ) {
+ return preg_match($error_origin_regexp, $file) == 1;
+ }
+
+ // Don't allow Vendors.
+ if ( preg_match('/^' . preg_quote(FULL_PATH, '/') . '\/vendor\//', $file) ) {
+ return false;
+ }
+
+ // Allow everything else within main folder.
+ return preg_match('/^' . preg_quote(FULL_PATH, '/') . '\//', $file) == 1;
+ }
+
+ /**
* Parses database error message into error number, error message and sql that caused that error
*
* @static
@@ -1242,7 +1299,7 @@
return true;
}
- $log->write();
+ $log->write(kLogger::LS_AUTOMATIC, true);
$res = false;

Event Timeline