Выполнение шага 5:

• Updated Plan
  └ Продолжаю итерацию 5 как отдельный рабочий срез поверх текущих SSH credentials.
    □ Добавить модель/миграцию/repository для host_scans и покрыть repository тестами
    □ Добавить SSH command runner и LinuxHostScanner с whitelist read-only команд
    □ Подключить controller/routes/UI для запуска deep scan и просмотра результата
    □ Прогнать проверки и зафиксировать ограничения Docker-верификации
This commit is contained in:
2026-05-29 17:34:27 +08:00
parent 3981ffdf5e
commit dc3a466944
15 changed files with 837 additions and 6 deletions
@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace Domovoy\Tests\Services;
use Domovoy\Models\Credential;
use Domovoy\Services\Security\CredentialVault;
use Domovoy\Services\Ssh\SshCredentialTester;
use PHPUnit\Framework\TestCase;
final class SshCredentialTesterTest extends TestCase
{
public function testTestsPasswordCredentialWithDecryptedSecret(): void
{
$vault = new CredentialVault('test-key-material');
$credential = new Credential();
$credential->username = 'root';
$credential->authMethod = 'password';
$credential->encryptedSecret = $vault->encrypt('secret-password');
$tester = new SshCredentialTester($vault, function (string $host, int $port, int $timeout) {
self::assertSame('192.168.1.10', $host);
self::assertSame(22, $port);
self::assertSame(5, $timeout);
return new FakeSshClient();
}, ['connect_timeout' => 5]);
$result = $tester->test($credential, '192.168.1.10');
self::assertSame('ok', $result['status']);
self::assertSame('Подключение успешно', $result['message']);
self::assertSame('root', FakeSshClient::$lastUsername);
self::assertSame('secret-password', FakeSshClient::$lastPassword);
}
}
final class FakeSshClient
{
public static ?string $lastUsername = null;
public static ?string $lastPassword = null;
public function login(string $username, string $password): bool
{
self::$lastUsername = $username;
self::$lastPassword = $password;
return true;
}
}