diff --git a/thehive-cortex/app/connectors/cortex/services/ActionOperation.scala b/thehive-cortex/app/connectors/cortex/services/ActionOperation.scala index dad270cbbd..d5b845ddf8 100644 --- a/thehive-cortex/app/connectors/cortex/services/ActionOperation.scala +++ b/thehive-cortex/app/connectors/cortex/services/ActionOperation.scala @@ -65,6 +65,14 @@ case class AddTagToAlert(tag: String, status: ActionOperationStatus.Type = Actio override def updateStatus(newStatus: ActionOperationStatus.Type, newMessage: String): AddTagToAlert = copy(status = newStatus, message = newMessage) } +case class AddArtifactToCase(data: String, dataType: String, dataMessage: String, status: ActionOperationStatus.Type = ActionOperationStatus.Waiting, message: String = "") extends ActionOperation { + override def updateStatus(newStatus: ActionOperationStatus.Type, newMessage: String): AddArtifactToCase = copy(status = newStatus, message = newMessage) +} + +case class AssignCase(owner: String, status: ActionOperationStatus.Type = ActionOperationStatus.Waiting, message: String = "") extends ActionOperation { + override def updateStatus(newStatus: ActionOperationStatus.Type, newMessage: String): AssignCase = copy(status = newStatus, message = newMessage) +} + object ActionOperation { val addTagToCaseWrites = Json.writes[AddTagToCase] val addTagToArtifactWrites = Json.writes[AddTagToArtifact] @@ -74,6 +82,8 @@ object ActionOperation { val markAlertAsReadWrites = Json.writes[MarkAlertAsRead] val addLogToTaskWrites = Json.writes[AddLogToTask] val addTagToAlertWrites = Json.writes[AddTagToAlert] + val addArtifactToCaseWrites = Json.writes[AddArtifactToCase] + val assignCaseWrites = Json.writes[AssignCase] implicit val actionOperationReads: Reads[ActionOperation] = Reads[ActionOperation](json ⇒ (json \ "type").asOpt[String].fold[JsResult[ActionOperation]](JsError("type is missing in action operation")) { case "AddTagToCase" ⇒ (json \ "tag").validate[String].map(tag ⇒ AddTagToCase(tag)) @@ -91,18 +101,28 @@ object ActionOperation { owner ← (json \ "owner").validateOpt[String] } yield AddLogToTask(content, owner) case "AddTagToAlert" => (json \ "tag").validate[String].map(tag ⇒ AddTagToAlert(tag)) + case "AddArtifactToCase" ⇒ for { + data ← (json \ "data").validate[String] + dataType ← (json \ "dataType").validate[String] + dataMessage ← (json \ "message").validate[String] + } yield AddArtifactToCase(data, dataType, dataMessage) + case "AssignCase" ⇒ for { + owner ← (json \ "owner").validate[String] + } yield AssignCase(owner) case other ⇒ JsError(s"Unknown operation $other") }) implicit val actionOperationWrites: Writes[ActionOperation] = Writes[ActionOperation] { - case a: AddTagToCase ⇒ addTagToCaseWrites.writes(a) - case a: AddTagToArtifact ⇒ addTagToArtifactWrites.writes(a) - case a: CreateTask ⇒ createTaskWrites.writes(a) - case a: AddCustomFields ⇒ addCustomFieldsWrites.writes(a) - case a: CloseTask ⇒ closeTaskWrites.writes(a) - case a: MarkAlertAsRead ⇒ markAlertAsReadWrites.writes(a) - case a: AddLogToTask ⇒ addLogToTaskWrites.writes(a) - case a: AddTagToAlert ⇒ addTagToAlertWrites.writes(a) - case a ⇒ Json.obj("unsupported operation" → a.toString) + case a: AddTagToCase ⇒ addTagToCaseWrites.writes(a) + case a: AddTagToArtifact ⇒ addTagToArtifactWrites.writes(a) + case a: CreateTask ⇒ createTaskWrites.writes(a) + case a: AddCustomFields ⇒ addCustomFieldsWrites.writes(a) + case a: CloseTask ⇒ closeTaskWrites.writes(a) + case a: MarkAlertAsRead ⇒ markAlertAsReadWrites.writes(a) + case a: AddLogToTask ⇒ addLogToTaskWrites.writes(a) + case a: AddTagToAlert ⇒ addTagToAlertWrites.writes(a) + case a: AddArtifactToCase ⇒ addArtifactToCaseWrites.writes(a) + case a: AssignCase ⇒ assignCaseWrites.writes(a) + case a ⇒ Json.obj("unsupported operation" → a.toString) } } @@ -205,6 +225,17 @@ class ActionOperationSrv @Inject() ( task ← findTaskEntity(entity) _ ← logSrv.create(task, Fields.empty.set("message", content).set("owner", owner.map(JsString))) } yield operation.updateStatus(ActionOperationStatus.Success, "") + case AddArtifactToCase(data, dataType, dataMessage, _, _) ⇒ + for { + initialCase ← findCaseEntity(entity) + artifact ← artifactSrv.create(initialCase.id, Fields.empty.set("data", data).set("dataType", dataType).set("message", dataMessage)) + } yield operation.updateStatus(ActionOperationStatus.Success, "") + case AssignCase(owner, _, _) ⇒ + for { + initialCase ← findCaseEntity(entity) + caze ← caseSrv.get(initialCase.id) + _ ← caseSrv.update(caze, Fields.empty.set("owner", owner), ModifyConfig(retryOnConflict = 0, version = Some(caze.version))) + } yield operation.updateStatus(ActionOperationStatus.Success, "") case AddTagToAlert(tag, _, _) => entity match { case initialAlert: Alert ⇒ diff --git a/ui/app/scripts/controllers/alert/AlertListCtrl.js b/ui/app/scripts/controllers/alert/AlertListCtrl.js index ba6c919b31..409d94d470 100755 --- a/ui/app/scripts/controllers/alert/AlertListCtrl.js +++ b/ui/app/scripts/controllers/alert/AlertListCtrl.js @@ -501,6 +501,14 @@ }); }; + this.filterByNewAndUpdated = function() { + self.filtering.clearFilters() + .then(function(){ + self.addFilterValue('status', 'New'); + self.addFilterValue('status', 'Updated'); + }); + }; + this.filterBySeverity = function(numericSev) { self.addFilterValue('severity', Severity.values[numericSev]); }; diff --git a/ui/app/scripts/controllers/case/CaseListCtrl.js b/ui/app/scripts/controllers/case/CaseListCtrl.js index e058e0e345..0997c18634 100644 --- a/ui/app/scripts/controllers/case/CaseListCtrl.js +++ b/ui/app/scripts/controllers/case/CaseListCtrl.js @@ -199,6 +199,21 @@ }); }; + this.filterMyOpenCases = function() { + this.uiSrv.clearFilters() + .then(function(){ + var currentUser = AuthenticationSrv.currentUser; + self.uiSrv.activeFilters.owner = { + value: [{ + text: currentUser.id, + label: currentUser.name + }] + }; + self.filter(); + self.addFilterValue('status', 'Open'); + }); + }; + this.filterByStatus = function(status) { this.uiSrv.clearFilters() .then(function(){ diff --git a/ui/app/views/partials/alert/list/toolbar.html b/ui/app/views/partials/alert/list/toolbar.html index 9f8d5cd70b..e887d13cf0 100644 --- a/ui/app/views/partials/alert/list/toolbar.html +++ b/ui/app/views/partials/alert/list/toolbar.html @@ -42,12 +42,16 @@
diff --git a/ui/app/views/partials/case/list/toolbar.html b/ui/app/views/partials/case/list/toolbar.html index a516b16b0f..b837230665 100644 --- a/ui/app/views/partials/case/list/toolbar.html +++ b/ui/app/views/partials/case/list/toolbar.html @@ -9,6 +9,9 @@