From 3c026b7cf601c0b83dd02436f17714fcf48cb9a8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas.mueller@tmit.eu>
Date: Mon, 16 Sep 2013 12:09:15 +0200
Subject: [PATCH] recreate an etag within the scanner if the cache contains an
 empty etag

---
 lib/files/cache/scanner.php       |  8 +++++++-
 tests/lib/files/cache/scanner.php | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index 9d180820e9..78cab6ed2d 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -97,13 +97,19 @@ class Scanner extends BasicEmitter {
 				}
 				$newData = $data;
 				if ($reuseExisting and $cacheData = $this->cache->get($file)) {
+					// prevent empty etag
+					$etag = $cacheData['etag'];
+					if (empty($etag)) {
+						$etag = $data['etag'];
+					}
+
 					// only reuse data if the file hasn't explicitly changed
 					if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
 						if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
 							$data['size'] = $cacheData['size'];
 						}
 						if ($reuseExisting & self::REUSE_ETAG) {
-							$data['etag'] = $cacheData['etag'];
+							$data['etag'] = $etag;
 						}
 					}
 					// Only update metadata that has changed
diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php
index f6deb93a49..fa1b340604 100644
--- a/tests/lib/files/cache/scanner.php
+++ b/tests/lib/files/cache/scanner.php
@@ -184,6 +184,23 @@ class Scanner extends \PHPUnit_Framework_TestCase {
 		$this->assertFalse($this->cache->inCache('folder/bar.txt'));
 	}
 
+	public function testETagRecreation() {
+		$this->fillTestFolders();
+
+		$this->scanner->scan('');
+
+		// manipulate etag to simulate an empty etag
+		$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
+		$data['etag'] = '';
+		$this->cache->put('', $data);
+
+		// rescan
+		$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
+		$newData = $this->cache->get('');
+		$this->assertNotEmpty($newData['etag']);
+
+	}
+
 	function setUp() {
 		$this->storage = new \OC\Files\Storage\Temporary(array());
 		$this->scanner = new \OC\Files\Cache\Scanner($this->storage);
-- 
GitLab