Skip to content

Commit 0905aed

Browse files
committed
#12 Add custom fields in case and case template
1 parent 16dfbc8 commit 0905aed

File tree

6 files changed

+14
-4
lines changed

6 files changed

+14
-4
lines changed

project/Dependencies.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ object Dependencies {
3030
val reflections = "org.reflections" % "reflections" % "0.9.10"
3131
val zip4j = "net.lingala.zip4j" % "zip4j" % "1.3.2"
3232
val akkaTest = "com.typesafe.akka" %% "akka-stream-testkit" % "2.4.4"
33-
val elastic4play = "org.cert-bdf" %% "elastic4play" % "1.1.6-SNAPSHOT"
33+
val elastic4play = "org.cert-bdf" %% "elastic4play" % "1.2.0-SNAPSHOT"
3434
}
3535
}

thehive-backend/app/models/Case.scala

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ trait CaseAttributes { _: AttributeDef ⇒
4848
val summary: A[Option[String]] = optionalAttribute("summary", F.textFmt, "Summary of the case, to be provided when closing a case")
4949
val mergeInto: A[Option[String]] = optionalAttribute("mergeInto", F.stringFmt, "Id of the case created by the merge")
5050
val mergeFrom: A[Seq[String]] = multiAttribute("mergeFrom", F.stringFmt, "Id of the cases merged")
51+
val customFields: A[Option[JsValue]] = optionalAttribute("customFields", F.customFields, "Custom fields")
5152
}
5253

5354
@Singleton

thehive-backend/app/models/CaseTemplate.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package models
22

33
import javax.inject.{ Inject, Singleton }
44

5-
import play.api.libs.json.JsObject
5+
import play.api.libs.json.{ JsObject, JsValue }
66
import org.elastic4play.models.{ Attribute, AttributeDef, EntityDef, HiveEnumeration, ModelDef, AttributeFormat F }
77
import models.JsonFormat.caseTemplateStatusFormat
88

@@ -23,7 +23,7 @@ trait CaseTemplateAttributes { _: AttributeDef ⇒
2323
val tlp: A[Option[Long]] = optionalAttribute("tlp", F.numberFmt, "TLP level")
2424
val status: A[CaseTemplateStatus.Value] = attribute("status", F.enumFmt(CaseTemplateStatus), "Status of the case", CaseTemplateStatus.Ok)
2525
val metricNames: A[Seq[String]] = multiAttribute("metricNames", F.stringFmt, "List of acceptable metric name")
26-
val customFieldNames: A[Seq[String]] = multiAttribute("customFieldNames", F.stringFmt, "List of acceptable custom field name")
26+
val customFields: A[Option[JsValue]] = optionalAttribute("customFields", F.customFields, "List of acceptable custom fields")
2727
val tasks: A[Seq[JsObject]] = multiAttribute("tasks", F.objectFmt(taskAttributes), "List of created tasks")
2828
}
2929

thehive-backend/app/models/Migration.scala

+1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class Migration(
126126
"follow" (misp \ "follow").as[JsBoolean])
127127
},
128128
removeEntity("audit")(o (o \ "objectType").asOpt[String].contains("alert")))
129+
case DatabaseState(9) Nil
129130
}
130131

131132
private val requestCounter = new java.util.concurrent.atomic.AtomicInteger(0)
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

22

33
package object models {
4-
val modelVersion = 9
4+
val modelVersion = 10
55
}

thehive-backend/app/services/CaseSrv.scala

+8
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,16 @@ class CaseSrv @Inject() (
3131
lazy val log = Logger(getClass)
3232

3333
def applyTemplate(template: CaseTemplate, originalFields: Fields): Fields = {
34+
def getJsObjectOrEmpty(value: Option[JsValue]) = value.fold(JsObject(Nil)) {
35+
case obj: JsObject obj
36+
case _ JsObject(Nil)
37+
}
38+
3439
val metricNames = (originalFields.getStrings("metricNames").getOrElse(Nil) ++ template.metricNames()).distinct
3540
val metrics = JsObject(metricNames.map(_ JsNull))
3641
val tags = (originalFields.getStrings("tags").getOrElse(Nil) ++ template.tags()).distinct
42+
val customFields = getJsObjectOrEmpty(template.customFields()) ++ getJsObjectOrEmpty(originalFields.getValue("customFields"))
43+
3744
originalFields
3845
.set("title", originalFields.getString("title").map(t JsString(template.titlePrefix().getOrElse("") + " " + t)))
3946
.set("description", originalFields.getString("description").orElse(template.description()).map(JsString))
@@ -42,6 +49,7 @@ class CaseSrv @Inject() (
4249
.set("flag", originalFields.getBoolean("flag").orElse(template.flag()).map(JsBoolean))
4350
.set("tlp", originalFields.getLong("tlp").orElse(template.tlp()).map(JsNumber(_)))
4451
.set("metrics", originalFields.getValue("metrics").flatMap(_.asOpt[JsObject]).getOrElse(JsObject(Nil)) ++ metrics)
52+
.set("customFields", customFields)
4553
}
4654

4755
def create(fields: Fields, template: Option[CaseTemplate] = None)(implicit authContext: AuthContext): Future[Case] = {

0 commit comments

Comments
 (0)