Skip to content

Commit

Permalink
Merge pull request #21612 from owncloud/fix_21598
Browse files Browse the repository at this point in the history
fix public link sharing if the master key is enabled
  • Loading branch information
DeepDiver1975 committed Jan 13, 2016
2 parents a5e4622 + 46f6c28 commit e0aa6e0
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 16 deletions.
9 changes: 5 additions & 4 deletions apps/encryption/lib/keymanager.php
Expand Up @@ -388,16 +388,17 @@ public function getPrivateKey($userId) {
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();
}
Expand Down
76 changes: 64 additions & 12 deletions apps/encryption/tests/lib/KeyManagerTest.php
Expand Up @@ -342,25 +342,77 @@ public function testGetEncryptedFileKey() {
$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() {
Expand Down

0 comments on commit e0aa6e0

Please sign in to comment.