mirror of
https://github.com/ysoftdevs/odc-analyzer.git
synced 2026-01-14 07:44:00 +01:00
Added support for brand
This commit is contained in:
@@ -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._
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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)){
|
||||
|
||||
9
app/controllers/MainTemplateData.scala
Normal file
9
app/controllers/MainTemplateData.scala
Normal 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)
|
||||
@@ -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]()
|
||||
|
||||
@@ -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]()
|
||||
|
||||
@@ -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)))) ++
|
||||
|
||||
@@ -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)){
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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._
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ""}") {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 "+_)}",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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)",
|
||||
|
||||
@@ -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()){
|
||||
|
||||
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user