Skip to content

Commit

Permalink
#2105 Fix injection of case number actor
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Jul 1, 2021
1 parent 75d6ff7 commit eb1bee3
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ trait IntegrityCheckApp {
bindActor[DummyActor]("config-actor")
bindActor[DummyActor]("cortex-actor")
bindActor[DummyActor]("integrity-check-actor")
bindTypedActor(CaseNumberActor.behavior, "case-number-actor")

val integrityCheckOpsBindings = ScalaMultibinder.newSetBinder[GenIntegrityCheckOps](binder)
integrityCheckOpsBindings.addBinding.to[ProfileIntegrityCheckOps]
Expand Down
2 changes: 1 addition & 1 deletion thehive/app/org/thp/thehive/TheHiveModule.scala
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ class TheHiveModule(environment: Environment, configuration: Configuration) exte
integrityCheckOpsBindings.addBinding.to[ObservableIntegrityCheckOps]
integrityCheckOpsBindings.addBinding.to[LogIntegrityCheckOps]
bind[ActorRef].annotatedWithName("integrity-check-actor").toProvider[IntegrityCheckActorProvider]
bind[TypedActorRef[CaseNumberActor.Request]].annotatedWithName("case-number-actor").toProvider[CaseNumberActorProvider]
bind[TypedActorRef[CaseNumberActor.Request]].toProvider[CaseNumberActorProvider]

bind[ActorRef].annotatedWithName("flow-actor").toProvider[FlowActorProvider]

Expand Down
16 changes: 13 additions & 3 deletions thehive/app/org/thp/thehive/services/CaseNumber.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.thp.thehive.services

import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.scaladsl.{ActorContext, Behaviors}
import akka.actor.typed.scaladsl.adapter.ClassicActorSystemOps
import akka.actor.typed.{ActorRefResolver, Behavior, ActorRef => TypedActorRef}
import akka.actor.{ActorSystem, ExtendedActorSystem}
Expand All @@ -22,15 +22,25 @@ object CaseNumberActor {
case class GetNextNumber(replyTo: TypedActorRef[Response]) extends Request
case class NextNumber(number: Int) extends Response

val behavior: Behavior[Request] = Behaviors.setup[Request] { context =>
val behavior: Behavior[Request] = Behaviors.setup[Request](context => waitFirstRequest(context))

def getNextCaseNumber(context: ActorContext[Request]): Int = {
val injector = GuiceAkkaExtension(context.system).injector
val db = injector.getInstance(classOf[Database])
val caseSrv = injector.getInstance(classOf[CaseSrv])
db.roTransaction { implicit graph =>
caseNumberProvider(caseSrv.startTraversal.getLast.headOption.fold(0)(_.number) + 1)
caseSrv.startTraversal.getLast.headOption.fold(0)(_.number) + 1
}
}

def waitFirstRequest(context: ActorContext[Request]): Behaviors.Receive[Request] =
Behaviors.receiveMessage {
case GetNextNumber(replyTo) =>
val nextNumber = getNextCaseNumber(context)
replyTo ! NextNumber(nextNumber)
caseNumberProvider(nextNumber + 1)
}

def caseNumberProvider(nextNumber: Int): Behavior[Request] =
Behaviors.receiveMessage {
case GetNextNumber(replyTo) =>
Expand Down
14 changes: 8 additions & 6 deletions thehive/app/org/thp/thehive/services/CaseSrv.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package org.thp.thehive.services

import akka.actor.ActorRef
import akka.actor.typed.scaladsl.AskPattern._
import akka.actor.typed.scaladsl.adapter.ClassicSchedulerOps
import akka.actor.typed.{Scheduler, ActorRef => TypedActorRef}
import akka.actor.{ActorRef, ActorSystem}
import akka.util.Timeout
import org.apache.tinkerpop.gremlin.process.traversal.{Order, P}
import org.apache.tinkerpop.gremlin.structure.Vertex
Expand Down Expand Up @@ -34,7 +35,7 @@ import java.lang.{Long => JLong}
import java.util.{Date, List => JList, Map => JMap}
import javax.inject.{Inject, Named, Provider, Singleton}
import scala.concurrent.duration.DurationInt
import scala.concurrent.{Await, ExecutionContext, Future}
import scala.concurrent.{Await, ExecutionContextExecutor, Future}
import scala.util.{Failure, Success, Try}

@Singleton
Expand All @@ -53,10 +54,9 @@ class CaseSrv @Inject() (
userSrv: UserSrv,
alertSrvProvider: Provider[AlertSrv],
@Named("integrity-check-actor") integrityCheckActor: ActorRef,
@Named("case-number-actor") caseNumberActor: TypedActorRef[CaseNumberActor.Request],
caseNumberActor: TypedActorRef[CaseNumberActor.Request],
cache: SyncCacheApi,
implicit val ec: ExecutionContext,
implicit val scheduler: Scheduler
system: ActorSystem
) extends VertexSrv[Case] {
lazy val alertSrv: AlertSrv = alertSrvProvider.get

Expand Down Expand Up @@ -133,7 +133,9 @@ class CaseSrv @Inject() (
}

def nextCaseNumberAsync: Future[Int] = {
implicit val timeout: Timeout = Timeout(1.minute)
implicit val timeout: Timeout = Timeout(1.minute)
implicit val scheduler: Scheduler = system.scheduler.toTyped
implicit val ec: ExecutionContextExecutor = system.dispatcher
caseNumberActor.ask[CaseNumberActor.Response](replyTo => CaseNumberActor.GetNextNumber(replyTo)).map {
case CaseNumberActor.NextNumber(caseNumber) => caseNumber
}
Expand Down

0 comments on commit eb1bee3

Please sign in to comment.