Merge branch 'pu/2013.03/modelconfig-hr'
authorPhilipp Schüle <p.schuele@metaways.de>
Mon, 29 Jul 2013 10:19:08 +0000 (12:19 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 29 Jul 2013 10:19:08 +0000 (12:19 +0200)
Conflicts:
tine20/Tinebase/Exception.php
tine20/Tinebase/Server/Json.php

1  2 
tine20/Tinebase/Exception.php
tine20/Tinebase/Record/Abstract.php
tine20/Tinebase/Server/Json.php
tine20/Tinebase/Tinebase.jsb2
tine20/Tinebase/js/widgets/grid/FilterModel.js

  class Tinebase_Exception extends Exception
  {
      /**
+      * the name of the application, this exception belongs to
+      * 
+      * @var string
+      */
+     protected $_appName = NULL;
+     
+     /**
+      * the constructor
+      * 
+      * @param message[optional]
+      * @param code[optional]
+      * @param previous[optional]
+      */
+     public function __construct($message = null, $code = null, $previous = null)
+     {
+         if (! $this->_appName) {
+             $c = explode('_', get_class($this));
+             $this->_appName = $c[0];
+         }
+         parent::__construct($message, $code, $previous);
+     }
+     
+     /**
 +     * get exception trace as array (remove confidential information)
 +     * 
 +     * @param Exception $exception
 +     * @return array
 +     */
 +    public static function getTraceAsArray(Exception $exception)
 +    {
 +        $trace = $exception->getTrace();
 +        $traceArray = array();
 +        
 +        foreach($trace as $part) {
 +            if (array_key_exists('file', $part)) {
 +                // don't send full paths to the client
 +                $part['file'] = self::_replaceBasePath($part['file']);
 +            }
 +            // unset args to make sure no passwords are shown
 +            unset($part['args']);
 +            $traceArray[] = $part;
 +        }
 +        
 +        return $traceArray;
 +    }
 +    
 +    /**
 +     * replace base path in string
 +     * 
 +     * @param string|array $_string
 +     * @return string
 +     */
 +    protected static function _replaceBasePath($_string)
 +    {
 +        $basePath = dirname(dirname(__FILE__));
 +        return str_replace($basePath, '...', $_string);
 +    }
 +    
 +    /**
 +     * log exception (remove confidential information from trace)
 +     * 
 +     * @param Exception $exception
 +     * @param boolean $suppressTrace
 +     */
 +    public static function log(Exception $exception, $suppressTrace = NULL)
 +    {
 +        Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' ' . get_class($exception) . ' -> ' . $exception->getMessage());
 +        
 +        $suppressTrace = ($suppressTrace !== NULL) ? $suppressTrace : Tinebase_Core::getConfig()->suppressExceptionTraces === TRUE;
 +        if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE) && ! $suppressTrace) {
 +            $traceString = $exception->getTraceAsString();
 +            $traceString = self::_replaceBasePath($traceString);
 +            $traceString = self::_removeCredentials($traceString);
 +             
 +            Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $traceString);
 +        }
 +    }
 +    
 +    /**
 +     * remove credentials/passwords from trace 
 +     * 
 +     * @param string $_traceString
 +     * @return string
 +     */
 +    protected static function _removeCredentials($_traceString)
 +    {
 +        $passwordPatterns = array(
 +            "/->login\('([^']*)', '[^']*'/",
 +            "/->loginFromPost\('([^']*)', '[^']*'/",
 +            "/->validate\('[^']*', '[^']*'/",
 +            "/->authenticate\('[^']*', '[^']*'/",
 +        );
 +        $replacements = array(
 +            "->login('$1', '********'",
 +            "->loginFromPost('$1', '********'",
 +            "->validate('$1', '********'",
 +            "->authenticate('$1', '********'",
 +        );
 +        
 +        return preg_replace($passwordPatterns, $replacements, $_traceString);
 +    }
 +    
++    /**
+      * returns the name of the application, this exception belongs to
+      * 
+      * @return string
+      */
+     public function getAppName()
+     {
+         return $this->_appName;
+     }
  }
Simple merge
@@@ -250,12 -249,16 +250,15 @@@ class Tinebase_Server_Json implements T
          $exceptionData = method_exists($exception, 'toArray')? $exception->toArray() : array();
          $exceptionData['message'] = htmlentities($exception->getMessage(), ENT_COMPAT, 'UTF-8');
          $exceptionData['code']    = $exception->getCode();
 -        
 +        $suppressTrace = Tinebase_Core::getConfig()->suppressExceptionTraces;
 +        if ($suppressTrace !== TRUE) {
 +            $exceptionData['trace'] = Tinebase_Exception::getTraceAsArray($exception);
 +        }
+         if ($exception instanceof Tinebase_Exception) {
+             $exceptionData['appName'] = $exception->getAppName();
+         }
          
 -        Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' ' . get_class($exception) . ' -> ' . $exception->getMessage());
 -        if (Tinebase_Core::getConfig()->suppressExceptionTraces !== TRUE) {
 -            $exceptionData['trace'] = $this->_getTraceAsArray($exception);
 -            $this->_logExceptionTrace($exception);
 -        }
 +        Tinebase_Exception::log($exception, $suppressTrace);
          
          $server->fault($exceptionData['message'], $exceptionData['code'], $exceptionData);
          
Simple merge