Skip to content

Commit

Permalink
Merge pull request #364 from nextcloud/ca-bundle-tests
Browse files Browse the repository at this point in the history
add test for needsRebundling() check
  • Loading branch information
schiessle authored Jul 11, 2016
2 parents e25d1cd + 7c64e19 commit e8169e0
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 1 deletion.
12 changes: 11 additions & 1 deletion lib/private/Security/CertificateManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ private function needsRebundling($uid = '') {
if ($uid === '') {
$uid = $this->uid;
}
$sourceMTimes = [filemtime(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt')];
$sourceMTimes = [$this->getFilemtimeOfCaBundle()];
$targetBundle = $this->getCertificateBundle($uid);
if (!$this->view->file_exists($targetBundle)) {
return true;
Expand All @@ -248,4 +248,14 @@ private function needsRebundling($uid = '') {
}, 0);
return $sourceMTime > $this->view->filemtime($targetBundle);
}

/**
* get mtime of ca-bundle shipped by Nextcloud
*
* @return int
*/
protected function getFilemtimeOfCaBundle() {
return filemtime(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt');
}

}
92 changes: 92 additions & 0 deletions tests/lib/Security/CertificateManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,96 @@ function testGetCertificateBundle() {
$this->assertSame('/' . $this->username . '/files_external/rootcerts.crt', $this->certificateManager->getCertificateBundle());
}

/**
* @dataProvider dataTestNeedRebundling
*
* @param string $uid
* @param int $CaBundleMtime
* @param int $systemWideMtime
* @param int $targetBundleMtime
* @param int $targetBundleExists
* @param bool $expected
*/
function testNeedRebundling($uid,
$CaBundleMtime,
$systemWideMtime,
$targetBundleMtime,
$targetBundleExists,
$expected
) {

$view = $this->getMockBuilder('OC\Files\View')
->disableOriginalConstructor()->getMock();
$config = $this->getMock('OCP\IConfig');

/** @var CertificateManager | \PHPUnit_Framework_MockObject_MockObject $certificateManager */
$certificateManager = $this->getMockBuilder('OC\Security\CertificateManager')
->setConstructorArgs([$uid, $view, $config])
->setMethods(['getFilemtimeOfCaBundle', 'getCertificateBundle'])
->getMock();

$certificateManager->expects($this->any())->method('getFilemtimeOfCaBundle')
->willReturn($CaBundleMtime);

$certificateManager->expects($this->at(1))->method('getCertificateBundle')
->with($uid)->willReturn('targetBundlePath');

$view->expects($this->any())->method('file_exists')
->with('targetBundlePath')
->willReturn($targetBundleExists);


if ($uid !== null && $targetBundleExists) {
$certificateManager->expects($this->at(2))->method('getCertificateBundle')
->with(null)->willReturn('SystemBundlePath');

}

$view->expects($this->any())->method('filemtime')
->willReturnCallback(function($path) use ($systemWideMtime, $targetBundleMtime) {
if ($path === 'SystemBundlePath') {
return $systemWideMtime;
} elseif ($path === 'targetBundlePath') {
return $targetBundleMtime;
}
throw new \Exception('unexpected path');
});


$this->assertSame($expected,
$this->invokePrivate($certificateManager, 'needsRebundling', [$uid])
);

}

function dataTestNeedRebundling() {
return [
//values: uid, CaBundleMtime, systemWideMtime, targetBundleMtime, targetBundleExists, expected

// compare minimum of CaBundleMtime and systemWideMtime with targetBundleMtime
['user1', 10, 20, 30, true, false],
['user1', 10, 20, 15, true, true],
['user1', 10, 5, 30, true, false],
['user1', 10, 5, 8, true, true],

// if no user exists we ignore 'systemWideMtime' because this is the bundle we re-build
[null, 10, 20, 30, true, false],
[null, 10, 20, 15, true, false],
[null, 10, 20, 8, true, true],
[null, 10, 5, 30, true, false],
[null, 10, 5, 8, true, true],

// if no target bundle exists we always build a new one
['user1', 10, 20, 30, false, true],
['user1', 10, 20, 15, false, true],
['user1', 10, 5, 30, false, true],
['user1', 10, 5, 8, false, true],
[null, 10, 20, 30, false, true],
[null, 10, 20, 15, false, true],
[null, 10, 20, 8, false, true],
[null, 10, 5, 30, false, true],
[null, 10, 5, 8, false, true],
];
}

}

0 comments on commit e8169e0

Please sign in to comment.