[Pkg-owncloud-commits] [owncloud] 25/122: skip user if we don't have a public key

David Prévot taffit at moszumanska.debian.org
Sat May 9 00:00:05 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch stable8
in repository owncloud.

commit 4ef9df8750553518143a7b1d088ab755db482cf1
Author: Bjoern Schiessle <schiessle at owncloud.com>
Date:   Mon Apr 13 15:56:36 2015 +0200

    skip user if we don't have a public key
---
 apps/encryption/appinfo/application.php            |  3 +
 apps/encryption/lib/crypto/encryption.php          | 16 ++++-
 .../encryption/tests/lib/crypto/encryptionTest.php | 69 ++++++++++++++++++++++
 3 files changed, 87 insertions(+), 1 deletion(-)

diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php
index 0c9dcb7..0d6f57f 100644
--- a/apps/encryption/appinfo/application.php
+++ b/apps/encryption/appinfo/application.php
@@ -94,10 +94,12 @@ class Application extends \OCP\AppFramework\App {
 	public function registerEncryptionModule() {
 		$container = $this->getContainer();
 
+
 		$this->encryptionManager->registerEncryptionModule(
 			Encryption::ID,
 			Encryption::DISPLAY_NAME,
 			function() use ($container) {
+
 			return new Encryption(
 				$container->query('Crypt'),
 				$container->query('KeyManager'),
@@ -105,6 +107,7 @@ class Application extends \OCP\AppFramework\App {
 				$container->getServer()->getLogger()
 			);
 		});
+
 	}
 
 	public function registerServices() {
diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php
index 4e181b0..0fb6f25 100644
--- a/apps/encryption/lib/crypto/encryption.php
+++ b/apps/encryption/lib/crypto/encryption.php
@@ -25,6 +25,7 @@
 namespace OCA\Encryption\Crypto;
 
 
+use OCA\Encryption\Exceptions\PublicKeyMissingException;
 use OCA\Encryption\Util;
 use OCP\Encryption\IEncryptionModule;
 use OCA\Encryption\KeyManager;
@@ -67,6 +68,7 @@ class Encryption implements IEncryptionModule {
 	/** @var Util */
 	private $util;
 
+
 	/** @var  ILogger */
 	private $logger;
 
@@ -161,6 +163,9 @@ class Encryption implements IEncryptionModule {
 	 * @param string $path to the file
 	 * @return string remained data which should be written to the file in case
 	 *                of a write operation
+	 * @throws PublicKeyMissingException
+	 * @throws \Exception
+	 * @throws \OCA\Encryption\Exceptions\MultiKeyEncryptException
 	 */
 	public function end($path) {
 		$result = '';
@@ -171,7 +176,16 @@ class Encryption implements IEncryptionModule {
 			}
 			$publicKeys = array();
 			foreach ($this->accessList['users'] as $uid) {
-				$publicKeys[$uid] = $this->keyManager->getPublicKey($uid);
+				try {
+					$publicKeys[$uid] = $this->keyManager->getPublicKey($uid);
+				} catch (PublicKeyMissingException $e) {
+					$this->logger->warning('no public key found for user \'' . $uid .
+						'\', user will not be able to read the file', array('app' => 'encryption'));
+					// if the public key of the owner is missing we should fail
+					if ($uid === $this->user) {
+						throw $e;
+					}
+				}
 			}
 
 			$publicKeys = $this->keyManager->addSystemKeys($this->accessList, $publicKeys);
diff --git a/apps/encryption/tests/lib/crypto/encryptionTest.php b/apps/encryption/tests/lib/crypto/encryptionTest.php
index cb4ca2d..70e48a2 100644
--- a/apps/encryption/tests/lib/crypto/encryptionTest.php
+++ b/apps/encryption/tests/lib/crypto/encryptionTest.php
@@ -21,6 +21,7 @@
 
 namespace OCA\Encryption\Tests\Crypto;
 
+use OCA\Encryption\Exceptions\PublicKeyMissingException;
 use Test\TestCase;
 use OCA\Encryption\Crypto\Encryption;
 
@@ -63,6 +64,74 @@ class EncryptionTest extends TestCase {
 			$this->utilMock,
 			$this->loggerMock
 		);
+
+	}
+
+	/**
+	 * test if public key from one of the recipients is missing
+	 */
+	public function testEndUser1() {
+		$this->instance->begin('/foo/bar', 'user1', 'r', array(), array('users' => array('user1', 'user2', 'user3')));
+		$this->endTest();
+	}
+
+	/**
+	 * test if public key from owner is missing
+	 *
+	 * @expectedException \OCA\Encryption\Exceptions\PublicKeyMissingException
+	 */
+	public function testEndUser2() {
+		$this->instance->begin('/foo/bar', 'user2', 'r', array(), array('users' => array('user1', 'user2', 'user3')));
+		$this->endTest();
+	}
+
+	/**
+	 * common part of testEndUser1 and testEndUser2
+	 *
+	 * @throws PublicKeyMissingException
+	 */
+	public function endTest() {
+		// prepare internal variables
+		$class = get_class($this->instance);
+		$module = new \ReflectionClass($class);
+		$isWriteOperation = $module->getProperty('isWriteOperation');
+		$writeCache = $module->getProperty('writeCache');
+		$isWriteOperation->setAccessible(true);
+		$writeCache->setAccessible(true);
+		$isWriteOperation->setValue($this->instance, true);
+		$writeCache->setValue($this->instance, '');
+		$isWriteOperation->setAccessible(false);
+		$writeCache->setAccessible(false);
+
+		$this->keyManagerMock->expects($this->any())
+			->method('getPublicKey')
+			->will($this->returnCallback([$this, 'getPublicKeyCallback']));
+		$this->keyManagerMock->expects($this->any())
+			->method('addSystemKeys')
+			->will($this->returnCallback([$this, 'addSystemKeysCallback']));
+		$this->cryptMock->expects($this->any())
+			->method('multiKeyEncrypt')
+			->willReturn(true);
+		$this->cryptMock->expects($this->any())
+			->method('setAllFileKeys')
+			->willReturn(true);
+
+		$this->instance->end('/foo/bar');
+	}
+
+
+	public function getPublicKeyCallback($uid) {
+		if ($uid === 'user2') {
+			throw new PublicKeyMissingException($uid);
+		}
+		return $uid;
+	}
+
+	public function addSystemKeysCallback($accessList, $publicKeys) {
+		$this->assertSame(2, count($publicKeys));
+		$this->assertArrayHasKey('user1', $publicKeys);
+		$this->assertArrayHasKey('user3', $publicKeys);
+		return $publicKeys;
 	}
 
 	/**

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list