Skip to content

Commit

Permalink
#1967 Make alert deletion more robust
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Apr 14, 2021
1 parent 67dfae2 commit 23e407c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 24 deletions.
15 changes: 9 additions & 6 deletions thehive/app/org/thp/thehive/services/AlertSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
40 changes: 22 additions & 18 deletions thehive/app/org/thp/thehive/services/ObservableSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 23e407c

Please sign in to comment.