From 2fa34d6772ae578911dca17bbb0dc7a755024d05 Mon Sep 17 00:00:00 2001
From: Arthur Schiwon <blizzz@owncloud.com>
Date: Fri, 5 Apr 2013 11:27:08 +0200
Subject: [PATCH] Make FileCache upgrade more robust, fixes #2650

---
 lib/files/cache/legacy.php  | 22 +++++++++++++++++-----
 lib/files/cache/upgrade.php |  4 ++++
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/lib/files/cache/legacy.php b/lib/files/cache/legacy.php
index 9556a2639a3..b8e2548639b 100644
--- a/lib/files/cache/legacy.php
+++ b/lib/files/cache/legacy.php
@@ -80,7 +80,7 @@ class Legacy {
 		}
 		$result = $query->execute(array($path));
 		$data = $result->fetchRow();
-		$data['etag'] = $this->getEtag($data['path']);
+		$data['etag'] = $this->getEtag($data['path'], $data['user']);
 		return $data;
 	}
 
@@ -90,12 +90,24 @@ class Legacy {
 	 * @param type $path
 	 * @return string
 	 */
-	function getEtag($path) {
+	function getEtag($path, $user = null) {
 		static $query = null;
-		list(, $user, , $relativePath) = explode('/', $path, 4);
-		if (is_null($relativePath)) {
+
+		$pathDetails = explode('/', $path, 4);
+		if((!$user) && !isset($pathDetails[1])) {
+			//no user!? Too odd, return empty string.
+			return '';
+		} else if(!$user) {
+			//guess user from path, if no user passed.
+			$user = $pathDetails[1];
+		}
+
+		if(!isset($pathDetails[3]) || is_null($pathDetails[3])) {
 			$relativePath = '';
+		} else {
+			$relativePath = $pathDetails[3];
 		}
+
 		if(is_null($query)){
 			$query = \OC_DB::prepare('SELECT `propertyvalue` FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = \'{DAV:}getetag\'');
 		}
@@ -118,7 +130,7 @@ class Legacy {
 		$result = $query->execute(array($id));
 		$data = $result->fetchAll();
 		foreach ($data as $i => $item) {
-			$data[$i]['etag'] = $this->getEtag($item['path']);
+			$data[$i]['etag'] = $this->getEtag($item['path'], $item['user']);
 		}
 		return $data;
 	}
diff --git a/lib/files/cache/upgrade.php b/lib/files/cache/upgrade.php
index 797f4e6ba8c..ca044ba81de 100644
--- a/lib/files/cache/upgrade.php
+++ b/lib/files/cache/upgrade.php
@@ -127,6 +127,10 @@ class Upgrade {
 	 * @return array
 	 */
 	function getNewData($data) {
+		//Make sure there is a path, otherwise we can do nothing.
+		if(!isset($data['path'])) {
+			return false;
+		}
 		$newData = $data;
 		/**
 		 * @var \OC\Files\Storage\Storage $storage
-- 
GitLab