Skip to content

Commit

Permalink
#1766 Add procedure query in case and extraData in procedure
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Feb 11, 2021
1 parent 0395890 commit c66164f
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 5 deletions.
5 changes: 3 additions & 2 deletions dto/src/main/scala/org/thp/thehive/dto/v1/Procedure.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.thp.thehive.dto.v1

import play.api.libs.json.{Format, Json, Reads, Writes}
import play.api.libs.json.{Format, JsObject, Json, Reads, Writes}

import java.util.Date

Expand Down Expand Up @@ -37,7 +37,8 @@ case class OutputProcedure(
_updatedBy: Option[String],
description: String,
occurence: Date,
patternId: String
patternId: String,
extraData: JsObject
)

object OutputProcedure {
Expand Down
3 changes: 2 additions & 1 deletion thehive/app/org/thp/thehive/controllers/v1/CaseCtrl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ class CaseCtrl @Inject() (
Query[Traversal.V[Case], Traversal.V[User]]("assignableUsers", (caseSteps, authContext) => caseSteps.assignableUsers(authContext)),
Query[Traversal.V[Case], Traversal.V[Organisation]]("organisations", (caseSteps, authContext) => caseSteps.organisations.visible(authContext)),
Query[Traversal.V[Case], Traversal.V[Alert]]("alerts", (caseSteps, authContext) => caseSteps.alert.visible(authContext)),
Query[Traversal.V[Case], Traversal.V[Share]]("shares", (caseSteps, authContext) => caseSteps.shares.visible(authContext))
Query[Traversal.V[Case], Traversal.V[Share]]("shares", (caseSteps, authContext) => caseSteps.shares.visible(authContext)),
Query[Traversal.V[Case], Traversal.V[Procedure]]("procedures", (caseSteps, _) => caseSteps.procedure)
)

def create: Action[AnyContent] =
Expand Down
12 changes: 12 additions & 0 deletions thehive/app/org/thp/thehive/controllers/v1/Conversion.scala
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,19 @@ object Conversion {
_.into[OutputProcedure]
.withFieldComputed(_._id, _._id.toString)
.withFieldComputed(_.patternId, _.pattern.patternId)
.withFieldConst(_.extraData, JsObject.empty)
.transform
)

implicit val richProcedureWithStatsRenderer: Renderer.Aux[(RichProcedure, JsObject), OutputProcedure] =
Renderer.toJson[(RichProcedure, JsObject), OutputProcedure] { procedureWithExtraData =>
procedureWithExtraData
._1
.into[OutputProcedure]
.withFieldComputed(_._id, _._id.toString)
.withFieldComputed(_.patternId, _.pattern.patternId)
.withFieldConst(_.extraData, procedureWithExtraData._2)
.transform
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ class ProcedureCtrl @Inject() (
properties: Properties,
procedureSrv: ProcedureSrv,
@Named("with-thehive-schema") implicit val db: Database
) extends QueryableCtrl {
) extends QueryableCtrl
with ProcedureRenderer {
override val entityName: String = "procedure"
override val publicProperties: PublicProperties = properties.procedure
override val initialQuery: Query = Query.init[Traversal.V[Procedure]](
Expand All @@ -33,7 +34,10 @@ class ProcedureCtrl @Inject() (
override val pageQuery: ParamQuery[OutputParam] = Query.withParam[OutputParam, Traversal.V[Procedure], IteratorOutput](
"page",
FieldsParser[OutputParam],
(range, procedureSteps, _) => procedureSteps.richPage(range.from, range.to, range.extraData.contains("total"))(_.richProcedure)
(range, procedureSteps, _) =>
procedureSteps.richPage(range.from, range.to, range.extraData.contains("total"))(
_.richProcedureWithCustomRenderer(procedureStatsRenderer(range.extraData - "total"))
)
)
override val outputQuery: Query = Query.output[RichProcedure, Traversal.V[Procedure]](_.richProcedure)
override val getQuery: ParamQuery[EntityIdOrName] = Query.initWithParam[EntityIdOrName, Traversal.V[Procedure]](
Expand Down
27 changes: 27 additions & 0 deletions thehive/app/org/thp/thehive/controllers/v1/ProcedureRenderer.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.thp.thehive.controllers.v1

import org.thp.scalligraph.traversal.{Converter, Traversal}
import org.thp.thehive.controllers.v1.Conversion._
import org.thp.thehive.models.Procedure
import org.thp.thehive.services.PatternOps._
import org.thp.thehive.services.ProcedureOps._
import play.api.libs.json.JsValue

import java.util.{Map => JMap}

trait ProcedureRenderer extends BaseRenderer[Procedure] {
def patternStats: Traversal.V[Procedure] => Traversal[JsValue, JMap[String, Any], Converter[JsValue, JMap[String, Any]]] =
_.pattern.richPattern.domainMap(_.toJson)

def procedureStatsRenderer(extraData: Set[String]): Traversal.V[Procedure] => JsTraversal = { implicit traversal =>
baseRenderer(
extraData,
traversal,
{
case (f, "pattern") => addData("pattern", f)(patternStats)
case (f, _) => f
}
)
}

}
13 changes: 13 additions & 0 deletions thehive/app/org/thp/thehive/services/ProcedureSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -80,5 +80,18 @@ object ProcedureOps {
.by(_.pattern)
)
.domainMap { case (procedure, pattern) => RichProcedure(procedure, pattern) }

def richProcedureWithCustomRenderer[D, G, C <: Converter[D, G]](
entityRenderer: Traversal.V[Procedure] => Traversal[D, G, C]
): Traversal[(RichProcedure, D), JMap[String, Any], Converter[(RichProcedure, D), JMap[String, Any]]] =
traversal
.project(
_.by
.by(_.pattern)
.by(entityRenderer)
)
.domainMap {
case (procedure, pattern, renderedEntity) => (RichProcedure(procedure, pattern), renderedEntity)
}
}
}

0 comments on commit c66164f

Please sign in to comment.