11package code .api .util
22
3- import code .api .{ CertificateConstants , RequestHeader }
3+ import code .api .RequestHeader
44import code .util .Helper .MdcLoggable
55import com .openbankproject .commons .model .User
66import net .liftweb .common .{Box , Failure , Full }
77import net .liftweb .http .provider .HTTPParam
88
9- import java .util .Base64
109import java .nio .charset .StandardCharsets
1110import java .nio .file .{Files , Paths }
1211import java .security ._
@@ -113,7 +112,7 @@ object BerlinGroupSigning extends MdcLoggable {
113112 * @param forwardResult Propagated result of calling function
114113 * @return Propagated result of calling function or signing request error
115114 */
116- def verifySignedRequest (body : Box [String ], verb : String , url : String , reqHeaders : List [HTTPParam ], forwardResult : (Box [User ], Option [CallContext ])) = {
115+ def verifySignedRequest (body : Box [String ], verb : String , url : String , reqHeaders : List [HTTPParam ], forwardResult : (Box [User ], Option [CallContext ])): ( Box [ User ], Option [ CallContext ]) = {
117116 def checkRequestIsSigned (requestHeaders : List [HTTPParam ]): Boolean = {
118117 requestHeaders.exists(_.name == RequestHeader .`TPP-Signature-Certificate`) &&
119118 requestHeaders.exists(_.name == RequestHeader .Signature ) &&
@@ -132,8 +131,8 @@ object BerlinGroupSigning extends MdcLoggable {
132131
133132 val signatureHeaderValue = getHeaderValue(RequestHeader .Signature , requestHeaders)
134133 val signature = parseSignatureHeader(signatureHeaderValue).getOrElse(" signature" , " NONE" )
135- val headersss = parseSignatureHeader(signatureHeaderValue).getOrElse(" headers" , " " ).split(" " ).toList
136- val headers = headersss .map(h =>
134+ val headersToSign = parseSignatureHeader(signatureHeaderValue).getOrElse(" headers" , " " ).split(" " ).toList
135+ val headers = headersToSign .map(h =>
137136 if (h.toLowerCase() == RequestHeader .Digest .toLowerCase()) {
138137 s " $h: SHA-256= $digest"
139138 } else {
@@ -143,8 +142,10 @@ object BerlinGroupSigning extends MdcLoggable {
143142 val signingString = headers.mkString(" \n " )
144143 val isVerified = verifySignature(signingString, signature, certificatePem)
145144 val isValidated = CertificateVerifier .validateCertificate(certificatePem)
145+ val bypassValidation = APIUtil .getPropsAsBoolValue(" bypass_tpp_signature_validation" , defaultValue = false )
146146 (isVerified, isValidated) match {
147147 case (true , true ) => forwardResult
148+ case (true , false ) if bypassValidation => forwardResult
148149 case (true , false ) => (Failure (ErrorMessages .X509PublicKeyCannotBeValidated ), forwardResult._2)
149150 case (false , _) => (Failure (ErrorMessages .X509PublicKeyCannotVerify ), forwardResult._2)
150151 }
@@ -157,7 +158,7 @@ object BerlinGroupSigning extends MdcLoggable {
157158 def getHeaderValue (name : String , requestHeaders : List [HTTPParam ]): String = {
158159 requestHeaders.find(_.name.toLowerCase() == name.toLowerCase()).map(_.values.mkString).getOrElse(" None" )
159160 }
160- def getPem (requestHeaders : List [HTTPParam ]): String = {
161+ private def getPem (requestHeaders : List [HTTPParam ]): String = {
161162 val certificate = getHeaderValue(RequestHeader .`TPP-Signature-Certificate`, requestHeaders)
162163 // Decode the Base64 string
163164 val decodedBytes = Base64 .getDecoder.decode(certificate)
@@ -184,6 +185,13 @@ object BerlinGroupSigning extends MdcLoggable {
184185 }
185186 }
186187
188+ def getTppSignatureCertificate (requestHeaders : List [HTTPParam ]): Option [String ] = {
189+ getPem(requestHeaders) match {
190+ case value if value.isEmpty => None
191+ case value => Some (value)
192+ }
193+ }
194+
187195 def parseSignatureHeader (signatureHeader : String ): Map [String , String ] = {
188196 val regex = new Regex (""" (\w+)\s*=\s*"([^"]*)"""" , " key" , " value" )
189197 regex.findAllMatchIn(signatureHeader).map(m => m.group(" key" ) -> m.group(" value" )).toMap
0 commit comments