Added support for brand

This commit is contained in:
Šesták Vít
2017-06-21 13:06:35 +02:00
parent b00857368a
commit ffabc8a4e5
27 changed files with 53 additions and 27 deletions

View File

@@ -6,6 +6,7 @@ import com.github.nscala_time.time.Imports._
import com.google.inject.Inject import com.google.inject.Inject
import com.google.inject.name.Named import com.google.inject.name.Named
import models._ import models._
import modules.TemplateCustomization
import play.api.Logger import play.api.Logger
import play.api.data.Forms._ import play.api.data.Forms._
import play.api.data._ import play.api.data._
@@ -55,7 +56,8 @@ class Application @Inject() (
libraryTagAssignmentsService: LibraryTagAssignmentsService, libraryTagAssignmentsService: LibraryTagAssignmentsService,
protected val dbConfigProvider: DatabaseConfigProvider, protected val dbConfigProvider: DatabaseConfigProvider,
val messagesApi: MessagesApi, val messagesApi: MessagesApi,
val env: AuthEnv val env: AuthEnv,
val templateCustomization: TemplateCustomization
) extends AuthenticatedController with HasDatabaseConfigProvider[models.profile.type]{ ) extends AuthenticatedController with HasDatabaseConfigProvider[models.profile.type]{
import ApplicationFormats._ import ApplicationFormats._

View File

@@ -7,6 +7,7 @@ import com.mohiva.play.silhouette.api._
import com.mohiva.play.silhouette.api.util.Clock import com.mohiva.play.silhouette.api.util.Clock
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import models.User import models.User
import modules.TemplateCustomization
import play.api.data.Form import play.api.data.Form
import play.api.data.Forms.{email => _, _} import play.api.data.Forms.{email => _, _}
import play.api.i18n.{Messages, MessagesApi} import play.api.i18n.{Messages, MessagesApi}
@@ -20,6 +21,7 @@ final case class LoginRequest(username: String, password: String, rememberMe: Bo
class AuthController @Inject() ( class AuthController @Inject() (
val messagesApi: MessagesApi, val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator], val env: Environment[User, CookieAuthenticator],
val templateCustomization: TemplateCustomization,
clock: Clock, clock: Clock,
credentialsVerificationService: CredentialsVerificationService, credentialsVerificationService: CredentialsVerificationService,
userService: UserService userService: UserService

View File

@@ -2,8 +2,10 @@ package controllers
import com.mohiva.play.silhouette.api.Silhouette import com.mohiva.play.silhouette.api.Silhouette
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import com.typesafe.config.Config
import models.User import models.User
import play.api.mvc.{Result, RequestHeader, Results} import modules.TemplateCustomization
import play.api.mvc.{RequestHeader, Result, Results}
import views.html.DefaultRequest import views.html.DefaultRequest
import scala.concurrent.Future import scala.concurrent.Future
@@ -19,6 +21,7 @@ trait AuthenticatedControllerLowPriorityImplicits[T, C]{
abstract class AuthenticatedController extends Silhouette[User, CookieAuthenticator] with AuthenticatedControllerLowPriorityImplicits[User, CookieAuthenticator]{ abstract class AuthenticatedController extends Silhouette[User, CookieAuthenticator] with AuthenticatedControllerLowPriorityImplicits[User, CookieAuthenticator]{
protected implicit def templateCustomization: TemplateCustomization
override protected def onNotAuthenticated(request: RequestHeader): Option[Future[Result]] = Some(Future.successful(Redirect( override protected def onNotAuthenticated(request: RequestHeader): Option[Future[Result]] = Some(Future.successful(Redirect(
routes.AuthController.signIn(request.path+"?"+request.rawQueryString) routes.AuthController.signIn(request.path+"?"+request.rawQueryString)
@@ -30,4 +33,6 @@ abstract class AuthenticatedController extends Silhouette[User, CookieAuthentica
def AdminAction: SecuredActionBuilder = ??? def AdminAction: SecuredActionBuilder = ???
protected implicit def mainTemplateData: MainTemplateData = MainTemplateData.createMainTemplateData
} }

View File

@@ -6,7 +6,7 @@ import com.google.inject.name.Named
import com.ysoft.odc.Checks._ import com.ysoft.odc.Checks._
import com.ysoft.odc._ import com.ysoft.odc._
import com.ysoft.odc.statistics.FailedProjects import com.ysoft.odc.statistics.FailedProjects
import modules.{LogSmell, LogSmellChecks} import modules.{LogSmell, LogSmellChecks, TemplateCustomization}
import org.joda.time.DateTimeConstants import org.joda.time.DateTimeConstants
import play.api.Logger import play.api.Logger
import play.api.i18n.{I18nSupport, MessagesApi} import play.api.i18n.{I18nSupport, MessagesApi}
@@ -25,8 +25,10 @@ final class DependencyCheckReportsProcessor @Inject() (
dependencyCheckReportsParser: DependencyCheckReportsParser, dependencyCheckReportsParser: DependencyCheckReportsParser,
@Named("missing-GAV-exclusions") missingGAVExclusions: MissingGavExclusions, @Named("missing-GAV-exclusions") missingGAVExclusions: MissingGavExclusions,
@Named("log-smells") logSmells: LogSmellChecks, @Named("log-smells") logSmells: LogSmellChecks,
val messagesApi: MessagesApi val messagesApi: MessagesApi,
templateCustomization: TemplateCustomization
) extends I18nSupport { ) extends I18nSupport {
private implicit def mainTemplateData: MainTemplateData = MainTemplateData.createMainTemplateData(templateCustomization)
private def parseDateTime(dt: String): DateTime = { private def parseDateTime(dt: String): DateTime = {
if(dt.forall(_.isDigit)){ if(dt.forall(_.isDigit)){

View File

@@ -0,0 +1,9 @@
package controllers
import modules.TemplateCustomization
object MainTemplateData{
implicit def createMainTemplateData(implicit templateCustomization: TemplateCustomization): MainTemplateData = MainTemplateData(templateCustomization)
}
case class MainTemplateData(templateCustomization: TemplateCustomization)

View File

@@ -7,6 +7,7 @@ import com.ysoft.concurrent.FutureLock._
import com.ysoft.odc.statistics.{FailedProjects, LibDepStatistics} import com.ysoft.odc.statistics.{FailedProjects, LibDepStatistics}
import com.ysoft.odc.{Absolutizer, ArtifactFile, ArtifactItem, SetDiff} import com.ysoft.odc.{Absolutizer, ArtifactFile, ArtifactItem, SetDiff}
import models.{EmailMessageId, ExportedVulnerability} import models.{EmailMessageId, ExportedVulnerability}
import modules.TemplateCustomization
import play.api.i18n.MessagesApi import play.api.i18n.MessagesApi
import play.api.libs.Crypto import play.api.libs.Crypto
import play.api.mvc.Action import play.api.mvc.Action
@@ -27,7 +28,8 @@ class Notifications @Inject()(
emailExportServiceOption: Option[EmailExportService], emailExportServiceOption: Option[EmailExportService],
odcService: OdcService, odcService: OdcService,
absolutizer: Absolutizer, absolutizer: Absolutizer,
val env: AuthEnv val env: AuthEnv,
val templateCustomization: TemplateCustomization
)(implicit val messagesApi: MessagesApi, executionContext: ExecutionContext) extends AuthenticatedController { )(implicit val messagesApi: MessagesApi, executionContext: ExecutionContext) extends AuthenticatedController {
private val versions = Map[String, Int]() private val versions = Map[String, Int]()

View File

@@ -9,6 +9,7 @@ import com.ysoft.odc._
import controllers.DependencyCheckReportsParser.ResultWithSelection import controllers.DependencyCheckReportsParser.ResultWithSelection
import controllers.api.{ApiConfig, ApiController} import controllers.api.{ApiConfig, ApiController}
import models.LibraryTag import models.LibraryTag
import modules.TemplateCustomization
import org.joda.time.DateTime import org.joda.time.DateTime
import play.api.i18n.MessagesApi import play.api.i18n.MessagesApi
import play.api.libs.json._ import play.api.libs.json._
@@ -73,7 +74,8 @@ class Statistics @Inject()(
vulnerabilityNotificationService: VulnerabilityNotificationService, vulnerabilityNotificationService: VulnerabilityNotificationService,
issueTrackerServiceOption: Option[IssueTrackerService], issueTrackerServiceOption: Option[IssueTrackerService],
protected val apiConfig: ApiConfig, protected val apiConfig: ApiConfig,
val env: AuthEnv val env: AuthEnv,
val templateCustomization: TemplateCustomization
)(implicit val messagesApi: MessagesApi, executionContext: ExecutionContext) extends AuthenticatedController with ApiController { )(implicit val messagesApi: MessagesApi, executionContext: ExecutionContext) extends AuthenticatedController with ApiController {
private val versions = Map[String, Int]() private val versions = Map[String, Int]()

View File

@@ -86,6 +86,7 @@ class FileCacheApi(path: Path) extends CacheApi{
} }
case class TemplateCustomization(brandHtml: Option[String])
class ConfigModule extends Module { class ConfigModule extends Module {
@@ -156,7 +157,8 @@ class ConfigModule extends Module {
bind[ExecutionContext].qualifiedWith("email-sending").toInstance(ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())), bind[ExecutionContext].qualifiedWith("email-sending").toInstance(ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())),
bind[LogSmellChecks].qualifiedWith("log-smells").toInstance(LogSmellChecks(configuration.underlying.getAs[Map[String, LogSmell]]("yssdc.logSmells").getOrElse(Map()))), bind[LogSmellChecks].qualifiedWith("log-smells").toInstance(LogSmellChecks(configuration.underlying.getAs[Map[String, LogSmell]]("yssdc.logSmells").getOrElse(Map()))),
bind[Projects].to(parseProjects(configuration)), bind[Projects].to(parseProjects(configuration)),
bind[ApiConfig].to(parseApiConfig(configuration)) bind[ApiConfig].to(parseApiConfig(configuration)),
bind[TemplateCustomization].to(TemplateCustomization(configuration.underlying.getAs[String]("app.brand")))
) ++ ) ++
configuration.underlying.getAs[Absolutizer]("app").map(a => bind[Absolutizer].toInstance(a)) ++ configuration.underlying.getAs[Absolutizer]("app").map(a => bind[Absolutizer].toInstance(a)) ++
configuration.getString("play.cache.path").map(cachePath => bind[CacheApi].toInstance(new FileCacheApi(Paths.get(cachePath)))) ++ configuration.getString("play.cache.path").map(cachePath => bind[CacheApi].toInstance(new FileCacheApi(Paths.get(cachePath)))) ++

View File

@@ -1,5 +1,5 @@
@import helper._ @import helper._
@(loginForm: Form[LoginRequest], callback: String/*, socialProviderRegistry: SocialProviderRegistry*/)(implicit requestHeader: DefaultRequest, messages: Messages) @(loginForm: Form[LoginRequest], callback: String/*, socialProviderRegistry: SocialProviderRegistry*/)(implicit requestHeader: DefaultRequest, messages: Messages, mainTemplateData: MainTemplateData)
@main("Log in"){ @main("Log in"){
@form(routes.AuthController.authenticate(callback)){ @form(routes.AuthController.authenticate(callback)){

View File

@@ -1,4 +1,4 @@
@(list: Traversable[_], name: String, id: String, collapse: Boolean = false, allowSnoozes: Boolean = true, versions: Map[String, Int])(content: => Html)(implicit rh: DefaultRequest, snoozes: SnoozesInfo, messages: Messages) @(list: Traversable[_], name: String, id: String, collapse: Boolean = false, allowSnoozes: Boolean = true, versions: Map[String, Int])(content: => Html)(implicit rh: DefaultRequest, snoozes: SnoozesInfo, messages: Messages, mainTemplateData: MainTemplateData)
@if(list.nonEmpty){ @if(list.nonEmpty){
@defining(snoozes(id)){ case si => @defining(snoozes(id)){ case si =>
@if(allowSnoozes) { @if(allowSnoozes) {

View File

@@ -8,7 +8,7 @@
tagsLink: Set[Int] => Call, tagsLink: Set[Int] => Call,
classificationLink: Option[Boolean] => Call, classificationLink: Option[Boolean] => Call,
noTagLink: Boolean => Call noTagLink: Boolean => Call
)(implicit header: DefaultRequest) )(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@main(s"${requiredClassification match{case Some(true) => "Classified" case Some(false) => "Unclassified" case None => "All"}} dependencies (${selectedDependencies.size})") { @main(s"${requiredClassification match{case Some(true) => "Classified" case Some(false) => "Unclassified" case None => "All"}} dependencies (${selectedDependencies.size})") {
<div> <div>
<div class="btn-group"> <div class="btn-group">

View File

@@ -1,4 +1,4 @@
@(name: String, id: String, collapse: Boolean = false, allowSnoozes: Boolean = true, versions: Map[String, Int])(list: Seq[GroupedDependency])(implicit rh: DefaultRequest, snoozes: SnoozesInfo, messages: Messages) @(name: String, id: String, collapse: Boolean = false, allowSnoozes: Boolean = true, versions: Map[String, Int])(list: Seq[GroupedDependency])(implicit rh: DefaultRequest, snoozes: SnoozesInfo, messages: Messages, mainTemplateData: MainTemplateData)
@conditionalList(list, name, id, collapse = collapse, allowSnoozes = allowSnoozes, versions = versions){ @conditionalList(list, name, id, collapse = collapse, allowSnoozes = allowSnoozes, versions = versions){
<table class="table"> <table class="table">
@for(dep <- list){ @for(dep <- list){

View File

@@ -9,7 +9,7 @@
//librariesForTagsWithWarning: SortedMap[(Int, LibraryTag), Seq[(Int, Library)]], //librariesForTagsWithWarning: SortedMap[(Int, LibraryTag), Seq[(Int, Library)]],
lastRefreshTime: DateTime, lastRefreshTime: DateTime,
versions: Map[String, Int] versions: Map[String, Int]
)(implicit req: DefaultRequest, snoozes: SnoozesInfo , messages: Messages) )(implicit req: DefaultRequest, snoozes: SnoozesInfo, messages: Messages, mainTemplateData: MainTemplateData)
@import com.ysoft.odc.Confidence @import com.ysoft.odc.Confidence
@import helper._ @import helper._

View File

@@ -1,4 +1,4 @@
@(dep: GroupedDependency, selectorOption: Option[String])(implicit req: DefaultRequest, messages: Messages) @(dep: GroupedDependency, selectorOption: Option[String])(implicit req: DefaultRequest, messages: Messages, mainTemplateData: MainTemplateData)
@main("Library details"){ @main("Library details"){
@libraryIdentificationList(dep, None, addLink = false, addButtons = false) @libraryIdentificationList(dep, None, addLink = false, addButtons = false)
@dependencyDetailsInner(depPrefix = "library-single-", dep = dep, selectorOption = selectorOption) @dependencyDetailsInner(depPrefix = "library-single-", dep = dep, selectorOption = selectorOption)

View File

@@ -1,5 +1,5 @@
@import helper._ @import helper._
@(title: String, headExtension: Html = Html(""), projectsOption: Option[(ProjectsWithSelection, Option[String] => Call)] = None)(content: Html)(implicit header: DefaultRequest) @(title: String, headExtension: Html = Html(""), projectsOption: Option[(ProjectsWithSelection, Option[String] => Call)] = None)(content: Html)(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@@ -40,7 +40,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
@* <a class="navbar-brand" href="#">YSSDC</a> *@ @for(brand <- mainTemplateData.templateCustomization.brandHtml){<a class="navbar-brand" href="#">@Html(brand)</a>}
</div> </div>
<div id="navbar" class="collapse navbar-collapse"> <div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">

View File

@@ -1,5 +1,5 @@
@import helper._ @import helper._
@(projects: Seq[ReportInfo], watchedProjects: Set[String], failedReports: Set[String], filter: Option[String])(implicit req: DefaultRequest) @(projects: Seq[ReportInfo], watchedProjects: Set[String], failedReports: Set[String], filter: Option[String])(implicit req: DefaultRequest, mainTemplateData: MainTemplateData)
@button(action: Call)(label: String) = { @button(action: Call)(label: String) = {
@form(action, 'style -> "display: inline-block"){ @form(action, 'style -> "display: inline-block"){
@CSRF.formField @CSRF.formField

View File

@@ -1,4 +1,4 @@
@(id: String, si: SnoozeInfo, versions: Map[String, Int])(implicit rh: RequestHeader, snoozes: SnoozesInfo, messages: Messages) @(id: String, si: SnoozeInfo, versions: Map[String, Int])(implicit rh: RequestHeader, snoozes: SnoozesInfo, messages: Messages, mainTemplateData: MainTemplateData)
@import helper._ @import helper._
@form((routes.Application.snooze(id, versions): Call).withFragment(id), 'id -> s"$id-snoozing", 'class -> s"snoozing collapse${if(si.shouldExpandForm) "in" else ""}") { @form((routes.Application.snooze(id, versions): Call).withFragment(id), 'id -> s"$id-snoozing", 'class -> s"snoozing collapse${if(si.shouldExpandForm) "in" else ""}") {

View File

@@ -1,4 +1,4 @@
@(unused_id: String, si: SnoozeInfo, versions: Map[String, Int])(implicit requestHeader: RequestHeader) @(unused_id: String, si: SnoozeInfo, versions: Map[String, Int])(implicit requestHeader: RequestHeader, mainTemplateData: MainTemplateData)
@import helper._ @import helper._
@if(si.isSnoozed){ @if(si.isSnoozed){
<h3>Snooze details</h3> <h3>Snooze details</h3>

View File

@@ -3,7 +3,7 @@
projectsWithSelection: ProjectsWithSelection, projectsWithSelection: ProjectsWithSelection,
allDependencies: Seq[GroupedDependency], allDependencies: Seq[GroupedDependency],
failedProjects: FailedProjects failedProjects: FailedProjects
)(implicit header: DefaultRequest) )(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@main( @main(
title = s"All libraries for ${projectsWithSelection.projectNameText}", title = s"All libraries for ${projectsWithSelection.projectNameText}",

View File

@@ -4,7 +4,7 @@
lds: LibDepStatistics, lds: LibDepStatistics,
tagStatistics: Seq[TagStatistics], tagStatistics: Seq[TagStatistics],
parsedReports: DependencyCheckReportsParser.Result parsedReports: DependencyCheckReportsParser.Result
)(implicit messagesApi: MessagesApi, requestHeader: DefaultRequest) )(implicit messagesApi: MessagesApi, requestHeader: DefaultRequest, mainTemplateData: MainTemplateData)
@import com.ysoft.odc.CWE @import com.ysoft.odc.CWE
@import play.api.libs.json.{JsNull, JsString} @import play.api.libs.json.{JsNull, JsString}
@import scala.language.implicitConversions @import scala.language.implicitConversions

View File

@@ -2,7 +2,7 @@
projectsWithSelection: ProjectsWithSelection, projectsWithSelection: ProjectsWithSelection,
tagOption: Option[(Int, LibraryTag)], tagOption: Option[(Int, LibraryTag)],
statistics: LibDepStatistics statistics: LibDepStatistics
)(implicit messagesApi: MessagesApi, requestHeader: DefaultRequest) )(implicit messagesApi: MessagesApi, requestHeader: DefaultRequest, mainTemplateData: MainTemplateData)
@main( @main(
title = s"details for ${projectsWithSelection.projectNameText}${tagOption.map(_._2.name).fold("")(" and tag "+_)}", title = s"details for ${projectsWithSelection.projectNameText}${tagOption.map(_._2.name).fold("")(" and tag "+_)}",

View File

@@ -2,7 +2,7 @@
vulnsAndVersionOption: Option[(Traversable[Vulnerability], String)], vulnsAndVersionOption: Option[(Traversable[Vulnerability], String)],
cpes: Seq[String], cpes: Seq[String],
isDbOld: Boolean isDbOld: Boolean
)(implicit header: DefaultRequest) )(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@import helper._ @import helper._
@main( @main(
title = "Vulnerabilities for a library" title = "Vulnerabilities for a library"

View File

@@ -7,7 +7,7 @@
affectedLibraries: Set[PlainLibraryIdentifier], affectedLibraries: Set[PlainLibraryIdentifier],
issueOption: Option[(ExportedVulnerability[String], String)], issueOption: Option[(ExportedVulnerability[String], String)],
failedProjects: FailedProjects failedProjects: FailedProjects
)(implicit header: DefaultRequest) )(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@section = @{views.html.genericSection("vuln")("h2") _} @section = @{views.html.genericSection("vuln")("h2") _}
@main( @main(
title = s"vulnerability ${vulnerability.name} for ${projectsWithSelection.projectNameText}", title = s"vulnerability ${vulnerability.name} for ${projectsWithSelection.projectNameText}",

View File

@@ -4,7 +4,7 @@
name: String, name: String,
failedProjects: FailedProjects, failedProjects: FailedProjects,
issueOption: Option[(ExportedVulnerability[String], String)] issueOption: Option[(ExportedVulnerability[String], String)]
)(implicit header: DefaultRequest) )(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@main( @main(
title = s"Unknown vulnerability $name for ${projectsWithSelection.projectNameText}", title = s"Unknown vulnerability $name for ${projectsWithSelection.projectNameText}",

View File

@@ -4,7 +4,7 @@
allDependenciesCount: Int, allDependenciesCount: Int,
dependenciesWithSuppressedVulnerabilitiesOnlyCount: Int, dependenciesWithSuppressedVulnerabilitiesOnlyCount: Int,
reports: DependencyCheckReportsParser.Result reports: DependencyCheckReportsParser.Result
)(implicit header: DefaultRequest) )(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@main( @main(
title = s"Vulnerable libraries for ${projectsWithSelection.projectNameText} (${vulnerableDependencies.size} deps, ${vulnerableDependencies.flatMap(_.cpeIdentifiers.map(_.toCpeIdentifierOption.get)).toSet.size} CPEs)", title = s"Vulnerable libraries for ${projectsWithSelection.projectNameText} (${vulnerableDependencies.size} deps, ${vulnerableDependencies.flatMap(_.cpeIdentifiers.map(_.toCpeIdentifierOption.get)).toSet.size} CPEs)",

View File

@@ -1,4 +1,4 @@
@(f: Form[String])(implicit requestHeader: DefaultRequest, messages: Messages) @(f: Form[String])(implicit requestHeader: DefaultRequest, messages: Messages, mainTemplateData: MainTemplateData)
@import helper._ @import helper._
@main("Data import"){ @main("Data import"){
@form(action = controllers.routes.Application.tagsImportAction()){ @form(action = controllers.routes.Application.tagsImportAction()){

View File

@@ -1,4 +1,4 @@
@(items: IndexedSeq[GroupedDependency])(implicit rh: DefaultRequest, snoozes: SnoozesInfo, messages: Messages) @(items: IndexedSeq[GroupedDependency])(implicit rh: DefaultRequest, snoozes: SnoozesInfo, messages: Messages, mainTemplateData: MainTemplateData)
(ignore this item) (ignore this item)
@groupedDependencyList(name = "", id = s"grouped-dependencies-warning-${java.util.UUID.randomUUID.toString}", collapse = false, allowSnoozes = false, versions = Map())(list = items) @groupedDependencyList(name = "", id = s"grouped-dependencies-warning-${java.util.UUID.randomUUID.toString}", collapse = false, allowSnoozes = false, versions = Map())(list = items)
@for(groupedDependency <- items){ @for(groupedDependency <- items){