From 594e2bb6dbc2cc4295c6a3bbeac74c0a27691dd0 Mon Sep 17 00:00:00 2001 From: hongwei Date: Mon, 11 Nov 2024 15:31:32 +0100 Subject: [PATCH 01/17] feature/added the ssl to rabbitMq connector --- .../rabbitmq/RabbitMQConnectionPool.scala | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala index 1ed336e82..eaa06e64d 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala @@ -8,22 +8,64 @@ import org.apache.commons.pool2.impl.{GenericObjectPool, GenericObjectPoolConfig import org.apache.commons.pool2.BasePooledObjectFactory import org.apache.commons.pool2.PooledObject import org.apache.commons.pool2.impl.DefaultPooledObject +import java.io.FileInputStream +import java.security.KeyStore +import javax.net.ssl.{KeyManagerFactory, SSLContext, TrustManagerFactory} -// Factory to create RabbitMQ connections class RabbitMQConnectionFactory extends BasePooledObjectFactory[Connection] { + private def createSSLContext( + keystorePath: String, keystorePassword: String, + truststorePath: String, truststorePassword: String + ): SSLContext = { + // Load client keystore + val keyStore = KeyStore.getInstance(KeyStore.getDefaultType) + val keystoreFile = new FileInputStream(keystorePath) + keyStore.load(keystoreFile, keystorePassword.toCharArray) + keystoreFile.close() + // Set up KeyManagerFactory for client certificates + val kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm) + kmf.init(keyStore, keystorePassword.toCharArray) + + // Load truststore for CA certificates + val trustStore = KeyStore.getInstance(KeyStore.getDefaultType) + val truststoreFile = new FileInputStream(truststorePath) + trustStore.load(truststoreFile, truststorePassword.toCharArray) + truststoreFile.close() + + // Set up TrustManagerFactory for CA certificates + val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm) + tmf.init(trustStore) + + // Initialize SSLContext + val sslContext = SSLContext.getInstance("TLSv1.2") + sslContext.init(kmf.getKeyManagers, tmf.getTrustManagers, null) + sslContext + } + // lazy initial RabbitMQ connection val host = APIUtil.getPropsValue("rabbitmq_connector.host").openOrThrowException("mandatory property rabbitmq_connector.host is missing!") val port = APIUtil.getPropsAsIntValue("rabbitmq_connector.port").openOrThrowException("mandatory property rabbitmq_connector.port is missing!") val username = APIUtil.getPropsValue("rabbitmq_connector.username").openOrThrowException("mandatory property rabbitmq_connector.username is missing!") val password = APIUtil.getPropsValue("rabbitmq_connector.password").openOrThrowException("mandatory property rabbitmq_connector.password is missing!") - + val keystorePath = APIUtil.getPropsValue("keystore.path").getOrElse("") + val keystorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) + val truststorePath = APIUtil.getPropsValue("truststore.path").getOrElse("") + val truststorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) + private val factory = new ConnectionFactory() factory.setHost(host) factory.setPort(port) factory.setUsername(username) factory.setPassword(password) + factory.useSslProtocol(createSSLContext( + keystorePath, + keystorePassword, + truststorePath, + truststorePassword + )) + // Create a new RabbitMQ connection override def create(): Connection = factory.newConnection() From a5253b4e6aa49dc342b2e1b4053304d39623e666 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 08:07:44 +0100 Subject: [PATCH 02/17] feature/added new props rabbitmq.use.ssl --- .../src/main/resources/props/sample.props.template | 3 +++ .../rabbitmq/RabbitMQConnectionPool.scala | 14 ++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/obp-api/src/main/resources/props/sample.props.template b/obp-api/src/main/resources/props/sample.props.template index d3171f0e2..cea3e4387 100644 --- a/obp-api/src/main/resources/props/sample.props.template +++ b/obp-api/src/main/resources/props/sample.props.template @@ -153,6 +153,9 @@ jwt.use.ssl=false ## Enable SSL for kafka, if set to true must set paths for the keystore locations #kafka.use.ssl=true +## Enable SSL for rabbitmq, if set to true must set paths for the keystore locations +#rabbitmq.use.ssl=false + # Paths to the SSL keystore files - has to be jks #keystore.path=/path/to/api.keystore.jks #keystore password diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala index eaa06e64d..75d84d0b2 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala @@ -58,12 +58,14 @@ class RabbitMQConnectionFactory extends BasePooledObjectFactory[Connection] { factory.setPort(port) factory.setUsername(username) factory.setPassword(password) - factory.useSslProtocol(createSSLContext( - keystorePath, - keystorePassword, - truststorePath, - truststorePassword - )) + if (APIUtil.getPropsAsBoolValue("rabbitmq.use.ssl", false)){ + factory.useSslProtocol(createSSLContext( + keystorePath, + keystorePassword, + truststorePath, + truststorePassword + )) + } // Create a new RabbitMQ connection From df8c0696c22106b0901aff84071dbbcda40e0685 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 08:10:29 +0100 Subject: [PATCH 03/17] docfix/add kafka.use.ssl to release_notes.md --- release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/release_notes.md b/release_notes.md index 745511e28..4db2f1ef8 100644 --- a/release_notes.md +++ b/release_notes.md @@ -3,6 +3,7 @@ ### Most recent changes at top of file ``` Date Commit Action +12/11/2024 a5253b4e Added props rabbitmq.use.ssl, default is false 30/10/2024 e69161b6 set V121, V130 and V200 status to DEPRECATED 29/10/2024 c83032f0 added the props for RabbitMq connector: Added props rabbitmq_connector.host=localhost From 42787b5193693825deb38d6195d25bed2cd27c61 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 12:34:30 +0100 Subject: [PATCH 04/17] feature/supported TLS for RabbitMq connector --- .../rabbitmq/Adapter/RPCServer.scala | 23 +++++---- .../rabbitmq/RabbitMQConnectionPool.scala | 45 +----------------- .../rabbitmq/RabbitMQUtils.scala | 47 ++++++++++++++++++- 3 files changed, 62 insertions(+), 53 deletions(-) diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala index 3d2aa85b6..a63bbab44 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala @@ -2,6 +2,7 @@ package code.bankconnectors.rabbitmq.Adapter import bootstrap.liftweb.ToSchemify import code.api.util.APIUtil +import code.bankconnectors.rabbitmq.RabbitMQUtils import com.openbankproject.commons.ExecutionContext.Implicits.global import com.openbankproject.commons.dto._ import com.openbankproject.commons.model._ @@ -14,7 +15,7 @@ import net.liftweb.mapper.Schemifier import scala.concurrent.Future import com.openbankproject.commons.ExecutionContext.Implicits.global - +import code.bankconnectors.rabbitmq.RabbitMQUtils._ import java.util.Date class ServerCallback(val ch: Channel) extends DeliverCallback { @@ -3067,12 +3068,7 @@ class ServerCallback(val ch: Channel) extends DeliverCallback { object RPCServer extends App { private val RPC_QUEUE_NAME = "obp_rpc_queue" - // lazy initial RabbitMQ connection - val host = APIUtil.getPropsValue("rabbitmq_connector.host").openOrThrowException("mandatory property rabbitmq_connector.host is missing!") - val port = APIUtil.getPropsAsIntValue("rabbitmq_connector.port").openOrThrowException("mandatory property rabbitmq_connector.port is missing!") -// val username = APIUtil.getPropsValue("rabbitmq_connector.username").openOrThrowException("mandatory property rabbitmq_connector.username is missing!") -// val password = APIUtil.getPropsValue("rabbitmq_connector.password").openOrThrowException("mandatory property rabbitmq_connector.password is missing!") - + DB.defineConnectionManager(net.liftweb.util.DefaultConnectionIdentifier, APIUtil.vendor) Schemifier.schemify(true, Schemifier.infoF _, ToSchemify.models: _*) @@ -3083,8 +3079,17 @@ object RPCServer extends App { val factory = new ConnectionFactory() factory.setHost(host) factory.setPort(port) - factory.setUsername("server") - factory.setPassword("server") + factory.setUsername(username) + factory.setPassword(password) + if (APIUtil.getPropsAsBoolValue("rabbitmq.use.ssl", false)){ + factory.useSslProtocol(RabbitMQUtils.createSSLContext( + keystorePath, + keystorePassword, + truststorePath, + truststorePassword + )) + } + connection = factory.newConnection() channel = connection.createChannel() channel.queueDeclare(RPC_QUEUE_NAME, false, false, false, null) diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala index 75d84d0b2..5a245140c 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala @@ -8,50 +8,9 @@ import org.apache.commons.pool2.impl.{GenericObjectPool, GenericObjectPoolConfig import org.apache.commons.pool2.BasePooledObjectFactory import org.apache.commons.pool2.PooledObject import org.apache.commons.pool2.impl.DefaultPooledObject -import java.io.FileInputStream -import java.security.KeyStore -import javax.net.ssl.{KeyManagerFactory, SSLContext, TrustManagerFactory} +import code.bankconnectors.rabbitmq.RabbitMQUtils._ class RabbitMQConnectionFactory extends BasePooledObjectFactory[Connection] { - - private def createSSLContext( - keystorePath: String, keystorePassword: String, - truststorePath: String, truststorePassword: String - ): SSLContext = { - // Load client keystore - val keyStore = KeyStore.getInstance(KeyStore.getDefaultType) - val keystoreFile = new FileInputStream(keystorePath) - keyStore.load(keystoreFile, keystorePassword.toCharArray) - keystoreFile.close() - // Set up KeyManagerFactory for client certificates - val kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm) - kmf.init(keyStore, keystorePassword.toCharArray) - - // Load truststore for CA certificates - val trustStore = KeyStore.getInstance(KeyStore.getDefaultType) - val truststoreFile = new FileInputStream(truststorePath) - trustStore.load(truststoreFile, truststorePassword.toCharArray) - truststoreFile.close() - - // Set up TrustManagerFactory for CA certificates - val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm) - tmf.init(trustStore) - - // Initialize SSLContext - val sslContext = SSLContext.getInstance("TLSv1.2") - sslContext.init(kmf.getKeyManagers, tmf.getTrustManagers, null) - sslContext - } - - // lazy initial RabbitMQ connection - val host = APIUtil.getPropsValue("rabbitmq_connector.host").openOrThrowException("mandatory property rabbitmq_connector.host is missing!") - val port = APIUtil.getPropsAsIntValue("rabbitmq_connector.port").openOrThrowException("mandatory property rabbitmq_connector.port is missing!") - val username = APIUtil.getPropsValue("rabbitmq_connector.username").openOrThrowException("mandatory property rabbitmq_connector.username is missing!") - val password = APIUtil.getPropsValue("rabbitmq_connector.password").openOrThrowException("mandatory property rabbitmq_connector.password is missing!") - val keystorePath = APIUtil.getPropsValue("keystore.path").getOrElse("") - val keystorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) - val truststorePath = APIUtil.getPropsValue("truststore.path").getOrElse("") - val truststorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) private val factory = new ConnectionFactory() factory.setHost(host) @@ -59,7 +18,7 @@ class RabbitMQConnectionFactory extends BasePooledObjectFactory[Connection] { factory.setUsername(username) factory.setPassword(password) if (APIUtil.getPropsAsBoolValue("rabbitmq.use.ssl", false)){ - factory.useSslProtocol(createSSLContext( + factory.useSslProtocol(RabbitMQUtils.createSSLContext( keystorePath, keystorePassword, truststorePath, diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala index c6b5e5594..9b177d8d6 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala @@ -3,14 +3,17 @@ package code.bankconnectors.rabbitmq import code.api.util.ErrorMessages.AdapterUnknownError import code.bankconnectors.Connector import code.util.Helper.MdcLoggable +import code.api.util.APIUtil import com.openbankproject.commons.model.TopicTrait import net.liftweb.common.{Box, Empty, Failure, Full} import net.liftweb.json.Serialization.write import com.rabbitmq.client.AMQP.BasicProperties import com.rabbitmq.client._ - import java.util import java.util.UUID +import javax.net.ssl.{KeyManagerFactory, SSLContext, TrustManagerFactory} +import java.io.FileInputStream +import java.security.KeyStore import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{Future, Promise} @@ -21,6 +24,16 @@ import scala.concurrent.{Future, Promise} */ object RabbitMQUtils extends MdcLoggable{ + val host = APIUtil.getPropsValue("rabbitmq_connector.host").openOrThrowException("mandatory property rabbitmq_connector.host is missing!") + val port = APIUtil.getPropsAsIntValue("rabbitmq_connector.port").openOrThrowException("mandatory property rabbitmq_connector.port is missing!") + val username = APIUtil.getPropsValue("rabbitmq_connector.username").openOrThrowException("mandatory property rabbitmq_connector.username is missing!") + val password = APIUtil.getPropsValue("rabbitmq_connector.password").openOrThrowException("mandatory property rabbitmq_connector.password is missing!") + + val keystorePath = APIUtil.getPropsValue("keystore.path").getOrElse("") + val keystorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) + val truststorePath = APIUtil.getPropsValue("truststore.path").getOrElse("") + val truststorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) + private implicit val formats = code.api.util.CustomJsonFormats.nullTolerateFormats val requestQueueName: String = "obp_rpc_queue" @@ -107,4 +120,36 @@ object RabbitMQUtils extends MdcLoggable{ rabbitResponseJsonFuture.map(rabbitResponseJsonString =>logger.debug(s"${RabbitMQConnector_vOct2024.toString} inBoundJson: $messageId = $rabbitResponseJsonString" )) rabbitResponseJsonFuture.map(rabbitResponseJsonString =>Connector.extractAdapterResponse[T](rabbitResponseJsonString, Empty)) } + + def createSSLContext( + keystorePath: String, + keystorePassword: String, + truststorePath: String, + truststorePassword: String + ): SSLContext = { + // Load client keystore + val keyStore = KeyStore.getInstance("jks") + val keystoreFile = new FileInputStream(keystorePath) + keyStore.load(keystoreFile, keystorePassword.toCharArray) + keystoreFile.close() + // Set up KeyManagerFactory for client certificates + val kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm) + kmf.init(keyStore, keystorePassword.toCharArray) + + // Load truststore for CA certificates + val trustStore = KeyStore.getInstance("jks") + val truststoreFile = new FileInputStream(truststorePath) + trustStore.load(truststoreFile, truststorePassword.toCharArray) + truststoreFile.close() + + // Set up TrustManagerFactory for CA certificates + val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm) + tmf.init(trustStore) + + // Initialize SSLContext + val sslContext = SSLContext.getInstance("TLSv1.3") + sslContext.init(kmf.getKeyManagers, tmf.getTrustManagers, null) + sslContext + } + } From d2e711b45b1313fc96d11a153c2c044660baf1bd Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 15:37:51 +0100 Subject: [PATCH 05/17] feature/added the rabbitmq.adapter.enabled function --- .../resources/props/sample.props.template | 3 ++ .../main/scala/bootstrap/liftweb/Boot.scala | 6 ++++ ...rver.scala => MockedRabbitMqAdapter.scala} | 30 ++++++++++++++----- 3 files changed, 32 insertions(+), 7 deletions(-) rename obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/{RPCServer.scala => MockedRabbitMqAdapter.scala} (99%) diff --git a/obp-api/src/main/resources/props/sample.props.template b/obp-api/src/main/resources/props/sample.props.template index cea3e4387..0d60caa8c 100644 --- a/obp-api/src/main/resources/props/sample.props.template +++ b/obp-api/src/main/resources/props/sample.props.template @@ -838,6 +838,9 @@ featured_apis=elasticSearchWarehouseV300 # rabbitmq_connector.port=5672 # rabbitmq_connector.username=obp # rabbitmq_connector.password=obp +# -- RabbitMQ Adapter -------------------------------------------- +#rabbitmq.adapter.enabled=false + # -- Scopes ----------------------------------------------------- diff --git a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala index 0cb8ca002..b4e186deb 100644 --- a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala @@ -339,6 +339,12 @@ class Boot extends MdcLoggable { } } + // start RabbitMq Adatper + if (APIUtil.getPropsAsBoolValue("rabbitmq.adapter.enabled", false)) { + code.bankconnectors.rabbitmq.Adapter.startRabbitMqAdapter.main(Array("")) + } + + // Database query timeout // APIUtil.getPropsValue("database_query_timeout_in_seconds").map { timeoutInSeconds => // tryo(timeoutInSeconds.toInt).isDefined match { diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala similarity index 99% rename from obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala rename to obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala index a63bbab44..130e9d236 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala @@ -17,8 +17,9 @@ import scala.concurrent.Future import com.openbankproject.commons.ExecutionContext.Implicits.global import code.bankconnectors.rabbitmq.RabbitMQUtils._ import java.util.Date +import code.util.Helper.MdcLoggable -class ServerCallback(val ch: Channel) extends DeliverCallback { +class ServerCallback(val ch: Channel) extends DeliverCallback with MdcLoggable{ private implicit val formats = code.api.util.CustomJsonFormats.nullTolerateFormats @@ -33,7 +34,7 @@ class ServerCallback(val ch: Channel) extends DeliverCallback { .messageId(obpMessageId) .build val message = new String(delivery.getBody, "UTF-8") - println(s"Request: OutBound message from OBP: methodId($obpMessageId) : message is $message ") + logger.debug(s"Request: OutBound message from OBP: methodId($obpMessageId) : message is $message ") try { val responseToOBP = if (obpMessageId.contains("obp_get_banks")) { @@ -3053,10 +3054,10 @@ class ServerCallback(val ch: Channel) extends DeliverCallback { } response = responseToOBP.map(a => write(a)).map("" + _) - response.map(res => println(s"Response: inBound message to OBP: process($obpMessageId) : message is $res ")) + response.map(res => logger.debug(s"Response: inBound message to OBP: process($obpMessageId) : message is $res ")) response } catch { - case e: Throwable => println("Unknown exception: " + e.toString) + case e: Throwable => logger.error("Unknown exception: " + e.toString) } finally { response.map(res => ch.basicPublish("", delivery.getProperties.getReplyTo, replyProps, res.getBytes("UTF-8"))) @@ -3066,7 +3067,7 @@ class ServerCallback(val ch: Channel) extends DeliverCallback { } -object RPCServer extends App { +object MockedRabbitMqAdapter extends App with MdcLoggable{ private val RPC_QUEUE_NAME = "obp_rpc_queue" DB.defineConnectionManager(net.liftweb.util.DefaultConnectionIdentifier, APIUtil.vendor) @@ -3097,7 +3098,7 @@ object RPCServer extends App { // stop after one consumed message since this is example code val serverCallback = new ServerCallback(channel) channel basicConsume(RPC_QUEUE_NAME, false, serverCallback, _ => {}) - println("Start awaiting OBP Connector Requests:") + logger.info("Start awaiting OBP Connector Requests:") } catch { case e: Exception => e.printStackTrace() } finally { @@ -3105,9 +3106,24 @@ object RPCServer extends App { try { // connection.close() } catch { - case e: Exception => println(s"unknown Exception:$e") + case e: Exception => logger.error(s"unknown Exception:$e") } } } } + +/** + * This adapter is only for testing poplors, not ready for the production + */ +object startRabbitMqAdapter { + def main(args: Array[String]): Unit = { + val thread = new Thread(new Runnable { + override def run(): Unit = { + MockedRabbitMqAdapter.main(Array.empty) + } + }) + thread.start() + thread.join() + } +} From 21b629a39248fbf2d25733bf952b53b1acdb100c Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 15:40:42 +0100 Subject: [PATCH 06/17] docfix/added the rabbitmq.adapter.enabled to release_notes.md --- release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/release_notes.md b/release_notes.md index 4db2f1ef8..d9a18e994 100644 --- a/release_notes.md +++ b/release_notes.md @@ -3,6 +3,7 @@ ### Most recent changes at top of file ``` Date Commit Action +12/11/2024 d2e711b4 Added props rabbitmq.adapter.enabled, default is false 12/11/2024 a5253b4e Added props rabbitmq.use.ssl, default is false 30/10/2024 e69161b6 set V121, V130 and V200 status to DEPRECATED 29/10/2024 c83032f0 added the props for RabbitMq connector: From f585348c6ed3249e6c3cba5f2ce7c935cc89ffa8 Mon Sep 17 00:00:00 2001 From: tawoe Date: Tue, 12 Nov 2024 15:40:26 +0100 Subject: [PATCH 07/17] fix bug in container pipeline --- .github/workflows/build_container_non_develop_branch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_container_non_develop_branch.yml b/.github/workflows/build_container_non_develop_branch.yml index a25f2ded9..2edffc96e 100644 --- a/.github/workflows/build_container_non_develop_branch.yml +++ b/.github/workflows/build_container_non_develop_branch.yml @@ -53,8 +53,8 @@ jobs: - name: Build the Docker image run: | echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u "${{ secrets.DOCKER_HUB_USERNAME }}" --password-stdin docker.io - docker build . --file .github/Dockerfile_PreBuild --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:develop - docker build . --file .github/Dockerfile_PreBuild_OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:develop-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/}-OC + docker build . --file .github/Dockerfile_PreBuild --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/} + docker build . --file .github/Dockerfile_PreBuild_OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/}-OC docker push docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }} --all-tags echo docker done From 4350b0245a405dce823d7c9f099d2c6cf303b47f Mon Sep 17 00:00:00 2001 From: tawoe Date: Tue, 12 Nov 2024 15:46:46 +0100 Subject: [PATCH 08/17] fix bug in container pipeline --- .../workflows/build_container_non_develop_branch.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_container_non_develop_branch.yml b/.github/workflows/build_container_non_develop_branch.yml index 2edffc96e..7c8a0e695 100644 --- a/.github/workflows/build_container_non_develop_branch.yml +++ b/.github/workflows/build_container_non_develop_branch.yml @@ -54,7 +54,7 @@ jobs: run: | echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u "${{ secrets.DOCKER_HUB_USERNAME }}" --password-stdin docker.io docker build . --file .github/Dockerfile_PreBuild --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/} - docker build . --file .github/Dockerfile_PreBuild_OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/}-OC + docker build . --file .github/Dockerfile_PreBuild_OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA-OC --tag docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/}-OC docker push docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }} --all-tags echo docker done @@ -66,15 +66,11 @@ jobs: - name: Sign container image run: | cosign sign -y --key cosign.key \ - docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:develop + docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/} cosign sign -y --key cosign.key \ - docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest + docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/}-OC cosign sign -y --key cosign.key \ docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA - cosign sign -y --key cosign.key \ - docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:develop-OC - cosign sign -y --key cosign.key \ - docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest-OC env: COSIGN_PASSWORD: "${{secrets.COSIGN_PASSWORD}}" From 348164afab0248cc49823a7729fa5baa3a835445 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 16:04:31 +0100 Subject: [PATCH 09/17] feature/added the rabbitmq_connector.virtual_host --- obp-api/src/main/resources/props/sample.props.template | 1 + .../bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala | 1 + .../code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala | 1 + .../main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala | 1 + 4 files changed, 4 insertions(+) diff --git a/obp-api/src/main/resources/props/sample.props.template b/obp-api/src/main/resources/props/sample.props.template index 0d60caa8c..1cdefdebb 100644 --- a/obp-api/src/main/resources/props/sample.props.template +++ b/obp-api/src/main/resources/props/sample.props.template @@ -838,6 +838,7 @@ featured_apis=elasticSearchWarehouseV300 # rabbitmq_connector.port=5672 # rabbitmq_connector.username=obp # rabbitmq_connector.password=obp +# rabbitmq_connector.virtual_host=/ # -- RabbitMQ Adapter -------------------------------------------- #rabbitmq.adapter.enabled=false diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala index 130e9d236..07b4ca1e9 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala @@ -3082,6 +3082,7 @@ object MockedRabbitMqAdapter extends App with MdcLoggable{ factory.setPort(port) factory.setUsername(username) factory.setPassword(password) + factory.setVirtualHost(virtualHost) if (APIUtil.getPropsAsBoolValue("rabbitmq.use.ssl", false)){ factory.useSslProtocol(RabbitMQUtils.createSSLContext( keystorePath, diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala index 5a245140c..489380b2d 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQConnectionPool.scala @@ -17,6 +17,7 @@ class RabbitMQConnectionFactory extends BasePooledObjectFactory[Connection] { factory.setPort(port) factory.setUsername(username) factory.setPassword(password) + factory.setVirtualHost(virtualHost) if (APIUtil.getPropsAsBoolValue("rabbitmq.use.ssl", false)){ factory.useSslProtocol(RabbitMQUtils.createSSLContext( keystorePath, diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala index 9b177d8d6..fd254c6cd 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala @@ -28,6 +28,7 @@ object RabbitMQUtils extends MdcLoggable{ val port = APIUtil.getPropsAsIntValue("rabbitmq_connector.port").openOrThrowException("mandatory property rabbitmq_connector.port is missing!") val username = APIUtil.getPropsValue("rabbitmq_connector.username").openOrThrowException("mandatory property rabbitmq_connector.username is missing!") val password = APIUtil.getPropsValue("rabbitmq_connector.password").openOrThrowException("mandatory property rabbitmq_connector.password is missing!") + val virtualHost = APIUtil.getPropsValue("rabbitmq_connector.virtual_host").openOrThrowException("mandatory property rabbitmq_connector.virtual_host is missing!") val keystorePath = APIUtil.getPropsValue("keystore.path").getOrElse("") val keystorePassword = APIUtil.getPropsValue("keystore.password").getOrElse(APIUtil.initPasswd) From 6fbaebbaf377c94ecf430672735d8b69a78a65de Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 12 Nov 2024 16:08:35 +0100 Subject: [PATCH 10/17] docfix/added rabbitmq_connector.virtual_host to the release_notes.md --- release_notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/release_notes.md b/release_notes.md index d9a18e994..f712348f7 100644 --- a/release_notes.md +++ b/release_notes.md @@ -3,6 +3,10 @@ ### Most recent changes at top of file ``` Date Commit Action +12/11/2024 d2e711b4 Added props rabbitmq_connector.virtual_host, default is /. + If you need to set it, please make sure you already add the virtual_host to the rabbitmq and grant the access to the user: + eg: run `rabbitmqctl add_vhost /obp/` => create the `/obp/` + and run `rabbitmqctl set_permissions -p /obp/ obp ".*" ".*" ".*"` => grant user `obp` the access permissions. 12/11/2024 d2e711b4 Added props rabbitmq.adapter.enabled, default is false 12/11/2024 a5253b4e Added props rabbitmq.use.ssl, default is false 30/10/2024 e69161b6 set V121, V130 and V200 status to DEPRECATED From 178f2eba28c6713ade8656a83c625cfe738d22ba Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 13 Nov 2024 10:58:27 +0100 Subject: [PATCH 11/17] docfix/added comments --- .../rabbitmq/Adapter/AdapterStubBuilder.scala | 2 +- .../rabbitmq/Adapter/MockedRabbitMqAdapter.scala | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/AdapterStubBuilder.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/AdapterStubBuilder.scala index 2af366213..5b563549d 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/AdapterStubBuilder.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/AdapterStubBuilder.scala @@ -59,7 +59,7 @@ object AdapterStubBuilder { println("===================") val path = new File(getClass.getResource("").toURI.toString.replaceFirst("target/.*", "").replace("file:", ""), - "src/main/scala/code/bankconnectors/rabbitmq/Adapter/RPCServer.scala") + "src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala") val source = FileUtils.readFileToString(path, "utf-8") val start = "//---------------- dynamic start -------------------please don't modify this line" val end = "//---------------- dynamic end ---------------------please don't modify this line" diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala index 07b4ca1e9..f9031c8c8 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala @@ -3067,6 +3067,10 @@ class ServerCallback(val ch: Channel) extends DeliverCallback with MdcLoggable{ } +/** + * This is only for testing, not ready for production. + * Still in processing. + */ object MockedRabbitMqAdapter extends App with MdcLoggable{ private val RPC_QUEUE_NAME = "obp_rpc_queue" @@ -3105,7 +3109,7 @@ object MockedRabbitMqAdapter extends App with MdcLoggable{ } finally { if (connection != null) { try { - // connection.close() + // connection.close() //this is a tempreory solution, we keep this connection open to wait for messages } catch { case e: Exception => logger.error(s"unknown Exception:$e") } From faa8a2ff92af4e04f2d8fa809af1747c7de2443e Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 13 Nov 2024 12:50:03 +0100 Subject: [PATCH 12/17] docfix/typo --- obp-api/src/main/scala/bootstrap/liftweb/Boot.scala | 2 +- .../rabbitmq/Adapter/MockedRabbitMqAdapter.scala | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala index b4e186deb..6cc758f2a 100644 --- a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala @@ -339,7 +339,7 @@ class Boot extends MdcLoggable { } } - // start RabbitMq Adatper + // start RabbitMq Adapter(using mapped connector as mockded CBS) if (APIUtil.getPropsAsBoolValue("rabbitmq.adapter.enabled", false)) { code.bankconnectors.rabbitmq.Adapter.startRabbitMqAdapter.main(Array("")) } diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala index f9031c8c8..662a1c651 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala @@ -3069,7 +3069,8 @@ class ServerCallback(val ch: Channel) extends DeliverCallback with MdcLoggable{ /** * This is only for testing, not ready for production. - * Still in processing. + * use mapped connector as the bank CBS. + * Work in progress */ object MockedRabbitMqAdapter extends App with MdcLoggable{ private val RPC_QUEUE_NAME = "obp_rpc_queue" @@ -3109,7 +3110,7 @@ object MockedRabbitMqAdapter extends App with MdcLoggable{ } finally { if (connection != null) { try { - // connection.close() //this is a tempreory solution, we keep this connection open to wait for messages + // connection.close() //this is a temporary solution, we keep this connection open to wait for messages } catch { case e: Exception => logger.error(s"unknown Exception:$e") } @@ -3119,7 +3120,7 @@ object MockedRabbitMqAdapter extends App with MdcLoggable{ } /** - * This adapter is only for testing poplors, not ready for the production + * This adapter is only for testing, not ready for the production */ object startRabbitMqAdapter { def main(args: Array[String]): Unit = { From 65bd7bd2deaf811034c2d2649053f65939ef445e Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 13 Nov 2024 12:58:08 +0100 Subject: [PATCH 13/17] docfix/added SSL to RabbitMq --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 008acde83..4e4e8d6c9 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,19 @@ For SSL encryption we use JKS keystores. Note that both the keystore and the tru truststore.path=/path/to/api.truststore.jks ``` +## Using SSL Encryption with RabbitMq + +For SSL encryption we use JKS keystores. Note that both the keystore and the truststore (and all keys within) must have the same password for unlocking, for which the API will stop at boot up and ask for. + +* Edit your props file(s) to contain: + + ``` + rabbitmq.use.ssl=true + keystore.path=/path/to/api.keystore.jks + keystore.password=123456 + truststore.path=/path/to/api.truststore.jks + ``` + ## Using SSL Encryption with props file For SSL encryption we use jks keystores. From 3f6e45d17371a93a9a38f5d73cd6c1dfe20ee546 Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 13 Nov 2024 12:50:03 +0100 Subject: [PATCH 14/17] docfix/typo --- obp-api/src/main/scala/bootstrap/liftweb/Boot.scala | 2 +- .../rabbitmq/Adapter/MockedRabbitMqAdapter.scala | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala index b4e186deb..6cc758f2a 100644 --- a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala @@ -339,7 +339,7 @@ class Boot extends MdcLoggable { } } - // start RabbitMq Adatper + // start RabbitMq Adapter(using mapped connector as mockded CBS) if (APIUtil.getPropsAsBoolValue("rabbitmq.adapter.enabled", false)) { code.bankconnectors.rabbitmq.Adapter.startRabbitMqAdapter.main(Array("")) } diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala index f9031c8c8..662a1c651 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/Adapter/MockedRabbitMqAdapter.scala @@ -3069,7 +3069,8 @@ class ServerCallback(val ch: Channel) extends DeliverCallback with MdcLoggable{ /** * This is only for testing, not ready for production. - * Still in processing. + * use mapped connector as the bank CBS. + * Work in progress */ object MockedRabbitMqAdapter extends App with MdcLoggable{ private val RPC_QUEUE_NAME = "obp_rpc_queue" @@ -3109,7 +3110,7 @@ object MockedRabbitMqAdapter extends App with MdcLoggable{ } finally { if (connection != null) { try { - // connection.close() //this is a tempreory solution, we keep this connection open to wait for messages + // connection.close() //this is a temporary solution, we keep this connection open to wait for messages } catch { case e: Exception => logger.error(s"unknown Exception:$e") } @@ -3119,7 +3120,7 @@ object MockedRabbitMqAdapter extends App with MdcLoggable{ } /** - * This adapter is only for testing poplors, not ready for the production + * This adapter is only for testing, not ready for the production */ object startRabbitMqAdapter { def main(args: Array[String]): Unit = { From 288ebb839fa5016cba15267a382ac7bc48f4948b Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 13 Nov 2024 12:58:08 +0100 Subject: [PATCH 15/17] docfix/added SSL to RabbitMq --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 008acde83..4e4e8d6c9 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,19 @@ For SSL encryption we use JKS keystores. Note that both the keystore and the tru truststore.path=/path/to/api.truststore.jks ``` +## Using SSL Encryption with RabbitMq + +For SSL encryption we use JKS keystores. Note that both the keystore and the truststore (and all keys within) must have the same password for unlocking, for which the API will stop at boot up and ask for. + +* Edit your props file(s) to contain: + + ``` + rabbitmq.use.ssl=true + keystore.path=/path/to/api.keystore.jks + keystore.password=123456 + truststore.path=/path/to/api.truststore.jks + ``` + ## Using SSL Encryption with props file For SSL encryption we use jks keystores. From 308b9f17d03cfae8d3dc2fe7c2a86281504e4837 Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 14 Nov 2024 15:17:17 +0100 Subject: [PATCH 16/17] feature/create the RPC_QUEUE_NAME in api side --- .../scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala index fd254c6cd..0fa125cb5 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rabbitmq/RabbitMQUtils.scala @@ -37,7 +37,7 @@ object RabbitMQUtils extends MdcLoggable{ private implicit val formats = code.api.util.CustomJsonFormats.nullTolerateFormats - val requestQueueName: String = "obp_rpc_queue" + val RPC_QUEUE_NAME: String = "obp_rpc_queue" class ResponseCallback(val rabbitCorrelationId: String, channel: Channel) extends DeliverCallback { @@ -82,6 +82,7 @@ object RabbitMQUtils extends MdcLoggable{ val connection = RabbitMQConnectionPool.borrowConnection() val channel = connection.createChannel() // channel is not thread safe, so we always create new channel for each message. + channel.queueDeclare(RPC_QUEUE_NAME, false, false, false, null) val replyQueueName:String = channel.queueDeclare( "", // Queue name false, // durable: non-persistent @@ -101,7 +102,7 @@ object RabbitMQUtils extends MdcLoggable{ .correlationId(rabbitMQCorrelationId) .replyTo(replyQueueName) .build() - channel.basicPublish("", requestQueueName, rabbitMQProps, rabbitRequestJsonString.getBytes("UTF-8")) + channel.basicPublish("", RPC_QUEUE_NAME, rabbitMQProps, rabbitRequestJsonString.getBytes("UTF-8")) val responseCallback = new ResponseCallback(rabbitMQCorrelationId, channel) channel.basicConsume(replyQueueName, true, responseCallback, cancelCallback) From 59425040b27e23d87f626c61fb2a4bfe9c77f89e Mon Sep 17 00:00:00 2001 From: hongwei Date: Fri, 15 Nov 2024 08:46:07 +0100 Subject: [PATCH 17/17] refactor/tweaked the code --- .../src/main/scala/code/api/v2_1_0/APIMethods210.scala | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/obp-api/src/main/scala/code/api/v2_1_0/APIMethods210.scala b/obp-api/src/main/scala/code/api/v2_1_0/APIMethods210.scala index 49bd34ae4..3213f2391 100644 --- a/obp-api/src/main/scala/code/api/v2_1_0/APIMethods210.scala +++ b/obp-api/src/main/scala/code/api/v2_1_0/APIMethods210.scala @@ -434,16 +434,14 @@ trait APIMethods210 { _ <- NewStyle.function.isEnabledTransactionRequests(callContext) _ <- Helper.booleanToFuture(InvalidAccountIdFormat, cc=callContext) {isValidID(accountId.value)} _ <- Helper.booleanToFuture(InvalidBankIdFormat, cc=callContext) {isValidID(bankId.value)} + _ <- Helper.booleanToFuture(s"${InvalidTransactionRequestType}: '${transactionRequestType.value}'", cc=callContext) { + APIUtil.getPropsValue("transactionRequests_supported_types", "").split(",").contains(transactionRequestType.value) + } (_, callContext) <- NewStyle.function.getBank(bankId, callContext) (fromAccount, callContext) <- NewStyle.function.checkBankAccountExists(bankId, accountId, callContext) account = BankIdAccountId(fromAccount.bankId, fromAccount.accountId) _ <- NewStyle.function.checkAuthorisationToCreateTransactionRequest(viewId, account, u, callContext) - - _ <- Helper.booleanToFuture(s"${InvalidTransactionRequestType}: '${transactionRequestType.value}'", cc=callContext) { - APIUtil.getPropsValue("transactionRequests_supported_types", "").split(",").contains(transactionRequestType.value) - } - // Check the input JSON format, here is just check the common parts of all four types transDetailsJson <- NewStyle.function.tryons(s"$InvalidJsonFormat The Json body should be the $TransactionRequestBodyCommonJSON ", 400, callContext) { json.extract[TransactionRequestBodyCommonJSON]