From 46a3910624f89c624df6b888e10e5879ca5c2002 Mon Sep 17 00:00:00 2001 From: csavelief Date: Mon, 16 Sep 2024 19:00:12 +0200 Subject: [PATCH] [REF. #67] Automatically create/update the list of assets when the list of YNH domains is updated. --- app/Http/Controllers/YnhServerController.php | 14 +++++++++++--- app/Listeners/ConfigureHostListener.php | 3 ++- app/Listeners/InstallAppListener.php | 3 ++- app/Listeners/UninstallAppListener.php | 3 ++- app/Models/YnhServer.php | 16 +++------------- .../AdversaryMeter/Events/CreateAsset.php | 4 +++- .../Http/Controllers/AssetController.php | 11 ++--------- .../Jobs/TriggerDiscoveryShallow.php | 2 +- .../Listeners/CreateAssetListener.php | 5 +++-- .../Listeners/EndDiscoveryListener.php | 2 +- tests/AdversaryMeter/DiscoveryShallowTest.php | 4 ++-- 11 files changed, 32 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/YnhServerController.php b/app/Http/Controllers/YnhServerController.php index beaa0f0..56b271c 100644 --- a/app/Http/Controllers/YnhServerController.php +++ b/app/Http/Controllers/YnhServerController.php @@ -34,6 +34,8 @@ use App\Models\YnhOsquery; use App\Models\YnhServer; use App\Models\YnhUser; +use App\Modules\AdversaryMeter\Events\CreateAsset; +use App\Modules\AdversaryMeter\Events\DeleteAsset; use App\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -166,6 +168,9 @@ public function configure(YnhServer $server, ConfigureHostRequest $request) $server->ssh_username = $request->username; $server->save(); + /** @var User $user */ + $user = Auth::user(); + if (!$principal) { $server->domains()->save(YnhDomain::updateOrCreate([ 'ynh_server_id' => $server->id, @@ -176,13 +181,16 @@ public function configure(YnhServer $server, ConfigureHostRequest $request) 'ynh_server_id' => $server->id, 'updated' => false, ])); + if ($user) { + event(new CreateAsset($user, $request->domain, true)); + } } $uid = Str::random(10); - $ssh = $server->sshConnection($uid, Auth::user()); + $ssh = $server->sshConnection($uid, $user); $ssh->newTrace(SshTraceStateEnum::PENDING, "Your host is being configured!"); - event(new ConfigureHost($uid, Auth::user(), $server)); + event(new ConfigureHost($uid, $user, $server)); return response()->json(['success' => "Your host is being configured!"]); } @@ -244,7 +252,7 @@ public function delete(YnhServer $server, RemoveHostRequest $request) if ($server->ip()) { $ssh->newTrace(SshTraceStateEnum::IN_PROGRESS, 'Stopping asset monitoring...'); - $server->stopMonitoringAsset(Auth::user(), $server->ip()); + event(new DeleteAsset(Auth::user(), $server->ip())); $ssh->newTrace(SshTraceStateEnum::DONE, 'Asset monitoring stopped.'); $server->sshEnableAdminConsole($ssh); diff --git a/app/Listeners/ConfigureHostListener.php b/app/Listeners/ConfigureHostListener.php index 81d18fd..9c5f3eb 100644 --- a/app/Listeners/ConfigureHostListener.php +++ b/app/Listeners/ConfigureHostListener.php @@ -5,6 +5,7 @@ use App\Enums\SshTraceStateEnum; use App\Events\ConfigureHost; use App\Events\PullServerInfos; +use App\Modules\AdversaryMeter\Events\CreateAsset; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; use Vanilo\Order\Models\FulfillmentStatus; @@ -76,7 +77,7 @@ protected function handle2($event) // $isOk = $isOk && $server->sshRestartDocker($ssh); $ssh->newTrace(SshTraceStateEnum::IN_PROGRESS, 'Starting asset monitoring...'); - $server->startMonitoringAsset($user, $server->ip()); + event(new CreateAsset($user, $server->ip(), true)); $ssh->newTrace(SshTraceStateEnum::DONE, 'Asset monitoring started.'); } if ($isOk) { diff --git a/app/Listeners/InstallAppListener.php b/app/Listeners/InstallAppListener.php index ee4db43..e5c4da3 100644 --- a/app/Listeners/InstallAppListener.php +++ b/app/Listeners/InstallAppListener.php @@ -7,6 +7,7 @@ use App\Events\PullServerInfos; use App\Helpers\AppStore; use App\Models\YnhApplication; +use App\Modules\AdversaryMeter\Events\CreateAsset; use Illuminate\Support\Facades\Auth; class InstallAppListener extends AbstractListener @@ -63,7 +64,7 @@ protected function handle2($event) } $ssh->newTrace(SshTraceStateEnum::IN_PROGRESS, 'Starting asset monitoring...'); - $server->startMonitoringAsset($user, $domain); + event(new CreateAsset($user, $domain, true)); $ssh->newTrace(SshTraceStateEnum::DONE, 'Asset monitoring started.'); } } diff --git a/app/Listeners/UninstallAppListener.php b/app/Listeners/UninstallAppListener.php index 6c42dec..01a00dd 100644 --- a/app/Listeners/UninstallAppListener.php +++ b/app/Listeners/UninstallAppListener.php @@ -5,6 +5,7 @@ use App\Enums\SshTraceStateEnum; use App\Events\PullServerInfos; use App\Events\UninstallApp; +use App\Modules\AdversaryMeter\Events\DeleteAsset; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; @@ -36,7 +37,7 @@ protected function handle2($event) } $ssh->newTrace(SshTraceStateEnum::IN_PROGRESS, 'Stopping asset monitoring...'); - $server->stopMonitoringAsset($user, $domain); + event(new DeleteAsset($user, $domain)); $ssh->newTrace(SshTraceStateEnum::DONE, 'Asset monitoring stopped.'); } } diff --git a/app/Models/YnhServer.php b/app/Models/YnhServer.php index dc2213a..3f09c4c 100644 --- a/app/Models/YnhServer.php +++ b/app/Models/YnhServer.php @@ -9,7 +9,6 @@ use App\Helpers\SshConnection2; use App\Helpers\SshKeyPair; use App\Modules\AdversaryMeter\Events\CreateAsset; -use App\Modules\AdversaryMeter\Events\DeleteAsset; use App\Traits\HasTenant2; use App\User; use Carbon\Carbon; @@ -346,18 +345,6 @@ public function latestTraces(): Collection ->get() : collect(); } - public function startMonitoringAsset(User $user, string $domainOrIpAddress): bool - { - event(new CreateAsset($user, $domainOrIpAddress)); - return true; - } - - public function stopMonitoringAsset(User $user, string $domainOrIpAddress): bool - { - event(new DeleteAsset($user, $domainOrIpAddress)); - return true; - } - public function sshTestConnection(): bool { return $this->sshKeyPair()->isSshConnectionUpAndRunning($this->ip(), $this->ssh_port, $this->ssh_username); @@ -838,6 +825,9 @@ public function pullServerInfos(?string $uid = null, ?User $user = null): void 'ynh_server_id' => $this->id, 'updated' => true, ]); + if ($user) { + event(new CreateAsset($user, $domain, true)); + } } DB::transaction(function () { YnhDomain::where('ynh_server_id', $this->id) diff --git a/app/Modules/AdversaryMeter/Events/CreateAsset.php b/app/Modules/AdversaryMeter/Events/CreateAsset.php index fe3440b..969a4ca 100644 --- a/app/Modules/AdversaryMeter/Events/CreateAsset.php +++ b/app/Modules/AdversaryMeter/Events/CreateAsset.php @@ -14,11 +14,13 @@ class CreateAsset public User $user; public string $asset; + public bool $monitor; - public function __construct(User $user, string $asset) + public function __construct(User $user, string $asset, bool $monitor) { $this->user = $user; $this->asset = $asset; + $this->monitor = $monitor; } public function broadcastOn() diff --git a/app/Modules/AdversaryMeter/Http/Controllers/AssetController.php b/app/Modules/AdversaryMeter/Http/Controllers/AssetController.php index 9a54219..608bc4c 100644 --- a/app/Modules/AdversaryMeter/Http/Controllers/AssetController.php +++ b/app/Modules/AdversaryMeter/Http/Controllers/AssetController.php @@ -75,20 +75,13 @@ public function saveAsset(Request $request): array /** @var User $user */ $user = Auth::user(); - $obj = CreateAssetListener::execute($user, $asset); + $obj = CreateAssetListener::execute($user, $asset, is_bool($watch) && $watch); if (!$obj) { abort(500, "The asset could not be created : {$asset}"); } - if (is_bool($watch) && $watch) { - $obj->is_monitored = true; - $obj->save(); - } - - $obj = $obj->refresh(); - return [ - 'asset' => $this->convertAsset($obj), + 'asset' => $this->convertAsset($obj->refresh()), ]; } diff --git a/app/Modules/AdversaryMeter/Jobs/TriggerDiscoveryShallow.php b/app/Modules/AdversaryMeter/Jobs/TriggerDiscoveryShallow.php index b7d23c7..d5a1607 100644 --- a/app/Modules/AdversaryMeter/Jobs/TriggerDiscoveryShallow.php +++ b/app/Modules/AdversaryMeter/Jobs/TriggerDiscoveryShallow.php @@ -43,7 +43,7 @@ public function handle() Asset::where('tld', $tld) ->get() ->each(function (Asset $asset) use ($domain) { - event(new CreateAsset($asset->createdBy(), $domain)); + event(new CreateAsset($asset->createdBy(), $domain, true)); }); }); } diff --git a/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php b/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php index 6582d25..5f69a6f 100644 --- a/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php +++ b/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php @@ -15,7 +15,7 @@ class CreateAssetListener extends AbstractListener { - public static function execute(User $user, string $asset): ?Asset + public static function execute(User $user, string $asset, bool $monitor): ?Asset { if (!IsValidAsset::test($asset)) { Log::error("Invalid asset : {$asset}"); @@ -36,6 +36,7 @@ public static function execute(User $user, string $asset): ?Asset [ 'asset' => $asset, 'type' => $assetType, + 'is_monitored' => $monitor, 'created_by' => $user->id, ] ); @@ -47,6 +48,6 @@ protected function handle2($event) throw new \Exception('Invalid event type!'); } Auth::login($event->user); // otherwise the tenant will not be properly set - self::execute($event->user, $event->asset); + self::execute($event->user, $event->asset, $event->monitor); } } diff --git a/app/Modules/AdversaryMeter/Listeners/EndDiscoveryListener.php b/app/Modules/AdversaryMeter/Listeners/EndDiscoveryListener.php index 77dfb8d..a66ab71 100644 --- a/app/Modules/AdversaryMeter/Listeners/EndDiscoveryListener.php +++ b/app/Modules/AdversaryMeter/Listeners/EndDiscoveryListener.php @@ -71,7 +71,7 @@ protected function handle2($event) Asset::where('tld', $tld) ->get() ->each(function (Asset $asset) use ($domain) { - event(new CreateAsset($asset->createdBy(), $domain)); + event(new CreateAsset($asset->createdBy(), $domain, true)); }); }); diff --git a/tests/AdversaryMeter/DiscoveryShallowTest.php b/tests/AdversaryMeter/DiscoveryShallowTest.php index bb01dba..55cda6c 100644 --- a/tests/AdversaryMeter/DiscoveryShallowTest.php +++ b/tests/AdversaryMeter/DiscoveryShallowTest.php @@ -19,8 +19,8 @@ public function testItCreatesAnAssetAfterDiscovery() 'subdomains' => ['www1.example.com', 'www1.example.com' /* duplicate! */, 'www2.example.com'], ]); - event(new CreateAsset($this->user, 'example.com')); - event(new CreateAsset($this->user, 'example.com')); + event(new CreateAsset($this->user, 'example.com', false)); + event(new CreateAsset($this->user, 'example.com', false)); TriggerDiscoveryShallow::dispatch();