|
|
|
|
@ -19,26 +19,27 @@ use OCP\IAppConfig; |
|
|
|
|
use OCP\ICacheFactory; |
|
|
|
|
use OCP\IConfig; |
|
|
|
|
use OCP\ServerVersion; |
|
|
|
|
use phpseclib\Crypt\RSA; |
|
|
|
|
use phpseclib\File\X509; |
|
|
|
|
use phpseclib3\Crypt\RSA; |
|
|
|
|
use phpseclib3\File\X509; |
|
|
|
|
use PHPUnit\Framework\MockObject\MockObject; |
|
|
|
|
use Test\TestCase; |
|
|
|
|
|
|
|
|
|
class CheckerTest extends TestCase { |
|
|
|
|
/** @var ServerVersion|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var ServerVersion&MockObject */ |
|
|
|
|
private $serverVersion; |
|
|
|
|
/** @var EnvironmentHelper|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var EnvironmentHelper&MockObject */ |
|
|
|
|
private $environmentHelper; |
|
|
|
|
/** @var FileAccessHelper|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var FileAccessHelper&MockObject */ |
|
|
|
|
private $fileAccessHelper; |
|
|
|
|
/** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var IConfig&MockObject */ |
|
|
|
|
private $config; |
|
|
|
|
/** @var IAppConfig|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var IAppConfig&MockObject */ |
|
|
|
|
private $appConfig; |
|
|
|
|
/** @var ICacheFactory|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var ICacheFactory&MockObject */ |
|
|
|
|
private $cacheFactory; |
|
|
|
|
/** @var IAppManager|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var IAppManager&MockObject */ |
|
|
|
|
private $appManager; |
|
|
|
|
/** @var Detection|\PHPUnit\Framework\MockObject\MockObject */ |
|
|
|
|
/** @var Detection&MockObject */ |
|
|
|
|
private $mimeTypeDetector; |
|
|
|
|
|
|
|
|
|
private Checker $checker; |
|
|
|
|
@ -93,8 +94,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeAppSignature('NotExistingApp', $x509, $rsa); |
|
|
|
|
@ -111,8 +111,8 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.key'); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeAppSignature(\OC::$SERVERROOT . '/tests/data/integritycheck/app/', $x509, $rsa); |
|
|
|
|
@ -127,6 +127,14 @@ class CheckerTest extends TestCase { |
|
|
|
|
"signature": "Y5yvXvcGHVPuRRatKVDUONWq1FpLXugZd6Km\/+aEHsQj7coVl9FeMj9OsWamBf7yRIw3dtNLguTLlAA9QAv\/b0uHN3JnbNZN+dwFOve4NMtqXfSDlWftqKN00VS+RJXpG1S2IIx9Poyp2NoghL\/5AuTv4GHiNb7zU\/DT\/kt71pUGPgPR6IIFaE+zHOD96vjYkrH+GfWZzKR0FCdLib9yyNvk+EGrcjKM6qjs2GKfS\/XFjj\/\/neDnh\/0kcPuKE3ZbofnI4TIDTv0CGqvOp7PtqVNc3Vy\/UKa7uF1PT0MAUKMww6EiMUSFZdUVP4WWF0Y72W53Qdtf1hrAZa2kfKyoK5kd7sQmCSKUPSU8978AUVZlBtTRlyT803IKwMV0iHMkw+xYB1sN2FlHup\/DESADqxhdgYuK35bCPvgkb4SBe4B8Voz\/izTvcP7VT5UvkYdAO+05\/jzdaHEmzmsD92CFfvX0q8O\/Y\/29ubftUJsqcHeMDKgcR4eZOE8+\/QVc\/89QO6WnKNuNuV+5bybO6g6PAdC9ZPsCvnihS61O2mwRXHLR3jv2UleFWm+lZEquPKtkhi6SLtDiijA4GV6dmS+dzujSLb7hGeD5o1plZcZ94uhWljl+QIp82+zU\/lYB1Zfr4Mb4e+V7r2gv7Fbv7y6YtjE2GIQwRhC5jq56bD0ZB+I=", |
|
|
|
|
"certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEwTCCAqmgAwIBAgIUWv0iujufs5lUr0svCf\/qTQvoyKAwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIyNDk1M1oXDTE2MTEwMzIyNDk1M1owEjEQMA4GA1UEAwwHU29tZUFwcDCCAiIw\r\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK8q0x62agGSRBqeWsaeEwFfepMk\r\nF8cAobMMi50qHCv9IrOn\/ZH9l52xBrbIkErVmRjmly0d4JhD8Ymhidsh9ONKYl\/j\r\n+ishsZDM8eNNdp3Ew+fEYVvY1W7mR1qU24NWj0bzVsClI7hvPVIuw7AjfBDq1C5+\r\nA+ZSLSXYvOK2cEWjdxQfuNZwEZSjmA63DUllBIrm35IaTvfuyhU6BW9yHZxmb8+M\r\nw0xDv30D5UkE\/2N7Pa\/HQJLxCR+3zKibRK3nUyRDLSXxMkU9PnFNaPNX59VPgyj4\r\nGB1CFSToldJVPF4pzh7p36uGXZVxs8m3LFD4Ol8mhi7jkxDZjqFN46gzR0r23Py6\r\ndol9vfawGIoUwp9LvL0S7MvdRY0oazLXwClLP4OQ17zpSMAiCj7fgNT661JamPGj\r\nt5O7Zn2wA7I4ddDS\/HDTWCu98Zwc9fHIpsJPgCZ9awoqxi4Mnf7Pk9g5nnXhszGC\r\ncxxIASQKM+GhdzoRxKknax2RzUCwCzcPRtCj8AQT\/x\/mqN3PfRmlnFBNACUw9bpZ\r\nSOoNq2pCF9igftDWpSIXQ38pVpKLWowjjg3DVRmVKBgivHnUnVLyzYBahHPj0vaz\r\ntFtUFRaqXDnt+4qyUGyrT5h5pjZaTcHIcSB4PiarYwdVvgslgwnQzOUcGAzRWBD4\r\n6jV2brP5vFY3g6iPAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBACTY3CCHC+Z28gCf\r\nFWGKQ3wAKs+k4+0yoti0qm2EKX7rSGQ0PHSas6uW79WstC4Rj+DYkDtIhGMSg8FS\r\nHVGZHGBCc0HwdX+BOAt3zi4p7Sf3oQef70\/4imPoKxbAVCpd\/cveVcFyDC19j1yB\r\nBapwu87oh+muoeaZxOlqQI4UxjBlR\/uRSMhOn2UGauIr3dWJgAF4pGt7TtIzt+1v\r\n0uA6FtN1Y4R5O8AaJPh1bIG0CVvFBE58esGzjEYLhOydgKFnEP94kVPgJD5ds9C3\r\npPhEpo1dRpiXaF7WGIV1X6DI\/ipWvfrF7CEy6I\/kP1InY\/vMDjQjeDnJ\/VrXIWXO\r\nyZvHXVaN\/m+1RlETsH7YO\/QmxRue9ZHN3gvvWtmpCeA95sfpepOk7UcHxHZYyQbF\r\n49\/au8j+5tsr4A83xzsT1JbcKRxkAaQ7WDJpOnE5O1+H0fB+BaLakTg6XX9d4Fo7\r\n7Gin7hVWX7pL+JIyxMzME3LhfI61+CRcqZQIrpyaafUziPQbWIPfEs7h8tCOWyvW\r\nUO8ZLervYCB3j44ivkrxPlcBklDCqqKKBzDP9dYOtS\/P4RB1NkHA9+NTvmBpTonS\r\nSFXdg9fFMD7VfjDE3Vnk+8DWkVH5wBYowTAD7w9Wuzr7DumiAULexnP\/Y7xwxLv7\r\n4B+pXTAcRK0zECDEaX3npS8xWzrB\r\n-----END CERTIFICATE-----" |
|
|
|
|
}'; |
|
|
|
|
$this->fileAccessHelper |
|
|
|
|
->expects(self::any()) |
|
|
|
|
->method('is_writable') |
|
|
|
|
->with( |
|
|
|
|
$this->equalTo(\OC::$SERVERROOT . '/tests/data/integritycheck/app//appinfo'), |
|
|
|
|
) |
|
|
|
|
->willReturn(true); |
|
|
|
|
|
|
|
|
|
$this->fileAccessHelper |
|
|
|
|
->expects($this->once()) |
|
|
|
|
->method('file_put_contents') |
|
|
|
|
@ -142,8 +150,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::load($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeAppSignature(\OC::$SERVERROOT . '/tests/data/integritycheck/app/', $x509, $rsa); |
|
|
|
|
@ -446,8 +453,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeCoreSignature($x509, $rsa, __DIR__); |
|
|
|
|
@ -469,8 +475,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/SomeApp.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeCoreSignature($x509, $rsa, __DIR__); |
|
|
|
|
@ -504,8 +509,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/core.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/core.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/app/'); |
|
|
|
|
@ -539,8 +543,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/core.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/core.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessUnmodified/'); |
|
|
|
|
@ -569,8 +572,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/core.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/core.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithInvalidModifiedContent/'); |
|
|
|
|
@ -605,8 +607,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
|
|
|
|
|
$keyBundle = file_get_contents(__DIR__ . '/../../data/integritycheck/core.crt'); |
|
|
|
|
$rsaPrivateKey = file_get_contents(__DIR__ . '/../../data/integritycheck/core.key'); |
|
|
|
|
$rsa = new RSA(); |
|
|
|
|
$rsa->loadKey($rsaPrivateKey); |
|
|
|
|
$rsa = RSA::loadPrivateKey($rsaPrivateKey); |
|
|
|
|
$x509 = new X509(); |
|
|
|
|
$x509->loadX509($keyBundle); |
|
|
|
|
$this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithValidModifiedContent'); |
|
|
|
|
@ -976,7 +977,8 @@ class CheckerTest extends TestCase { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function testRunInstanceVerification(): void { |
|
|
|
|
$this->checker = $this->getMockBuilder('\OC\IntegrityCheck\Checker') |
|
|
|
|
/** @var Checker&MockObject */ |
|
|
|
|
$checker = $this->getMockBuilder('\OC\IntegrityCheck\Checker') |
|
|
|
|
->setConstructorArgs([ |
|
|
|
|
$this->serverVersion, |
|
|
|
|
$this->environmentHelper, |
|
|
|
|
@ -993,7 +995,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
]) |
|
|
|
|
->getMock(); |
|
|
|
|
|
|
|
|
|
$this->checker |
|
|
|
|
$checker |
|
|
|
|
->expects($this->once()) |
|
|
|
|
->method('verifyCoreSignature'); |
|
|
|
|
$this->appManager |
|
|
|
|
@ -1020,7 +1022,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
'calendar', |
|
|
|
|
'dav', |
|
|
|
|
]; |
|
|
|
|
$this->checker |
|
|
|
|
$checker |
|
|
|
|
->expects($this->exactly(3)) |
|
|
|
|
->method('verifyAppSignature') |
|
|
|
|
->willReturnCallback(function ($app) use (&$calls) { |
|
|
|
|
@ -1047,7 +1049,7 @@ class CheckerTest extends TestCase { |
|
|
|
|
->method('deleteKey') |
|
|
|
|
->with('core', 'oc.integritycheck.checker'); |
|
|
|
|
|
|
|
|
|
$this->checker->runInstanceVerification(); |
|
|
|
|
$checker->runInstanceVerification(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function testVerifyAppSignatureWithoutSignatureDataAndCodeCheckerDisabled(): void { |
|
|
|
|
|