Start packagemanager tests

This commit is contained in:
Dennis Eichhorn 2018-10-14 22:00:53 +02:00
parent e8e036173d
commit de7ef32dbb
7 changed files with 113 additions and 14 deletions

View File

@ -213,7 +213,7 @@ class InstallerAbstract
self::installHooks(__DIR__ . '/../../' . $child->getName() . '/' . \basename($file->getName(), '.php') . '/Hooks.php', $file->getPath());
}
} elseif ($child instanceof File) {
self::installRoutes(__DIR__ . '/../../' . $child->getName() . '/Hooks.php', $child->getPath());
self::installHooks(__DIR__ . '/../../' . $child->getName() . '/Hooks.php', $child->getPath());
}
}
}

View File

@ -57,6 +57,14 @@ final class PackageManager
*/
private $extractPath = '';
/**
* Public key.
*
* @var string
* @since 1.0.0
*/
private $publicKey = '';
/**
* Info data.
*
@ -68,15 +76,17 @@ final class PackageManager
/**
* Constructor.
*
* @param string $path Package source path e.g. path after download.
* @param string $basePath Path of the application
* @param string $path Package source path e.g. path after download.
* @param string $basePath Path of the application
* @param string $publicKey Public key
*
* @since 1.0.0
*/
public function __construct(string $path, string $basePath)
public function __construct(string $path, string $basePath, string $publicKey)
{
$this->path = $path;
$this->basePath = $basePath;
$this->path = $path;
$this->basePath = $basePath; // todo: maybe remove from here because stupid
$this->publicKey = $publicKey;
}
/**
@ -136,7 +146,7 @@ final class PackageManager
*/
private function hashFiles() : string
{
$files = Directory::list($this->extractPath . '/package');
$files = Directory::list($this->extractPath);
$state = \sodium_crypto_generichash_init();
foreach ($files as $file) {
@ -144,7 +154,7 @@ final class PackageManager
continue;
}
$contents = \file_get_contents($this->extractPath . '/package/' . $file);
$contents = \file_get_contents($this->extractPath . '/' . $file);
if ($contents === false) {
throw new \Exception();
}
@ -171,7 +181,7 @@ final class PackageManager
}
foreach ($this->info as $key => $components) {
if (function_exists($this->{$key})) {
if (\function_exists($this->{$key})) {
$this->{$key}($components);
}
}
@ -270,9 +280,8 @@ final class PackageManager
*/
private function authenticate(string $signedHash, string $rawHash) : bool
{
// https://3v4l.org/PN9Xl
$publicKey = 'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjr73rerPRq3ZwWmrUKsNBjg8Wy5lnyWu9HCRQz0fix6grz+NOOsr4m/jazB2knfdtn7fi5XifbIbmrNJY8e6musCJ0FTgJPVBqVk7XAFVSRe2gUaCPZrTPtfZ00C3cynjwTlxSdjNtU9N0ZAo17sVWghH8ki4T2d5Mg1erGOtMJzp5yw47UHUa+KbxUmUV25WMcRYyi7+itD2xANF2AE+PQZT1dSEU8++NI+zT6tXD/Orv5ikk0whoVqvo6duWejx5n5cpJB4EiMo4Q7epbw9uMo9uIKqgQ9y3KdT36GBQkBErFf1dhf8KYJBGYMhO1UJE11dY3XrA7Ij1+zK+aiduQHOc5EMClUGZQzCJAIU5lj4WEHQ4Lo0gop+fx9hzuBTDxdyOjWSJzkqyuWMkq3zEpRBay785iaglaue9XDLee58wY+toiGLBfXe73gsbDqDSOll+cQYNjrronVN7sUDc2WyTIVW1Z8KFwK10D3SW0oEylCaGLtClyyihuW7JPu/8Or1Zjf87W82XTm31FpYkRgoEMDtVHZq0N2eHpLz1L8zKyT0ogZYN5eH5VlGrPcpwbAludNKlgAJ0hrgED19YsCBLwJQpFa4VZP7A5a/Qcw8EFAvNkgaPpBbAAtWoDbyOQsez6Jsdan/enfZ18+LL7qOB5oFFM/pKlTIeVS+UsCAwEAAQ==';
$unsignedHash = \sodium_crypto_sign_open($signedHash, $publicKey);
return \sodium_crypto_sign_verify_detached($signedHash, $rawHash, $this->publicKey);
//$unsignedHash = \sodium_crypto_sign_open($signedHash, $this->publicKey);
return $unsignedHash === $rawHash;
}

View File

@ -16,11 +16,97 @@ namespace phpOMS\tests\Module;
require_once __DIR__ . '/../Autoloader.php';
use phpOMS\Module\PackageManager;
use phpOMS\System\File\Local\File;
use phpOMS\System\File\Local\Directory;
use phpOMS\System\File\Local\LocalStorage;
use phpOMS\Utils\IO\Zip\Zip;
use phpOMS\Utils\StringUtils;
class PackageManagerTest extends \PHPUnit\Framework\TestCase
{
public function testPackage()
public static function setUpBeforeClass()
{
self::markTestIncomplete();
if (file_exists(__DIR__ . '/testPackage.zip')) {
unlink(__DIR__ . '/testPackage.zip');
}
if (file_exists(__DIR__ . '/testPackageExtracted')) {
\array_map('unlink', \glob(__DIR__ . '/testPackageExtracted/*'));
}
// create keys
$alice_sign_kp = \sodium_crypto_sign_keypair();
$alice_sign_secretkey = \sodium_crypto_sign_secretkey($alice_sign_kp);
$alice_sign_publickey = \sodium_crypto_sign_publickey($alice_sign_kp);
// create signature
$files = Directory::list(__DIR__ . '/testPackage');
$state = \sodium_crypto_generichash_init();
foreach ($files as $file) {
if ($file === 'package.cert') {
continue;
}
$contents = \file_get_contents(__DIR__ . '/testPackage' . '/' . $file);
if ($contents === false) {
throw new \Exception();
}
\sodium_crypto_generichash_update($state, $contents);
}
$hash = \sodium_crypto_generichash_final($state);
$signature = sodium_crypto_sign_detached($hash, $alice_sign_secretkey);
\file_put_contents(__DIR__ . '/testPackage/package.cert', $signature);
\file_put_contents(__DIR__ . '/public.key', $alice_sign_publickey);
// create zip
Zip::pack(
[
__DIR__ . '/testPackage',
],
__DIR__ . '/testPackage.zip'
);
}
public function testPackageValid()
{
$package = new PackageManager(
__DIR__ . '/testPackage.zip',
'/invalid',
\file_get_contents(__DIR__ . '/public.key')
);
$package->extract(__DIR__ . '/testPackageExtracted');
self::assertTrue($package->isValid());
}
public function testCleanup()
{
$package = new PackageManager(
__DIR__ . '/testPackage.zip',
'/invalid',
\file_get_contents(__DIR__ . '/public.key')
);
$package->cleanup();
self::assertFalse(file_exists(__DIR__ . '/testPackage.zip'));
self::assertFalse(file_exists(__DIR__ . '/testPackageExtracted'));
}
public static function tearDownAfterClass()
{
if (file_exists(__DIR__ . '/testPackage.zip')) {
unlink(__DIR__ . '/testPackage.zip');
}
if (file_exists(__DIR__ . '/testPackageExtracted')) {
\array_map('unlink', \glob(__DIR__ . '/testPackageExtracted/*'));
}
}
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@
╨9  >К╤AMВ╙=ь║1б[▀QгШ5ОС b│ших3'{Яz0t╤=·пфuOzНФ┴⌡h

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@ -0,0 +1,2 @@
this is a test file