From 23e407ced50d59574157e35c3c78eb67551492c1 Mon Sep 17 00:00:00 2001 From: To-om Date: Wed, 14 Apr 2021 17:26:56 +0200 Subject: [PATCH] #1967 Make alert deletion more robust --- .../org/thp/thehive/services/AlertSrv.scala | 15 ++++--- .../thp/thehive/services/ObservableSrv.scala | 40 ++++++++++--------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/thehive/app/org/thp/thehive/services/AlertSrv.scala b/thehive/app/org/thp/thehive/services/AlertSrv.scala index 9783100087..44924b27a3 100644 --- a/thehive/app/org/thp/thehive/services/AlertSrv.scala +++ b/thehive/app/org/thp/thehive/services/AlertSrv.scala @@ -354,12 +354,15 @@ class AlertSrv @Inject() ( .map(_ => ()) def remove(alert: Alert with Entity)(implicit graph: Graph, authContext: AuthContext): Try[Unit] = - for { - organisation <- organisationSrv.getOrFail(authContext.organisation) - _ <- get(alert).observables.toIterator.toTry(observableSrv.delete(_)) - _ = get(alert).remove() - _ <- auditSrv.alert.delete(alert, organisation) - } yield () + auditSrv.mergeAudits { + get(alert).observables.toIterator.foreach(observableSrv.delete(_)) + Success(()) + } { _ => + for { + organisation <- organisationSrv.getOrFail(authContext.organisation) + _ <- auditSrv.alert.delete(alert, organisation) + } yield get(alert).remove() + } } object AlertOps { diff --git a/thehive/app/org/thp/thehive/services/ObservableSrv.scala b/thehive/app/org/thp/thehive/services/ObservableSrv.scala index cbea7a27e1..a2e9f0d8cd 100644 --- a/thehive/app/org/thp/thehive/services/ObservableSrv.scala +++ b/thehive/app/org/thp/thehive/services/ObservableSrv.scala @@ -137,24 +137,28 @@ class ObservableSrv @Inject() ( override def delete(observable: Observable with Entity)(implicit graph: Graph, authContext: AuthContext): Try[Unit] = get(observable).alert.headOption match { case None => - get(observable).share.getOrFail("Share").flatMap { - case share if share.owner => - get(observable) - .shares - .toIterator - .toTry { share => - auditSrv - .observable - .delete(observable, share) - } - .map(_ => get(observable).remove()) - case share => - for { - organisation <- organisationSrv.current.getOrFail("Organisation") - _ <- shareSrv.unshareObservable(observable, organisation) - _ <- auditSrv.observable.delete(observable, share) - } yield () - } + get(observable) + .share + .toIterator + .toTry { + case share if share.owner => + get(observable) + .shares + .toIterator + .toTry { share => + auditSrv + .observable + .delete(observable, share) + } + .map(_ => get(observable).remove()) + case share => + for { + organisation <- organisationSrv.current.getOrFail("Organisation") + _ <- shareSrv.unshareObservable(observable, organisation) + _ <- auditSrv.observable.delete(observable, share) + } yield () + } + .map(_ => ()) case Some(alert) => get(observable).remove() auditSrv.observableInAlert.delete(observable, alert)