Skip to content

Commit 2ce4262

Browse files
committed
#912 Add "AddTagToAlert" operation, for responders
1 parent c7b23a5 commit 2ce4262

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

thehive-cortex/app/connectors/cortex/services/ActionOperation.scala

+16
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ case class AddLogToTask(content: String, owner: Option[String], status: ActionOp
6161
override def updateStatus(newStatus: Type, newMessage: String): ActionOperation = copy(status = newStatus, message = newMessage)
6262
}
6363

64+
case class AddTagToAlert(tag: String, status: ActionOperationStatus.Type = ActionOperationStatus.Waiting, message: String = "") extends ActionOperation {
65+
override def updateStatus(newStatus: ActionOperationStatus.Type, newMessage: String): AddTagToAlert = copy(status = newStatus, message = newMessage)
66+
}
67+
6468
object ActionOperation {
6569
val addTagToCaseWrites = Json.writes[AddTagToCase]
6670
val addTagToArtifactWrites = Json.writes[AddTagToArtifact]
@@ -69,6 +73,7 @@ object ActionOperation {
6973
val closeTaskWrites = Json.writes[CloseTask]
7074
val markAlertAsReadWrites = Json.writes[MarkAlertAsRead]
7175
val addLogToTaskWrites = Json.writes[AddLogToTask]
76+
val addTagToAlertWrites = Json.writes[AddTagToAlert]
7277
implicit val actionOperationReads: Reads[ActionOperation] = Reads[ActionOperation](json
7378
(json \ "type").asOpt[String].fold[JsResult[ActionOperation]](JsError("type is missing in action operation")) {
7479
case "AddTagToCase" (json \ "tag").validate[String].map(tag AddTagToCase(tag))
@@ -85,6 +90,7 @@ object ActionOperation {
8590
content (json \ "content").validate[String]
8691
owner (json \ "owner").validateOpt[String]
8792
} yield AddLogToTask(content, owner)
93+
case "AddTagToAlert" => (json \ "tag").validate[String].map(tag AddTagToAlert(tag))
8894
case other JsError(s"Unknown operation $other")
8995
})
9096
implicit val actionOperationWrites: Writes[ActionOperation] = Writes[ActionOperation] {
@@ -95,6 +101,7 @@ object ActionOperation {
95101
case a: CloseTask closeTaskWrites.writes(a)
96102
case a: MarkAlertAsRead markAlertAsReadWrites.writes(a)
97103
case a: AddLogToTask addLogToTaskWrites.writes(a)
104+
case a: AddTagToAlert addTagToAlertWrites.writes(a)
98105
case a Json.obj("unsupported operation" a.toString)
99106
}
100107
}
@@ -198,6 +205,15 @@ class ActionOperationSrv @Inject() (
198205
task findTaskEntity(entity)
199206
_ logSrv.create(task, Fields.empty.set("message", content).set("owner", owner.map(JsString)))
200207
} yield operation.updateStatus(ActionOperationStatus.Success, "")
208+
case AddTagToAlert(tag, _, _) =>
209+
entity match {
210+
case initialAlert: Alert
211+
for {
212+
alert alertSrv.get(initialAlert.id)
213+
_ alertSrv.update(alert.id, Fields.empty.set("tags", Json.toJson((alert.tags() :+ tag).distinct)), ModifyConfig(retryOnConflict = 0, version = Some(alert.version)))
214+
} yield operation.updateStatus(ActionOperationStatus.Success, "")
215+
case _ Future.failed(BadRequestError("Alert not found"))
216+
}
201217
case o Future.successful(operation.updateStatus(ActionOperationStatus.Failure, s"Operation $o not supported"))
202218
}
203219
}

0 commit comments

Comments
 (0)