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.name.Named
import models._
import modules.TemplateCustomization
import play.api.Logger
import play.api.data.Forms._
import play.api.data._
@@ -55,7 +56,8 @@ class Application @Inject() (
libraryTagAssignmentsService: LibraryTagAssignmentsService,
protected val dbConfigProvider: DatabaseConfigProvider,
val messagesApi: MessagesApi,
val env: AuthEnv
val env: AuthEnv,
val templateCustomization: TemplateCustomization
) extends AuthenticatedController with HasDatabaseConfigProvider[models.profile.type]{
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.impl.authenticators.CookieAuthenticator
import models.User
import modules.TemplateCustomization
import play.api.data.Form
import play.api.data.Forms.{email => _, _}
import play.api.i18n.{Messages, MessagesApi}
@@ -20,6 +21,7 @@ final case class LoginRequest(username: String, password: String, rememberMe: Bo
class AuthController @Inject() (
val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator],
val templateCustomization: TemplateCustomization,
clock: Clock,
credentialsVerificationService: CredentialsVerificationService,
userService: UserService

View File

@@ -2,8 +2,10 @@ package controllers
import com.mohiva.play.silhouette.api.Silhouette
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import com.typesafe.config.Config
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 scala.concurrent.Future
@@ -19,6 +21,7 @@ trait AuthenticatedControllerLowPriorityImplicits[T, C]{
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(
routes.AuthController.signIn(request.path+"?"+request.rawQueryString)
@@ -30,4 +33,6 @@ abstract class AuthenticatedController extends Silhouette[User, CookieAuthentica
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._
import com.ysoft.odc.statistics.FailedProjects
import modules.{LogSmell, LogSmellChecks}
import modules.{LogSmell, LogSmellChecks, TemplateCustomization}
import org.joda.time.DateTimeConstants
import play.api.Logger
import play.api.i18n.{I18nSupport, MessagesApi}
@@ -25,8 +25,10 @@ final class DependencyCheckReportsProcessor @Inject() (
dependencyCheckReportsParser: DependencyCheckReportsParser,
@Named("missing-GAV-exclusions") missingGAVExclusions: MissingGavExclusions,
@Named("log-smells") logSmells: LogSmellChecks,
val messagesApi: MessagesApi
val messagesApi: MessagesApi,
templateCustomization: TemplateCustomization
) extends I18nSupport {
private implicit def mainTemplateData: MainTemplateData = MainTemplateData.createMainTemplateData(templateCustomization)
private def parseDateTime(dt: String): DateTime = {
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.{Absolutizer, ArtifactFile, ArtifactItem, SetDiff}
import models.{EmailMessageId, ExportedVulnerability}
import modules.TemplateCustomization
import play.api.i18n.MessagesApi
import play.api.libs.Crypto
import play.api.mvc.Action
@@ -27,7 +28,8 @@ class Notifications @Inject()(
emailExportServiceOption: Option[EmailExportService],
odcService: OdcService,
absolutizer: Absolutizer,
val env: AuthEnv
val env: AuthEnv,
val templateCustomization: TemplateCustomization
)(implicit val messagesApi: MessagesApi, executionContext: ExecutionContext) extends AuthenticatedController {
private val versions = Map[String, Int]()

View File

@@ -9,6 +9,7 @@ import com.ysoft.odc._
import controllers.DependencyCheckReportsParser.ResultWithSelection
import controllers.api.{ApiConfig, ApiController}
import models.LibraryTag
import modules.TemplateCustomization
import org.joda.time.DateTime
import play.api.i18n.MessagesApi
import play.api.libs.json._
@@ -73,7 +74,8 @@ class Statistics @Inject()(
vulnerabilityNotificationService: VulnerabilityNotificationService,
issueTrackerServiceOption: Option[IssueTrackerService],
protected val apiConfig: ApiConfig,
val env: AuthEnv
val env: AuthEnv,
val templateCustomization: TemplateCustomization
)(implicit val messagesApi: MessagesApi, executionContext: ExecutionContext) extends AuthenticatedController with ApiController {
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 {
@@ -156,7 +157,8 @@ class ConfigModule extends Module {
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[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.getString("play.cache.path").map(cachePath => bind[CacheApi].toInstance(new FileCacheApi(Paths.get(cachePath)))) ++

View File

@@ -1,5 +1,5 @@
@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"){
@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){
@defining(snoozes(id)){ case si =>
@if(allowSnoozes) {

View File

@@ -8,7 +8,7 @@
tagsLink: Set[Int] => Call,
classificationLink: Option[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})") {
<div>
<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){
<table class="table">
@for(dep <- list){

View File

@@ -9,7 +9,7 @@
//librariesForTagsWithWarning: SortedMap[(Int, LibraryTag), Seq[(Int, Library)]],
lastRefreshTime: DateTime,
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 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"){
@libraryIdentificationList(dep, None, addLink = false, addButtons = false)
@dependencyDetailsInner(depPrefix = "library-single-", dep = dep, selectorOption = selectorOption)

View File

@@ -1,5 +1,5 @@
@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>
<html>
<head>
@@ -40,7 +40,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@* <a class="navbar-brand" href="#">YSSDC</a> *@
@for(brand <- mainTemplateData.templateCustomization.brandHtml){<a class="navbar-brand" href="#">@Html(brand)</a>}
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">

View File

@@ -1,5 +1,5 @@
@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) = {
@form(action, 'style -> "display: inline-block"){
@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._
@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._
@if(si.isSnoozed){
<h3>Snooze details</h3>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,7 +4,7 @@
allDependenciesCount: Int,
dependenciesWithSuppressedVulnerabilitiesOnlyCount: Int,
reports: DependencyCheckReportsParser.Result
)(implicit header: DefaultRequest)
)(implicit header: DefaultRequest, mainTemplateData: MainTemplateData)
@main(
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._
@main("Data import"){
@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)
@groupedDependencyList(name = "", id = s"grouped-dependencies-warning-${java.util.UUID.randomUUID.toString}", collapse = false, allowSnoozes = false, versions = Map())(list = items)
@for(groupedDependency <- items){