@@ -28,6 +28,15 @@ object ClientSSLConfig {
2828 val trustStorePath = Config .string(" trust-store-path" )
2929 val trustStorePassword = Config .secret(" trust-store-password" )
3030
31+ val keyManagerKeyStoreType = Config .string(" keyManagerKeyStoreType" )
32+ val keyManagerFile = Config .string(" keyManagerFile" )
33+ val keyManagerResource = Config .string(" keyManagerResource" )
34+ val keyManagerPassword = Config .secret(" keyManagerPassword" )
35+ val trustManagerKeyStoreType = Config .string(" trustManagerKeyStoreType" )
36+ val trustManagerFile = Config .string(" trustManagerFile" )
37+ val trustManagerResource = Config .string(" trustManagerResource" )
38+ val trustManagerPassword = Config .secret(" trustManagerPassword" )
39+
3140 val default = Config .succeed(Default )
3241 val fromCertFile = certPath.map(FromCertFile (_))
3342 val fromCertResource = certPath.map(FromCertResource (_))
@@ -39,6 +48,45 @@ object ClientSSLConfig {
3948 serverCertConfig.zipWith(clientCertConfig)(FromClientAndServerCert (_, _))
4049 }
4150
51+ val fromJavaxNetSsl = {
52+ keyManagerKeyStoreType.optional
53+ .zip(keyManagerFile.optional)
54+ .zip(keyManagerResource.optional)
55+ .zip(keyManagerPassword.optional)
56+ .zip(trustManagerKeyStoreType.optional)
57+ .zip(
58+ trustManagerFile.optional
59+ .zip(trustManagerResource.optional)
60+ .validate(" must supply trustManagerFile or trustManagerResource" )(pair =>
61+ pair._1.isDefined || pair._2.isDefined,
62+ ),
63+ )
64+ .zip(trustManagerPassword.optional)
65+ .map { case (kmkst, kmf, kmr, kmpass, tmkst, (tmf, tmr), tmpass) =>
66+ val bldr0 =
67+ List [(Option [String ], FromJavaxNetSsl => String => FromJavaxNetSsl )](
68+ (kmkst, b => b.keyManagerKeyStoreType(_)),
69+ (kmf, b => b.keyManagerFile),
70+ (kmr, b => b.keyManagerResource),
71+ (tmkst, b => b.trustManagerKeyStoreType(_)),
72+ (tmf, b => b.trustManagerFile),
73+ (tmr, b => b.trustManagerResource),
74+ )
75+ .foldLeft(FromJavaxNetSsl ()) { case (bldr, (maybe, lens)) =>
76+ maybe.fold(bldr)(s => lens(bldr)(s))
77+ }
78+
79+ List [(Option [Secret ], FromJavaxNetSsl => Secret => FromJavaxNetSsl )](
80+ (kmpass, b => b.keyManagerPassword(_)),
81+ (tmpass, b => b.trustManagerPassword(_)),
82+ )
83+ .foldLeft(bldr0) { case (bldr, (maybe, lens)) =>
84+ maybe.fold(bldr)(s => lens(bldr)(s))
85+ }
86+ .build()
87+ }
88+ }
89+
4290 tpe.switch(
4391 " Default" -> default,
4492 " FromCertFile" -> fromCertFile,
@@ -58,6 +106,55 @@ object ClientSSLConfig {
58106 clientCertConfig : ClientSSLCertConfig ,
59107 ) extends ClientSSLConfig
60108
109+ final case class FromJavaxNetSsl (
110+ keyManagerKeyStoreType : String = " JKS" ,
111+ keyManagerSource : FromJavaxNetSsl .Source = FromJavaxNetSsl .Empty ,
112+ keyManagerPassword : Option [Secret ] = None ,
113+ trustManagerKeyStoreType : String = " JKS" ,
114+ trustManagerSource : FromJavaxNetSsl .Source = FromJavaxNetSsl .Empty ,
115+ trustManagerPassword : Option [Secret ] = None ,
116+ ) extends ClientSSLConfig { self =>
117+
118+ def isValidBuild : Boolean = trustManagerSource != FromJavaxNetSsl .Empty
119+ def isInvalidBuild : Boolean = ! isValidBuild
120+ def build (): FromJavaxNetSsl = this
121+
122+ def keyManagerKeyStoreType (tpe : String ): FromJavaxNetSsl = self.copy(keyManagerKeyStoreType = tpe)
123+ def keyManagerFile (file : String ): FromJavaxNetSsl =
124+ keyManagerSource match {
125+ case FromJavaxNetSsl .Resource (_) => this
126+ case _ => self.copy(keyManagerSource = FromJavaxNetSsl .File (file))
127+ }
128+ def keyManagerResource (path : String ): FromJavaxNetSsl = self.copy(keyManagerSource = FromJavaxNetSsl .Resource (path))
129+ def keyManagerPassword (password : Secret ): FromJavaxNetSsl = self.copy(keyManagerPassword = Some (password))
130+ def keyManagerPassword (password : String ): FromJavaxNetSsl = keyManagerPassword(Secret (password))
131+
132+ def trustManagerKeyStoreType (tpe : String ): FromJavaxNetSsl = self.copy(trustManagerKeyStoreType = tpe)
133+ def trustManagerFile (file : String ): FromJavaxNetSsl =
134+ trustManagerSource match {
135+ case FromJavaxNetSsl .Resource (_) => this
136+ case _ => self.copy(trustManagerSource = FromJavaxNetSsl .File (file))
137+ }
138+ def trustManagerResource (path : String ): FromJavaxNetSsl =
139+ self.copy(trustManagerSource = FromJavaxNetSsl .Resource (path))
140+ def trustManagerPassword (password : Secret ): FromJavaxNetSsl = self.copy(trustManagerPassword = Some (password))
141+ def trustManagerPassword (password : String ): FromJavaxNetSsl = trustManagerPassword(Secret (password))
142+ }
143+
144+ object FromJavaxNetSsl {
145+
146+ sealed trait Source extends Product with Serializable
147+ case object Empty extends Source
148+ final case class File (file : String ) extends Source
149+ final case class Resource (resource : String ) extends Source
150+
151+ def builderWithTrustManagerFile (file : String ): FromJavaxNetSsl =
152+ FromJavaxNetSsl ().trustManagerFile(file)
153+
154+ def builderWithTrustManagerResource (resource : String ): FromJavaxNetSsl =
155+ FromJavaxNetSsl ().trustManagerResource(resource)
156+ }
157+
61158 object FromTrustStoreResource {
62159 def apply (trustStorePath : String , trustStorePassword : String ): FromTrustStoreResource =
63160 FromTrustStoreResource (trustStorePath, Secret (trustStorePassword))
0 commit comments