Browse Source

only use master key ID if a user is logged in. Otherwise keep the public link share key

tags/v9.0beta1
Björn Schießle 8 years ago
parent
commit
46f6c289ca
2 changed files with 69 additions and 16 deletions
  1. 5
    4
      apps/encryption/lib/keymanager.php
  2. 64
    12
      apps/encryption/tests/lib/KeyManagerTest.php

+ 5
- 4
apps/encryption/lib/keymanager.php View File

@@ -386,16 +386,17 @@ class KeyManager {
public function getFileKey($path, $uid) {
$encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId, Encryption::ID);

if ($this->util->isMasterKeyEnabled()) {
$uid = $this->getMasterKeyId();
}

if (is_null($uid)) {
$uid = $this->getPublicShareKeyId();
$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.privateKey', Encryption::ID);
$privateKey = $this->crypt->decryptPrivateKey($privateKey);
} else {

if ($this->util->isMasterKeyEnabled()) {
$uid = $this->getMasterKeyId();
}

$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->session->getPrivateKey();
}

+ 64
- 12
apps/encryption/tests/lib/KeyManagerTest.php View File

@@ -342,25 +342,77 @@ class KeyManagerTest extends TestCase {
$this->assertTrue($this->instance->getEncryptedFileKey('/'));
}

public function testGetFileKey() {
$this->keyStorageMock->expects($this->exactly(4))
/**
* @dataProvider dataTestGetFileKey
*
* @param $uid
* @param $isMasterKeyEnabled
* @param $privateKey
* @param $expected
*/
public function testGetFileKey($uid, $isMasterKeyEnabled, $privateKey, $expected) {

$path = '/foo.txt';

if ($isMasterKeyEnabled) {
$expectedUid = 'masterKeyId';
} else {
$expectedUid = $uid;
}

$this->invokePrivate($this->instance, 'masterKeyId', ['masterKeyId']);

$this->keyStorageMock->expects($this->at(0))
->method('getFileKey')
->with($path, 'fileKey', 'OC_DEFAULT_MODULE')
->willReturn(true);

$this->keyStorageMock->expects($this->once())
->method('getSystemUserKey')
$this->keyStorageMock->expects($this->at(1))
->method('getFileKey')
->with($path, $expectedUid . '.shareKey', 'OC_DEFAULT_MODULE')
->willReturn(true);

$this->cryptMock->expects($this->once())
->method('decryptPrivateKey')
->willReturn(true);
if (is_null($uid)) {
$this->keyStorageMock->expects($this->once())
->method('getSystemUserKey')
->willReturn(true);
$this->cryptMock->expects($this->once())
->method('decryptPrivateKey')
->willReturn($privateKey);
} else {
$this->keyStorageMock->expects($this->never())
->method('getSystemUserKey');
$this->utilMock->expects($this->once())->method('isMasterKeyEnabled')
->willReturn($isMasterKeyEnabled);
$this->sessionMock->expects($this->once())->method('getPrivateKey')->willReturn($privateKey);
}

$this->cryptMock->expects($this->once())
->method('multiKeyDecrypt')
->willReturn(true);
if($privateKey) {
$this->cryptMock->expects($this->once())
->method('multiKeyDecrypt')
->willReturn(true);
} else {
$this->cryptMock->expects($this->never())
->method('multiKeyDecrypt');
}

$this->assertTrue($this->instance->getFileKey('/', null));
$this->assertEmpty($this->instance->getFileKey('/', $this->userId));
$this->assertSame($expected,
$this->instance->getFileKey($path, $uid)
);

}

public function dataTestGetFileKey() {
return [
['user1', false, 'privateKey', true],
['user1', false, false, ''],
['user1', true, 'privateKey', true],
['user1', true, false, ''],
['', false, 'privateKey', true],
['', false, false, ''],
['', true, 'privateKey', true],
['', true, false, '']
];
}

public function testDeletePrivateKey() {

Loading…
Cancel
Save