Skip to content

Commit

Permalink
#1501 Fix coalesce converter problem
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Sep 21, 2020
1 parent 33aa6a1 commit dfeea88
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ trait AuditRenderer {
def observableToJson: Traversal.V[Observable] => Traversal[JsObject, JMap[String, Any], Converter[JsObject, JMap[String, Any]]] =
_.project(
_.by(_.richObservable.domainMap(_.toJson))
.by(_.coalesce(o => caseToJson(o.`case`), o => alertToJson(o.alert)))
.by(_.coalesceMulti(o => caseToJson(o.`case`), o => alertToJson(o.alert)))
).domainMap {
case (obs, caseOrAlert) => obs.as[JsObject] + ((caseOrAlert \ "_type").asOpt[String].getOrElse("<unknwon>") -> caseOrAlert)
}
Expand Down Expand Up @@ -83,7 +83,7 @@ trait AuditRenderer {

def auditRenderer: Traversal.V[Audit] => Traversal[JsObject, JMap[String, Any], Converter[JsObject, JMap[String, Any]]] =
(_: Traversal.V[Audit])
.coalesce(_.`object`, _.identity.setConverter[Vertex, IdentityConverter[Vertex]](Converter.identity[Vertex]))
.coalesceIdent[Vertex](_.`object`, _.identity)
.choose(
_.on(_.label)
.option("Case", t => caseToJson(t.v[Case]))
Expand Down
2 changes: 1 addition & 1 deletion thehive/app/org/thp/thehive/controllers/v0/CaseCtrl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ class PublicCase @Inject() (
.sack((_: Long) - (_: JLong), _.by(_.value(_.startDate).graphMap[Long, JLong, Converter[Long, JLong]](_.getTime, Converter.long)))
.sack((_: Long) / (_: Long), _.by(_.constant(3600000L)))
.sack[Long],
_.constant(0L)
0L
)
).readonly
)
Expand Down
6 changes: 3 additions & 3 deletions thehive/app/org/thp/thehive/controllers/v0/CaseRenderer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ trait CaseRenderer {
def isOwnerStats(implicit authContext: AuthContext): Traversal.V[Case] => Traversal[Boolean, String, Converter[Boolean, String]] =
_.origin.value(_.name).domainMap(_ == authContext.organisation)

def caseStatsRenderer(
implicit authContext: AuthContext
def caseStatsRenderer(implicit
authContext: AuthContext
): Traversal.V[Case] => Traversal[JsObject, JMap[String, Any], Converter[JsObject, JMap[String, Any]]] =
_.project(
_.by(
Expand All @@ -68,7 +68,7 @@ trait CaseRenderer {
_.by(taskStats)
.by(observableStats)
),
_.constant2[(JsObject, JsObject), JMap[String, Any]](JsObject.empty -> JsObject.empty)
JsObject.empty -> JsObject.empty
)
).by(alertStats)
.by(mergeFromStats)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ import play.api.libs.json.{JsObject, Json}

trait ObservableRenderer {

def observableStatsRenderer(
implicit authContext: AuthContext
def observableStatsRenderer(implicit
authContext: AuthContext
): Traversal.V[Observable] => Traversal[JsObject, JMap[JBoolean, JLong], Converter[JsObject, JMap[JBoolean, JLong]]] =
_.similar
.visible
Expand All @@ -32,8 +32,8 @@ trait ObservableRenderer {
}

def observableLinkRenderer: V[Observable] => Traversal[JsObject, JMap[String, Any], Converter[JsObject, JMap[String, Any]]] =
_.coalesce(
_.alert.richAlert.domainMap(a => Json.obj("alert" -> a.toJson)),
_.coalesceMulti(
_.alert.richAlert.domainMap(a => Json.obj("alert" -> a.toJson)),
_.`case`.richCaseWithoutPerms.domainMap(c => Json.obj("case" -> c.toJson))
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ trait ObservableRenderer {
_.origin.has("name", authContext.organisation).fold.domainMap(l => JsBoolean(l.nonEmpty))

def observableLinks: Traversal.V[Observable] => Traversal[JsObject, JMap[String, Any], Converter[JsObject, JMap[String, Any]]] =
_.coalesce(
_.coalesceMulti(
_.alert.richAlert.domainMap(a => Json.obj("alert" -> a.toJson)),
_.`case`.richCaseWithoutPerms.domainMap(c => Json.obj("case" -> c.toJson))
)
Expand Down
40 changes: 20 additions & 20 deletions thehive/app/org/thp/thehive/services/AuditSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ class AuditSrv @Inject() (
}
}

private def createFromPending(tx: AnyRef, audit: Audit, context: Option[Product with Entity], `object`: Option[Product with Entity])(
implicit graph: Graph,
private def createFromPending(tx: AnyRef, audit: Audit, context: Option[Product with Entity], `object`: Option[Product with Entity])(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] = {
logger.debug(s"Store audit entity: $audit")
Expand All @@ -123,8 +123,8 @@ class AuditSrv @Inject() (
}
}

def create(audit: Audit, context: Option[Product with Entity], `object`: Option[Product with Entity])(
implicit graph: Graph,
def create(audit: Audit, context: Option[Product with Entity], `object`: Option[Product with Entity])(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] = {
def setupCallbacks(tx: AnyRef): Try[Unit] = {
Expand Down Expand Up @@ -190,8 +190,8 @@ class AuditSrv @Inject() (

class UserAudit extends SelfContextObjectAudit[User] {

def changeProfile(user: User with Entity, organisation: Organisation, profile: Profile)(
implicit graph: Graph,
def changeProfile(user: User with Entity, organisation: Organisation, profile: Profile)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand All @@ -200,8 +200,8 @@ class AuditSrv @Inject() (
Some(user)
)

def delete(user: User with Entity, organisation: Organisation with Entity)(
implicit graph: Graph,
def delete(user: User with Entity, organisation: Organisation with Entity)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand All @@ -213,8 +213,8 @@ class AuditSrv @Inject() (

class ShareAudit {

def shareCase(`case`: Case with Entity, organisation: Organisation with Entity, profile: Profile with Entity)(
implicit graph: Graph,
def shareCase(`case`: Case with Entity, organisation: Organisation with Entity, profile: Profile with Entity)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand All @@ -223,8 +223,8 @@ class AuditSrv @Inject() (
Some(`case`)
)

def shareTask(task: Task with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(
implicit graph: Graph,
def shareTask(task: Task with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand All @@ -233,8 +233,8 @@ class AuditSrv @Inject() (
Some(`case`)
)

def shareObservable(observable: Observable with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(
implicit graph: Graph,
def shareObservable(observable: Observable with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand All @@ -250,8 +250,8 @@ class AuditSrv @Inject() (
Some(`case`)
)

def unshareTask(task: Task with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(
implicit graph: Graph,
def unshareTask(task: Task with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand All @@ -260,8 +260,8 @@ class AuditSrv @Inject() (
Some(`case`)
)

def unshareObservable(observable: Observable with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(
implicit graph: Graph,
def unshareObservable(observable: Observable with Entity, `case`: Case with Entity, organisation: Organisation with Entity)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] =
auditSrv.create(
Expand Down Expand Up @@ -329,14 +329,14 @@ object AuditOps {
def `case`: Traversal.V[Case] =
traversal
.out[AuditContext]
.coalesce(_.in().hasLabel("Share"), _.hasLabel("Share"))
.coalesceIdent[Vertex](_.in().hasLabel("Share"), _.hasLabel("Share"))
.out[ShareCase]
.v[Case]

def organisation: Traversal.V[Organisation] =
traversal
.out[AuditContext]
.coalesce(
.coalesceIdent[Vertex](
_.hasLabel("Organisation"),
_.in().hasLabel("Share").in[OrganisationShare],
_.both().hasLabel("Organisation")
Expand Down
17 changes: 9 additions & 8 deletions thehive/app/org/thp/thehive/services/CaseSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,10 @@ class CaseSrv @Inject() (
case (task, owner) => taskSrv.create(task, owner)
}
_ <- createdTasks.toTry(t => shareSrv.shareTask(t, createdCase, organisation))
caseTemplateCustomFields = caseTemplate
.fold[Seq[RichCustomField]](Nil)(_.customFields)
.map(cf => (cf.name, cf.value, cf.order))
caseTemplateCustomFields =
caseTemplate
.fold[Seq[RichCustomField]](Nil)(_.customFields)
.map(cf => (cf.name, cf.value, cf.order))
cfs <- (caseTemplateCustomFields ++ customFields).toTry { case (name, value, order) => createCustomField(createdCase, name, value, order) }
caseTemplateTags = caseTemplate.fold[Seq[Tag with Entity]](Nil)(_.tags)
allTags = tags ++ caseTemplateTags
Expand Down Expand Up @@ -152,8 +153,8 @@ class CaseSrv @Inject() (
} yield ()
}

def addObservable(`case`: Case with Entity, richObservable: RichObservable)(
implicit graph: Graph,
def addObservable(`case`: Case with Entity, richObservable: RichObservable)(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] = {
val alreadyExistInThatCase = observableSrv
Expand Down Expand Up @@ -206,8 +207,8 @@ class CaseSrv @Inject() (
.map(_ => ())
}

def setOrCreateCustomField(`case`: Case with Entity, customFieldName: String, value: Option[Any], order: Option[Int])(
implicit graph: Graph,
def setOrCreateCustomField(`case`: Case with Entity, customFieldName: String, value: Option[Any], order: Option[Int])(implicit
graph: Graph,
authContext: AuthContext
): Try[Unit] = {
val cfv = get(`case`).customFields(customFieldName)
Expand Down Expand Up @@ -373,7 +374,7 @@ object CaseOps {

def richCaseWithCustomRenderer[D, G, C <: Converter[D, G]](
entityRenderer: Traversal.V[Case] => Traversal[D, G, C]
)(implicit authContext: AuthContext) =
)(implicit authContext: AuthContext): Traversal[(RichCase, D), JMap[String, Any], Converter[(RichCase, D), JMap[String, Any]]] =
traversal
.project(
_.by
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ class WebhookProvider @Inject() (
override def apply(config: Configuration): Try[Notifier] =
for {
name <- config.getOrFail[String]("endpoint")
config <- webhookConfigs
.get
.find(_.name == name)
.fold[Try[WebhookNotification]](Failure(BadConfigurationError(s"Webhook configuration `$name` not found`")))(Success.apply)
config <-
webhookConfigs
.get
.find(_.name == name)
.fold[Try[WebhookNotification]](Failure(BadConfigurationError(s"Webhook configuration `$name` not found`")))(Success.apply)

} yield new Webhook(config, auditSrv, customFieldSrv, mat, ec)
}
Expand Down Expand Up @@ -111,7 +112,7 @@ class Webhook(
def observableToJson: Traversal.V[Observable] => Traversal[JsObject, JMap[String, Any], Converter[JsObject, JMap[String, Any]]] =
_.project(
_.by(_.richObservable.domainMap(_.toJson))
.by(_.coalesce(o => caseToJson(o.`case`), o => alertToJson(o.alert)))
.by(_.coalesceMulti(o => caseToJson(o.`case`), o => alertToJson(o.alert)))
).domainMap {
case (obs, caseOrAlert) => obs.as[JsObject] + ((caseOrAlert \ "_type").asOpt[String].getOrElse("<unknown>") -> caseOrAlert)
}
Expand All @@ -134,20 +135,20 @@ class Webhook(
).domainMap {
case (vertex, _) =>
JsObject(
UMapping.string.optional.getProperty(vertex, "workerId").map(v => "analyzerId" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "workerName").map(v => "analyzerName" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "workerId").map(v => "analyzerId" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "workerName").map(v => "analyzerName" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "workerDefinition").map(v => "analyzerDefinition" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "status").map(v => "status" -> JsString(v)).toList :::
UMapping.date.optional.getProperty(vertex, "startDate").map(v => "startDate" -> JsNumber(v.getTime)).toList :::
UMapping.date.optional.getProperty(vertex, "endDate").map(v => "endDate" -> JsNumber(v.getTime)).toList :::
UMapping.string.optional.getProperty(vertex, "cortexId").map(v => "cortexId" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "cortexJobId").map(v => "cortexJobId" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "_createdBy").map(v => "_createdBy" -> JsString(v)).toList :::
UMapping.date.optional.getProperty(vertex, "_createdAt").map(v => "_createdAt" -> JsNumber(v.getTime)).toList :::
UMapping.string.optional.getProperty(vertex, "_updatedBy").map(v => "_updatedBy" -> JsString(v)).toList :::
UMapping.date.optional.getProperty(vertex, "_updatedAt").map(v => "_updatedAt" -> JsNumber(v.getTime)).toList :::
UMapping.string.optional.getProperty(vertex, "_type").map(v => "_type" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "_id").map(v => "_id" -> JsString(v)).toList
UMapping.string.optional.getProperty(vertex, "status").map(v => "status" -> JsString(v)).toList :::
UMapping.date.optional.getProperty(vertex, "startDate").map(v => "startDate" -> JsNumber(v.getTime)).toList :::
UMapping.date.optional.getProperty(vertex, "endDate").map(v => "endDate" -> JsNumber(v.getTime)).toList :::
UMapping.string.optional.getProperty(vertex, "cortexId").map(v => "cortexId" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "cortexJobId").map(v => "cortexJobId" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "_createdBy").map(v => "_createdBy" -> JsString(v)).toList :::
UMapping.date.optional.getProperty(vertex, "_createdAt").map(v => "_createdAt" -> JsNumber(v.getTime)).toList :::
UMapping.string.optional.getProperty(vertex, "_updatedBy").map(v => "_updatedBy" -> JsString(v)).toList :::
UMapping.date.optional.getProperty(vertex, "_updatedAt").map(v => "_updatedAt" -> JsNumber(v.getTime)).toList :::
UMapping.string.optional.getProperty(vertex, "_type").map(v => "_type" -> JsString(v)).toList :::
UMapping.string.optional.getProperty(vertex, "_id").map(v => "_id" -> JsString(v)).toList
)
}

Expand All @@ -165,7 +166,7 @@ class Webhook(
.option("Job", jobToJson)
.none(_.constant2[JsObject, JMap[String, Any]](JsObject.empty))
),
_.constant2[JsObject, JMap[String, Any]](JsObject.empty)
JsObject.empty
)

}
Expand Down
8 changes: 4 additions & 4 deletions thehive/app/org/thp/thehive/services/th3/Aggregation.scala
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ case class AggSum(aggName: Option[String], fieldName: String) extends Aggregatio
.sum
.domainMap(sum => Output(Json.obj(name -> JsNumber(BigDecimal(sum.toString)))))
.castDomain[Output[_]],
_.constant2(Output(Json.obj(name -> JsNull)))
Output(Json.obj(name -> JsNull))
)
}
}
Expand All @@ -187,7 +187,7 @@ case class AggAvg(aggName: Option[String], fieldName: String) extends Aggregatio
.select(fieldPath, t)
.mean
.domainMap(avg => Output(Json.obj(name -> avg.asInstanceOf[Double]))),
_.constant2(Output(Json.obj(name -> JsNull)))
Output(Json.obj(name -> JsNull))
)
}
}
Expand All @@ -210,7 +210,7 @@ case class AggMin(aggName: Option[String], fieldName: String) extends Aggregatio
.select(fieldPath, t)
.min
.domainMap(min => Output(Json.obj(name -> property.mapping.selectRenderer.toJson(min)))),
_.constant2(Output(Json.obj(name -> JsNull)))
Output(Json.obj(name -> JsNull))
)
}
}
Expand All @@ -233,7 +233,7 @@ case class AggMax(aggName: Option[String], fieldName: String) extends Aggregatio
.select(fieldPath, t)
.max
.domainMap(max => Output(Json.obj(name -> property.mapping.selectRenderer.toJson(max)))),
_.constant2(Output(Json.obj(name -> JsNull)))
Output(Json.obj(name -> JsNull))
)
}
}
Expand Down

0 comments on commit dfeea88

Please sign in to comment.