From d30909064f734e428ae8a228af616b4425f79323 Mon Sep 17 00:00:00 2001 From: Vincent Debergue Date: Thu, 22 Jul 2021 18:10:58 +0200 Subject: [PATCH] #2125 Be able to update the type of observable --- .../thehive/controllers/v0/ObservableCtrl.scala | 12 +++++++++++- .../thp/thehive/controllers/v1/Properties.scala | 14 ++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/thehive/app/org/thp/thehive/controllers/v0/ObservableCtrl.scala b/thehive/app/org/thp/thehive/controllers/v0/ObservableCtrl.scala index 5283de1908..2dfa60e72e 100644 --- a/thehive/app/org/thp/thehive/controllers/v0/ObservableCtrl.scala +++ b/thehive/app/org/thp/thehive/controllers/v0/ObservableCtrl.scala @@ -351,6 +351,7 @@ class ObservableCtrl( class PublicObservable( observableSrv: ObservableSrv, + observableTypeSrv: ObservableTypeSrv, override val organisationSrv: OrganisationSrv, override val customFieldSrv: CustomFieldSrv ) extends PublicData @@ -417,7 +418,16 @@ class PublicObservable( ) .property("message", UMapping.string)(_.field.updatable) .property("tlp", UMapping.int)(_.field.updatable) - .property("dataType", UMapping.string)(_.field.readonly) + .property("dataType", UMapping.string)(_.field.custom { (_, value, vertex, graph, _) => + val observable = observableSrv.model.converter(vertex) + for { + currentDataType <- observableTypeSrv.getByName(observable.dataType)(graph).getOrFail("ObservableType") + newDataType <- observableTypeSrv.getByName(value)(graph).getOrFail("ObservableType") + isSameType = currentDataType.isAttachment == newDataType.isAttachment + _ <- if (isSameType) Success(()) else Failure(BadRequestError("Can not update dataType: isAttachment does not match")) + _ <- Try(observableSrv.get(vertex)(graph).update(_.dataType, value).iterate()) + } yield Json.obj("dataType" -> value) + }) .property("data", UMapping.string.optional)(_.field.readonly) .property("attachment.name", UMapping.string.optional)(_.select(_.attachments.value(_.name)).readonly) .property("attachment.hashes", UMapping.hash.sequence)(_.select(_.attachments.value(_.hashes)).readonly) diff --git a/thehive/app/org/thp/thehive/controllers/v1/Properties.scala b/thehive/app/org/thp/thehive/controllers/v1/Properties.scala index b5a94d8fea..da9fa5b7f0 100644 --- a/thehive/app/org/thp/thehive/controllers/v1/Properties.scala +++ b/thehive/app/org/thp/thehive/controllers/v1/Properties.scala @@ -11,7 +11,7 @@ import org.thp.thehive.models._ import org.thp.thehive.services._ import play.api.libs.json.{JsObject, JsValue, Json} -import scala.util.Failure +import scala.util.{Failure, Success, Try} class Properties( alertSrv: AlertSrv, @@ -22,6 +22,7 @@ class Properties( dashboardSrv: DashboardSrv, caseTemplateSrv: CaseTemplateSrv, observableSrv: ObservableSrv, + observableTypeSrv: ObservableTypeSrv, val customFieldSrv: CustomFieldSrv, val organisationSrv: OrganisationSrv, db: Database @@ -442,7 +443,16 @@ class Properties( ) .property("message", UMapping.string)(_.field.updatable) .property("tlp", UMapping.int)(_.field.updatable) - .property("dataType", UMapping.string)(_.field.readonly) + .property("dataType", UMapping.string)(_.field.custom { (_, value, vertex, graph, _) => + val observable = observableSrv.model.converter(vertex) + for { + currentDataType <- observableTypeSrv.getByName(observable.dataType)(graph).getOrFail("ObservableType") + newDataType <- observableTypeSrv.getByName(value)(graph).getOrFail("ObservableType") + isSameType = currentDataType.isAttachment == newDataType.isAttachment + _ <- if (isSameType) Success(()) else Failure(BadRequestError("Can not update dataType: isAttachment does not match")) + _ <- Try(observableSrv.get(vertex)(graph).update(_.dataType, value).iterate()) + } yield Json.obj("dataType" -> value) + }) .property("data", UMapping.string.optional)(_.field.readonly) .property("attachment.name", UMapping.string.optional)(_.select(_.attachments.value(_.name)).readonly) .property("attachment.hashes", UMapping.hash.sequence)(_.select(_.attachments.value(_.hashes)).readonly)