From 3aecd8d26933c05e17e1043ebe6e57b3b175d565 Mon Sep 17 00:00:00 2001 From: csavelief Date: Tue, 17 Sep 2024 08:50:57 +0200 Subject: [PATCH] [CLOSES #68] Use the YnhServer::name property as a tage when creating an asset. --- app/Http/Controllers/YnhServerController.php | 2 +- app/Listeners/ConfigureHostListener.php | 2 +- app/Listeners/InstallAppListener.php | 2 +- app/Models/YnhServer.php | 2 +- .../AdversaryMeter/Events/CreateAsset.php | 4 +++- .../Listeners/CreateAssetListener.php | 20 ++++++++++++++++--- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/YnhServerController.php b/app/Http/Controllers/YnhServerController.php index 56b271c..1e58c31 100644 --- a/app/Http/Controllers/YnhServerController.php +++ b/app/Http/Controllers/YnhServerController.php @@ -182,7 +182,7 @@ public function configure(YnhServer $server, ConfigureHostRequest $request) 'updated' => false, ])); if ($user) { - event(new CreateAsset($user, $request->domain, true)); + event(new CreateAsset($user, $request->domain, true, [$server->name])); } } diff --git a/app/Listeners/ConfigureHostListener.php b/app/Listeners/ConfigureHostListener.php index 9c5f3eb..7dfddef 100644 --- a/app/Listeners/ConfigureHostListener.php +++ b/app/Listeners/ConfigureHostListener.php @@ -77,7 +77,7 @@ protected function handle2($event) // $isOk = $isOk && $server->sshRestartDocker($ssh); $ssh->newTrace(SshTraceStateEnum::IN_PROGRESS, 'Starting asset monitoring...'); - event(new CreateAsset($user, $server->ip(), true)); + event(new CreateAsset($user, $server->ip(), true, [$server->name])); $ssh->newTrace(SshTraceStateEnum::DONE, 'Asset monitoring started.'); } if ($isOk) { diff --git a/app/Listeners/InstallAppListener.php b/app/Listeners/InstallAppListener.php index e5c4da3..1aefbdf 100644 --- a/app/Listeners/InstallAppListener.php +++ b/app/Listeners/InstallAppListener.php @@ -64,7 +64,7 @@ protected function handle2($event) } $ssh->newTrace(SshTraceStateEnum::IN_PROGRESS, 'Starting asset monitoring...'); - event(new CreateAsset($user, $domain, true)); + event(new CreateAsset($user, $domain, true, [$server->name])); $ssh->newTrace(SshTraceStateEnum::DONE, 'Asset monitoring started.'); } } diff --git a/app/Models/YnhServer.php b/app/Models/YnhServer.php index 3f09c4c..9ff3cb4 100644 --- a/app/Models/YnhServer.php +++ b/app/Models/YnhServer.php @@ -826,7 +826,7 @@ public function pullServerInfos(?string $uid = null, ?User $user = null): void 'updated' => true, ]); if ($user) { - event(new CreateAsset($user, $domain, true)); + event(new CreateAsset($user, $domain, true, [$this->name])); } } DB::transaction(function () { diff --git a/app/Modules/AdversaryMeter/Events/CreateAsset.php b/app/Modules/AdversaryMeter/Events/CreateAsset.php index 969a4ca..c63cc24 100644 --- a/app/Modules/AdversaryMeter/Events/CreateAsset.php +++ b/app/Modules/AdversaryMeter/Events/CreateAsset.php @@ -15,12 +15,14 @@ class CreateAsset public User $user; public string $asset; public bool $monitor; + public array $tags; - public function __construct(User $user, string $asset, bool $monitor) + public function __construct(User $user, string $asset, bool $monitor, array $tags = []) { $this->user = $user; $this->asset = $asset; $this->monitor = $monitor; + $this->tags = $tags; } public function broadcastOn() diff --git a/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php b/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php index 5f69a6f..d52fa09 100644 --- a/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php +++ b/app/Modules/AdversaryMeter/Listeners/CreateAssetListener.php @@ -6,16 +6,19 @@ use App\Modules\AdversaryMeter\Enums\AssetTypesEnum; use App\Modules\AdversaryMeter\Events\CreateAsset; use App\Modules\AdversaryMeter\Models\Asset; +use App\Modules\AdversaryMeter\Models\AssetTag; use App\Modules\AdversaryMeter\Rules\IsValidAsset; use App\Modules\AdversaryMeter\Rules\IsValidDomain; use App\Modules\AdversaryMeter\Rules\IsValidIpAddress; +use App\Modules\AdversaryMeter\Rules\IsValidTag; use App\User; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Str; class CreateAssetListener extends AbstractListener { - public static function execute(User $user, string $asset, bool $monitor): ?Asset + public static function execute(User $user, string $asset, bool $monitor, array $tags = []): ?Asset { if (!IsValidAsset::test($asset)) { Log::error("Invalid asset : {$asset}"); @@ -28,7 +31,8 @@ public static function execute(User $user, string $asset, bool $monitor): ?Asset } else { $assetType = AssetTypesEnum::RANGE; } - return Asset::updateOrCreate( + /** @var Asset $azzet */ + $azzet = Asset::updateOrCreate( [ 'asset' => $asset, 'created_by' => $user->id, @@ -40,6 +44,16 @@ public static function execute(User $user, string $asset, bool $monitor): ?Asset 'created_by' => $user->id, ] ); + collect($tags)->map(fn(string $tag) => Str::lower($tag)) + ->filter(fn(string $tag) => IsValidTag::test($tag)) + ->each(function (string $tag) use ($azzet) { + /** @var ?AssetTag $obj */ + $obj = $azzet->tags()->where('tag', $tag)->first(); + if (!$obj) { + $obj = $azzet->tags()->create(['tag' => $tag]); + } + }); + return $azzet; } protected function handle2($event) @@ -48,6 +62,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, $event->monitor); + self::execute($event->user, $event->asset, $event->monitor, $event->tags); } }