From 9b0f0df7f52d16e71d40834035dd840ad4fa86b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= <jfd@butonic.de>
Date: Fri, 29 Aug 2014 14:36:00 +0200
Subject: [PATCH] make skeleton compatible with objectstore

suspend encryption proxy when copying skeleton
---
 apps/files_sharing/tests/base.php             |  4 +-
 .../objectstore/homeobjectstorestorage.php    |  6 ---
 lib/private/server.php                        | 15 ++++++
 lib/private/util.php                          | 46 ++++++++++---------
 4 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/apps/files_sharing/tests/base.php b/apps/files_sharing/tests/base.php
index 738ba3493ba..84de6006fdb 100644
--- a/apps/files_sharing/tests/base.php
+++ b/apps/files_sharing/tests/base.php
@@ -126,9 +126,9 @@ abstract class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase {
 		}
 
 		\OC_Util::tearDownFS();
-		\OC_User::setUserId('');
+		\OC::$server->getUserSession()->setUser(null);
 		\OC\Files\Filesystem::tearDown();
-		\OC_User::setUserId($user);
+		\OC::$server->getUserSession()->login($user, $password);
 		\OC_Util::setupFS($user);
 	}
 
diff --git a/lib/private/files/objectstore/homeobjectstorestorage.php b/lib/private/files/objectstore/homeobjectstorestorage.php
index 947fc496b20..14fc604a7f0 100644
--- a/lib/private/files/objectstore/homeobjectstorestorage.php
+++ b/lib/private/files/objectstore/homeobjectstorestorage.php
@@ -34,12 +34,6 @@ class HomeObjectStoreStorage extends ObjectStoreStorage implements \OCP\Files\IH
 		}
 		$this->user = $params['user'];
 		parent::__construct($params);
-
-
-		//initialize cache with root directory in cache
-		if ( ! $this->is_dir('files') ) {
-			$this->mkdir('files');
-		}
 	}
 
 	public function getId () {
diff --git a/lib/private/server.php b/lib/private/server.php
index ff34cfdccb6..d2728d2b6ef 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -291,6 +291,8 @@ class Server extends SimpleContainer implements IServerContainer {
 				return null;
 			}
 			$userId = $user->getUID();
+		} else {
+			$user = $this->getUserManager()->get($userId);
 		}
 		$dir = '/' . $userId;
 		$root = $this->getRootFolder();
@@ -305,6 +307,19 @@ class Server extends SimpleContainer implements IServerContainer {
 		$dir = '/files';
 		if (!$folder->nodeExists($dir)) {
 			$folder = $folder->newFolder($dir);
+
+			if (\OCP\App::isEnabled('files_encryption')) {
+				// disable encryption proxy to prevent recursive calls
+				$proxyStatus = \OC_FileProxy::$enabled;
+				\OC_FileProxy::$enabled = false;
+			}
+
+			\OC_Util::copySkeleton($user, $folder);
+
+			if (\OCP\App::isEnabled('files_encryption')) {
+				// re-enable proxy - our work is done
+				\OC_FileProxy::$enabled = $proxyStatus;
+			}
 		} else {
 			$folder = $folder->get($dir);
 		}
diff --git a/lib/private/util.php b/lib/private/util.php
index c0a68c56223..d6515872c5a 100755
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -115,16 +115,6 @@ class OC_Util {
 				return $storage;
 			});
 
-			// copy skeleton for local storage only
-			if (!isset($objectStore)) {
-				$userRoot = OC_User::getHome($user);
-				$userDirectory = $userRoot . '/files';
-				if (!is_dir($userDirectory)) {
-					mkdir($userDirectory, 0755, true);
-					OC_Util::copySkeleton($userDirectory);
-				}
-			}
-
 			$userDir = '/' . $user . '/files';
 
 			//jail the user into his "home" directory
@@ -133,6 +123,9 @@ class OC_Util {
 			$fileOperationProxy = new OC_FileProxy_FileOperations();
 			OC_FileProxy::register($fileOperationProxy);
 
+			//trigger creation of user home and /files folder
+			\OC::$server->getUserFolder($user);
+
 			OC_Hook::emit('OC_Filesystem', 'setup', array('user' => $user, 'user_dir' => $userDir));
 		}
 		return true;
@@ -208,33 +201,44 @@ class OC_Util {
 	}
 
 	/**
-	 * copies the user skeleton files into the fresh user home files
+	 * copies the skeleton to the users /files
 	 *
-	 * @param string $userDirectory
+	 * @param \OC\User\User $user
+	 * @param \OCP\Files\Folder $userDirectory
 	 */
-	public static function copySkeleton($userDirectory) {
-		$skeletonDirectory = OC_Config::getValue('skeletondirectory', \OC::$SERVERROOT . '/core/skeleton');
+	public static function copySkeleton(\OC\User\User $user, \OCP\Files\Folder $userDirectory) {
+
+		$skeletonDirectory = \OCP\Config::getSystemValue('skeletondirectory', \OC::$SERVERROOT . '/core/skeleton');
+
 		if (!empty($skeletonDirectory)) {
-			OC_Util::copyr($skeletonDirectory, $userDirectory);
+			\OCP\Util::writeLog(
+				'files_skeleton',
+				'copying skeleton for '.$user->getUID().' from '.$skeletonDirectory.' to '.$userDirectory->getFullPath('/'),
+				\OCP\Util::DEBUG
+			);
+			self::copyr($skeletonDirectory, $userDirectory);
+			// update the file cache
+			$userDirectory->getStorage()->getScanner()->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE);
 		}
 	}
 
 	/**
-	 * copies a directory recursively
+	 * copies a directory recursively by using streams
 	 *
 	 * @param string $source
-	 * @param string $target
+	 * @param \OCP\Files\Folder $target
 	 * @return void
 	 */
-	public static function copyr($source, $target) {
+	public static function copyr($source, \OCP\Files\Folder $target) {
 		$dir = opendir($source);
-		@mkdir($target);
 		while (false !== ($file = readdir($dir))) {
 			if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
 				if (is_dir($source . '/' . $file)) {
-					OC_Util::copyr($source . '/' . $file, $target . '/' . $file);
+					$child = $target->newFolder($file);
+					self::copyr($source . '/' . $file, $child);
 				} else {
-					copy($source . '/' . $file, $target . '/' . $file);
+					$child = $target->newFile($file);
+					stream_copy_to_stream(fopen($source . '/' . $file,'r'), $child->fopen('w'));
 				}
 			}
 		}
-- 
GitLab