function testGetUser() { self::setUpUsers(); $path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt"; $path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt"; $path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER2 . "/thumbnails/foo"; $path4 = "/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1; self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); // if we are logged-in every path should return the currently logged-in user $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path1)); $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path2)); $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path3)); $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path4)); // now log out self::logoutHelper(); // now we should only get the user from /user/files and user/cache paths $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path1)); $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path2)); try { $this->assertFalse(Helper::getUser($path3)); $this->assertFalse(true, '"OCA\\Files_Encryption\\Exception\\EncryptionException: Could not determine user expected"'); } catch (Files_Encryption\Exception\EncryptionException $e) { $this->assertSame('Could not determine user', $e->getMessage()); } try { $this->assertFalse(Helper::getUser($path4)); $this->assertFalse(true, '"OCA\\Files_Encryption\\Exception\\EncryptionException: Could not determine user expected"'); } catch (Files_Encryption\Exception\EncryptionException $e) { $this->assertSame('Could not determine user', $e->getMessage()); } // Log-in again self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); self::cleanUpUsers(); }
/** * @param string $path raw path relative to data/ * @param string $mode * @param int $options * @param string $opened_path * @return bool * @throw \OCA\Files_Encryption\Exception\EncryptionException */ public function stream_open($path, $mode, $options, &$opened_path) { // read default cipher from config $this->cipher = Helper::getCipher(); // assume that the file already exist before we decide it finally in getKey() $this->newFile = false; $this->rootView = new \OC\Files\View('/'); $this->session = new Session($this->rootView); $this->privateKey = $this->session->getPrivateKey(); if ($this->privateKey === false) { throw new EncryptionException('Session does not contain a private key, maybe your login password changed?', EncryptionException::PRIVATE_KEY_MISSING); } $normalizedPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path)); $originalFile = Helper::getPathFromTmpFile($normalizedPath); if ($originalFile) { $this->rawPath = $originalFile; $this->isLocalTmpFile = true; $this->localTmpFile = $normalizedPath; } else { $this->rawPath = $normalizedPath; } $this->util = new Util($this->rootView, Helper::getUser($this->rawPath)); // get the key ID which we want to use, can be the users key or the // public share key $this->keyId = $this->util->getKeyId(); $fileType = Helper::detectFileType($this->rawPath); switch ($fileType) { case Util::FILE_TYPE_FILE: $this->relPath = Helper::stripUserFilesPath($this->rawPath); $user = \OC::$server->getUserSession()->getUser(); $this->userId = $user ? $user->getUID() : Helper::getUserFromPath($this->rawPath); break; case Util::FILE_TYPE_VERSION: $this->relPath = Helper::getPathFromVersion($this->rawPath); $this->userId = Helper::getUserFromPath($this->rawPath); break; case Util::FILE_TYPE_CACHE: $this->relPath = Helper::getPathFromCachedFile($this->rawPath); Helper::mkdirr($this->rawPath, new \OC\Files\View('/')); $user = \OC::$server->getUserSession()->getUser(); $this->userId = $user ? $user->getUID() : Helper::getUserFromPath($this->rawPath); break; default: \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR); return false; } // Disable fileproxies so we can get the file size and open the source file without recursive encryption $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; if ($mode === 'w' or $mode === 'w+' or $mode === 'wb' or $mode === 'wb+') { // We're writing a new file so start write counter with 0 bytes $this->size = 0; $this->unencryptedSize = 0; } else { $this->size = $this->rootView->filesize($this->rawPath); $this->readHeader(); } if ($this->isLocalTmpFile) { $this->handle = fopen($this->localTmpFile, $mode); } else { $this->handle = $this->rootView->fopen($this->rawPath, $mode); } \OC_FileProxy::$enabled = $proxyStatus; if (!is_resource($this->handle)) { \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR); } else { $this->meta = stream_get_meta_data($this->handle); // sometimes fopen changes the mode, e.g. for a url "r" convert to "r+" // but we need to remember the original access type $this->meta['mode'] = $mode; } return is_resource($this->handle); }
function testGetUser() { self::setUpUsers(); $path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt"; $path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt"; $path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER2 . "/thumbnails/foo"; $path4 = "/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1; self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); // if we are logged-in every path should return the currently logged-in user $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, \OCA\Files_Encryption\Helper::getUser($path3)); // now log out self::logoutHelper(); // now we should only get the user from /user/files and user/cache paths $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, \OCA\Files_Encryption\Helper::getUser($path1)); $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, \OCA\Files_Encryption\Helper::getUser($path2)); $this->assertFalse(\OCA\Files_Encryption\Helper::getUser($path3)); $this->assertFalse(\OCA\Files_Encryption\Helper::getUser($path4)); // Log-in again self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); self::cleanUpUsers(); }
/** * @param string $path raw path relative to data/ * @param string $mode * @param int $options * @param string $opened_path * @return bool * @throw \OCA\Files_Encryption\Exception\EncryptionException */ public function stream_open($path, $mode, $options, &$opened_path) { // read default cipher from config $this->cipher = Helper::getCipher(); // assume that the file already exist before we decide it finally in getKey() $this->newFile = false; if (!isset($this->rootView)) { $this->rootView = new \OC\Files\View('/'); } $this->session = new Session($this->rootView); $this->privateKey = $this->session->getPrivateKey(); if ($this->privateKey === false) { throw new EncryptionException('Session does not contain a private key, maybe your login password changed?', EncryptionException::PRIVATE_KEY_MISSING); } $normalizedPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path)); if ($originalFile = Helper::getPathFromTmpFile($normalizedPath)) { $this->rawPath = $originalFile; $this->isLocalTmpFile = true; $this->localTmpFile = $normalizedPath; } else { $this->rawPath = $normalizedPath; } $this->userId = Helper::getUser($this->rawPath); $util = new Util($this->rootView, $this->userId); // get the key ID which we want to use, can be the users key or the // public share key $this->keyId = $util->getKeyId(); // Strip identifier text from path, this gives us the path relative to data/<user>/files $this->relPath = Helper::stripUserFilesPath($this->rawPath); // if raw path doesn't point to a real file, check if it is a version or a file in the trash bin if ($this->relPath === false) { $this->relPath = Helper::getPathToRealFile($this->rawPath); } if ($this->relPath === false) { \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR); return false; } // Disable fileproxies so we can get the file size and open the source file without recursive encryption $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; if ($mode === 'w' or $mode === 'w+' or $mode === 'wb' or $mode === 'wb+') { // We're writing a new file so start write counter with 0 bytes $this->size = 0; $this->unencryptedSize = 0; } else { if ($this->privateKey === false) { // if private key is not valid redirect user to a error page Helper::redirectToErrorPage($this->session); } $this->size = $this->rootView->filesize($this->rawPath); $this->readHeader(); } if ($this->isLocalTmpFile) { $this->handle = fopen($this->localTmpFile, $mode); } else { $this->handle = $this->rootView->fopen($this->rawPath, $mode); } \OC_FileProxy::$enabled = $proxyStatus; if (!is_resource($this->handle)) { \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR); } else { $this->meta = stream_get_meta_data($this->handle); // sometimes fopen changes the mode, e.g. for a url "r" convert to "r+" // but we need to remember the original access type $this->meta['mode'] = $mode; } return is_resource($this->handle); }