mirror of
https://github.com/ysoftdevs/odc-analyzer.git
synced 2026-04-30 20:34:26 +02:00
Added support for mail notifications and WIP JIRA export.
This commit is contained in:
@@ -3,14 +3,19 @@ package modules
|
||||
import java.io._
|
||||
import java.net.URLEncoder
|
||||
import java.nio.file.{Files, Path, Paths}
|
||||
import java.util.concurrent.Executors
|
||||
|
||||
import akka.util.ClassLoaderObjectInputStream
|
||||
import com.ysoft.odc._
|
||||
import controllers.MissingGavExclusions
|
||||
import net.ceedubs.ficus.Ficus._
|
||||
import net.ceedubs.ficus.readers.ArbitraryTypeReader._
|
||||
import play.api.cache.CacheApi
|
||||
import play.api.inject.{Binding, Module}
|
||||
import play.api.{Configuration, Environment, Logger}
|
||||
import services.IssueTrackerService
|
||||
|
||||
import scala.concurrent.ExecutionContext
|
||||
import scala.concurrent.duration.Duration
|
||||
import scala.reflect.ClassTag
|
||||
import scala.util.{Failure, Success, Try}
|
||||
@@ -22,6 +27,7 @@ import scala.util.{Failure, Success, Try}
|
||||
* * Thread safety
|
||||
* * fsync: https://stackoverflow.com/questions/4072878/i-o-concept-flush-vs-sync
|
||||
* * probably not removing files that are not used for a long time
|
||||
*
|
||||
* @param path
|
||||
*/
|
||||
class FileCacheApi(path: Path) extends CacheApi{
|
||||
@@ -79,7 +85,10 @@ class FileCacheApi(path: Path) extends CacheApi{
|
||||
|
||||
|
||||
class ConfigModule extends Module {
|
||||
|
||||
|
||||
private val bambooAuthentication = bind[AtlassianAuthentication].qualifiedWith("bamboo-authentication")
|
||||
//private val jiraAuthentication = bind[AtlassianAuthentication].qualifiedWith("jira-authentication")
|
||||
|
||||
override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq(
|
||||
bind[String].qualifiedWith("bamboo-server-url").toInstance(configuration.getString("yssdc.bamboo.url").getOrElse(sys.error("Key yssdc.bamboo.url is not set"))),
|
||||
configuration.getString("yssdc.reports.provider") match{
|
||||
@@ -89,11 +98,13 @@ class ConfigModule extends Module {
|
||||
},
|
||||
bind[MissingGavExclusions].qualifiedWith("missing-GAV-exclusions").toInstance(MissingGavExclusions(
|
||||
configuration.getStringSeq("yssdc.exclusions.missingGAV.bySha1").getOrElse(Seq()).toSet.map(Exclusion))
|
||||
)
|
||||
),
|
||||
bind[ExecutionContext].qualifiedWith("email-sending").toInstance(ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor()))
|
||||
) ++
|
||||
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("yssdc.reports.bamboo.sessionId").map{s => bind[BambooAuthentication].toInstance(new SessionIdBambooAuthentication(s))} ++
|
||||
configuration.getString("yssdc.reports.bamboo.user").map{u => bind[BambooAuthentication].toInstance(new CredentialsBambooAuthentication(u, configuration.getString("yssdc.reports.bamboo.password").get))} ++
|
||||
configuration.getString("yssdc.reports.bamboo.sessionId").map{s => bambooAuthentication.toInstance(new SessionIdAtlassianAuthentication(s))} ++
|
||||
configuration.getString("yssdc.reports.bamboo.user").map{u => bambooAuthentication.toInstance(new CredentialsAtlassianAuthentication(u, configuration.getString("yssdc.reports.bamboo.password").get))} ++
|
||||
configuration.getString("yssdc.reports.path").map{s => bind[String].qualifiedWith("reports-path").toInstance(s)}
|
||||
|
||||
}
|
||||
|
||||
33
app/modules/EmailExportModule.scala
Normal file
33
app/modules/EmailExportModule.scala
Normal file
@@ -0,0 +1,33 @@
|
||||
package modules
|
||||
|
||||
import javax.inject.Named
|
||||
|
||||
import com.google.inject.{AbstractModule, Provides}
|
||||
import com.ysoft.odc.Absolutizer
|
||||
import net.ceedubs.ficus.Ficus._
|
||||
import net.codingwell.scalaguice.ScalaModule
|
||||
import play.api.Configuration
|
||||
import play.api.libs.mailer.MailerClient
|
||||
import services.{EmailExportService, VulnerabilityNotificationService}
|
||||
|
||||
import scala.concurrent.ExecutionContext
|
||||
|
||||
class EmailExportModule extends AbstractModule with ScalaModule{
|
||||
override def configure(): Unit = {
|
||||
}
|
||||
|
||||
@Provides
|
||||
def provideIssueTrackerOption(conf: Configuration, mailerClient: MailerClient, notificationService: VulnerabilityNotificationService, absolutizer: Absolutizer, @Named("email-sending") emailSendingExecutionContext: ExecutionContext)(implicit executionContext: ExecutionContext): Option[EmailExportService] = {
|
||||
println(s"emailSendingExecutionContext = $emailSendingExecutionContext")
|
||||
conf.getConfig("yssdc.export.email").map{c =>
|
||||
new EmailExportService(
|
||||
from = c.underlying.as[String]("from"),
|
||||
mailerClient = mailerClient,
|
||||
emailSendingExecutionContext = emailSendingExecutionContext,
|
||||
absolutizer = absolutizer,
|
||||
notificationService = notificationService,
|
||||
nobodyInterestedContact = c.underlying.as[String]("noSubscriberContact")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
39
app/modules/IssueTrackerExportModule.scala
Normal file
39
app/modules/IssueTrackerExportModule.scala
Normal file
@@ -0,0 +1,39 @@
|
||||
package modules
|
||||
|
||||
import com.google.inject.{AbstractModule, Provides}
|
||||
import com.ysoft.odc.{Absolutizer, CredentialsAtlassianAuthentication}
|
||||
import net.ceedubs.ficus.Ficus._
|
||||
import net.ceedubs.ficus.readers.ArbitraryTypeReader._
|
||||
import net.codingwell.scalaguice.ScalaModule
|
||||
import play.api.Configuration
|
||||
import play.api.libs.ws.WSClient
|
||||
import services.{IssueTrackerService, JiraIssueTrackerService}
|
||||
|
||||
import scala.concurrent.ExecutionContext
|
||||
|
||||
class IssueTrackerExportModule extends AbstractModule with ScalaModule{
|
||||
override def configure(): Unit = {
|
||||
}
|
||||
|
||||
@Provides
|
||||
def provideIssueTrackerOption(conf: Configuration, absolutizer: Absolutizer)(implicit executionContext: ExecutionContext, wSClient: WSClient): Option[IssueTrackerService] = {
|
||||
conf.getConfig("yssdc.export.issueTracker").map(issueTrackerConfiguration(absolutizer))
|
||||
}
|
||||
|
||||
private def issueTrackerConfiguration(absolutizer: Absolutizer)(conf: Configuration)(implicit executionContext: ExecutionContext, wSClient: WSClient): IssueTrackerService = conf.getString("provider") match{
|
||||
case Some("jira") =>
|
||||
conf.getString("authentication.type") match {
|
||||
case Some("credentials") =>
|
||||
case other => sys.error("unknown authentication type: "+other)
|
||||
}
|
||||
new JiraIssueTrackerService(
|
||||
absolutizer = absolutizer,
|
||||
server = conf.underlying.as[String]("server"),
|
||||
projectId = conf.underlying.as[Int]("projectId"),
|
||||
vulnerabilityIssueType = conf.underlying.as[Int]("vulnerabilityIssueType"),
|
||||
atlassianAuthentication = conf.underlying.as[CredentialsAtlassianAuthentication]("authentication")
|
||||
)
|
||||
case other => sys.error("unknown provider for issue tracker: "+other)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user