make skeleton compatible with objectstore

suspend encryption proxy when copying skeleton
This commit is contained in:
Jörn Friedrich Dreyer 2014-08-29 14:36:00 +02:00
parent 87da62072b
commit 9b0f0df7f5
4 changed files with 42 additions and 29 deletions

View File

@ -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);
}

View File

@ -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 () {

View File

@ -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);
}

View File

@ -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'));
}
}
}