diff --git a/pom.xml b/pom.xml index cc2180df95..cb9c8afc39 100644 --- a/pom.xml +++ b/pom.xml @@ -334,6 +334,11 @@ java-jwt 3.3.0 + + com.nimbusds + nimbus-jose-jwt + 4.23 + diff --git a/src/main/scala/bootstrap/liftweb/Boot.scala b/src/main/scala/bootstrap/liftweb/Boot.scala index b54f0c9800..7de264775c 100644 --- a/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/src/main/scala/bootstrap/liftweb/Boot.scala @@ -184,7 +184,8 @@ class Boot extends MdcLoggable { print("Enter the Password for the SSL Certificate Stores: ") //As most IDEs do not provide a Console, we fall back to readLine - code.api.util.APIUtil.initPasswd = if (Props.get("kafka.use.ssl").getOrElse("") == "true") { + code.api.util.APIUtil.initPasswd = if (Props.get("kafka.use.ssl").getOrElse("") == "true" || + Props.get("jwt.use.ssl").getOrElse("") == "true") { try { System.console.readPassword().toString } catch { @@ -223,7 +224,7 @@ class Boot extends MdcLoggable { LiftRules.statelessDispatch.append(OAuthHandshake) // JWT auth endpoints - if(Props.getBool("allow_direct_login", true)) { + if(APIUtil.getPropsAsBoolValue("allow_direct_login", true)) { LiftRules.statelessDispatch.append(DirectLogin) } @@ -233,7 +234,7 @@ class Boot extends MdcLoggable { // OpenIdConnect endpoint and validator - if(Props.getBool("allow_openidconnect", false)) { + if(APIUtil.getPropsAsBoolValue("allow_openidconnect", false)) { LiftRules.dispatch.append(OpenIdConnect) } @@ -269,7 +270,7 @@ class Boot extends MdcLoggable { // LiftRules.statelessDispatch.append(Metrics) TODO: see metric menu entry below //add sandbox api calls only if we're running in sandbox mode - if(Props.getBool("allow_sandbox_data_import", false)) { + if(APIUtil.getPropsAsBoolValue("allow_sandbox_data_import", false)) { LiftRules.statelessDispatch.append(SandboxApiCalls) } else { logger.info("Not adding sandbox api calls") @@ -279,7 +280,7 @@ class Boot extends MdcLoggable { Schedule.schedule(()=> OAuthAuthorisation.dataBaseCleaner, 2 minutes) val accountCreation = { - if(Props.getBool("allow_sandbox_account_creation", false)){ + if(APIUtil.getPropsAsBoolValue("allow_sandbox_account_creation", false)){ //user must be logged in, as a created account needs an owner // Not mentioning test and sandbox for App store purposes right now. List(Menu("Sandbox Account Creation", "Create Bank Account") / "create-sandbox-account" >> AuthUser.loginFirst) @@ -293,7 +294,7 @@ class Boot extends MdcLoggable { KafkaHelperActors.startLocalKafkaHelperWorkers(actorSystem) } - if (!Props.getBool("remotedata.enable", false)) { + if (!APIUtil.getPropsAsBoolValue("remotedata.enable", false)) { try { logger.info(s"RemotedataActors.startLocalRemotedataWorkers( ${actorSystem} ) starting") RemotedataActors.startActors(actorSystem) @@ -305,7 +306,7 @@ class Boot extends MdcLoggable { // API Metrics (logs of API calls) // If set to true we will write each URL with params to a datastore / log file - if (Props.getBool("write_metrics", false)) { + if (APIUtil.getPropsAsBoolValue("write_metrics", false)) { logger.info("writeMetrics is true. We will write API metrics") } else { logger.info("writeMetrics is false. We will NOT write API metrics") @@ -370,7 +371,7 @@ class Boot extends MdcLoggable { S.addAround(DB.buildLoanWrapper) try { - val useMessageQueue = Props.getBool("messageQueue.createBankAccounts", false) + val useMessageQueue = APIUtil.getPropsAsBoolValue("messageQueue.createBankAccounts", false) if(useMessageQueue) BankAccountCreationListener.startListen } catch { @@ -396,15 +397,15 @@ class Boot extends MdcLoggable { } } - if ( !Props.getLong("transaction_status_scheduler_delay").isEmpty ) { - val delay = Props.getLong("transaction_status_scheduler_delay").openOrThrowException("Incorrect value for transaction_status_scheduler_delay, please provide number of seconds.") + if ( !APIUtil.getPropsAsLongValue("transaction_status_scheduler_delay").isEmpty ) { + val delay = APIUtil.getPropsAsLongValue("transaction_status_scheduler_delay").openOrThrowException("Incorrect value for transaction_status_scheduler_delay, please provide number of seconds.") TransactionStatusScheduler.start(delay) } APIUtil.akkaSanityCheck() match { case Full(c) if c == true => logger.info(s"remotedata.secret matched = $c") case Full(c) if c == false => throw new Exception(ErrorMessages.RemoteDataSecretMatchError) - case Empty => Props.getBool("use_akka", false) match { + case Empty => APIUtil.getPropsAsBoolValue("use_akka", false) match { case true => throw new Exception(ErrorMessages.RemoteDataSecretObtainError) case false => logger.info("Akka middleware layer is disabled.") } diff --git a/src/main/scala/code/accountholder/AccountHolders.scala b/src/main/scala/code/accountholder/AccountHolders.scala index d8dbe90f0a..0011dfeaaa 100644 --- a/src/main/scala/code/accountholder/AccountHolders.scala +++ b/src/main/scala/code/accountholder/AccountHolders.scala @@ -2,9 +2,10 @@ package code.accountholder +import code.api.util.APIUtil import code.model._ import net.liftweb.util.{Props, SimpleInjector} -import code.remotedata.{RemotedataAccountHolders} +import code.remotedata.RemotedataAccountHolders import net.liftweb.common.Box @@ -13,7 +14,7 @@ object AccountHolders extends SimpleInjector { val accountHolders = new Inject(buildOne _) {} def buildOne: AccountHolders = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MapperAccountHolders case true => RemotedataAccountHolders // We will use Akka as a middleware } diff --git a/src/main/scala/code/actorsystem/ObpActorInit.scala b/src/main/scala/code/actorsystem/ObpActorInit.scala index a76d5d3be9..8ac522b00c 100644 --- a/src/main/scala/code/actorsystem/ObpActorInit.scala +++ b/src/main/scala/code/actorsystem/ObpActorInit.scala @@ -2,6 +2,7 @@ package code.actorsystem import akka.util.Timeout import code.api.APIFailure +import code.api.util.APIUtil import code.util.Helper.MdcLoggable import net.liftweb.common._ import net.liftweb.util.Props @@ -12,7 +13,7 @@ import scala.concurrent.{Await, Future} trait ObpActorInit extends MdcLoggable{ // Default is 3 seconds, which should be more than enough for slower systems - val ACTOR_TIMEOUT: Long = Props.getLong("remotedata.timeout").openOr(3) + val ACTOR_TIMEOUT: Long = APIUtil.getPropsAsLongValue("remotedata.timeout").openOr(3) val actorName = CreateActorNameFromClassName(this.getClass.getName) val actor = ObpLookupSystem.getRemotedataActor(actorName) diff --git a/src/main/scala/code/actorsystem/ObpLookupSystem.scala b/src/main/scala/code/actorsystem/ObpLookupSystem.scala index 3176c7f172..90ae8576ba 100644 --- a/src/main/scala/code/actorsystem/ObpLookupSystem.scala +++ b/src/main/scala/code/actorsystem/ObpLookupSystem.scala @@ -1,6 +1,7 @@ package code.actorsystem import akka.actor.ActorSystem +import code.api.util.APIUtil import code.util.Helper import code.util.Helper.MdcLoggable import com.typesafe.config.ConfigFactory @@ -41,7 +42,7 @@ trait ObpLookupSystem extends MdcLoggable { def getRemotedataActor(actorName: String) = { - val actorPath: String = Props.getBool("remotedata.enable", false) match { + val actorPath: String = APIUtil.getPropsAsBoolValue("remotedata.enable", false) match { case true => val hostname = ObpActorConfig.remoteHostname val port = ObpActorConfig.remotePort diff --git a/src/main/scala/code/api/GatewayLogin.scala b/src/main/scala/code/api/GatewayLogin.scala index 83ddcdfe9c..2ccf74b21f 100755 --- a/src/main/scala/code/api/GatewayLogin.scala +++ b/src/main/scala/code/api/GatewayLogin.scala @@ -28,7 +28,7 @@ package code.api import java.io.UnsupportedEncodingException -import code.api.util.{CertificateUtil, CryptoSystem, ErrorMessages} +import code.api.util.{APIUtil, CertificateUtil, CryptoSystem, ErrorMessages} import code.bankconnectors.{Connector, InboundAccountCommon} import code.consumer.Consumers import code.model.dataAccess.AuthUser @@ -86,7 +86,7 @@ object GatewayLogin extends RestHelper with MdcLoggable { var jwt: String = "" try { - val algorithm = Props.getBool("jwt.use.ssl", false) match { + val algorithm = APIUtil.getPropsAsBoolValue("jwt.use.ssl", false) match { case true => Algorithm.RSA256(CertificateUtil.publicKey, CertificateUtil.privateKey) case false => @@ -107,7 +107,12 @@ object GatewayLogin extends RestHelper with MdcLoggable { //Invalid Signing configuration / Couldn't convert Claims. logger.error(exception) } - jwt + APIUtil.getPropsAsBoolValue("jwt.use.ssl", false) match { + case true => + CertificateUtil.encryptJwtWithRsa(jwt) + case false => + jwt + } } def parseJwt(parameters: Map[String, String]): Box[String] = { @@ -134,7 +139,7 @@ object GatewayLogin extends RestHelper with MdcLoggable { def validateJwtToken(token: String): Box[DecodedJWT] = { try { val jwtDecoded = JWT.decode(token) - val algorithm = Props.getBool("jwt.use.ssl", false) match { + val algorithm = APIUtil.getPropsAsBoolValue("jwt.use.ssl", false) match { case true => Algorithm.RSA256(CertificateUtil.publicKey, CertificateUtil.privateKey) case false => diff --git a/src/main/scala/code/api/OBPRestHelper.scala b/src/main/scala/code/api/OBPRestHelper.scala index 9e1c5fc2ff..59b8c76331 100644 --- a/src/main/scala/code/api/OBPRestHelper.scala +++ b/src/main/scala/code/api/OBPRestHelper.scala @@ -113,7 +113,7 @@ trait OBPRestHelper extends RestHelper with MdcLoggable { errorJsonResponse(apiFailure.msg, apiFailure.responseCode) } case obj@Failure(msg, _, c) => { - val failuresMsg = Props.getBool("display_internal_errors").openOr(false) match { + val failuresMsg = APIUtil.getPropsAsBoolValue("display_internal_errors", false) match { case true => // Show all error in a chain obj.messageChain case false => // Do not display internal errors @@ -216,7 +216,7 @@ trait OBPRestHelper extends RestHelper with MdcLoggable { case Failure(msg, t, c) => Failure(msg, t, c) case _ => Failure("oauth error") } - } else if (Props.getBool("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { + } else if (APIUtil.getPropsAsBoolValue("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { DirectLogin.getUser match { case Full(u) => fn(cc.copy(user = Full(u)))// Authentication is successful case _ => { @@ -224,7 +224,7 @@ trait OBPRestHelper extends RestHelper with MdcLoggable { Full(errorJsonResponse(message, httpCode)) } } - } else if (Props.getBool("allow_gateway_login", false) && hasGatewayHeader(authorization)) { + } else if (APIUtil.getPropsAsBoolValue("allow_gateway_login", false) && hasGatewayHeader(authorization)) { logger.info("allow_gateway_login-getRemoteIpAddress: " + getRemoteIpAddress() ) Props.get("gateway.host") match { case Full(h) if h.split(",").toList.exists(_.equalsIgnoreCase(getRemoteIpAddress()) == true) => // Only addresses from white list can use this feature diff --git a/src/main/scala/code/api/directlogin.scala b/src/main/scala/code/api/directlogin.scala index 715103fb94..50c7c60f90 100644 --- a/src/main/scala/code/api/directlogin.scala +++ b/src/main/scala/code/api/directlogin.scala @@ -250,7 +250,7 @@ object DirectLogin extends RestHelper with MdcLoggable { //check if the application is registered and active else if ( requestType == "authorizationToken" && - Props.getBool("direct_login_consumer_key_mandatory", true) && + APIUtil.getPropsAsBoolValue("direct_login_consumer_key_mandatory", true) && ! APIUtil.registeredApplication(parameters.getOrElse("consumer_key", ""))) { logger.error("application: " + parameters.getOrElse("consumer_key", "") + " not found") @@ -364,7 +364,7 @@ object DirectLogin extends RestHelper with MdcLoggable { if (requestType == "protectedResource") { validAccessTokenFuture(parameters.getOrElse("token", "")) } else if (requestType == "authorizationToken" && - Props.getBool("direct_login_consumer_key_mandatory", true)) + APIUtil.getPropsAsBoolValue("direct_login_consumer_key_mandatory", true)) { APIUtil.registeredApplicationFuture(parameters.getOrElse("consumer_key", "")) } else { @@ -392,7 +392,7 @@ object DirectLogin extends RestHelper with MdcLoggable { } //check if the application is registered and active else if ( requestType == "authorizationToken" && - Props.getBool("direct_login_consumer_key_mandatory", true) && + APIUtil.getPropsAsBoolValue("direct_login_consumer_key_mandatory", true) && !valid) { logger.error("application: " + parameters.getOrElse("consumer_key", "") + " not found") diff --git a/src/main/scala/code/api/util/APIUtil.scala b/src/main/scala/code/api/util/APIUtil.scala index 632fa48f31..5c7f07e4b3 100644 --- a/src/main/scala/code/api/util/APIUtil.scala +++ b/src/main/scala/code/api/util/APIUtil.scala @@ -432,7 +432,7 @@ object APIUtil extends MdcLoggable { def logAPICall(callContext: Option[CallContext]) = { callContext match { case Some(cc) => - if(Props.getBool("write_metrics", false)) { + if(getPropsAsBoolValue("write_metrics", false)) { val u: User = cc.user.orNull val userId = if (u != null) u.userId else "null" val userName = if (u != null) u.name else "null" @@ -456,7 +456,7 @@ object APIUtil extends MdcLoggable { case Full(c) => Full(c) case _ => Empty } - } else if (Props.getBool("allow_direct_login", true) && hasDirectLoginHeader(cc.authorization)) { + } else if (getPropsAsBoolValue("allow_direct_login", true) && hasDirectLoginHeader(cc.authorization)) { DirectLogin.getConsumer(cc) match { case Full(c) => Full(c) case _ => Empty @@ -493,14 +493,14 @@ object APIUtil extends MdcLoggable { def logAPICall(date: TimeSpan, duration: Long, rd: Option[ResourceDoc]) = { val authorization = S.request.map(_.header("Authorization")).flatten - if(Props.getBool("write_metrics", false)) { + if(getPropsAsBoolValue("write_metrics", false)) { val user = if (hasAnOAuthHeader(authorization)) { getUser match { case Full(u) => Full(u) case _ => Empty } - } else if (Props.getBool("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { + } else if (getPropsAsBoolValue("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { DirectLogin.getUser match { case Full(u) => Full(u) case _ => Empty @@ -515,7 +515,7 @@ object APIUtil extends MdcLoggable { case Full(c) => Full(c) case _ => Empty } - } else if (Props.getBool("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { + } else if (getPropsAsBoolValue("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { DirectLogin.getConsumer match { case Full(c) => Full(c) case _ => Empty @@ -1464,7 +1464,7 @@ Returns a string showed to the developer val result = blockOfCode // call-by-name val t1 = System.currentTimeMillis() - if (Props.getBool("write_metrics", false)){ + if (getPropsAsBoolValue("write_metrics", false)){ val correlationId = getCorrelationId() Future { ConnectorMetricsProvider.metrics.vend.saveConnectorMetric(nameOfConnector, nameOfFunction, correlationId, now, t1 - t0) @@ -1474,7 +1474,7 @@ Returns a string showed to the developer } def akkaSanityCheck (): Box[Boolean] = { - Props.getBool("use_akka", false) match { + getPropsAsBoolValue("use_akka", false) match { case true => val remotedataSecret = Props.get("remotedata.secret").openOrThrowException("Cannot obtain property remotedata.secret") SanityCheck.sanityCheck.vend.remoteAkkaSanityCheck(remotedataSecret) @@ -1924,9 +1924,9 @@ Versions are groups of endpoints in a file val res = if (hasAnOAuthHeader(authorization)) { getUserFromOAuthHeaderFuture(cc) - } else if (Props.getBool("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { + } else if (getPropsAsBoolValue("allow_direct_login", true) && hasDirectLoginHeader(authorization)) { DirectLogin.getUserFromDirectLoginHeaderFuture(cc) - } else if (Props.getBool("allow_gateway_login", false) && hasGatewayHeader(authorization)) { + } else if (getPropsAsBoolValue("allow_gateway_login", false) && hasGatewayHeader(authorization)) { Props.get("gateway.host") match { case Full(h) if h.split(",").toList.exists(_.equalsIgnoreCase(getRemoteIpAddress()) == true) => // Only addresses from white list can use this feature val (httpCode, message, parameters) = GatewayLogin.validator(s.request) @@ -2015,7 +2015,7 @@ Versions are groups of endpoints in a file case ParamFailure(msg,_,_,_) => throw new Exception(msg) case obj@Failure(msg, _, c) => - val failuresMsg = Props.getBool("display_internal_errors").openOr(false) match { + val failuresMsg = getPropsAsBoolValue("display_internal_errors", false) match { case true => // Show all error in a chain obj.messageChain case false => // Do not display internal errors @@ -2093,25 +2093,46 @@ Versions are groups of endpoints in a file /** * This function is implemented in order to support encrypted values in props file. * Please note that some value is considered as encrypted if has an encryption mark property in addition to regular props value in props file e.g - * db.url=SOME_ENCRYPTED_VALUE + * db.url=Helpers.base64Encode(SOME_ENCRYPTED_VALUE) * db.url.is_encrypted=true * getDecryptedPropsValue("db.url") = jdbc:postgresql://localhost:5432/han_obp_api_9?user=han_obp_api&password=mypassword + * Encrypt/Decrypt workflow: + * Encrypt: Array[Byte] -> Helpers.base64Encode(encrypted) -> Props file: String -> Helpers.base64Decode(encryptedValue) -> Decrypt: Array[Byte] * @param nameOfProperty Name of property which value should be decrypted * @return Decrypted value of a property */ def getPropsValue(nameOfProperty: String): Box[String] = { (Props.get(nameOfProperty), Props.get(nameOfProperty + ".is_encrypted")) match { - case (Full(encryptedValue), Full(isEncrypted)) if isEncrypted == "true" => - val decryptedValue: Array[Byte] = decrypt(privateKey, encryptedValue.getBytes(StandardCharsets.UTF_8), CryptoSystem.RSA) - Full(decryptedValue.toString) + case (Full(base64PropsValue), Full(isEncrypted)) if isEncrypted == "true" => + val decryptedValueAsArray = decrypt(privateKey, Helpers.base64Decode(base64PropsValue), CryptoSystem.RSA) + val decryptedValueAsString = new String(decryptedValueAsArray) + Full(decryptedValueAsString) case (Full(property), Full(isEncrypted)) if isEncrypted == "false" => Full(property) case (Full(property), Empty) => Full(property) + case (Empty, Empty) => + Empty case _ => logger.error(cannotDecryptValueOfProperty + nameOfProperty) Failure(cannotDecryptValueOfProperty + nameOfProperty) } } + def getPropsAsBoolValue(nameOfProperty: String, defaultValue: Boolean): Boolean = { + getPropsValue(nameOfProperty) map(toBoolean) openOr(defaultValue) + } + def getPropsAsIntValue(nameOfProperty: String): Box[Int] = { + getPropsValue(nameOfProperty) map(toInt) + } + def getPropsAsIntValue(nameOfProperty: String, defaultValue: Int): Int = { + getPropsAsIntValue(nameOfProperty) openOr(defaultValue) + } + def getPropsAsLongValue(nameOfProperty: String): Box[Long] = { + getPropsValue(nameOfProperty) flatMap(asLong) + } + def getPropsAsLongValue(nameOfProperty: String, defaultValue: Long): Long = { + getPropsAsLongValue(nameOfProperty) openOr(defaultValue) + } + } diff --git a/src/main/scala/code/api/util/CertificateUtil.scala b/src/main/scala/code/api/util/CertificateUtil.scala index 78700cd2b5..723087edf8 100644 --- a/src/main/scala/code/api/util/CertificateUtil.scala +++ b/src/main/scala/code/api/util/CertificateUtil.scala @@ -6,7 +6,11 @@ import java.security.{PublicKey, _} import javax.crypto.Cipher import code.api.util.CryptoSystem.CryptoSystem -import net.liftweb.util.Props +import com.nimbusds.jose.crypto.RSAEncrypter +import com.nimbusds.jose.{EncryptionMethod, JOSEObject, JWEAlgorithm, JWEHeader} +import com.nimbusds.jwt.EncryptedJWT +import code.util.Helper.MdcLoggable +import net.liftweb.util.{Helpers, Props} object CryptoSystem extends Enumeration { @@ -14,14 +18,14 @@ object CryptoSystem extends Enumeration { val RSA = Value } -object CertificateUtil { +object CertificateUtil extends MdcLoggable { - lazy val (publicKey: RSAPublicKey, privateKey: RSAPrivateKey) = Props.getBool("jwt.use.ssl", false) match { + lazy val (publicKey: RSAPublicKey, privateKey: RSAPrivateKey) = APIUtil.getPropsAsBoolValue("jwt.use.ssl", false) match { case true => getKeyPair( jkspath = Props.get("keystore.path").getOrElse(""), - jkspasswd = Props.get("keystore.password").getOrElse(""), - keypasswd = Props.get("keystore.passphrase").getOrElse(""), + jkspasswd = Props.get("keystore.password").getOrElse(APIUtil.initPasswd), + keypasswd = Props.get("keystore.passphrase").getOrElse(APIUtil.initPasswd), alias = Props.get("keystore.alias").getOrElse("") ) case false => @@ -95,20 +99,73 @@ object CertificateUtil { cipher.doFinal(encrypted) } + def getClaimSet(jwt: String) = { + import com.nimbusds.jose.util.Base64URL + import com.nimbusds.jwt.PlainJWT + // {"alg":"none"}// {"alg":"none"} + val header = "eyJhbGciOiJub25lIn0" + val parts: Array[Base64URL] = JOSEObject.split(jwt) + val plainJwt = new PlainJWT(new Base64URL(header), (parts(1))) + plainJwt.getJWTClaimsSet + } + def encryptJwtWithRsa(jwt: String) = { + // Request JWT encrypted with RSA-OAEP-256 and 128-bit AES/GCM + val header = new JWEHeader(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A128GCM) + // Create an encrypter with the specified public RSA key + val encrypter = new RSAEncrypter(publicKey) + // Create the encrypted JWT object + val encryptedJWT = new EncryptedJWT(header, CertificateUtil.getClaimSet(jwt)) + // Do the actual encryption + encryptedJWT.encrypt(encrypter) + logger.debug("encryptedJWT.serialize(): " + encryptedJWT.serialize()) + // Return JWT + encryptedJWT.serialize() + } + def decryptJwtWithRsa(jwt: String) = { + import com.nimbusds.jose.crypto.RSADecrypter + import com.nimbusds.jwt.EncryptedJWT + // Parse back + val jwtParsed = EncryptedJWT.parse(jwt) + System.out.println("decryptJwtWithRsa: " + jwtParsed.serialize()) + // Create a decrypter with the specified private RSA key + val decrypter = new RSADecrypter(privateKey) + jwtParsed.decrypt(decrypter) + logger.debug("jwt: " + jwt) + logger.debug("getState: " + jwtParsed.getState) + logger.debug("getJWTClaimsSet: " + jwtParsed.getJWTClaimsSet) + logger.debug("getCipherText: " + jwtParsed.getCipherText) + logger.debug("getAuthTag: " + jwtParsed.getAuthTag) + jwtParsed.serialize() + } + @throws[Exception] def main(args: Array[String]): Unit = { + print("Enter the Password for the SSL Certificate Stores: ") + //As most IDEs do not provide a Console, we fall back to readLine + code.api.util.APIUtil.initPasswd = + if (Props.get("kafka.use.ssl").getOrElse("") == "true" || + Props.get("jwt.use.ssl").getOrElse("") == "true") + { + try { + System.console.readPassword().toString + } catch { + case e: NullPointerException => scala.io.StdIn.readLine() + } + } else {"notused"} + System.out.println("Public key:" + publicKey.getEncoded) System.out.println("Private key:" + privateKey.getEncoded) // 1.1 Encrypt the token with public key val encryptedWithPublicReceived = encrypt(publicKey, "This is a secret message we should receive", CryptoSystem.RSA) System.out.println("Encrypted token with public key:") - System.out.println(new String(encryptedWithPublicReceived)) // <> + val encryptedString = Helpers.base64Encode(encryptedWithPublicReceived) + System.out.println(encryptedString) // <> // 1.2 Decrypt the token with private key - val decryptedToken = decrypt(privateKey, encryptedWithPublicReceived, CryptoSystem.RSA) + val decryptedToken = decrypt(privateKey, Helpers.base64Decode(encryptedString), CryptoSystem.RSA) System.out.println("Decrypted token with private key:") // This is a secret message System.out.println(new String(decryptedToken)) // This is a secret message diff --git a/src/main/scala/code/api/v1_2_1/APIMethods121.scala b/src/main/scala/code/api/v1_2_1/APIMethods121.scala index c8d5e249cd..911abcf565 100644 --- a/src/main/scala/code/api/v1_2_1/APIMethods121.scala +++ b/src/main/scala/code/api/v1_2_1/APIMethods121.scala @@ -2882,7 +2882,7 @@ Authentication via OAuth is required. The user must either have owner privileges lazy val makePayment : OBPEndpoint = { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transactions" :: Nil JsonPost json -> _ => { sc - if (Props.getBool("payments_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("payments_enabled", false)) { for { u <- cc.user ?~ UserNotLoggedIn makeTransJson <- tryo{json.extract[MakePaymentJson]} ?~ {InvalidJsonFormat} diff --git a/src/main/scala/code/api/v1_4_0/APIMethods140.scala b/src/main/scala/code/api/v1_4_0/APIMethods140.scala index 1d97ca646b..b916f61ac4 100644 --- a/src/main/scala/code/api/v1_4_0/APIMethods140.scala +++ b/src/main/scala/code/api/v1_4_0/APIMethods140.scala @@ -167,7 +167,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ } - val getBranchesIsPublic = Props.getBool("apiOptions.getBranchesIsPublic", true) + val getBranchesIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getBranchesIsPublic", true) resourceDocs += ResourceDoc( getBranches, @@ -234,7 +234,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ } - val getAtmsIsPublic = Props.getBool("apiOptions.getAtmsIsPublic", true) + val getAtmsIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getAtmsIsPublic", true) resourceDocs += ResourceDoc( getAtms, @@ -302,7 +302,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ } - val getProductsIsPublic = Props.getBool("apiOptions.getProductsIsPublic", true) + val getProductsIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getProductsIsPublic", true) resourceDocs += ResourceDoc( @@ -445,7 +445,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-request-types" :: Nil JsonGet _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { u <- cc.user ?~ ErrorMessages.UserNotLoggedIn fromBank <- Bank(bankId) ?~! {ErrorMessages.BankNotFound} @@ -488,7 +488,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ lazy val getTransactionRequests: OBPEndpoint = { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-requests" :: Nil JsonGet _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { u <- cc.user ?~ ErrorMessages.UserNotLoggedIn fromBank <- Bank(bankId) ?~! {ErrorMessages.BankNotFound} @@ -554,7 +554,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-request-types" :: TransactionRequestType(transactionRequestType) :: "transaction-requests" :: Nil JsonPost json -> _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { /* TODO: * check if user has access using the view that is given (now it checks if user has access to owner view), will need some new permissions for transaction requests @@ -622,7 +622,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{ case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-request-types" :: TransactionRequestType(transactionRequestType) :: "transaction-requests" :: TransactionRequestId(transReqId) :: "challenge" :: Nil JsonPost json -> _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { u <- cc.user ?~ ErrorMessages.UserNotLoggedIn fromBank <- Bank(bankId) ?~! {ErrorMessages.BankNotFound} diff --git a/src/main/scala/code/api/v2_0_0/APIMethods200.scala b/src/main/scala/code/api/v2_0_0/APIMethods200.scala index 864b7446d9..053abf27f0 100644 --- a/src/main/scala/code/api/v2_0_0/APIMethods200.scala +++ b/src/main/scala/code/api/v2_0_0/APIMethods200.scala @@ -7,7 +7,7 @@ import code.TransactionTypes.TransactionType import code.api.APIFailure import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON._ import code.api.util.APIUtil._ -import code.api.util.{ApiRole, ErrorMessages} +import code.api.util.{APIUtil, ApiRole, ErrorMessages} import code.api.v1_2_1.OBPAPI1_2_1._ import code.api.v1_2_1.{AmountOfMoneyJsonV121 => AmountOfMoneyJSON121, JSONFactory => JSONFactory121} import code.api.v1_4_0.JSONFactory1_4_0 @@ -35,6 +35,7 @@ import net.liftweb.json.JsonAST.JValue import net.liftweb.mapper.By import net.liftweb.util.Helpers.tryo import net.liftweb.util.Props + import scala.concurrent.ExecutionContext.Implicits.global import scala.collection.immutable.Nil import scala.collection.mutable.ArrayBuffer @@ -1144,7 +1145,7 @@ trait APIMethods200 { - val getTransactionTypesIsPublic = Props.getBool("apiOptions.getTransactionTypesIsPublic", true) + val getTransactionTypesIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getTransactionTypesIsPublic", true) resourceDocs += ResourceDoc( @@ -1271,7 +1272,7 @@ trait APIMethods200 { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-request-types" :: TransactionRequestType(transactionRequestType) :: "transaction-requests" :: Nil JsonPost json -> _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { /* TODO: * check if user has access using the view that is given (now it checks if user has access to owner view), will need some new permissions for transaction requests @@ -1348,7 +1349,7 @@ trait APIMethods200 { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-request-types" :: TransactionRequestType(transactionRequestType) :: "transaction-requests" :: TransactionRequestId(transReqId) :: "challenge" :: Nil JsonPost json -> _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { _ <- cc.user ?~! ErrorMessages.UserNotLoggedIn _ <- tryo(assert(isValidID(accountId.value)))?~! ErrorMessages.InvalidAccountIdFormat @@ -1437,7 +1438,7 @@ trait APIMethods200 { lazy val getTransactionRequests: OBPEndpoint = { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-requests" :: Nil JsonGet _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { u <- cc.user ?~! UserNotLoggedIn _ <- Bank(bankId) ?~! BankNotFound @@ -1562,7 +1563,7 @@ trait APIMethods200 { lazy val createMeeting: OBPEndpoint = { case "banks" :: BankId(bankId) :: "meetings" :: Nil JsonPost json -> _ => { cc => - if (Props.getBool("meeting.tokbox_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("meeting.tokbox_enabled", false)) { for { // TODO use these keys to get session and tokens from tokbox _ <- Props.get("meeting.tokbox_api_key") ~> APIFailure(MeetingApiKeyNotConfigured, 403) @@ -1619,7 +1620,7 @@ trait APIMethods200 { lazy val getMeetings: OBPEndpoint = { case "banks" :: BankId(bankId) :: "meetings" :: Nil JsonGet _ => { cc => - if (Props.getBool("meeting.tokbox_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("meeting.tokbox_enabled", false)) { for { _ <- cc.user ?~! ErrorMessages.UserNotLoggedIn _ <- Bank(bankId) ?~! BankNotFound @@ -1677,7 +1678,7 @@ trait APIMethods200 { lazy val getMeeting: OBPEndpoint = { case "banks" :: BankId(bankId) :: "meetings" :: meetingId :: Nil JsonGet _ => { cc => - if (Props.getBool("meeting.tokbox_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("meeting.tokbox_enabled", false)) { for { u <- cc.user ?~! UserNotLoggedIn _ <- Bank(bankId) ?~! BankNotFound diff --git a/src/main/scala/code/api/v2_1_0/APIMethods210.scala b/src/main/scala/code/api/v2_1_0/APIMethods210.scala index 6bbc2684a6..ef6c5a67b7 100644 --- a/src/main/scala/code/api/v2_1_0/APIMethods210.scala +++ b/src/main/scala/code/api/v2_1_0/APIMethods210.scala @@ -4,7 +4,7 @@ import java.text.SimpleDateFormat import java.util.{Date, Locale} import code.TransactionTypes.TransactionType -import code.api.util.ApiRole +import code.api.util.{APIUtil, ApiRole} import code.api.util.ErrorMessages.TransactionDisabled import code.api.v1_2_1.AmountOfMoneyJsonV121 import code.api.v1_3_0.{JSONFactory1_3_0, _} @@ -127,7 +127,7 @@ trait APIMethods210 { } - val getTransactionRequestTypesIsPublic = Props.getBool("apiOptions.getTransactionRequestTypesIsPublic", true) + val getTransactionRequestTypesIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getTransactionRequestTypesIsPublic", true) resourceDocs += ResourceDoc( getTransactionRequestTypesSupportedByBank, @@ -404,7 +404,7 @@ trait APIMethods210 { TransactionRequestType(transactionRequestType) :: "transaction-requests" :: Nil JsonPost json -> _ => { cc => for { - _ <- booleanToBox(Props.getBool("transactionRequests_enabled", false)) ?~ TransactionDisabled + _ <- booleanToBox(APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) ?~ TransactionDisabled u <- cc.user ?~ UserNotLoggedIn _ <- tryo(assert(isValidID(accountId.value))) ?~! InvalidAccountIdFormat _ <- tryo(assert(isValidID(bankId.value))) ?~! InvalidBankIdFormat @@ -560,7 +560,7 @@ trait APIMethods210 { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-request-types" :: TransactionRequestType(transactionRequestType) :: "transaction-requests" :: TransactionRequestId(transReqId) :: "challenge" :: Nil JsonPost json -> _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { // Check we have a User u: User <- cc.user ?~ UserNotLoggedIn @@ -674,7 +674,7 @@ trait APIMethods210 { lazy val getTransactionRequests: OBPEndpoint = { case "banks" :: BankId(bankId) :: "accounts" :: AccountId(accountId) :: ViewId(viewId) :: "transaction-requests" :: Nil JsonGet _ => { cc => - if (Props.getBool("transactionRequests_enabled", false)) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false)) { for { u <- cc.user ?~ UserNotLoggedIn _ <- Bank(bankId) ?~! {BankNotFound} @@ -1011,7 +1011,7 @@ trait APIMethods210 { } } - val getTransactionTypesIsPublic = Props.getBool("apiOptions.getTransactionTypesIsPublic", true) + val getTransactionTypesIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getTransactionTypesIsPublic", true) resourceDocs += ResourceDoc( createTransactionType, @@ -1064,7 +1064,7 @@ trait APIMethods210 { } - val getAtmsIsPublic = Props.getBool("apiOptions.getAtmsIsPublic", true) + val getAtmsIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getAtmsIsPublic", true) resourceDocs += ResourceDoc( getAtm, @@ -1108,7 +1108,7 @@ trait APIMethods210 { } } - val getBranchesIsPublic = Props.getBool("apiOptions.getBranchesIsPublic", true) + val getBranchesIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getBranchesIsPublic", true) resourceDocs += ResourceDoc( getBranch, @@ -1156,7 +1156,7 @@ trait APIMethods210 { } } - val getProductsIsPublic = Props.getBool("apiOptions.getProductsIsPublic", true) + val getProductsIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getProductsIsPublic", true) resourceDocs += ResourceDoc( @@ -1542,7 +1542,7 @@ trait APIMethods210 { for { u <- cc.user ?~ UserNotLoggedIn _ <- booleanToBox( - hasEntitlement("", u.userId, ApiRole.canUpdateConsumerRedirectUrl) || Props.getBool("consumers_enabled_by_default", false), + hasEntitlement("", u.userId, ApiRole.canUpdateConsumerRedirectUrl) || APIUtil.getPropsAsBoolValue("consumers_enabled_by_default", false), UserHasMissingRoles + CanUpdateConsumerRedirectUrl ) postJson <- tryo {json.extract[ConsumerRedirectUrlJSON]} ?~! InvalidJsonFormat @@ -1551,7 +1551,7 @@ trait APIMethods210 { //only the developer that created the Consumer should be able to edit it _ <- tryo(assert(consumer.createdByUserId.equals(cc.user.openOrThrowException(attemptedToOpenAnEmptyBox).userId)))?~! UserNoPermissionUpdateConsumer //update the redirectURL and isactive (set to false when change redirectUrl) field in consumer table - updatedConsumer <- Consumers.consumers.vend.updateConsumer(consumer.id.get, None, None, Some(Props.getBool("consumers_enabled_by_default", false)), None, None, None, None, Some(postJson.redirect_url), None) ?~! UpdateConsumerError + updatedConsumer <- Consumers.consumers.vend.updateConsumer(consumer.id.get, None, None, Some(APIUtil.getPropsAsBoolValue("consumers_enabled_by_default", false)), None, None, None, None, Some(postJson.redirect_url), None) ?~! UpdateConsumerError } yield { val json = JSONFactory210.createConsumerJSON(updatedConsumer) createdJsonResponse(Extraction.decompose(json)) diff --git a/src/main/scala/code/api/v3_0_0/APIMethods300.scala b/src/main/scala/code/api/v3_0_0/APIMethods300.scala index 0cff626941..eb695c3b5e 100644 --- a/src/main/scala/code/api/v3_0_0/APIMethods300.scala +++ b/src/main/scala/code/api/v3_0_0/APIMethods300.scala @@ -5,7 +5,7 @@ import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON._ import code.api.util.APIUtil.{canGetAtm, _} import code.api.util.ApiRole._ import code.api.util.ErrorMessages._ -import code.api.util.{ApiRole, CallContext, ErrorMessages} +import code.api.util.{APIUtil, ApiRole, CallContext, ErrorMessages} import code.api.v2_0_0.JSONFactory200 import code.api.v3_0_0.JSONFactory300._ import code.atms.Atms.AtmId @@ -962,7 +962,7 @@ trait APIMethods300 { - val getBranchesIsPublic = Props.getBool("apiOptions.getBranchesIsPublic", true) + val getBranchesIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getBranchesIsPublic", true) resourceDocs += ResourceDoc( getBranch, @@ -1096,7 +1096,7 @@ trait APIMethods300 { } } - val getAtmsIsPublic = Props.getBool("apiOptions.getAtmsIsPublic", true) + val getAtmsIsPublic = APIUtil.getPropsAsBoolValue("apiOptions.getAtmsIsPublic", true) resourceDocs += ResourceDoc( getAtm, diff --git a/src/main/scala/code/bankconnectors/Connector.scala b/src/main/scala/code/bankconnectors/Connector.scala index d5ca1caacb..c913ca1145 100644 --- a/src/main/scala/code/bankconnectors/Connector.scala +++ b/src/main/scala/code/bankconnectors/Connector.scala @@ -569,7 +569,7 @@ trait Connector extends MdcLoggable{ // i.e. if we are certain that saveTransaction will be honored immediately by the backend, then transaction_status_scheduler_delay // can be empty in the props file. Otherwise, the status will be set to STATUS_PENDING // and getTransactionRequestStatusesImpl needs to be run periodically to update the transaction request status. - if (Props.getLong("transaction_status_scheduler_delay").isEmpty ) + if (APIUtil.getPropsAsLongValue("transaction_status_scheduler_delay").isEmpty ) TransactionRequestStatus.COMPLETED else TransactionRequestStatus.PENDING diff --git a/src/main/scala/code/bankconnectors/KafkaMappedConnector.scala b/src/main/scala/code/bankconnectors/KafkaMappedConnector.scala index b5df4e19de..42ef1925a5 100644 --- a/src/main/scala/code/bankconnectors/KafkaMappedConnector.scala +++ b/src/main/scala/code/bankconnectors/KafkaMappedConnector.scala @@ -25,9 +25,10 @@ Berlin 13359, Germany import java.text.SimpleDateFormat import java.util.{Date, Locale, UUID} + import code.api.util.ErrorMessages._ import code.accountholder.AccountHolders -import code.api.util.{ErrorMessages, CallContext} +import code.api.util.{APIUtil, CallContext, ErrorMessages} import code.api.v2_1_0.TransactionRequestCommonBodyJSON import code.bankconnectors.vJune2017.AccountRule import code.bankconnectors.vMar2017.{InboundAdapterInfoInternal, KafkaMappedConnector_vMar2017} @@ -480,9 +481,9 @@ object KafkaMappedConnector extends Connector with KafkaHelper with MdcLoggable account <- getBankAccountType(bankId, accountId) } { spawn{ - val useMessageQueue = Props.getBool("messageQueue.updateBankAccountsTransaction", false) + val useMessageQueue = APIUtil.getPropsAsBoolValue("messageQueue.updateBankAccountsTransaction", false) val outDatedTransactions = Box!!account.lastUpdate match { - case Full(l) => now after time(l.getTime + hours(Props.getInt("messageQueue.updateTransactionsInterval", 1))) + case Full(l) => now after time(l.getTime + hours(APIUtil.getPropsAsIntValue("messageQueue.updateTransactionsInterval", 1))) case _ => true } //if(outDatedTransactions && useMessageQueue) { @@ -502,7 +503,7 @@ object KafkaMappedConnector extends Connector with KafkaHelper with MdcLoggable // Get one counterparty by the Counterparty Id override def getCounterpartyByCounterpartyId(counterpartyId: CounterpartyId): Box[CounterpartyTrait] = { - if (Props.getBool("get_counterparties_from_OBP_DB", true)) { + if (APIUtil.getPropsAsBoolValue("get_counterparties_from_OBP_DB", true)) { Counterparties.counterparties.vend.getCounterparty(counterpartyId.value) } else { val req = Map( @@ -527,7 +528,7 @@ object KafkaMappedConnector extends Connector with KafkaHelper with MdcLoggable override def getCounterpartyByIban(iban: String): Box[CounterpartyTrait] = { - if (Props.getBool("get_counterparties_from_OBP_DB", true)) { + if (APIUtil.getPropsAsBoolValue("get_counterparties_from_OBP_DB", true)) { Counterparties.counterparties.vend.getCounterpartyByIban(iban) } else { val req = Map( diff --git a/src/main/scala/code/bankconnectors/KafkaMappedConnector_JVMcompatible.scala b/src/main/scala/code/bankconnectors/KafkaMappedConnector_JVMcompatible.scala index 8658ce3f90..9bfb731486 100644 --- a/src/main/scala/code/bankconnectors/KafkaMappedConnector_JVMcompatible.scala +++ b/src/main/scala/code/bankconnectors/KafkaMappedConnector_JVMcompatible.scala @@ -666,9 +666,9 @@ object KafkaMappedConnector_JVMcompatible extends Connector with KafkaHelper wit account <- getBankAccountType(bankId, accountId) } { spawn{ - val useMessageQueue = Props.getBool("messageQueue.updateBankAccountsTransaction", false) + val useMessageQueue = APIUtil.getPropsAsBoolValue("messageQueue.updateBankAccountsTransaction", false) val outDatedTransactions = Box!!account.lastUpdate match { - case Full(l) => now after time(l.getTime + hours(Props.getInt("messageQueue.updateTransactionsInterval", 1))) + case Full(l) => now after time(l.getTime + hours(APIUtil.getPropsAsIntValue("messageQueue.updateTransactionsInterval", 1))) case _ => true } //if(outDatedTransactions && useMessageQueue) { diff --git a/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index 1b117efaf5..d0d8c593be 100644 --- a/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -265,9 +265,9 @@ object LocalMappedConnector extends Connector with MdcLoggable { account <- getBankAccount(bankId, accountId).map(_.asInstanceOf[MappedBankAccount]) } { Future{ - val useMessageQueue = Props.getBool("messageQueue.updateBankAccountsTransaction", false) + val useMessageQueue = APIUtil.getPropsAsBoolValue("messageQueue.updateBankAccountsTransaction", false) val outDatedTransactions = Box!!account.accountLastUpdate.get match { - case Full(l) => now after time(l.getTime + hours(Props.getInt("messageQueue.updateTransactionsInterval", 1))) + case Full(l) => now after time(l.getTime + hours(APIUtil.getPropsAsIntValue("messageQueue.updateTransactionsInterval", 1))) case _ => true } if(outDatedTransactions && useMessageQueue) { diff --git a/src/main/scala/code/bankconnectors/LocalRecordConnector.scala b/src/main/scala/code/bankconnectors/LocalRecordConnector.scala index 92ba5e630d..3abfae5abb 100644 --- a/src/main/scala/code/bankconnectors/LocalRecordConnector.scala +++ b/src/main/scala/code/bankconnectors/LocalRecordConnector.scala @@ -2,8 +2,9 @@ package code.bankconnectors import java.text.SimpleDateFormat import java.util.{Date, TimeZone, UUID} + import code.api.util.ErrorMessages._ -import code.api.util.CallContext +import code.api.util.{APIUtil, CallContext} import code.api.v2_1_0.TransactionRequestCommonBodyJSON import code.bankconnectors.vMar2017.InboundAdapterInfoInternal import code.branches.Branches.{Branch, BranchT} @@ -338,8 +339,8 @@ private object LocalRecordConnector extends Connector with MdcLoggable { private def updateAccountTransactions(bank: HostedBank, account: Account): Unit = { Future { - val useMessageQueue = Props.getBool("messageQueue.updateBankAccountsTransaction", false) - val outDatedTransactions = now after time(account.accountLastUpdate.get.getTime + hours(Props.getInt("messageQueue.updateTransactionsInterval", 1))) + val useMessageQueue = APIUtil.getPropsAsBoolValue("messageQueue.updateBankAccountsTransaction", false) + val outDatedTransactions = now after time(account.accountLastUpdate.get.getTime + hours(APIUtil.getPropsAsIntValue("messageQueue.updateTransactionsInterval", 1))) if(outDatedTransactions && useMessageQueue) { UpdatesRequestSender.sendMsg(UpdateBankAccount(account.accountNumber.get, bank.national_identifier.get)) } diff --git a/src/main/scala/code/bankconnectors/ObpJvmMappedConnector.scala b/src/main/scala/code/bankconnectors/ObpJvmMappedConnector.scala index 6b371c4325..1e7c459519 100644 --- a/src/main/scala/code/bankconnectors/ObpJvmMappedConnector.scala +++ b/src/main/scala/code/bankconnectors/ObpJvmMappedConnector.scala @@ -531,9 +531,9 @@ object ObpJvmMappedConnector extends Connector with MdcLoggable { account <- getBankAccountType(bankId, accountId) } { spawn{ - val useMessageQueue = Props.getBool("messageQueue.updateBankAccountsTransaction", false) + val useMessageQueue = APIUtil.getPropsAsBoolValue("messageQueue.updateBankAccountsTransaction", false) val outDatedTransactions = Box!!account.lastUpdate match { - case Full(l) => now after time(l.getTime + hours(Props.getInt("messageQueue.updateTransactionsInterval", 1))) + case Full(l) => now after time(l.getTime + hours(APIUtil.getPropsAsIntValue("messageQueue.updateTransactionsInterval", 1))) case _ => true } //if(outDatedTransactions && useMessageQueue) { diff --git a/src/main/scala/code/bankconnectors/vMar2017/KafkaMappedConnector_vMar2017.scala b/src/main/scala/code/bankconnectors/vMar2017/KafkaMappedConnector_vMar2017.scala index f625aea74d..34a8db90cc 100644 --- a/src/main/scala/code/bankconnectors/vMar2017/KafkaMappedConnector_vMar2017.scala +++ b/src/main/scala/code/bankconnectors/vMar2017/KafkaMappedConnector_vMar2017.scala @@ -25,10 +25,11 @@ Berlin 13359, Germany import java.text.SimpleDateFormat import java.util.{Date, Locale, UUID} + import code.api.util.ErrorMessages._ import code.accountholder.AccountHolders import code.api.util.APIUtil.MessageDoc -import code.api.util.{ErrorMessages, CallContext} +import code.api.util.{APIUtil, CallContext, ErrorMessages} import code.api.v2_1_0._ import code.bankconnectors._ import code.branches.Branches.{Branch, BranchT} @@ -890,7 +891,7 @@ trait KafkaMappedConnector_vMar2017 extends Connector with KafkaHelper with MdcL ) override def getCounterpartyByCounterpartyId(counterpartyId: CounterpartyId): Box[CounterpartyTrait] = { - if (Props.getBool("get_counterparties_from_OBP_DB", true)) { + if (APIUtil.getPropsAsBoolValue("get_counterparties_from_OBP_DB", true)) { Counterparties.counterparties.vend.getCounterparty(counterpartyId.value) } else { val req = OutboundCounterpartyByCounterpartyIdBase( @@ -946,7 +947,7 @@ trait KafkaMappedConnector_vMar2017 extends Connector with KafkaHelper with MdcL ) override def getCounterpartyByIban(iban: String): Box[CounterpartyTrait] = { - if (Props.getBool("get_counterparties_from_OBP_DB", true)) { + if (APIUtil.getPropsAsBoolValue("get_counterparties_from_OBP_DB", true)) { Counterparties.counterparties.vend.getCounterpartyByIban(iban) } else { val req = OutboundCounterpartyByIbanBase( diff --git a/src/main/scala/code/consumer/ConsumerProvider.scala b/src/main/scala/code/consumer/ConsumerProvider.scala index 5a3c506c0f..a70fcb6691 100644 --- a/src/main/scala/code/consumer/ConsumerProvider.scala +++ b/src/main/scala/code/consumer/ConsumerProvider.scala @@ -1,9 +1,11 @@ package code.consumer +import code.api.util.APIUtil import code.model.{AppType, Consumer, MappedConsumersProvider} import code.remotedata.RemotedataConsumers import net.liftweb.common.Box import net.liftweb.util.{Props, SimpleInjector} + import scala.concurrent.Future object Consumers extends SimpleInjector { @@ -11,7 +13,7 @@ object Consumers extends SimpleInjector { val consumers = new Inject(buildOne _) {} def buildOne: ConsumersProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedConsumersProvider case true => RemotedataConsumers // We will use Akka as a middleware } diff --git a/src/main/scala/code/customer/CustomerProvider.scala b/src/main/scala/code/customer/CustomerProvider.scala index b1e7320ba6..d96af73066 100644 --- a/src/main/scala/code/customer/CustomerProvider.scala +++ b/src/main/scala/code/customer/CustomerProvider.scala @@ -3,6 +3,7 @@ package code.customer import java.lang import java.util.Date +import code.api.util.APIUtil import code.model.{BankId, User} import code.remotedata.RemotedataCustomers import net.liftweb.common.Box @@ -15,7 +16,7 @@ object Customer extends SimpleInjector { val customerProvider = new Inject(buildOne _) {} def buildOne: CustomerProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedCustomerProvider case true => RemotedataCustomers // We will use Akka as a middleware } diff --git a/src/main/scala/code/entitlement/Entilement.scala b/src/main/scala/code/entitlement/Entilement.scala index c1d823936f..14db6afb09 100644 --- a/src/main/scala/code/entitlement/Entilement.scala +++ b/src/main/scala/code/entitlement/Entilement.scala @@ -1,6 +1,7 @@ package code.entitlement +import code.api.util.APIUtil import code.remotedata.RemotedataEntitlements import net.liftweb.common.Box import net.liftweb.util.{Props, SimpleInjector} @@ -12,7 +13,7 @@ object Entitlement extends SimpleInjector { val entitlement = new Inject(buildOne _) {} def buildOne: EntitlementProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedEntitlementsProvider case true => RemotedataEntitlements // We will use Akka as a middleware } diff --git a/src/main/scala/code/kafka/KafkaConfig.scala b/src/main/scala/code/kafka/KafkaConfig.scala index 6607aad551..dca6bf7c52 100644 --- a/src/main/scala/code/kafka/KafkaConfig.scala +++ b/src/main/scala/code/kafka/KafkaConfig.scala @@ -2,6 +2,7 @@ package code.kafka import java.util.UUID +import code.api.util.APIUtil import net.liftweb.util.Props import scala.concurrent.duration.{FiniteDuration, MILLISECONDS} @@ -13,7 +14,7 @@ trait KafkaConfig { val bootstrapServers = Props.get("kafka.bootstrap_hosts")openOr("localhost:9092") - val partitions = Props.getInt("kafka.partitions")openOr(10) + val partitions = APIUtil.getPropsAsIntValue("kafka.partitions", 10) val clientId = UUID.randomUUID().toString @@ -22,5 +23,5 @@ trait KafkaConfig { val autoOffsetResetConfig = "earliest" val maxWakeups = 50 //TODO should be less then container's timeout - val completionTimeout = FiniteDuration(Props.getInt("kafka.akka.timeout", 2)*1000 - 450, MILLISECONDS) + val completionTimeout = FiniteDuration(APIUtil.getPropsAsIntValue("kafka.akka.timeout", 2)*1000 - 450, MILLISECONDS) } \ No newline at end of file diff --git a/src/main/scala/code/metadata/comments/Comments.scala b/src/main/scala/code/metadata/comments/Comments.scala index 174fd75e91..27a5aaf54f 100644 --- a/src/main/scala/code/metadata/comments/Comments.scala +++ b/src/main/scala/code/metadata/comments/Comments.scala @@ -2,6 +2,7 @@ package code.metadata.comments import java.util.Date +import code.api.util.APIUtil import code.model._ import code.remotedata.RemotedataComments import net.liftweb.common.Box @@ -12,7 +13,7 @@ object Comments extends SimpleInjector { val comments = new Inject(buildOne _) {} def buildOne: Comments = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedComments case true => RemotedataComments // We will use Akka as a middleware } diff --git a/src/main/scala/code/metadata/counterparties/Counterparties.scala b/src/main/scala/code/metadata/counterparties/Counterparties.scala index 86bccb2c18..6259d29734 100644 --- a/src/main/scala/code/metadata/counterparties/Counterparties.scala +++ b/src/main/scala/code/metadata/counterparties/Counterparties.scala @@ -2,6 +2,7 @@ package code.metadata.counterparties import java.util.Date +import code.api.util.APIUtil import code.model._ import code.remotedata.RemotedataCounterparties import net.liftweb.common.Box @@ -12,7 +13,7 @@ object Counterparties extends SimpleInjector { val counterparties = new Inject(buildOne _) {} def buildOne: Counterparties = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MapperCounterparties case true => RemotedataCounterparties // We will use Akka as a middleware } diff --git a/src/main/scala/code/metadata/narrative/Narrative.scala b/src/main/scala/code/metadata/narrative/Narrative.scala index c33795d054..b821d25279 100644 --- a/src/main/scala/code/metadata/narrative/Narrative.scala +++ b/src/main/scala/code/metadata/narrative/Narrative.scala @@ -1,5 +1,6 @@ package code.metadata.narrative +import code.api.util.APIUtil import code.model.{AccountId, BankId, TransactionId} import code.remotedata.RemotedataNarratives import net.liftweb.util.{Props, SimpleInjector} @@ -9,7 +10,7 @@ object Narrative extends SimpleInjector { val narrative = new Inject(buildOne _) {} def buildOne: Narrative = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedNarratives case true => RemotedataNarratives // We will use Akka as a middleware } diff --git a/src/main/scala/code/metadata/tags/Tags.scala b/src/main/scala/code/metadata/tags/Tags.scala index 16f7e36c3a..09272c5e97 100644 --- a/src/main/scala/code/metadata/tags/Tags.scala +++ b/src/main/scala/code/metadata/tags/Tags.scala @@ -2,6 +2,7 @@ package code.metadata.tags import java.util.Date +import code.api.util.APIUtil import code.model._ import code.remotedata.RemotedataTags import net.liftweb.common.Box @@ -12,7 +13,7 @@ object Tags extends SimpleInjector { val tags = new Inject(buildOne _) {} def buildOne: Tags = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedTags case true => RemotedataTags // We will use Akka as a middleware } diff --git a/src/main/scala/code/metadata/transactionimages/TransactionImages.scala b/src/main/scala/code/metadata/transactionimages/TransactionImages.scala index 915adc1a96..d0f7b2ab86 100644 --- a/src/main/scala/code/metadata/transactionimages/TransactionImages.scala +++ b/src/main/scala/code/metadata/transactionimages/TransactionImages.scala @@ -2,6 +2,7 @@ package code.metadata.transactionimages import java.util.Date +import code.api.util.APIUtil import code.model._ import code.remotedata.RemotedataTransactionImages import net.liftweb.common.Box @@ -12,7 +13,7 @@ object TransactionImages extends SimpleInjector { val transactionImages = new Inject(buildOne _) {} def buildOne: TransactionImages = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MapperTransactionImages case true => RemotedataTransactionImages // We will use Akka as a middleware } diff --git a/src/main/scala/code/metadata/wheretags/WhereTags.scala b/src/main/scala/code/metadata/wheretags/WhereTags.scala index 5b9f5b7e14..ead796fbd4 100644 --- a/src/main/scala/code/metadata/wheretags/WhereTags.scala +++ b/src/main/scala/code/metadata/wheretags/WhereTags.scala @@ -2,6 +2,7 @@ package code.metadata.wheretags import java.util.Date +import code.api.util.APIUtil import code.model._ import code.remotedata.RemotedataWhereTags import net.liftweb.common.Box @@ -12,7 +13,7 @@ object WhereTags extends SimpleInjector { val whereTags = new Inject(buildOne _) {} def buildOne: WhereTags = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MapperWhereTags case true => RemotedataWhereTags // We will use Akka as a middleware } diff --git a/src/main/scala/code/metrics/APIMetrics.scala b/src/main/scala/code/metrics/APIMetrics.scala index c889975be0..5c37a48e98 100644 --- a/src/main/scala/code/metrics/APIMetrics.scala +++ b/src/main/scala/code/metrics/APIMetrics.scala @@ -2,6 +2,7 @@ package code.metrics import java.util.{Calendar, Date} +import code.api.util.APIUtil import code.bankconnectors.OBPQueryParam import code.remotedata.RemotedataMetrics import net.liftweb.util.{Props, SimpleInjector} @@ -11,11 +12,11 @@ object APIMetrics extends SimpleInjector { val apiMetrics = new Inject(buildOne _) {} def buildOne: APIMetrics = - Props.getBool("allow_elasticsearch", false) && - Props.getBool("allow_elasticsearch_metrics", false) match { + APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) && + APIUtil.getPropsAsBoolValue("allow_elasticsearch_metrics", false) match { // case false => MappedMetrics case false => - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedMetrics case true => RemotedataMetrics // We will use Akka as a middleware } diff --git a/src/main/scala/code/metrics/ConnectorMetricsProvider.scala b/src/main/scala/code/metrics/ConnectorMetricsProvider.scala index bea2a18647..488ddb5347 100644 --- a/src/main/scala/code/metrics/ConnectorMetricsProvider.scala +++ b/src/main/scala/code/metrics/ConnectorMetricsProvider.scala @@ -2,6 +2,7 @@ package code.metrics import java.util.{Calendar, Date} +import code.api.util.APIUtil import code.bankconnectors.OBPQueryParam import code.remotedata.RemotedataConnectorMetrics import net.liftweb.util.{Props, SimpleInjector} @@ -11,7 +12,7 @@ object ConnectorMetricsProvider extends SimpleInjector { val metrics = new Inject(buildOne _) {} def buildOne: ConnectorMetricsProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => ConnectorMetrics case true => RemotedataConnectorMetrics // We will use Akka as a middleware } diff --git a/src/main/scala/code/metrics/ElasticsearchMetrics.scala b/src/main/scala/code/metrics/ElasticsearchMetrics.scala index 2b9c077e58..504186b21e 100644 --- a/src/main/scala/code/metrics/ElasticsearchMetrics.scala +++ b/src/main/scala/code/metrics/ElasticsearchMetrics.scala @@ -2,6 +2,7 @@ package code.metrics import java.util.Date +import code.api.util.APIUtil import code.bankconnectors._ import code.search.elasticsearchMetrics import net.liftweb.mapper._ @@ -12,7 +13,7 @@ object ElasticsearchMetrics extends APIMetrics { val es = new elasticsearchMetrics override def saveMetric(userId: String, url: String, date: Date, duration: Long, userName: String, appName: String, developerEmail: String, consumerId: String, implementedByPartialFunction: String, implementedInVersion: String, verb: String, correlationId: String): Unit = { - if (Props.getBool("allow_elasticsearch", false) && Props.getBool("allow_elasticsearch_metrics", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) && APIUtil.getPropsAsBoolValue("allow_elasticsearch_metrics", false) ) { //TODO ,need to be fixed now add more parameters es.indexMetric(userId, url, date, duration, userName, appName, developerEmail, correlationId) } diff --git a/src/main/scala/code/model/OAuth.scala b/src/main/scala/code/model/OAuth.scala index 234553a9cf..08af699f8a 100644 --- a/src/main/scala/code/model/OAuth.scala +++ b/src/main/scala/code/model/OAuth.scala @@ -32,6 +32,7 @@ Berlin 13359, Germany package code.model import java.util.Date +import code.api.util.APIUtil import code.token.TokensProvider import code.consumer.{Consumers, ConsumersProvider} import code.model.AppType.{Mobile, Web} @@ -309,7 +310,7 @@ class Consumer extends LongKeyedMapper[Consumer] with CreatedUpdated{ object key extends MappedString(this, 250) object secret extends MappedString(this, 250) object isActive extends MappedBoolean(this){ - override def defaultValue = Props.getBool("consumers_enabled_by_default", false) + override def defaultValue = APIUtil.getPropsAsBoolValue("consumers_enabled_by_default", false) } object name extends MappedString(this, 100){ override def validations = minLength3(this) _ :: super.validations diff --git a/src/main/scala/code/model/dataAccess/AuthUser.scala b/src/main/scala/code/model/dataAccess/AuthUser.scala index 82589826f6..453b0cacab 100644 --- a/src/main/scala/code/model/dataAccess/AuthUser.scala +++ b/src/main/scala/code/model/dataAccess/AuthUser.scala @@ -257,7 +257,7 @@ import net.liftweb.util.Helpers._ override def signupFields = List(firstName, lastName, email, username, password) // If we want to validate email addresses set this to false - override def skipEmailValidation = Props.getBool("authUser.skipEmailValidation", true) + override def skipEmailValidation = APIUtil.getPropsAsBoolValue("authUser.skipEmailValidation", true) override def loginXhtml = { val loginXml = Templates(List("templates-hidden","_login")).map({ @@ -516,7 +516,7 @@ import net.liftweb.util.Helpers._ case Full(user) if (user.getProvider() != Props.get("hostname","")) => connector match { - case Helper.matchAnyKafka() if ( Props.getBool("kafka.user.authentication", false) && + case Helper.matchAnyKafka() if ( APIUtil.getPropsAsBoolValue("kafka.user.authentication", false) && ! LoginAttempt.userIsLocked(username) ) => val userId = for { kafkaUser <- getUserFromConnector(username, password) kafkaUserId <- tryo{kafkaUser.user} } yield { @@ -529,7 +529,7 @@ import net.liftweb.util.Helpers._ LoginAttempt.incrementBadLoginAttempts(username) Empty } - case "obpjvm" if ( Props.getBool("obpjvm.user.authentication", false) && + case "obpjvm" if ( APIUtil.getPropsAsBoolValue("obpjvm.user.authentication", false) && ! LoginAttempt.userIsLocked(username) ) => val userId = for { obpjvmUser <- getUserFromConnector(username, password) obpjvmUserId <- tryo{obpjvmUser.user} } yield { @@ -720,8 +720,8 @@ import net.liftweb.util.Helpers._ // If not found locally, try to authenticate user via Kafka, if enabled in props case Empty if (connector.startsWith("kafka") || connector == "obpjvm") && - (Props.getBool("kafka.user.authentication", false) || - Props.getBool("obpjvm.user.authentication", false)) => + (APIUtil.getPropsAsBoolValue("kafka.user.authentication", false) || + APIUtil.getPropsAsBoolValue("obpjvm.user.authentication", false)) => val preLoginState = capturePreLoginState() info("login redir: " + loginRedirect.get) val redir = loginRedirect.get match { diff --git a/src/main/scala/code/model/dataAccess/MongoConfig.scala b/src/main/scala/code/model/dataAccess/MongoConfig.scala index 39b12233d6..721eaa700a 100644 --- a/src/main/scala/code/model/dataAccess/MongoConfig.scala +++ b/src/main/scala/code/model/dataAccess/MongoConfig.scala @@ -31,6 +31,7 @@ Berlin 13359, Germany */ package code.model.dataAccess +import code.api.util.APIUtil import code.metadata.narrative.OBPNarrativeInit import code.metadata.wheretags.OBPWhereTagInit import com.mongodb.MongoClient @@ -49,7 +50,7 @@ object MongoConfig { val srvr = new ServerAddress( Props.get("mongo.host", "localhost"), - Props.getInt("mongo.port", 27017) + APIUtil.getPropsAsIntValue("mongo.port", 27017) ) val defaultDatabase = Props.mode match { case Props.RunModes.Test => "test" diff --git a/src/main/scala/code/nonce/NonceProvider.scala b/src/main/scala/code/nonce/NonceProvider.scala index 6aa9d5d013..5e3043e1df 100644 --- a/src/main/scala/code/nonce/NonceProvider.scala +++ b/src/main/scala/code/nonce/NonceProvider.scala @@ -2,6 +2,7 @@ package code.nonce import java.util.Date +import code.api.util.APIUtil import code.model.{MappedNonceProvider, Nonce} import code.remotedata.RemotedataNonces import net.liftweb.common.Box @@ -15,7 +16,7 @@ object Nonces extends SimpleInjector { val nonces = new Inject(buildOne _) {} def buildOne: NoncesProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedNonceProvider case true => RemotedataNonces // We will use Akka as a middleware } diff --git a/src/main/scala/code/search/search.scala b/src/main/scala/code/search/search.scala index 8007479ace..4ac566c3c8 100644 --- a/src/main/scala/code/search/search.scala +++ b/src/main/scala/code/search/search.scala @@ -14,11 +14,11 @@ import Defaults._ import net.liftweb.json import java.util.Date +import code.api.util.APIUtil import org.elasticsearch.common.settings.Settings import com.sksamuel.elastic4s.TcpClient import com.sksamuel.elastic4s.mappings.FieldType._ import com.sksamuel.elastic4s.ElasticDsl._ - import net.liftweb.http.provider.HTTPCookie import net.liftweb.json.JsonAST @@ -44,7 +44,7 @@ class elasticsearch extends MdcLoggable { def searchProxy(userId: String, queryString: String): LiftResponse = { //println("-------------> " + esHost + ":" + esPortHTTP + "/" + esIndex + "/" + queryString) - if (Props.getBool("allow_elasticsearch", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) ) { val request = constructQuery(userId, getParameters(queryString)) val response = getAPIResponse(request) ESJsonResponse(response.body, ("Access-Control-Allow-Origin", "*") :: Nil, Nil, response.code) @@ -54,7 +54,7 @@ class elasticsearch extends MdcLoggable { } def searchProxyV300(userId: String, uri: String, body: String): LiftResponse = { - if (Props.getBool("allow_elasticsearch", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) ) { val httpHost = ("http://" + esHost + ":" + esPortHTTP) val esUrl = s"${httpHost}${uri.replaceAll("\"" , "")}" logger.debug(esUrl) @@ -151,7 +151,7 @@ class elasticsearchMetrics extends elasticsearch { var client:TcpClient = null - if (Props.getBool("allow_elasticsearch", false) && Props.getBool("allow_elasticsearch_metrics", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) && APIUtil.getPropsAsBoolValue("allow_elasticsearch_metrics", false) ) { val settings = Settings.builder().put("cluster.name", Props.get("es.cluster.name", "elasticsearch")).build() client = TcpClient.transport(settings, "elasticsearch://" + esHost + ":" + esPortTCP + ",") try { @@ -175,7 +175,7 @@ class elasticsearchMetrics extends elasticsearch { } def indexMetric(userId: String, url: String, date: Date, duration: Long, userName: String, appName: String, developerEmail: String, correlationId: String) { - if (Props.getBool("allow_elasticsearch", false) && Props.getBool("allow_elasticsearch_metrics", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) && APIUtil.getPropsAsBoolValue("allow_elasticsearch_metrics", false) ) { try { client.execute { indexInto(esIndex / "request") fields ( @@ -204,7 +204,7 @@ class elasticsearchWarehouse extends elasticsearch { override val esPortHTTP = Props.get("es.warehouse.port.http","9200") override val esIndex = Props.get("es.warehouse.index", "warehouse") var client:TcpClient = null - if (Props.getBool("allow_elasticsearch", false) && Props.getBool("allow_elasticsearch_warehouse", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) && APIUtil.getPropsAsBoolValue("allow_elasticsearch_warehouse", false) ) { val settings = Settings.builder().put("cluster.name", Props.get("es.cluster.name", "elasticsearch")).build() client = TcpClient.transport(settings, "elasticsearch://" + esHost + ":" + esPortTCP + ",") } @@ -221,7 +221,7 @@ class elasticsearchOBP extends elasticsearch { var client:TcpClient = null - if (Props.getBool("allow_elasticsearch", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) ) { client = TcpClient.transport("elasticsearch://" + esHost + ":" + esPortTCP + ",") client.execute { @@ -251,7 +251,7 @@ class elasticsearchOBP extends elasticsearch { // Index a Transaction // Put into a index that has the viewId and version in the name. def indexTransaction(viewId: String, transaction: TransactionJSON) { - if (Props.getBool("allow_elasticsearch", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) ) { client.execute { index into transactionIndex / "transaction" fields ( "viewId" -> viewId, @@ -264,7 +264,7 @@ class elasticsearchOBP extends elasticsearch { // Index an Account // Put into a index that has the viewId and version in the name. def indexAccount(viewId: String, account: AccountJSON) { - if (Props.getBool("allow_elasticsearch", false) ) { + if (APIUtil.getPropsAsBoolValue("allow_elasticsearch", false) ) { client.execute { index into accountIndex / "account" fields ( "viewId" -> viewId, diff --git a/src/main/scala/code/snippet/ConsumerRegistration.scala b/src/main/scala/code/snippet/ConsumerRegistration.scala index 3a1959dc06..870fad3624 100644 --- a/src/main/scala/code/snippet/ConsumerRegistration.scala +++ b/src/main/scala/code/snippet/ConsumerRegistration.scala @@ -31,7 +31,7 @@ Berlin 13359, Germany */ package code.snippet -import code.api.util.ErrorMessages +import code.api.util.{APIUtil, ErrorMessages} import code.model._ import code.model.dataAccess.AuthUser import net.liftweb.common.{Empty, Full} @@ -202,7 +202,7 @@ class ConsumerRegistration extends MdcLoggable { } yield { // Only send consumer key / secret by email if we explicitly want that. - val sendSensitive : Boolean = Props.getBool("mail.api.consumer.registered.notification.send.sensistive", false) + val sendSensitive : Boolean = APIUtil.getPropsAsBoolValue("mail.api.consumer.registered.notification.send.sensistive", false) val consumerKeyOrMessage : String = if (sendSensitive) registered.key.get else "Configured so sensitive data is not sent by email (Consumer Key)." val consumerSecretOrMessage : String = if (sendSensitive) registered.secret.get else "Configured so sensitive data is not sent by email (Consumer Secret)." diff --git a/src/main/scala/code/snippet/Login.scala b/src/main/scala/code/snippet/Login.scala index 4ca0f57808..1895bf42d9 100644 --- a/src/main/scala/code/snippet/Login.scala +++ b/src/main/scala/code/snippet/Login.scala @@ -33,6 +33,7 @@ Berlin 13359, Germany package code.snippet import code.api.OpenIdConnectConfig +import code.api.util.APIUtil import code.model.dataAccess.{Admin, AuthUser} import net.liftweb.http.{S, SHtml} import net.liftweb.util.Helpers._ @@ -96,7 +97,7 @@ class Login { def openIdConnectButton : CssSel = { - if(Props.getBool("allow_openidconnect", false)){ + if(APIUtil.getPropsAsBoolValue("allow_openidconnect", false)){ val config = OpenIdConnectConfig.get() var onclick = "getCode();" if (config.url_login.endsWith(".js") ) @@ -116,7 +117,7 @@ class Login { } def openIdConnectScripts : CssSel = { - if(Props.getBool("allow_openidconnect", false)){ + if(APIUtil.getPropsAsBoolValue("allow_openidconnect", false)){ val config = OpenIdConnectConfig.get() val url = config.url_login diff --git a/src/main/scala/code/token/TokenProvider.scala b/src/main/scala/code/token/TokenProvider.scala index f793aaad10..1a1251932d 100644 --- a/src/main/scala/code/token/TokenProvider.scala +++ b/src/main/scala/code/token/TokenProvider.scala @@ -2,10 +2,12 @@ package code.token import java.util.Date +import code.api.util.APIUtil import code.model.{MappedTokenProvider, Token, TokenType} import code.remotedata.RemotedataTokens import net.liftweb.common.Box import net.liftweb.util.{Props, SimpleInjector} + import scala.concurrent.Future object Tokens extends SimpleInjector { @@ -13,7 +15,7 @@ object Tokens extends SimpleInjector { val tokens = new Inject(buildOne _) {} def buildOne: TokensProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedTokenProvider case true => RemotedataTokens // We will use Akka as a middleware } diff --git a/src/main/scala/code/transactionChallenge/ExpectedChallengeAnswer.scala b/src/main/scala/code/transactionChallenge/ExpectedChallengeAnswer.scala index c30399a651..24bd256889 100644 --- a/src/main/scala/code/transactionChallenge/ExpectedChallengeAnswer.scala +++ b/src/main/scala/code/transactionChallenge/ExpectedChallengeAnswer.scala @@ -1,5 +1,6 @@ package code.transactionChallenge +import code.api.util.APIUtil import code.remotedata.RemotedataExpectedChallengeAnswerProvider import net.liftweb.util.{Props, SimpleInjector} @@ -17,7 +18,7 @@ object ExpectedChallengeAnswer extends SimpleInjector { val expectedChallengeAnswerProvider = new Inject(buildOne _) {} def buildOne: ExpectedChallengeAnswerProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedExpectedChallengeAnswerProvider case true => RemotedataExpectedChallengeAnswerProvider // We will use Akka as a middleware } diff --git a/src/main/scala/code/transactionrequests/TransactionRequests.scala b/src/main/scala/code/transactionrequests/TransactionRequests.scala index 7338bd53d2..49ccbc06c4 100644 --- a/src/main/scala/code/transactionrequests/TransactionRequests.scala +++ b/src/main/scala/code/transactionrequests/TransactionRequests.scala @@ -3,6 +3,7 @@ package code.transactionrequests import java.util.Date +import code.api.util.APIUtil import code.api.v2_1_0.TransactionRequestCommonBodyJSON import code.metadata.counterparties.CounterpartyTrait import code.model._ @@ -84,7 +85,7 @@ object TransactionRequests extends SimpleInjector { def buildOne: TransactionRequestProvider = Props.get("transactionRequests_connector", "mapped") match { - case "mapped" => Props.getBool("use_akka", false) match { + case "mapped" => APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedTransactionRequestProvider case true => RemotedataTransactionRequests // We will use Akka as a middleware } diff --git a/src/main/scala/code/usercustomerlinks/UserCustomerLink.scala b/src/main/scala/code/usercustomerlinks/UserCustomerLink.scala index 39218bec57..d04c14af2e 100644 --- a/src/main/scala/code/usercustomerlinks/UserCustomerLink.scala +++ b/src/main/scala/code/usercustomerlinks/UserCustomerLink.scala @@ -2,6 +2,7 @@ package code.usercustomerlinks import java.util.Date +import code.api.util.APIUtil import code.remotedata.RemotedataUserCustomerLinks import net.liftweb.common.Box import net.liftweb.util.{Props, SimpleInjector} @@ -12,7 +13,7 @@ object UserCustomerLink extends SimpleInjector { val userCustomerLink = new Inject(buildOne _) {} def buildOne: UserCustomerLinkProvider = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MappedUserCustomerLinkProvider case true => RemotedataUserCustomerLinks // We will use Akka as a middleware } diff --git a/src/main/scala/code/users/Users.scala b/src/main/scala/code/users/Users.scala index 7eafcbe5c6..8443afd995 100644 --- a/src/main/scala/code/users/Users.scala +++ b/src/main/scala/code/users/Users.scala @@ -1,5 +1,6 @@ package code.users +import code.api.util.APIUtil import code.entitlement.Entitlement import code.model.User import code.model.dataAccess.{ResourceUser, ResourceUserCaseClass} @@ -15,7 +16,7 @@ object Users extends SimpleInjector { val users = new Inject(buildOne _) {} def buildOne: Users = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => LiftUsers case true => RemotedataUsers // We will use Akka as a middleware } diff --git a/src/main/scala/code/util/UUIDString.scala b/src/main/scala/code/util/UUIDString.scala index 2678408291..e643533306 100644 --- a/src/main/scala/code/util/UUIDString.scala +++ b/src/main/scala/code/util/UUIDString.scala @@ -1,5 +1,6 @@ package code.util +import code.api.util.APIUtil import net.liftweb.mapper.{MappedString, Mapper} import net.liftweb.util.Props @@ -12,20 +13,20 @@ class UUIDString [T <: Mapper[T]](override val fieldOwner : T) extends MappedStr object UUIDString { // We use 44 as a default because base64 encoding of sha256 is 44 characters long - val MaxLength = Props.getInt("uuid_string.length", 44) + val MaxLength = APIUtil.getPropsAsIntValue("uuid_string.length", 44) } class MediumString [T <: Mapper[T]](override val fieldOwner : T) extends MappedString(fieldOwner, MediumString.MaxLength) object MediumString { - val MaxLength = Props.getInt("medium_string.length", 20) + val MaxLength = APIUtil.getPropsAsIntValue("medium_string.length", 20) } class AccountIdString [T <: Mapper[T]](override val fieldOwner : T) extends MappedString(fieldOwner, AccountIdString.MaxLength) object AccountIdString { - val MaxLength = Props.getInt("account_id.length", 64) + val MaxLength = APIUtil.getPropsAsIntValue("account_id.length", 64) } @@ -36,5 +37,5 @@ So we can store a time of day without the date e.g. 23:33 - but also go past mid class TwentyFourHourClockString [T <: Mapper[T]](override val fieldOwner : T) extends MappedString(fieldOwner, TwentyFourHourClockString.MaxLength) object TwentyFourHourClockString { - val MaxLength = Props.getInt("time_string.length", 5) + val MaxLength = APIUtil.getPropsAsIntValue("time_string.length", 5) } \ No newline at end of file diff --git a/src/main/scala/code/views/MapperViews.scala b/src/main/scala/code/views/MapperViews.scala index ffce892408..8c577c076c 100644 --- a/src/main/scala/code/views/MapperViews.scala +++ b/src/main/scala/code/views/MapperViews.scala @@ -3,7 +3,7 @@ package code.views import bootstrap.liftweb.ToSchemify import code.accountholder.{AccountHolders, MapperAccountHolders} import code.api.APIFailure -import code.api.util.ApiRole +import code.api.util.{APIUtil, ApiRole} import code.model.dataAccess.ViewImpl.create import code.model.dataAccess.{ResourceUser, ViewImpl, ViewPrivileges} import code.model.{CreateViewJson, Permission, UpdateViewJSON, User, _} @@ -11,6 +11,7 @@ import net.liftweb.common._ import net.liftweb.mapper.{By, Schemifier} import net.liftweb.util.Helpers._ import code.api.util.ErrorMessages._ + import scala.collection.immutable.List import code.util.Helper.MdcLoggable import net.liftweb.util.Props @@ -27,8 +28,8 @@ object MapperViews extends Views with MdcLoggable { Schemifier.schemify(true, Schemifier.infoF _, ToSchemify.modelsRemotedata: _*) - val ALLOW_PUBLIC_VIEWS: Boolean = Props.getBool("allow_public_views").openOr(false) - val ALLOW_FIREHOSE_VIEWS: Boolean = Props.getBool("allow_firehose_views").openOr(false) + val ALLOW_PUBLIC_VIEWS: Boolean = APIUtil.getPropsAsBoolValue("allow_public_views", false) + val ALLOW_FIREHOSE_VIEWS: Boolean = APIUtil.getPropsAsBoolValue("allow_firehose_views", false) def permissions(account : BankIdAccountId) : List[Permission] = { diff --git a/src/main/scala/code/views/Views.scala b/src/main/scala/code/views/Views.scala index c0d348c857..eaba922382 100644 --- a/src/main/scala/code/views/Views.scala +++ b/src/main/scala/code/views/Views.scala @@ -1,5 +1,6 @@ package code.views +import code.api.util.APIUtil import code.model.{CreateViewJson, Permission, _} import code.remotedata.RemotedataViews import net.liftweb.common.Box @@ -14,7 +15,7 @@ object Views extends SimpleInjector { //TODO Remove MapperViews when Remotedata is optimized and stable def buildOne: Views = - Props.getBool("use_akka", false) match { + APIUtil.getPropsAsBoolValue("use_akka", false) match { case false => MapperViews case true => RemotedataViews // We will use Akka as a middleware } diff --git a/src/test/scala/RunWebApp.scala b/src/test/scala/RunWebApp.scala index b7a14eb14f..904f21383a 100644 --- a/src/test/scala/RunWebApp.scala +++ b/src/test/scala/RunWebApp.scala @@ -29,12 +29,13 @@ Berlin 13359, Germany Ayoub Benali: ayoub AT tesobe DOT com */ +import code.api.util.APIUtil import net.liftweb.util.Props import org.eclipse.jetty.server.Server import org.eclipse.jetty.webapp.WebAppContext object RunWebApp extends App { - val server = new Server(Props.getInt("dev.port", 8080)) + val server = new Server(APIUtil.getPropsAsIntValue("dev.port", 8080)) val context = new WebAppContext() context.setServer(server) diff --git a/src/test/scala/code/TestServer.scala b/src/test/scala/code/TestServer.scala index 94d3c9a62a..b0c3915461 100644 --- a/src/test/scala/code/TestServer.scala +++ b/src/test/scala/code/TestServer.scala @@ -1,5 +1,6 @@ package code +import code.api.util.APIUtil import org.eclipse.jetty.server.Server import org.eclipse.jetty.webapp.WebAppContext @@ -7,9 +8,9 @@ object TestServer { import net.liftweb.util.Props val host = "localhost" - val port = Props.getInt("tests.port",8000) + val port = APIUtil.getPropsAsIntValue("tests.port",8000) val externalHost = Props.get("external.hostname") - val externalPort = Props.getInt("external.port") + val externalPort = APIUtil.getPropsAsIntValue("external.port") val server = new Server(port) val context = new WebAppContext() diff --git a/src/test/scala/code/api/gateWayloginTest.scala b/src/test/scala/code/api/gateWayloginTest.scala index 59c9165cf2..eebb5c9e8d 100644 --- a/src/test/scala/code/api/gateWayloginTest.scala +++ b/src/test/scala/code/api/gateWayloginTest.scala @@ -1,6 +1,6 @@ package code.api -import code.api.util.ErrorMessages +import code.api.util.{APIUtil, ErrorMessages} import code.bankconnectors.vJune2017.InboundAccountJune2017 import code.bankconnectors.vMar2017.InboundStatusMessage import code.setup.{APIResponse, DefaultUsers, ServerSetup} @@ -95,7 +95,7 @@ class gateWayloginTest extends ServerSetup with BeforeAndAfter with DefaultUsers def gatewayLoginNonBlockingRequest = baseRequest / "obp" / "v3.0.0" / "users" / "current" / "customers" feature("GatewayLogin in a BLOCKING way") { - Props.getBool("allow_gateway_login", false) match { + APIUtil.getPropsAsBoolValue("allow_gateway_login", false) match { case true => scenario("Missing parameter token in a blocking way") { When("We try to login without parameter token in a Header") @@ -134,7 +134,7 @@ class gateWayloginTest extends ServerSetup with BeforeAndAfter with DefaultUsers } feature("GatewayLogin in a NON BLOCKING way") { - Props.getBool("allow_gateway_login", false) match { + APIUtil.getPropsAsBoolValue("allow_gateway_login", false) match { case true => scenario("Missing parameter token in a blocking way") { When("We try to login without parameter token in a Header") diff --git a/src/test/scala/code/api/v1_2_1/API1_2_1Test.scala b/src/test/scala/code/api/v1_2_1/API1_2_1Test.scala index 95355b1075..edf435684e 100644 --- a/src/test/scala/code/api/v1_2_1/API1_2_1Test.scala +++ b/src/test/scala/code/api/v1_2_1/API1_2_1Test.scala @@ -667,7 +667,7 @@ class API1_2_1Test extends User1AllPrivileges with DefaultUsers with PrivateUser TODO check we have equivelent tests in Create Transaction Request tests - if (Props.getBool("payments_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("payments_enabled", false) == false) { ignore("we make a payment", Payments) {} } else { scenario("we make a payment", Payments) { diff --git a/src/test/scala/code/api/v1_4_0/TransactionRequestsTest.scala b/src/test/scala/code/api/v1_4_0/TransactionRequestsTest.scala index a855489cad..f59c9f5164 100644 --- a/src/test/scala/code/api/v1_4_0/TransactionRequestsTest.scala +++ b/src/test/scala/code/api/v1_4_0/TransactionRequestsTest.scala @@ -1,5 +1,6 @@ package code.api.v1_4_0 +import code.api.util.APIUtil import code.api.util.APIUtil.OAuth._ import code.api.v1_2_1.AmountOfMoneyJsonV121 import code.api.v1_4_0.JSONFactory1_4_0._ @@ -29,7 +30,7 @@ class TransactionRequestsTest extends V140ServerSetup with DefaultUsers { }) } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request without challenge", TransactionRequest) {} } else { scenario("we create a transaction request without challenge", TransactionRequest) { @@ -159,7 +160,7 @@ class TransactionRequestsTest extends V140ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request with a challenge", TransactionRequest) {} } else { scenario("we create a transaction request with a challenge", TransactionRequest) { diff --git a/src/test/scala/code/api/v2_0_0/TransactionRequestsTest.scala b/src/test/scala/code/api/v2_0_0/TransactionRequestsTest.scala index b107b325c3..541cc7c3b8 100644 --- a/src/test/scala/code/api/v2_0_0/TransactionRequestsTest.scala +++ b/src/test/scala/code/api/v2_0_0/TransactionRequestsTest.scala @@ -2,7 +2,7 @@ package code.api.v2_0_0 import code.api.util.APIUtil.OAuth._ import code.api.util.ApiRole._ -import code.api.util.ErrorMessages +import code.api.util.{APIUtil, ErrorMessages} import code.api.v1_2_1.AmountOfMoneyJsonV121 import code.api.v1_4_0.JSONFactory1_4_0.{ChallengeAnswerJSON, TransactionRequestAccountJsonV140} import code.bankconnectors.Connector @@ -33,7 +33,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { } // No challenge, No FX (same currencies) - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request with a user who doesn't have access to owner view but has CanCreateAnyTransactionRequest at BANK_ID", TransactionRequest) {} } else { scenario("we create a transaction request with a user who doesn't have access to owner view but has CanCreateAnyTransactionRequest at BANK_ID", TransactionRequest) { @@ -182,7 +182,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { // No challenge, No FX (same currencies) - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request without challenge, no FX (same currencies)", TransactionRequest) {} } else { scenario("we create a transaction request without challenge, no FX (same currencies)", TransactionRequest) { @@ -320,7 +320,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request with a user without owner view access", TransactionRequest) {} } else { scenario("we create a transaction request with a user without owner view access", TransactionRequest) { @@ -367,7 +367,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request with a user who doesn't have access to owner view but has CanCreateAnyTransactionRequest at a different BANK_ID", TransactionRequest) {} } else { scenario("we create a transaction request with a user who doesn't have access to owner view but has CanCreateAnyTransactionRequest at a different BANK_ID", TransactionRequest) { @@ -428,7 +428,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { } // No challenge, with FX - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create an FX transaction request without challenge, with FX (different currencies)", TransactionRequest) {} } else { scenario("we create an FX transaction request without challenge, with FX (different currencies)", TransactionRequest) { @@ -640,7 +640,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { // With challenge, No FX (Same currencies) - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create a transaction request with a challenge, same currencies", TransactionRequest) {} } else { scenario("we create a transaction request with a challenge", TransactionRequest) { @@ -811,7 +811,7 @@ class TransactionRequestsTest extends V200ServerSetup with DefaultUsers { // With Challenge, with FX - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("we create an FX transaction request with challenge", TransactionRequest) {} } else { scenario("we create an FX transaction request with challenge", TransactionRequest) { diff --git a/src/test/scala/code/api/v2_1_0/TransactionRequestsTest.scala b/src/test/scala/code/api/v2_1_0/TransactionRequestsTest.scala index 6defe1ed40..4dbd0aefd9 100644 --- a/src/test/scala/code/api/v2_1_0/TransactionRequestsTest.scala +++ b/src/test/scala/code/api/v2_1_0/TransactionRequestsTest.scala @@ -1,11 +1,12 @@ package code.api.v2_1_0 import java.util.UUID + import code.api.util.ErrorMessages._ import code.api.ChargePolicy import code.api.util.APIUtil.OAuth._ import code.api.util.ApiRole.CanCreateAnyTransactionRequest -import code.api.util.ErrorMessages +import code.api.util.{APIUtil, ErrorMessages} import code.api.v1_2_1.AmountOfMoneyJsonV121 import code.api.v1_4_0.JSONFactory1_4_0.{ChallengeAnswerJSON, TransactionRequestAccountJsonV140} import code.api.v2_0_0.TransactionRequestBodyJsonV200 @@ -292,7 +293,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { feature("Security Tests: permissions, roles, views...") { - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No login user", TransactionRequest) {} } else { scenario("No login user", TransactionRequest) { @@ -315,7 +316,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No owner view , No CanCreateAnyTransactionRequest role", TransactionRequest) {} } else { scenario("No owner view, No CanCreateAnyTransactionRequest role", TransactionRequest) { @@ -336,7 +337,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No owner view, With CanCreateAnyTransactionRequest role", TransactionRequest) {} } else { scenario("No owner view, With CanCreateAnyTransactionRequest role", TransactionRequest) { @@ -357,7 +358,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("Invalid transactionRequestType", TransactionRequest) {} } else { scenario("Invalid transactionRequestType", TransactionRequest) { @@ -386,7 +387,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { feature("we can create transaction requests -- SANDBOX_TAN") { - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, No FX (same currencies)", TransactionRequest) {} } else { scenario("No challenge, No FX (same currencies)", TransactionRequest) { @@ -416,7 +417,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, With FX ", TransactionRequest) {} } else { scenario("No challenge, With FX ", TransactionRequest) { @@ -456,7 +457,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, No FX", TransactionRequest) {} } else { scenario("With challenge, No FX ", TransactionRequest) { @@ -502,7 +503,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, With FX ", TransactionRequest) {} } else { scenario("With challenge, With FX ", TransactionRequest) { @@ -555,7 +556,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { feature("we can create transaction requests -- FREE_FORM") { - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, No FX ", TransactionRequest) {} } else { scenario("No challenge, No FX ", TransactionRequest) { @@ -585,7 +586,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, With FX ", TransactionRequest) {} } else { scenario("No challenge, With FX ", TransactionRequest) { @@ -625,7 +626,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, No FX", TransactionRequest) {} } else { scenario("With challenge, No FX ", TransactionRequest) { @@ -671,7 +672,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, With FX ", TransactionRequest) {} } else { scenario("With challenge, With FX ", TransactionRequest) { @@ -724,7 +725,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { feature("we can create transaction requests -- SEPA") { - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, No FX ", TransactionRequest) {} } else { scenario("No challenge, No FX ", TransactionRequest) { @@ -754,7 +755,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, With FX ", TransactionRequest) {} } else { scenario("No challenge, With FX ", TransactionRequest) { @@ -794,7 +795,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, No FX ", TransactionRequest) {} } else { scenario("With challenge, No FX ", TransactionRequest) { @@ -840,7 +841,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, With FX ", TransactionRequest) {} } else { scenario("With challenge, With FX ", TransactionRequest) { @@ -893,7 +894,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { feature("we can create transaction requests -- COUNTERPARTY") { - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, No FX ", TransactionRequest) {} } else { scenario("No challenge, No FX ", TransactionRequest) { @@ -923,7 +924,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("No challenge, With FX ", TransactionRequest) {} } else { scenario("No challenge, With FX ", TransactionRequest) { @@ -963,7 +964,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, No FX ", TransactionRequest) {} } else { scenario("With challenge, No FX ", TransactionRequest) { @@ -1009,7 +1010,7 @@ class TransactionRequestsTest extends V210ServerSetup with DefaultUsers { } } - if (Props.getBool("transactionRequests_enabled", false) == false) { + if (APIUtil.getPropsAsBoolValue("transactionRequests_enabled", false) == false) { ignore("With challenge, With FX", TransactionRequest) {} } else { scenario("With challenge, With FX", TransactionRequest) { diff --git a/src/test/scala/code/bankaccountcreation/BankAccountCreationListenerTest.scala b/src/test/scala/code/bankaccountcreation/BankAccountCreationListenerTest.scala index 11301d0426..09574a1b81 100644 --- a/src/test/scala/code/bankaccountcreation/BankAccountCreationListenerTest.scala +++ b/src/test/scala/code/bankaccountcreation/BankAccountCreationListenerTest.scala @@ -1,6 +1,7 @@ package code.bankaccountcreation import code.accountholder.AccountHolders +import code.api.util.APIUtil import code.api.util.ErrorMessages._ import code.model.{BankId, User} import code.views.Views @@ -59,7 +60,7 @@ class BankAccountCreationListenerTest extends ServerSetup with DefaultConnectorT AccountHolders.accountHolders.vend.getAccountHolders(BankId(expectedBankId), createdAccount.accountId) should equal(Set(user)) } - if (Props.getBool("messageQueue.createBankAccounts", false) == false) { + if (APIUtil.getPropsAsBoolValue("messageQueue.createBankAccounts", false) == false) { ignore("a bank account is created at a bank that does not yet exist", BankAccountCreationListenerTag) {} ignore("a bank account is created at a bank that already exists", BankAccountCreationListenerTag) {} } else { diff --git a/src/test/scala/code/fx/PutFX.scala b/src/test/scala/code/fx/PutFX.scala new file mode 100644 index 0000000000..b272c8139f --- /dev/null +++ b/src/test/scala/code/fx/PutFX.scala @@ -0,0 +1,178 @@ +package code.fx + +/** +Open Bank Project - API +Copyright (C) 2011-2016, TESOBE Ltd. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Email: contact@tesobe.com +TESOBE Ltd. +Osloer Strasse 16/17 +Berlin 13359, Germany + +This product includes software developed at +TESOBE (http://www.tesobe.com/) + + */ + +/* +* This is a utility script that can be used to POST data via the API as a logged-in User. +* It POSTS customers and links them to existing Users +* It requires the credentials of the user and logs in via OAuth using selenium. +* +* We use an "admin user" e.g. a user which has been assigned certain roles to perform the actions. +* The roles required include CanGetAnyUser, CanCreateCustomerAtAnyBank , CanCreateUserCustomerLinkAtAnyBank +* +* To use this one-time script, put e.g. +* target_api_hostname=https://localhost:8080 +* obp_consumer_key=xxx +* obp_secret_key=yyy +* import.fx_data_path=path_to.json +* import.admin_user.username=username-of-user-that-has-correct-roles +* import.admin_user.password=password +* +* into your props file. +* */ + +import java.util.Date + +import code.api.v2_2_0.FXRateJsonV220 +import code.setup.SendServerRequests +import code.util.ObpJson._ +import code.util.{OAuthClient, ObpGet, ObpPut} +import net.liftweb.common.{Box, Empty, Full} +import net.liftweb.http.RequestVar +import net.liftweb.json._ +import net.liftweb.util.Props + +import scala.collection.mutable.ListBuffer +import scala.io.Source + + +case class FxJson(from_currency_code: String, + to_currency_code: String, + conversion_value: Double, + inverse_conversion_value: Double, + effective_date: Date) + +object PutFX extends SendServerRequests { + + + def debugBreak() { + println("Breakpoint hit!") // Manually set a breakpoint here + } + + def main(args : Array[String]) { + + // this sets the date format to "yyyy-MM-dd'T'HH:mm:ss'Z'" i.e. ISO 8601 No milliseconds UTC + implicit val formats = DefaultFormats // Brings in default date formats etc. + + val adminUserUsername = Props.get("import.admin_user.username").getOrElse("ERROR") + println(s"adminUserUsername is $adminUserUsername") + + val adminUserPassword = Props.get("import.admin_user.password").getOrElse("ERROR") + println(s"adminUserPassword is $adminUserPassword") + + //println("Got " + customers.length + " records") + + object allBanksVar extends RequestVar[Box[BanksJson]] (Empty) + + def allBanks : Box[BanksJson]= { + allBanksVar.get match { + case Full(a) => Full(a) + case _ => ObpGet("/v1.2.1/banks").flatMap(_.extractOpt[BanksJson]) // TODO use more recent API version + } + } + + case class SimpleBank( + id : String, + shortName : String, + fullName : String, + logo : String, + website : String) + + + // Login once as an admin user. Will need to have some admin Roles + if(!OAuthClient.loggedIn) { + print("login as user: ") + println (adminUserUsername) + OAuthClient.authenticateWithOBPCredentials(adminUserUsername, adminUserPassword) + println(" - ok.") + } + + + val banks = for { + a <- allBanks.toList + b <- a.bankJsons + // This filtering could be turned on/off by Props setting + // Filter out banks if we have a list of ones to use, else use all of them. + // Also, show all if requested by url parameter + // if featuredBankIds.length == 0 || featuredBankIds.contains(b.id.get) || listAllBanks + } yield SimpleBank (b.id.get, + b.short_name.getOrElse(""), + b.full_name.getOrElse(""), + b.logo.getOrElse(""), + b.website.getOrElse("") + ) // Add a flag to say if this bank is featured. + + for (b <- banks) { // (b.shortName == "uk") + println(s"Posting FX Rate for bank ${b.shortName}") + + val url = s"/v3.0.0/banks/${b.id}/fx" + + //load json for fx rates + val fxDataPath = Props.get("import.fx_data_path") + + println(s"fxDataPath is $fxDataPath") + + // This contains a list of fx rates. + val fxListData = JsonParser.parse(Source.fromFile(fxDataPath.getOrElse("ERROR")) mkString) + + var fxrates = ListBuffer[FxJson]() + + // Get fx rate data from json + for(i <- fxListData.children){ + //logger.info(s" extract fx rate records") + val f = i.extract[FxJson] + val fxJsonV210 = FXRateJsonV220( + bank_id = b.id, + from_currency_code = f.from_currency_code, + to_currency_code = f.to_currency_code, + conversion_value = f.conversion_value, + inverse_conversion_value = f.inverse_conversion_value, + effective_date = f.effective_date + ) + + val json = Extraction.decompose(fxJsonV210) + println(s"json to post is $json") + + val result = ObpPut(url, json) + + if (!result.isEmpty) { + println("saved " + f.from_currency_code + " to " + f.to_currency_code + " as currency exchange rate " + result) + } else { + println("did NOT save fx rate " + result) + } + + } + + + //OAuthClient.logoutAll() + } + + OAuthClient.logoutAll() + sys.exit(0) + } +} \ No newline at end of file diff --git a/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala b/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala index 633acbfe24..2be54d67ab 100644 --- a/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala +++ b/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala @@ -33,10 +33,12 @@ package code.sandbox import java.text.SimpleDateFormat import java.util.Date + import code.api.util.ErrorMessages._ import bootstrap.liftweb.ToSchemify import code.TestServer import code.accountholder.AccountHolders +import code.api.util.APIUtil import code.api.util.APIUtil._ import code.atms.Atms import code.atms.Atms.{AtmId, AtmT, countOfAtms} @@ -90,7 +92,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Match //drop database tables before //MongoDB.getDb(DefaultMongoIdentifier).foreach(_.dropDatabase()) ToSchemify.models.foreach(_.bulkDelete_!!()) - if (!Props.getBool("remotedata.enable", false)) { + if (!APIUtil.getPropsAsBoolValue("remotedata.enable", false)) { ToSchemify.modelsRemotedata.foreach(_.bulkDelete_!!()) } else { Views.views.vend.bulkDeleteAllPermissionsAndViews() diff --git a/src/test/scala/code/setup/DefaultUsers.scala b/src/test/scala/code/setup/DefaultUsers.scala index 00bbcb3b9b..3cfb2e899b 100644 --- a/src/test/scala/code/setup/DefaultUsers.scala +++ b/src/test/scala/code/setup/DefaultUsers.scala @@ -1,8 +1,10 @@ package code.setup import java.util.UUID + import code.api.util.ErrorMessages._ import code.api.GatewayLogin +import code.api.util.APIUtil import code.api.util.APIUtil.OAuth.{Consumer, Token} import code.consumer.Consumers import code.model.TokenType._ @@ -36,7 +38,7 @@ trait DefaultUsers { lazy val consumer = Consumer(testConsumer.key.get, testConsumer.secret.get) // create the access token - val expiration = Props.getInt("token_expiration_weeks", 4) + val expiration = APIUtil.getPropsAsIntValue("token_expiration_weeks", 4) lazy val tokenDuration = weeks(expiration) // Create resource user, need provider diff --git a/src/test/scala/code/setup/LocalMappedConnectorTestSetup.scala b/src/test/scala/code/setup/LocalMappedConnectorTestSetup.scala index 16bd3c13b1..439d7a204b 100644 --- a/src/test/scala/code/setup/LocalMappedConnectorTestSetup.scala +++ b/src/test/scala/code/setup/LocalMappedConnectorTestSetup.scala @@ -1,9 +1,11 @@ package code.setup import java.util.{Date, UUID} + import code.api.util.ErrorMessages._ import bootstrap.liftweb.ToSchemify import code.accountholder.AccountHolders +import code.api.util.APIUtil import code.entitlement.Entitlement import code.metadata.counterparties.{Counterparties, CounterpartyTrait} import code.model._ @@ -141,7 +143,7 @@ trait LocalMappedConnectorTestSetup extends TestConnectorSetupWithStandardPermis //empty the relational db tables after each test ToSchemify.models.filterNot(exclusion).foreach(_.bulkDelete_!!()) - if (!Props.getBool("remotedata.enable", false)) { + if (!APIUtil.getPropsAsBoolValue("remotedata.enable", false)) { ToSchemify.modelsRemotedata.filterNot(exclusion).foreach(_.bulkDelete_!!()) } else { Views.views.vend.bulkDeleteAllPermissionsAndViews() diff --git a/src/test/scala/code/setup/ServerSetup.scala b/src/test/scala/code/setup/ServerSetup.scala index 020e152ba2..c3cea7d979 100644 --- a/src/test/scala/code/setup/ServerSetup.scala +++ b/src/test/scala/code/setup/ServerSetup.scala @@ -36,6 +36,7 @@ import java.text.SimpleDateFormat import _root_.net.liftweb.json.JsonAST.JObject import code.TestServer +import code.api.util.APIUtil import code.model.BankId import code.util.Helper.MdcLoggable import dispatch._ @@ -56,7 +57,7 @@ trait ServerSetup extends FeatureSpec with SendServerRequests val server = TestServer def baseRequest = host(server.host, server.port) - val secured = Props.getBool("external.https", false) + val secured = APIUtil.getPropsAsBoolValue("external.https", false) def externalBaseRequest = (server.externalHost, server.externalPort) match { case (Full(h), Full(p)) if secured => host(h, p).secure case (Full(h), Full(p)) if !secured => host(h, p) diff --git a/src/test/scala/code/setup/TestConnectorSetupWithStandardPermissions.scala b/src/test/scala/code/setup/TestConnectorSetupWithStandardPermissions.scala index 7b6db8d251..bd06cbade2 100644 --- a/src/test/scala/code/setup/TestConnectorSetupWithStandardPermissions.scala +++ b/src/test/scala/code/setup/TestConnectorSetupWithStandardPermissions.scala @@ -2,6 +2,7 @@ package code.setup import bootstrap.liftweb.ToSchemify import code.accountholder.AccountHolders +import code.api.util.APIUtil import code.model._ import code.model.dataAccess._ import code.views.Views @@ -54,7 +55,7 @@ trait TestConnectorSetupWithStandardPermissions extends TestConnectorSetup { //empty the relational db tables after each test ToSchemify.models.filterNot(exclusion).foreach(_.bulkDelete_!!()) - if (!Props.getBool("remotedata.enable", false)) { + if (!APIUtil.getPropsAsBoolValue("remotedata.enable", false)) { ToSchemify.modelsRemotedata.filterNot(exclusion).foreach(_.bulkDelete_!!()) } else { Views.views.vend.bulkDeleteAllPermissionsAndViews()