Skip to content

Commit 13ecd33

Browse files
committed
Merge branch 'release/3.0.0-RC3'
2 parents e7eef99 + 43ebbf1 commit 13ecd33

88 files changed

Lines changed: 2081 additions & 13464 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.scalafmt.conf

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
version = "2.0.0-RC7"
2+
align = more # For pretty alignment.
3+
assumeStandardLibraryStripMargin = true
4+
style = defaultWithAlign
5+
maxColumn = 150
6+
7+
align.openParenCallSite = false
8+
align.openParenDefnSite = false
9+
newlines.alwaysBeforeTopLevelStatements = true
10+
rewrite.rules = [
11+
# ExpandImportSelectors
12+
RedundantBraces
13+
RedundantParens
14+
SortModifiers
15+
PreferCurlyFors
16+
SortImports
17+
]
18+
19+
includeCurlyBraceInSelectChains = true
20+
includeNoParensInSelectChains = true
21+
22+
rewriteTokens {
23+
"=>" : "⇒"
24+
"<-" : "←"
25+
"->": "→"
26+
}

.scalariform.conf

Lines changed: 0 additions & 30 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
# Change Log
22

3-
## [3.0.0-RC2](https://github.com/TheHive-Project/Cortex/tree/3.0.0-RC2) (2019-05-03)
3+
## [3.0.0-RC3](https://github.com/TheHive-Project/Cortex/tree/3.0.0-RC3) (2019-06-05)
4+
5+
[Full Changelog](https://github.com/TheHive-Project/Cortex/compare/3.0.0-RC2...3.0.0-RC3)
6+
7+
**Implemented enhancements:**
8+
9+
- Improve job details page [\#195](https://github.com/TheHive-Project/Cortex/issues/195)
10+
- Add support of ElasticSearch 6 [\#191](https://github.com/TheHive-Project/Cortex/issues/191)
11+
- Upgrade frontend libraries [\#190](https://github.com/TheHive-Project/Cortex/issues/190)
412

13+
**Fixed bugs:**
14+
15+
- Get user detials via API is available to non-admin users [\#194](https://github.com/TheHive-Project/Cortex/issues/194)
16+
17+
## [3.0.0-RC2](https://github.com/TheHive-Project/Cortex/tree/3.0.0-RC2) (2019-05-03)
518
[Full Changelog](https://github.com/TheHive-Project/Cortex/compare/3.0.0-RC1...3.0.0-RC2)
619

720
**Fixed bugs:**

app/org/thp/cortex/Module.scala

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,47 @@
11
package org.thp.cortex
22

3+
import java.lang.reflect.Modifier
4+
35
import com.google.inject.AbstractModule
4-
import net.codingwell.scalaguice.{ ScalaModule, ScalaMultibinder }
6+
import net.codingwell.scalaguice.{ScalaModule, ScalaMultibinder}
57
import play.api.libs.concurrent.AkkaGuiceSupport
6-
import play.api.{ Configuration, Environment, Logger, Mode }
8+
import play.api.{Configuration, Environment, Logger, Mode}
79
import scala.collection.JavaConverters._
810

911
import com.google.inject.name.Names
1012
import org.reflections.Reflections
1113
import org.reflections.scanners.SubTypesScanner
1214
import org.reflections.util.ConfigurationBuilder
13-
import org.thp.cortex.models.{ AuditedModel, Migration }
15+
import org.thp.cortex.models.{AuditedModel, Migration}
1416
import org.thp.cortex.services._
1517

1618
import org.elastic4play.models.BaseModelDef
1719
import org.elastic4play.services.auth.MultiAuthSrv
18-
import org.elastic4play.services.{ AuthSrv, MigrationOperations }
19-
import org.thp.cortex.controllers.{ AssetCtrl, AssetCtrlDev, AssetCtrlProd }
20-
import services.mappers.{ MultiUserMapperSrv, UserMapper }
20+
import org.elastic4play.services.{UserSrv EUserSrv, AuthSrv, MigrationOperations}
21+
import org.thp.cortex.controllers.{AssetCtrl, AssetCtrlDev, AssetCtrlProd}
22+
import services.mappers.{MultiUserMapperSrv, UserMapper}
2123

2224
class Module(environment: Environment, configuration: Configuration) extends AbstractModule with ScalaModule with AkkaGuiceSupport {
2325

2426
private lazy val logger = Logger(s"module")
2527

2628
override def configure(): Unit = {
27-
val modelBindings = ScalaMultibinder.newSetBinder[BaseModelDef](binder)
29+
val modelBindings = ScalaMultibinder.newSetBinder[BaseModelDef](binder)
2830
val auditedModelBindings = ScalaMultibinder.newSetBinder[AuditedModel](binder)
29-
val reflectionClasses = new Reflections(new ConfigurationBuilder()
30-
.forPackages("org.elastic4play")
31-
.addClassLoader(getClass.getClassLoader)
32-
.addClassLoader(environment.getClass.getClassLoader)
33-
.forPackages("org.thp.cortex")
34-
.setExpandSuperTypes(false)
35-
.setScanners(new SubTypesScanner(false)))
31+
val reflectionClasses = new Reflections(
32+
new ConfigurationBuilder()
33+
.forPackages("org.elastic4play")
34+
.addClassLoader(getClass.getClassLoader)
35+
.addClassLoader(environment.getClass.getClassLoader)
36+
.forPackages("org.thp.cortex")
37+
.setExpandSuperTypes(false)
38+
.setScanners(new SubTypesScanner(false))
39+
)
3640

3741
reflectionClasses
3842
.getSubTypesOf(classOf[BaseModelDef])
3943
.asScala
40-
.filterNot(c java.lang.reflect.Modifier.isAbstract(c.getModifiers))
44+
.filterNot(c Modifier.isAbstract(c.getModifiers))
4145
.foreach { modelClass
4246
logger.info(s"Loading model $modelClass")
4347
modelBindings.addBinding.to(modelClass)
@@ -50,7 +54,7 @@ class Module(environment: Environment, configuration: Configuration) extends Abs
5054
reflectionClasses
5155
.getSubTypesOf(classOf[AuthSrv])
5256
.asScala
53-
.filterNot(c java.lang.reflect.Modifier.isAbstract(c.getModifiers) || c.isMemberClass)
57+
.filterNot(c Modifier.isAbstract(c.getModifiers) || c.isMemberClass)
5458
.filterNot(c c == classOf[MultiAuthSrv] || c == classOf[CortexAuthSrv])
5559
.foreach { authSrvClass
5660
logger.info(s"Loading authentication module $authSrvClass")
@@ -61,7 +65,7 @@ class Module(environment: Environment, configuration: Configuration) extends Abs
6165
reflectionClasses
6266
.getSubTypesOf(classOf[UserMapper])
6367
.asScala
64-
.filterNot(c java.lang.reflect.Modifier.isAbstract(c.getModifiers) || c.isMemberClass)
68+
.filterNot(c Modifier.isAbstract(c.getModifiers) || c.isMemberClass)
6569
.filterNot(c c == classOf[MultiUserMapperSrv])
6670
.foreach(mapperCls ssoMapperBindings.addBinding.to(mapperCls))
6771

@@ -70,7 +74,7 @@ class Module(environment: Environment, configuration: Configuration) extends Abs
7074
else
7175
bind[AssetCtrl].to[AssetCtrlDev]
7276

73-
bind[org.elastic4play.services.UserSrv].to[UserSrv]
77+
bind[EUserSrv].to[UserSrv]
7478
bind[Int].annotatedWith(Names.named("databaseVersion")).toInstance(models.modelVersion)
7579
bind[UserMapper].to[MultiUserMapperSrv]
7680

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,56 @@
11
package org.thp.cortex.controllers
22

3-
import javax.inject.{ Inject, Singleton }
4-
import scala.concurrent.{ ExecutionContext, Future }
3+
import javax.inject.{Inject, Singleton}
4+
import scala.concurrent.{ExecutionContext, Future}
55

66
import play.api.libs.json.JsObject
7-
import play.api.mvc.{ AbstractController, Action, AnyContent, ControllerComponents }
7+
import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents}
88

9-
import org.thp.cortex.models.{ BaseConfig, Roles }
10-
import org.thp.cortex.services.{ AnalyzerConfigSrv, UserSrv }
9+
import org.thp.cortex.models.{BaseConfig, Roles}
10+
import org.thp.cortex.services.{AnalyzerConfigSrv, UserSrv}
1111

1212
import org.elastic4play.BadRequestError
13-
import org.elastic4play.controllers.{ Authenticated, Fields, FieldsBodyParser, Renderer }
13+
import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer}
1414

1515
@Singleton
16-
class AnalyzerConfigCtrl @Inject() (
16+
class AnalyzerConfigCtrl @Inject()(
1717
analyzerConfigSrv: AnalyzerConfigSrv,
1818
userSrv: UserSrv,
1919
authenticated: Authenticated,
2020
fieldsBodyParser: FieldsBodyParser,
2121
renderer: Renderer,
2222
components: ControllerComponents,
23-
implicit val ec: ExecutionContext) extends AbstractController(components) {
23+
implicit val ec: ExecutionContext
24+
) extends AbstractController(components) {
2425

2526
def get(analyzerConfigName: String): Action[AnyContent] = authenticated(Roles.orgAdmin).async { request
26-
analyzerConfigSrv.getForUser(request.userId, analyzerConfigName)
27+
analyzerConfigSrv
28+
.getForUser(request.userId, analyzerConfigName)
2729
.map(renderer.toOutput(OK, _))
2830
}
2931

3032
def list(): Action[AnyContent] = authenticated(Roles.orgAdmin).async { request
31-
analyzerConfigSrv.listConfigForUser(request.userId)
33+
analyzerConfigSrv
34+
.listConfigForUser(request.userId)
3235
.map { bc
33-
renderer.toOutput(OK, bc.sortWith {
34-
case (BaseConfig("global", _, _, _), _) true
35-
case (_, BaseConfig("global", _, _, _)) false
36-
case (BaseConfig(a, _, _, _), BaseConfig(b, _, _, _)) a.compareTo(b) < 0
37-
})
36+
renderer.toOutput(
37+
OK,
38+
bc.sortWith {
39+
case (BaseConfig("global", _, _, _), _) true
40+
case (_, BaseConfig("global", _, _, _)) false
41+
case (BaseConfig(a, _, _, _), BaseConfig(b, _, _, _)) a.compareTo(b) < 0
42+
}
43+
)
3844
}
3945
}
4046

4147
def update(analyzerConfigName: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request
4248
request.body.getValue("config").flatMap(_.asOpt[JsObject]) match {
43-
case Some(config) analyzerConfigSrv.updateOrCreate(request.userId, analyzerConfigName, config)
44-
.map(renderer.toOutput(OK, _))
49+
case Some(config)
50+
analyzerConfigSrv
51+
.updateOrCreate(request.userId, analyzerConfigName, config)
52+
.map(renderer.toOutput(OK, _))
4553
case None Future.failed(BadRequestError("attribute config has invalid format"))
4654
}
4755
}
48-
}
56+
}
Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,52 @@
11
package org.thp.cortex.controllers
22

3-
import scala.concurrent.{ ExecutionContext, Future }
3+
import scala.concurrent.{ExecutionContext, Future}
44

5-
import play.api.libs.json.{ JsObject, JsString, Json }
6-
import play.api.mvc.{ AbstractController, Action, AnyContent, ControllerComponents }
5+
import play.api.libs.json.{JsObject, JsString, Json}
6+
import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents}
77

88
import akka.stream.Materializer
9-
import javax.inject.{ Inject, Singleton }
10-
import org.thp.cortex.models.{ Roles, Worker }
11-
import org.thp.cortex.services.{ UserSrv, WorkerSrv }
9+
import javax.inject.{Inject, Singleton}
10+
import org.thp.cortex.models.{Roles, Worker}
11+
import org.thp.cortex.services.{UserSrv, WorkerSrv}
1212

13-
import org.elastic4play.controllers.{ Authenticated, Fields, FieldsBodyParser, Renderer }
13+
import org.elastic4play.controllers.{Authenticated, Fields, FieldsBodyParser, Renderer}
1414
import org.elastic4play.services.JsonFormat.queryReads
15-
import org.elastic4play.services.{ QueryDSL, QueryDef }
15+
import org.elastic4play.services.{QueryDSL, QueryDef}
1616

1717
@Singleton
18-
class AnalyzerCtrl @Inject() (
18+
class AnalyzerCtrl @Inject()(
1919
workerSrv: WorkerSrv,
2020
userSrv: UserSrv,
2121
authenticated: Authenticated,
2222
fieldsBodyParser: FieldsBodyParser,
2323
renderer: Renderer,
2424
components: ControllerComponents,
2525
implicit val ec: ExecutionContext,
26-
implicit val mat: Materializer) extends AbstractController(components) {
26+
implicit val mat: Materializer
27+
) extends AbstractController(components) {
2728

2829
def find: Action[Fields] = authenticated(Roles.read).async(fieldsBodyParser) { request
29-
val query = request.body.getValue("query").fold[QueryDef](QueryDSL.any)(_.as[QueryDef])
30-
val range = request.body.getString("range")
31-
val sort = request.body.getStrings("sort").getOrElse(Nil)
32-
val isAdmin = request.roles.contains(Roles.orgAdmin)
30+
val query = request.body.getValue("query").fold[QueryDef](QueryDSL.any)(_.as[QueryDef])
31+
val range = request.body.getString("range")
32+
val sort = request.body.getStrings("sort").getOrElse(Nil)
33+
val isAdmin = request.roles.contains(Roles.orgAdmin)
3334
val (analyzers, analyzerTotal) = workerSrv.findAnalyzersForUser(request.userId, query, range, sort)
3435
renderer.toOutput(OK, analyzers.map(analyzerJson(isAdmin)), analyzerTotal)
3536
}
3637

3738
def get(analyzerId: String): Action[AnyContent] = authenticated(Roles.read).async { request
3839
val isAdmin = request.roles.contains(Roles.orgAdmin)
39-
workerSrv.getForUser(request.userId, analyzerId)
40+
workerSrv
41+
.getForUser(request.userId, analyzerId)
4042
.map(a renderer.toOutput(OK, analyzerJson(isAdmin)(a)))
4143
}
4244

43-
private def analyzerJson(isAdmin: Boolean)(analyzer: Worker): JsObject = {
45+
private def analyzerJson(isAdmin: Boolean)(analyzer: Worker): JsObject =
4446
if (isAdmin)
4547
analyzer.toJson + ("configuration" Json.parse(analyzer.configuration())) + ("analyzerDefinitionId" JsString(analyzer.workerDefinitionId()))
4648
else
4749
analyzer.toJson + ("analyzerDefinitionId" JsString(analyzer.workerDefinitionId()))
48-
}
4950

5051
def listForType(dataType: String): Action[AnyContent] = authenticated(Roles.read).async { request
5152
import org.elastic4play.services.QueryDSL._
@@ -55,9 +56,9 @@ class AnalyzerCtrl @Inject() (
5556

5657
def create(analyzerDefinitionId: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request
5758
for {
58-
organizationId userSrv.getOrganizationId(request.userId)
59+
organizationId userSrv.getOrganizationId(request.userId)
5960
workerDefinition Future.fromTry(workerSrv.getDefinition(analyzerDefinitionId))
60-
analyzer workerSrv.create(organizationId, workerDefinition, request.body)
61+
analyzer workerSrv.create(organizationId, workerDefinition, request.body)
6162
} yield renderer.toOutput(CREATED, analyzerJson(isAdmin = false)(analyzer))
6263
}
6364

@@ -74,14 +75,14 @@ class AnalyzerCtrl @Inject() (
7475
def delete(analyzerId: String): Action[AnyContent] = authenticated(Roles.orgAdmin, Roles.superAdmin).async { implicit request
7576
for {
7677
analyzer workerSrv.getForUser(request.userId, analyzerId)
77-
_ workerSrv.delete(analyzer)
78+
_ workerSrv.delete(analyzer)
7879
} yield NoContent
7980
}
8081

8182
def update(analyzerId: String): Action[Fields] = authenticated(Roles.orgAdmin).async(fieldsBodyParser) { implicit request
8283
for {
83-
analyzer workerSrv.getForUser(request.userId, analyzerId)
84+
analyzer workerSrv.getForUser(request.userId, analyzerId)
8485
updatedAnalyzer workerSrv.update(analyzer, request.body)
8586
} yield renderer.toOutput(OK, analyzerJson(isAdmin = true)(updatedAnalyzer))
8687
}
87-
}
88+
}
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.thp.cortex.controllers
22

3-
import javax.inject.{ Inject, Singleton }
4-
import play.api.http.{ FileMimeTypes, HttpErrorHandler }
5-
import play.api.mvc.{ Action, AnyContent }
6-
import controllers.{ Assets, AssetsMetadata, ExternalAssets }
3+
import javax.inject.{Inject, Singleton}
4+
import play.api.http.{FileMimeTypes, HttpErrorHandler}
5+
import play.api.mvc.{Action, AnyContent}
6+
import controllers.{Assets, AssetsMetadata, ExternalAssets}
77
import play.api.Environment
88

99
import scala.concurrent.ExecutionContext
@@ -13,11 +13,13 @@ trait AssetCtrl {
1313
}
1414

1515
@Singleton
16-
class AssetCtrlProd @Inject() (errorHandler: HttpErrorHandler, meta: AssetsMetadata) extends Assets(errorHandler, meta) with AssetCtrl {
16+
class AssetCtrlProd @Inject()(errorHandler: HttpErrorHandler, meta: AssetsMetadata) extends Assets(errorHandler, meta) with AssetCtrl {
1717
def get(file: String): Action[AnyContent] = at("/www", file)
1818
}
1919

2020
@Singleton
21-
class AssetCtrlDev @Inject() (environment: Environment)(implicit ec: ExecutionContext, fileMimeTypes: FileMimeTypes) extends ExternalAssets(environment) with AssetCtrl {
21+
class AssetCtrlDev @Inject()(environment: Environment)(implicit ec: ExecutionContext, fileMimeTypes: FileMimeTypes)
22+
extends ExternalAssets(environment)
23+
with AssetCtrl {
2224
def get(file: String): Action[AnyContent] = at("www/dist", file)
23-
}
25+
}

0 commit comments

Comments
 (0)