Skip to content

Commit

Permalink
#1670 Link freetags to freetag taxonomy
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Mar 2, 2021
1 parent 323b6d6 commit da6cd83
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 14 deletions.
2 changes: 1 addition & 1 deletion ScalliGraph
4 changes: 3 additions & 1 deletion thehive/app/org/thp/thehive/services/OrganisationSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class OrganisationSrv @Inject() (
val activeTaxos = getByName("admin").taxonomies.toSeq
for {
newOrga <- createEntity(e)
_ <- taxonomySrv.createFreetag(newOrga)
_ <- taxonomySrv.createFreetagTaxonomy(newOrga)
_ <- activeTaxos.toTry(t => organisationTaxonomySrv.create(OrganisationTaxonomy(), newOrga, t))
_ <- auditSrv.organisation.create(newOrga, newOrga.toJson)
} yield newOrga
Expand Down Expand Up @@ -187,6 +187,8 @@ object OrganisationOps {
RichOrganisation(organisation, linkedOrganisations)
}

def notAdmin: Traversal.V[Organisation] = traversal.hasNot(_.name, Organisation.administration.name)

def isAdmin: Boolean = traversal.has(_.name, Organisation.administration.name).exists

def users: Traversal.V[User] = traversal.in[RoleOrganisation].in[UserRole].v[User]
Expand Down
16 changes: 11 additions & 5 deletions thehive/app/org/thp/thehive/services/TagSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex
import org.thp.scalligraph.auth.AuthContext
import org.thp.scalligraph.models.{Database, Entity}
import org.thp.scalligraph.services.config.{ApplicationConfig, ConfigItem}
import org.thp.scalligraph.services.{IntegrityCheckOps, VertexSrv}
import org.thp.scalligraph.services.{EdgeSrv, IntegrityCheckOps, VertexSrv}
import org.thp.scalligraph.traversal.TraversalOps._
import org.thp.scalligraph.traversal.{Converter, Graph, Traversal}
import org.thp.scalligraph.utils.FunctionalCondition.When
Expand All @@ -21,18 +21,17 @@ import scala.util.{Success, Try}
@Singleton
class TagSrv @Inject() (
organisationSrv: OrganisationSrv,
taxonomySrv: TaxonomySrv,
appConfig: ApplicationConfig,
@Named("integrity-check-actor") integrityCheckActor: ActorRef
) extends VertexSrv[Tag] {

val taxonomyTagSrv = new EdgeSrv[TaxonomyTag, Taxonomy, Tag]
private val freeTagColourConfig: ConfigItem[String, String] =
appConfig.item[String]("tags.freeTagColour", "Default colour for free tags")

def freeTagColour: String = freeTagColourConfig.get

private def freeTag(tagName: String)(implicit graph: Graph, authContext: AuthContext): Tag =
Tag(freeTagNamespace, tagName, None, None, freeTagColour)

private def freeTagNamespace(implicit graph: Graph, authContext: AuthContext): String =
s"_freetags_${organisationSrv.currentId(graph, authContext).value}"

Expand Down Expand Up @@ -60,9 +59,16 @@ class TagSrv @Inject() (
startTraversal
.getByName(freeTagNamespace, tagName, None)
.getOrFail("Tag")
.orElse(create(freeTag(tagName)))
.orElse(createFreeTag(tagName))
}(Success(_))

private def createFreeTag(tagName: String)(implicit graph: Graph, authContext: AuthContext): Try[Tag with Entity] =
for {
freetagTaxonomy <- taxonomySrv.getFreetagTaxonomy
tag <- createEntity(Tag(freeTagNamespace, tagName, None, None, freeTagColour))
_ <- taxonomyTagSrv.create(TaxonomyTag(), freetagTaxonomy, tag)
} yield tag

def create(tag: Tag)(implicit graph: Graph, authContext: AuthContext): Try[Tag with Entity] = {
integrityCheckActor ! EntityAdded("Tag")
super.createEntity(tag)
Expand Down
18 changes: 12 additions & 6 deletions thehive/app/org/thp/thehive/services/TaxonomySrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,23 @@ class TaxonomySrv @Inject() (organisationSrv: OrganisationSrv, tagSrv: TagSrv) e
richTaxonomy <- Try(RichTaxonomy(taxonomy, tags))
} yield richTaxonomy

def createFreetag(organisation: Organisation with Entity)(implicit graph: Graph, authContext: AuthContext): Try[RichTaxonomy] = {
def createFreetagTaxonomy(organisation: Organisation with Entity)(implicit graph: Graph, authContext: AuthContext): Try[Taxonomy with Entity] = {
val customTaxo = Taxonomy(s"_freetags_${organisation._id.value}", "Custom taxonomy", 1)
for {
taxonomy <- createEntity(customTaxo)
richTaxonomy <- Try(RichTaxonomy(taxonomy, Seq()))
_ <- organisationTaxonomySrv.create(OrganisationTaxonomy(), organisation, taxonomy)
} yield richTaxonomy
taxonomy <- createEntity(customTaxo)
_ <- organisationTaxonomySrv.create(OrganisationTaxonomy(), organisation, taxonomy)
} yield taxonomy
}

def getFreetagTaxonomy(implicit graph: Graph, authContext: AuthContext): Try[Taxonomy with Entity] =
getByName(s"_freetags_${organisationSrv.currentId.value}")
.getOrFail("FreetagTaxonomy")
.orElse {
organisationSrv.current.notAdmin.getOrFail("Organisation").flatMap(createFreetagTaxonomy)
}

override def getByName(name: String)(implicit graph: Graph): Traversal.V[Taxonomy] =
Try(startTraversal.getByNamespace(name)).getOrElse(startTraversal.limit(0))
startTraversal.getByNamespace(name)

def update(taxonomy: Taxonomy with Entity, input: Taxonomy)(implicit graph: Graph): Try[RichTaxonomy] =
for {
Expand Down
2 changes: 1 addition & 1 deletion thehive/test/org/thp/thehive/DatabaseBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ class DatabaseBuilder @Inject() (
.startTraversal
.hasNot(_.name, "admin")
.filterNot(_.taxonomies.freetags)
.foreach(o => taxonomySrv.createFreetag(o))
.foreach(o => taxonomySrv.createFreetagTaxonomy(o))

// TODO: get tags from entity and create freetag for each
// // Add each tag to its Organisation's FreeTags taxonomy
Expand Down

0 comments on commit da6cd83

Please sign in to comment.