From b27819785e32be24f289958efda79dec6358da00 Mon Sep 17 00:00:00 2001
From: Joas Schilling <coding@schilljs.com>
Date: Thu, 29 Jun 2017 11:43:32 +0200
Subject: [PATCH] Don't log passwords on dav exceptions

Signed-off-by: Joas Schilling <coding@schilljs.com>
---
 .../Connector/Sabre/ExceptionLoggerPlugin.php | 25 +++----------------
 .../Sabre/ExceptionLoggerPluginTest.php       |  6 ++---
 lib/private/Log.php                           | 15 +++++++----
 3 files changed, 17 insertions(+), 29 deletions(-)

diff --git a/apps/dav/lib/Connector/Sabre/ExceptionLoggerPlugin.php b/apps/dav/lib/Connector/Sabre/ExceptionLoggerPlugin.php
index 4f7c2286827..dce2f9c45e4 100644
--- a/apps/dav/lib/Connector/Sabre/ExceptionLoggerPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/ExceptionLoggerPlugin.php
@@ -94,26 +94,9 @@ class ExceptionLoggerPlugin extends \Sabre\DAV\ServerPlugin {
 			$level = \OCP\Util::DEBUG;
 		}
 
-		$message = $ex->getMessage();
-		if ($ex instanceof Exception) {
-			if (empty($message)) {
-				$response = new Response($ex->getHTTPCode());
-				$message = $response->getStatusText();
-			}
-			$message = "HTTP/1.1 {$ex->getHTTPCode()} $message";
-		}
-
-		$user = \OC_User::getUser();
-
-		$exception = [
-			'Message' => $message,
-			'Exception' => $exceptionClass,
-			'Code' => $ex->getCode(),
-			'Trace' => $ex->getTraceAsString(),
-			'File' => $ex->getFile(),
-			'Line' => $ex->getLine(),
-			'User' => $user,
-		];
-		$this->logger->log($level, 'Exception: ' . json_encode($exception), ['app' => $this->appName]);
+		$this->logger->logException($ex, [
+			'app' => $this->appName,
+			'level' => $level,
+		]);
 	}
 }
diff --git a/apps/dav/tests/unit/Connector/Sabre/ExceptionLoggerPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/ExceptionLoggerPluginTest.php
index 8088ee6dc4d..85ede2ad681 100644
--- a/apps/dav/tests/unit/Connector/Sabre/ExceptionLoggerPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/ExceptionLoggerPluginTest.php
@@ -71,13 +71,13 @@ class ExceptionLoggerPluginTest extends TestCase {
 		$this->plugin->logException($exception);
 
 		$this->assertEquals($expectedLogLevel, $this->logger->level);
-		$this->assertStringStartsWith('Exception: {"Message":"' . $expectedMessage, $this->logger->message);
+		$this->assertStringStartsWith('Exception: {"Exception":' . json_encode(get_class($exception)) . ',"Message":"' . $expectedMessage . '",', $this->logger->message);
 	}
 
 	public function providesExceptions() {
 		return [
-			[0, 'HTTP\/1.1 404 Not Found', new NotFound()],
-			[4, 'HTTP\/1.1 400 This path leads to nowhere', new InvalidPath('This path leads to nowhere')]
+			[0, '', new NotFound()],
+			[4, 'This path leads to nowhere', new InvalidPath('This path leads to nowhere')]
 		];
 	}
 
diff --git a/lib/private/Log.php b/lib/private/Log.php
index ea20353a0a0..0d291218096 100644
--- a/lib/private/Log.php
+++ b/lib/private/Log.php
@@ -305,13 +305,18 @@ class Log implements ILogger {
 	/**
 	 * Logs an exception very detailed
 	 *
-	 * @param \Exception | \Throwable $exception
+	 * @param \Exception|\Throwable $exception
 	 * @param array $context
 	 * @return void
 	 * @since 8.2.0
 	 */
 	public function logException($exception, array $context = array()) {
-		$exception = array(
+		$level = Util::ERROR;
+		if (isset($context['level'])) {
+			$level = $context['level'];
+			unset($context['level']);
+		}
+		$data = array(
 			'Exception' => get_class($exception),
 			'Message' => $exception->getMessage(),
 			'Code' => $exception->getCode(),
@@ -319,10 +324,10 @@ class Log implements ILogger {
 			'File' => $exception->getFile(),
 			'Line' => $exception->getLine(),
 		);
-		$exception['Trace'] = preg_replace('!(' . implode('|', $this->methodsWithSensitiveParameters) . ')\(.*\)!', '$1(*** sensitive parameters replaced ***)', $exception['Trace']);
+		$data['Trace'] = preg_replace('!(' . implode('|', $this->methodsWithSensitiveParameters) . ')\(.*\)!', '$1(*** sensitive parameters replaced ***)', $data['Trace']);
 		$msg = isset($context['message']) ? $context['message'] : 'Exception';
-		$msg .= ': ' . json_encode($exception);
-		$this->error($msg, $context);
+		$msg .= ': ' . json_encode($data);
+		$this->log($level, $msg, $context);
 	}
 
 	/**
-- 
GitLab