Merge remote-tracking branch 'refs/remotes/Hongwei/developPom' into develop

This commit is contained in:
hongwei 2026-01-20 15:04:45 +01:00
commit 8f2048c89e
146 changed files with 737 additions and 715 deletions

View File

@ -11,6 +11,7 @@ env:
jobs:
build:
runs-on: ubuntu-latest
if: github.repository == 'OpenBankProject/OBP-API'
steps:
- name: Checkout repository
uses: actions/checkout@v4

View File

@ -13,7 +13,6 @@ env:
DOCKER_HUB_ORGANIZATION: ${{ vars.DOCKER_HUB_ORGANIZATION }}
DOCKER_HUB_REPOSITORY: obp-api
jobs:
build:
runs-on: ubuntu-latest
@ -36,8 +35,8 @@ jobs:
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'adopt'
java-version: "11"
distribution: "adopt"
cache: maven
- name: Build with Maven
run: |
@ -126,6 +125,7 @@ jobs:
path: push/
- name: Build the Docker image
if: github.repository == 'OpenBankProject/OBP-API'
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
@ -136,9 +136,11 @@ jobs:
- uses: sigstore/cosign-installer@4d14d7f17e7112af04ea6108fbb4bfc714c00390
- name: Write signing key to disk (only needed for `cosign sign --key`)
if: github.repository == 'OpenBankProject/OBP-API'
run: echo "${{ secrets.COSIGN_PRIVATE_KEY }}" > cosign.key
- name: Sign container image
if: github.repository == 'OpenBankProject/OBP-API'
run: |
cosign sign -y --key cosign.key \
docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:develop
@ -152,5 +154,3 @@ jobs:
docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:latest-OC
env:
COSIGN_PASSWORD: "${{secrets.COSIGN_PASSWORD}}"

View File

@ -3,8 +3,8 @@ name: Build and publish container non develop
on:
push:
branches:
- '**'
- '!develop'
- "*"
- "!develop"
env:
DOCKER_HUB_ORGANIZATION: ${{ vars.DOCKER_HUB_ORGANIZATION }}
@ -35,8 +35,8 @@ jobs:
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'adopt'
java-version: "11"
distribution: "adopt"
cache: maven
- name: Build with Maven
run: |
@ -125,6 +125,7 @@ jobs:
path: push/
- name: Build the Docker image
if: github.repository == 'OpenBankProject/OBP-API'
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##*/}
@ -135,9 +136,11 @@ jobs:
- uses: sigstore/cosign-installer@4d14d7f17e7112af04ea6108fbb4bfc714c00390
- name: Write signing key to disk (only needed for `cosign sign --key`)
if: github.repository == 'OpenBankProject/OBP-API'
run: echo "${{ secrets.COSIGN_PRIVATE_KEY }}" > cosign.key
- name: Sign container image
if: github.repository == 'OpenBankProject/OBP-API'
run: |
cosign sign -y --key cosign.key \
docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${GITHUB_REF##*/}
@ -147,5 +150,3 @@ jobs:
docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:$GITHUB_SHA
env:
COSIGN_PASSWORD: "${{secrets.COSIGN_PASSWORD}}"

View File

@ -3,15 +3,15 @@ name: Build on Pull Request
on:
pull_request:
branches:
- '**'
- "**"
env:
## Sets environment variable
DOCKER_HUB_ORGANIZATION: ${{ vars.DOCKER_HUB_ORGANIZATION }}
jobs:
build:
runs-on: ubuntu-latest
if: github.repository == 'OpenBankProject/OBP-API'
services:
# Label used to access the service container
redis:
@ -31,8 +31,8 @@ jobs:
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'adopt'
java-version: "11"
distribution: "adopt"
cache: maven
- name: Build with Maven
run: |
@ -119,6 +119,3 @@ jobs:
with:
name: ${{ github.sha }}
path: pull/

View File

@ -12,11 +12,10 @@ env:
DOCKER_HUB_ORGANIZATION: ${{ vars.DOCKER_HUB_ORGANIZATION }}
DOCKER_HUB_REPOSITORY: obp-api
jobs:
build:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
if: github.repository == 'OpenBankProject/OBP-API' && github.event.workflow_run.conclusion == 'success'
steps:
- uses: actions/checkout@v4
@ -38,17 +37,17 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${{ github.sha }}'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results.sarif'
security-checks: 'vuln'
severity: 'CRITICAL,HIGH'
timeout: '30m'
image-ref: "docker.io/${{ env.DOCKER_HUB_ORGANIZATION }}/${{ env.DOCKER_HUB_REPOSITORY }}:${{ github.sha }}"
format: "template"
template: "@/contrib/sarif.tpl"
output: "trivy-results.sarif"
security-checks: "vuln"
severity: "CRITICAL,HIGH"
timeout: "30m"
cache-dir: .trivy
- name: Fix .trivy permissions
run: sudo chown -R $(stat . -c %u:%g) .trivy
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
sarif_file: "trivy-results.sarif"

1
.gitignore vendored
View File

@ -1,4 +1,3 @@
.github/*
*.class
*.db
.DS_Store

View File

@ -586,15 +586,9 @@
<forkMode>once</forkMode>
<junitxml>.</junitxml>
<filereports>WDF TestSuite.txt</filereports>
<!-- Increased memory for faster test execution -->
<argLine>-Drun.mode=test -XX:MaxMetaspaceSize=1G -Xms2G -Xmx4G -XX:+UseG1GC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:+UseStringDeduplication --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.jar=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED</argLine>
<argLine>-Drun.mode=test -XX:MaxMetaspaceSize=512m -Xms512m -Xmx512m --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.jar=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED</argLine>
<tagsToExclude>code.external</tagsToExclude>
<testFailureIgnore>${maven.test.failure.ignore}</testFailureIgnore>
<!-- Disable parallel test execution to avoid shared database state issues -->
<!-- Tests share an in-memory H2 database which causes conflicts when run in parallel -->
<!-- <parallel>true</parallel>-->
<!-- <threadCount>4</threadCount>-->
<parallel>false</parallel>
</configuration>
<executions>
<execution>
@ -673,26 +667,15 @@
<version>4.8.1</version>
<configuration>
<fork>true</fork>
<recompileMode>incremental</recompileMode>
<useZincServer>true</useZincServer>
<jvmArgs>
<jvmArg>-Xms4G</jvmArg>
<jvmArg>-Xmx12G</jvmArg>
<jvmArg>-Xss4m</jvmArg>
<jvmArg>-XX:MaxMetaspaceSize=4G</jvmArg>
<jvmArg>-XX:+UseG1GC</jvmArg>
<jvmArg>-XX:+TieredCompilation</jvmArg>
<jvmArg>-XX:TieredStopAtLevel=1</jvmArg>
</jvmArgs>
<args>
<arg>-deprecation</arg>
<arg>-feature</arg>
<!-- Enable language features to suppress warnings -->
<arg>-language:implicitConversions</arg>
<arg>-language:reflectiveCalls</arg>
<arg>-language:postfixOps</arg>
<!-- Suppress auto-application deprecation warning -->
<arg>-Wconf:cat=deprecation&amp;msg=auto-application:s</arg>
</args>
</configuration>
</plugin>

View File

@ -624,6 +624,14 @@ webui_agree_terms_url =
#webui_post_consumer_registration_more_info_text = Please tell us more your Application and / or Startup using this link.
#webui_post_consumer_registration_submit_button_value=Register consumer
# OBP Portal URL - base URL for the OBP Portal service
webui_obp_portal_url = http://localhost:5174
# External Consumer Registration URL - used to redirect "Get API Key" links to an external service
# If not set, defaults to webui_obp_portal_url + "/consumer-registration"
# Set this to redirect to a custom URL for consumer registration
webui_external_consumer_registration_url = http://localhost:5174/consumer-registration
## Display For Banks section
webui_display_for_banks_section = true

View File

@ -4,6 +4,7 @@ import code.api.util.{APIUtil, CallContext, DynamicUtil}
import code.bankconnectors.Connector
import code.model.dataAccess.ResourceUser
import code.users.Users
import code.entitlement.Entitlement
import com.openbankproject.commons.model._
import com.openbankproject.commons.ExecutionContext.Implicits.global
import net.liftweb.common.{Box, Empty, Failure, Full}
@ -26,12 +27,12 @@ object AbacRuleEngine {
/**
* Type alias for compiled ABAC rule function
* Parameters: authenticatedUser (logged in), authenticatedUserAttributes (non-personal), authenticatedUserAuthContext (auth context),
* onBehalfOfUser (delegation), onBehalfOfUserAttributes, onBehalfOfUserAuthContext,
* Parameters: authenticatedUser (logged in), authenticatedUserAttributes (non-personal), authenticatedUserAuthContext (auth context), authenticatedUserEntitlements (roles),
* onBehalfOfUser (delegation), onBehalfOfUserAttributes, onBehalfOfUserAuthContext, onBehalfOfUserEntitlements,
* user, userAttributes, bankOpt, bankAttributes, accountOpt, accountAttributes, transactionOpt, transactionAttributes, customerOpt, customerAttributes
* Returns: Boolean (true = allow access, false = deny access)
*/
type AbacRuleFunction = (User, List[UserAttributeTrait], List[UserAuthContext], Option[User], List[UserAttributeTrait], List[UserAuthContext], Option[User], List[UserAttributeTrait], Option[Bank], List[BankAttributeTrait], Option[BankAccount], List[AccountAttribute], Option[Transaction], List[TransactionAttribute], Option[TransactionRequest], List[TransactionRequestAttributeTrait], Option[Customer], List[CustomerAttribute], Option[CallContext]) => Boolean
type AbacRuleFunction = (User, List[UserAttributeTrait], List[UserAuthContext], List[Entitlement], Option[User], List[UserAttributeTrait], List[UserAuthContext], List[Entitlement], Option[User], List[UserAttributeTrait], Option[Bank], List[BankAttributeTrait], Option[BankAccount], List[AccountAttribute], Option[Transaction], List[TransactionAttribute], Option[TransactionRequest], List[TransactionRequestAttributeTrait], Option[Customer], List[CustomerAttribute], Option[CallContext]) => Boolean
/**
* Compile an ABAC rule from Scala code
@ -73,9 +74,11 @@ object AbacRuleEngine {
|import com.openbankproject.commons.model._
|import code.model.dataAccess.ResourceUser
|import net.liftweb.common._
|import code.entitlement.Entitlement
|import code.api.util.CallContext
|
|// ABAC Rule Function
|(authenticatedUser: User, authenticatedUserAttributes: List[UserAttributeTrait], authenticatedUserAuthContext: List[UserAuthContext], onBehalfOfUserOpt: Option[User], onBehalfOfUserAttributes: List[UserAttributeTrait], onBehalfOfUserAuthContext: List[UserAuthContext], userOpt: Option[User], userAttributes: List[UserAttributeTrait], bankOpt: Option[Bank], bankAttributes: List[BankAttributeTrait], accountOpt: Option[BankAccount], accountAttributes: List[AccountAttribute], transactionOpt: Option[Transaction], transactionAttributes: List[TransactionAttribute], transactionRequestOpt: Option[TransactionRequest], transactionRequestAttributes: List[TransactionRequestAttributeTrait], customerOpt: Option[Customer], customerAttributes: List[CustomerAttribute], callContext: Option[code.api.util.CallContext]) => {
|(authenticatedUser: User, authenticatedUserAttributes: List[UserAttributeTrait], authenticatedUserAuthContext: List[UserAuthContext], authenticatedUserEntitlements: List[Entitlement], onBehalfOfUserOpt: Option[User], onBehalfOfUserAttributes: List[UserAttributeTrait], onBehalfOfUserAuthContext: List[UserAuthContext], onBehalfOfUserEntitlements: List[Entitlement], userOpt: Option[User], userAttributes: List[UserAttributeTrait], bankOpt: Option[Bank], bankAttributes: List[BankAttributeTrait], accountOpt: Option[BankAccount], accountAttributes: List[AccountAttribute], transactionOpt: Option[Transaction], transactionAttributes: List[TransactionAttribute], transactionRequestOpt: Option[TransactionRequest], transactionRequestAttributes: List[TransactionRequestAttributeTrait], customerOpt: Option[Customer], customerAttributes: List[CustomerAttribute], callContext: Option[code.api.util.CallContext]) => {
| $ruleCode
|}
|""".stripMargin
@ -129,6 +132,12 @@ object AbacRuleEngine {
5.seconds
)
// Fetch entitlements for authenticated user
authenticatedUserEntitlements = Await.result(
code.api.util.NewStyle.function.getEntitlementsByUserId(authenticatedUserId, Some(callContext)),
5.seconds
)
// Fetch onBehalfOf user if provided (delegation scenario)
onBehalfOfUserOpt <- onBehalfOfUserId match {
case Some(obUserId) => Users.users.vend.getUserByUserId(obUserId).map(Some(_))
@ -155,6 +164,16 @@ object AbacRuleEngine {
case None => List.empty[UserAuthContext]
}
// Fetch entitlements for onBehalfOf user if provided
onBehalfOfUserEntitlements = onBehalfOfUserId match {
case Some(obUserId) =>
Await.result(
code.api.util.NewStyle.function.getEntitlementsByUserId(obUserId, Some(callContext)),
5.seconds
)
case None => List.empty[Entitlement]
}
// Fetch target user if userId is provided
userOpt <- userId match {
case Some(uId) => Users.users.vend.getUserByUserId(uId).map(Some(_))
@ -274,13 +293,77 @@ object AbacRuleEngine {
// Compile and execute the rule
compiledFunc <- compileRule(ruleId, rule.ruleCode)
result <- tryo {
compiledFunc(authenticatedUser, authenticatedUserAttributes, authenticatedUserAuthContext, onBehalfOfUserOpt, onBehalfOfUserAttributes, onBehalfOfUserAuthContext, userOpt, userAttributes, bankOpt, bankAttributes, accountOpt, accountAttributes, transactionOpt, transactionAttributes, transactionRequestOpt, transactionRequestAttributes, customerOpt, customerAttributes, Some(callContext))
compiledFunc(authenticatedUser, authenticatedUserAttributes, authenticatedUserAuthContext, authenticatedUserEntitlements, onBehalfOfUserOpt, onBehalfOfUserAttributes, onBehalfOfUserAuthContext, onBehalfOfUserEntitlements, userOpt, userAttributes, bankOpt, bankAttributes, accountOpt, accountAttributes, transactionOpt, transactionAttributes, transactionRequestOpt, transactionRequestAttributes, customerOpt, customerAttributes, Some(callContext))
}
} yield result
}
/**
* Execute all active ABAC rules with a specific policy (OR logic - at least one must pass)
* @param logic The logic to apply: "AND" (all must pass), "OR" (any must pass), "XOR" (exactly one must pass)
*
* @param policy The policy to filter rules by
* @param authenticatedUserId The ID of the authenticated user
* @param onBehalfOfUserId Optional ID of user being acted on behalf of
* @param userId The ID of the target user to evaluate
* @param callContext Call context for fetching objects
* @param bankId Optional bank ID
* @param accountId Optional account ID
* @param viewId Optional view ID
* @param transactionId Optional transaction ID
* @param transactionRequestId Optional transaction request ID
* @param customerId Optional customer ID
* @return Box[Boolean] - Full(true) if at least one rule passes (OR logic), Full(false) if all fail
*/
def executeRulesByPolicy(
policy: String,
authenticatedUserId: String,
onBehalfOfUserId: Option[String] = None,
userId: Option[String] = None,
callContext: CallContext,
bankId: Option[String] = None,
accountId: Option[String] = None,
viewId: Option[String] = None,
transactionId: Option[String] = None,
transactionRequestId: Option[String] = None,
customerId: Option[String] = None
): Box[Boolean] = {
val rules = MappedAbacRuleProvider.getActiveAbacRulesByPolicy(policy)
if (rules.isEmpty) {
// No rules for this policy - default to allow
Full(true)
} else {
// Execute all rules and check if at least one passes
val results = rules.map { rule =>
executeRule(
ruleId = rule.abacRuleId,
authenticatedUserId = authenticatedUserId,
onBehalfOfUserId = onBehalfOfUserId,
userId = userId,
callContext = callContext,
bankId = bankId,
accountId = accountId,
viewId = viewId,
transactionId = transactionId,
transactionRequestId = transactionRequestId,
customerId = customerId
)
}
// Count successes and failures
val successes = results.filter {
case Full(true) => true
case _ => false
}
// At least one rule must pass (OR logic)
Full(successes.nonEmpty)
}
}
/**
* Validate ABAC rule code by attempting to compile it
*

View File

@ -14,6 +14,7 @@ trait AbacRuleTrait {
def ruleCode: String
def isActive: Boolean
def description: String
def policy: String
def createdByUserId: String
def updatedByUserId: String
}
@ -30,6 +31,7 @@ class AbacRule extends AbacRuleTrait with LongKeyedMapper[AbacRule] with IdPK wi
override def defaultValue = true
}
object Description extends MappedText(this)
object Policy extends MappedText(this)
object CreatedByUserId extends MappedString(this, 255)
object UpdatedByUserId extends MappedString(this, 255)
@ -38,6 +40,7 @@ class AbacRule extends AbacRuleTrait with LongKeyedMapper[AbacRule] with IdPK wi
override def ruleCode: String = RuleCode.get
override def isActive: Boolean = IsActive.get
override def description: String = Description.get
override def policy: String = Policy.get
override def createdByUserId: String = CreatedByUserId.get
override def updatedByUserId: String = UpdatedByUserId.get
}
@ -51,10 +54,13 @@ trait AbacRuleProvider {
def getAbacRuleByName(ruleName: String): Box[AbacRuleTrait]
def getAllAbacRules(): List[AbacRuleTrait]
def getActiveAbacRules(): List[AbacRuleTrait]
def getAbacRulesByPolicy(policy: String): List[AbacRuleTrait]
def getActiveAbacRulesByPolicy(policy: String): List[AbacRuleTrait]
def createAbacRule(
ruleName: String,
ruleCode: String,
description: String,
policy: String,
isActive: Boolean,
createdBy: String
): Box[AbacRuleTrait]
@ -63,6 +69,7 @@ trait AbacRuleProvider {
ruleName: String,
ruleCode: String,
description: String,
policy: String,
isActive: Boolean,
updatedBy: String
): Box[AbacRuleTrait]
@ -87,10 +94,23 @@ object MappedAbacRuleProvider extends AbacRuleProvider {
AbacRule.findAll(By(AbacRule.IsActive, true))
}
override def getAbacRulesByPolicy(policy: String): List[AbacRuleTrait] = {
AbacRule.findAll().filter { rule =>
rule.policy.split(",").map(_.trim).contains(policy)
}
}
override def getActiveAbacRulesByPolicy(policy: String): List[AbacRuleTrait] = {
AbacRule.findAll(By(AbacRule.IsActive, true)).filter { rule =>
rule.policy.split(",").map(_.trim).contains(policy)
}
}
override def createAbacRule(
ruleName: String,
ruleCode: String,
description: String,
policy: String,
isActive: Boolean,
createdBy: String
): Box[AbacRuleTrait] = {
@ -99,6 +119,7 @@ object MappedAbacRuleProvider extends AbacRuleProvider {
.RuleName(ruleName)
.RuleCode(ruleCode)
.Description(description)
.Policy(policy)
.IsActive(isActive)
.CreatedByUserId(createdBy)
.UpdatedByUserId(createdBy)
@ -111,6 +132,7 @@ object MappedAbacRuleProvider extends AbacRuleProvider {
ruleName: String,
ruleCode: String,
description: String,
policy: String,
isActive: Boolean,
updatedBy: String
): Box[AbacRuleTrait] = {
@ -121,6 +143,7 @@ object MappedAbacRuleProvider extends AbacRuleProvider {
.RuleName(ruleName)
.RuleCode(ruleCode)
.Description(description)
.Policy(policy)
.IsActive(isActive)
.UpdatedByUserId(updatedBy)
.saveMe()

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.ApiTag._

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,7 @@
package code.api.AUOpenBanking.v1_0_0
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.BahrainOBF.v1_0_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,7 @@
package code.api.MxOF
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.Constant
import code.api.MxOF.JSONFactory_MXOF_0_0_1.createGetAtmsResponse
import code.api.util.APIUtil._

View File

@ -27,6 +27,8 @@ TESOBE (http://www.tesobe.com/)
package code.api
import scala.language.reflectiveCalls
import scala.language.implicitConversions
import code.api.Constant._
import code.api.OAuthHandshake._
import code.api.util.APIUtil._

View File

@ -1,5 +1,6 @@
package code.api.Polish.v2_1_1_1
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.Polish.v2_1_1_1
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.Polish.v2_1_1_1
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.Polish.v2_1_1_1
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.ResourceDocs1_4_0
import scala.language.reflectiveCalls
import code.api.Constant.HostName
import code.api.OBPRestHelper
import code.api.cache.Caching
@ -16,7 +17,7 @@ import net.liftweb.http.{GetRequest, InMemoryResponse, PlainTextResponse, Req, S
object ResourceDocs140 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version = ApiVersion.v1_4_0 // "1.4.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObp,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
ImplementationsResourceDocs.getResourceDocsSwagger,
@ -31,7 +32,7 @@ object ResourceDocs140 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs200 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version = ApiVersion.v2_0_0 // "2.0.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObp,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -46,7 +47,7 @@ object ResourceDocs200 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs210 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v2_1_0 // "2.1.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObp,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -60,7 +61,7 @@ object ResourceDocs210 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs220 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v2_2_0 // "2.2.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObp,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -74,7 +75,7 @@ object ResourceDocs220 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version : ApiVersion = ApiVersion.v3_0_0 // = "3.0.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObp,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -87,7 +88,7 @@ object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs310 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v3_1_0 // = "3.0.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObp,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -102,7 +103,7 @@ object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs400 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v4_0_0 // = "4.0.0" // We match other api versions so API explorer can easily use the path.
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObpV400,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -117,7 +118,7 @@ object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs500 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v5_0_0
val versionStatus = ApiVersionStatus.STABLE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObpV400,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -132,7 +133,7 @@ object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs510 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v5_1_0
val versionStatus = ApiVersionStatus.BLEEDING_EDGE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObpV400,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getBankLevelDynamicResourceDocsObp,
@ -148,7 +149,7 @@ object ResourceDocs300 extends OBPRestHelper with ResourceDocsAPIMethods with Md
object ResourceDocs600 extends OBPRestHelper with ResourceDocsAPIMethods with MdcLoggable {
val version: ApiVersion = ApiVersion.v6_0_0
val versionStatus = ApiVersionStatus.BLEEDING_EDGE.toString
val routes = List(
val routes: Seq[OBPEndpoint] = List(
ImplementationsResourceDocs.getResourceDocsObpV400,
ImplementationsResourceDocs.getResourceDocsSwagger,
ImplementationsResourceDocs.getResourceDocsOpenAPI31,

View File

@ -39,6 +39,7 @@ import net.liftweb.json.JsonAST.{JField, JString, JValue}
import net.liftweb.json._
import java.util.concurrent.ConcurrentHashMap
import scala.collection.immutable
import scala.collection.immutable.{List, Nil}
import scala.concurrent.Future
@ -471,7 +472,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
case true => authenticatedAccess(cc) // If set resource_docs_requires_role=true, we need check the authentication
}
_ <- resourceDocsRequireRole match {
case false => Future()
case false => Future(())
case true => // If set resource_docs_requires_role=true, we need check the roles as well
NewStyle.function.hasAtLeastOneEntitlement(failMsg = UserHasMissingRoles + canReadResourceDoc.toString)("", u.map(_.userId).getOrElse(""), ApiRole.canReadResourceDoc :: Nil, cc.callContext)
}
@ -595,7 +596,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
}
(_, callContext) <- NewStyle.function.getBank(BankId(bankId), Option(cc))
_ <- resourceDocsRequireRole match {
case false => Future()
case false => Future(())
case true => // If set resource_docs_requires_role=true, we need check the the roles as well
NewStyle.function.hasAtLeastOneEntitlement(failMsg = UserHasMissingRoles + ApiRole.canReadDynamicResourceDocsAtOneBank.toString)(
bankId, u.map(_.userId).getOrElse(""), ApiRole.canReadDynamicResourceDocsAtOneBank::Nil, cc.callContext
@ -1256,3 +1257,4 @@ so the caller must specify any required filtering by catalog explicitly.
}

View File

@ -1,5 +1,6 @@
package code.api.ResourceDocs1_4_0
import scala.language.implicitConversions
import code.api.Constant
import code.api.Constant._
import code.api.UKOpenBanking.v2_0_0.JSONFactory_UKOpenBanking_200

View File

@ -889,7 +889,7 @@ object SwaggerJSONFactory extends MdcLoggable {
* @return a list of include original list and nested objects
*/
private def getAllEntities(entities: List[AnyRef]) = {
val notNullEntities = entities.filter(null !=)
val notNullEntities = entities.filter(null.!=)
val notSupportYetEntity = entities.filter(_.getClass.getSimpleName.equals(NotSupportedYet.getClass.getSimpleName.replace("$","")))
val existsEntityTypes: Set[universe.Type] = notNullEntities.map(ReflectUtils.getType).toSet
@ -919,10 +919,10 @@ object SwaggerJSONFactory extends MdcLoggable {
val entityType = ReflectUtils.getType(obj)
val constructorParamList = ReflectUtils.getPrimaryConstructor(entityType).paramLists.headOption.getOrElse(Nil)
// if exclude current obj, the result list tail will be Nil
val resultTail = if(excludeTypes.exists(entityType =:=)) Nil else List(obj)
val resultTail = if(excludeTypes.exists(entityType.=:=)) Nil else List(obj)
val refValues: List[Any] = constructorParamList
.filter(it => isSwaggerRefType(it.info) && !excludeTypes.exists(_ =:= it.info))
.filter(it => isSwaggerRefType(it.info) && !excludeTypes.exists(_.=:=(it.info)))
.map(it => {
val paramName = it.name.toString
val value = ReflectUtils.invokeMethod(obj, paramName)
@ -1009,7 +1009,7 @@ object SwaggerJSONFactory extends MdcLoggable {
val errorMessages: Set[AnyRef] = resourceDocList.flatMap(_.error_response_bodies).toSet
val errorDefinitions = ErrorMessages.allFields
.filterNot(null ==)
.filterNot(null.==)
.filter(it => errorMessages.contains(it._2))
.toList
.map(it => {

View File

@ -1,5 +1,6 @@
package code.api.STET.v1_4
import scala.language.implicitConversions
import code.api.APIFailureNewStyle
import code.api.STET.v1_4.JSONFactory_STET_1_4._
import code.api.berlin.group.v1_3.JvalueCaseClass

View File

@ -1,5 +1,6 @@
package code.api.STET.v1_4
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.STET.v1_4
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.Constant
import code.api.UKOpenBanking.v3_1_0.JSONFactory_UKOpenBanking_310.ConsentPostBodyUKV310
import code.api.berlin.group.v1_3.JvalueCaseClass

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.Constant
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.Constant
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil._
import code.api.util.ApiTag

View File

@ -1,5 +1,6 @@
package code.api.UKOpenBanking.v3_1_0
import scala.language.implicitConversions
import code.api.berlin.group.v1_3.JvalueCaseClass
import code.api.util.APIUtil.{defaultBankId, _}
import code.api.util.ApiTag._

View File

@ -1,5 +1,6 @@
package code.api.builder.AccountInformationServiceAISApi
import scala.language.implicitConversions
import code.api.APIFailureNewStyle
import code.api.Constant.{SYSTEM_READ_ACCOUNTS_BERLIN_GROUP_VIEW_ID, SYSTEM_READ_BALANCES_BERLIN_GROUP_VIEW_ID, SYSTEM_READ_TRANSACTIONS_BERLIN_GROUP_VIEW_ID}
import code.api.berlin.group.ConstantsBG

View File

@ -1,5 +1,6 @@
package code.api.builder.CommonServicesApi
import scala.language.implicitConversions
import code.api.berlin.group.ConstantsBG
import code.api.berlin.group.v1_3.{JvalueCaseClass, OBP_BERLIN_GROUP_1_3}
import code.api.builder.AccountInformationServiceAISApi.APIMethods_AccountInformationServiceAISApi

View File

@ -1,5 +1,6 @@
package code.api.builder.ConfirmationOfFundsServicePIISApi
import scala.language.implicitConversions
import code.api.berlin.group.ConstantsBG
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3._
import code.api.berlin.group.v1_3.{JvalueCaseClass, OBP_BERLIN_GROUP_1_3}

View File

@ -1,5 +1,6 @@
package code.api.builder.PaymentInitiationServicePISApi
import scala.language.implicitConversions
import code.api.berlin.group.ConstantsBG
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3.{CancelPaymentResponseJson, CancelPaymentResponseLinks, LinkHrefJson, UpdatePaymentPsuDataJson, checkAuthorisationConfirmation, checkSelectPsuAuthenticationMethod, checkTransactionAuthorisation, checkUpdatePsuAuthentication, createCancellationTransactionRequestJson}
import code.api.berlin.group.v1_3.model.TransactionStatus.mapTransactionStatus

View File

@ -1,5 +1,6 @@
package code.api.builder.SigningBasketsApi
import scala.language.implicitConversions
import code.api.berlin.group.ConstantsBG
import code.api.berlin.group.v1_3.JSONFactory_BERLIN_GROUP_1_3.{PostSigningBasketJsonV13, UpdatePaymentPsuDataJson, createSigningBasketResponseJson, createStartSigningBasketAuthorisationJson, getSigningBasketResponseJson, getSigningBasketStatusResponseJson}
import code.api.berlin.group.v1_3.{JSONFactory_BERLIN_GROUP_1_3, JvalueCaseClass}

View File

@ -266,6 +266,19 @@ object Constant extends MdcLoggable {
// ABAC Cache Prefixes (with global namespace and versioning)
def ABAC_RULE_PREFIX: String = getVersionedCachePrefix(ABAC_RULE_NAMESPACE)
// ABAC Policy Constants
final val ABAC_POLICY_ACCOUNT_ACCESS = "account-access"
// List of all ABAC Policies
final val ABAC_POLICIES: List[String] = List(
ABAC_POLICY_ACCOUNT_ACCESS
)
// Map of ABAC Policies to their descriptions
final val ABAC_POLICY_DESCRIPTIONS: Map[String, String] = Map(
ABAC_POLICY_ACCOUNT_ACCESS -> "Rules for controlling access to account information and account-related operations"
)
final val CAN_SEE_TRANSACTION_OTHER_BANK_ACCOUNT = "can_see_transaction_other_bank_account"
final val CAN_SEE_TRANSACTION_METADATA = "can_see_transaction_metadata"
final val CAN_SEE_TRANSACTION_DESCRIPTION = "can_see_transaction_description"

View File

@ -1,5 +1,6 @@
package code.api.dynamic.endpoint.helper
import scala.language.implicitConversions
import code.api.util.APIUtil.{OBPEndpoint, OBPReturnType, futureToBoxedResponse, scalaFutureToLaFuture}
import code.api.util.DynamicUtil.{Sandbox, Validation}
import code.api.util.{CallContext, CustomJsonFormats, DynamicUtil}
@ -34,7 +35,7 @@ trait DynamicCompileEndpoint {
}
private def validateDependencies() = {
val dependencies = DynamicUtil.getDynamicCodeDependentMethods(this.getClass, "process" == )
val dependencies = DynamicUtil.getDynamicCodeDependentMethods(this.getClass, "process".==)
Validation.validateDependency(dependencies)
}
}

View File

@ -1,5 +1,6 @@
package code.api.dynamic.endpoint.helper
import scala.language.existentials
import org.apache.pekko.http.scaladsl.model.{HttpMethods, HttpMethod => PekkoHttpMethod}
import code.DynamicData.{DynamicDataProvider, DynamicDataT}
import code.DynamicEndpoint.{DynamicEndpointProvider, DynamicEndpointT}
@ -677,7 +678,7 @@ object DynamicEndpointHelper extends RestHelper {
schemas += schema
}
// check whether this schema already recurse two times
if(schemas.count(schema ==) > 3) {
if(schemas.count(schema.==) > 3) {
return JObject(Nil)
}

View File

@ -26,6 +26,9 @@ TESOBE (http://www.tesobe.com/)
*/
package code.api.util
import scala.language.implicitConversions
import scala.language.reflectiveCalls
import bootstrap.liftweb.CustomDBVendor
import cats.effect.IO
import code.accountholders.AccountHolders
@ -1646,6 +1649,11 @@ object APIUtil extends MdcLoggable with CustomJsonFormats{
var errorResponseBodies: List[String], // Possible error responses
tags: List[ResourceDocTag],
var roles: Option[List[ApiRole]] = None,
// IMPORTANT: Roles declared here are AUTOMATICALLY CHECKED at runtime!
// When roles specified, framework automatically: 1) Validates user authentication,
// 2) Checks user has at least one of specified roles, 3) Performs checks in wrappedWithAuthCheck()
// No manual hasEntitlement() call needed in endpoint body - handled automatically!
// To disable: call .disableAutoValidateRoles() on ResourceDoc
isFeatured: Boolean = false,
specialInstructions: Option[String] = None,
var specifiedUrl: Option[String] = None, // A derived value: Contains the called version (added at run time). See the resource doc for resource doc!
@ -1778,9 +1786,9 @@ object APIUtil extends MdcLoggable with CustomJsonFormats{
private val reversedRequestUrl = requestUrlPartPath.reverse
def getPathParams(url: List[String]): Map[String, String] =
reversedRequestUrl.zip(url.reverse) collect {
reversedRequestUrl.zip(url.reverse).collect {
case pair @(k, _) if isPathVariable(k) => pair
} toMap
}.toMap
/**
* According errorResponseBodies whether contains UserNotLoggedIn and UserHasMissingRoles do validation.
@ -4068,7 +4076,7 @@ object APIUtil extends MdcLoggable with CustomJsonFormats{
def parseDate(date: String): Option[Date] = {
val currentSupportFormats = List(DateWithDayFormat, DateWithSecondsFormat, DateWithMsFormat, DateWithMsRollbackFormat)
val parsePosition = new ParsePosition(0)
currentSupportFormats.toStream.map(_.parse(date, parsePosition)).find(null !=)
currentSupportFormats.toStream.map(_.parse(date, parsePosition)).find(null.!=)
}
private def passesPsd2ServiceProviderCommon(cc: Option[CallContext], serviceProvider: String) = {
@ -4464,7 +4472,7 @@ object APIUtil extends MdcLoggable with CustomJsonFormats{
private def getClassPool(classLoader: ClassLoader) = {
import scala.concurrent.duration._
Caching.memoizeSyncWithImMemory(Some(classLoader.toString()))(DurationInt(30) days) {
Caching.memoizeSyncWithImMemory(Some(classLoader.toString()))(DurationInt(30).days) {
val classPool: ClassPool = ClassPool.getDefault
classPool.appendClassPath(new LoaderClassPath(classLoader))
classPool
@ -4565,7 +4573,7 @@ object APIUtil extends MdcLoggable with CustomJsonFormats{
*/
def getObpTrace(clazzName: String, methodName: String, signature: String, exclude: List[(String, String, String)] = Nil): List[(String, String, String)] = {
import scala.concurrent.duration._
Caching.memoizeSyncWithImMemory(Some(clazzName + methodName + signature))(DurationInt(30) days) {
Caching.memoizeSyncWithImMemory(Some(clazzName + methodName + signature))(DurationInt(30).days) {
// List:: className->methodName->signature, find all the dependent methods for one
val methods = getDependentMethods(clazzName, methodName, signature)

View File

@ -32,11 +32,12 @@ object AfterApiAuth extends MdcLoggable{
*/
def innerLoginUserInitAction(authUser: Box[AuthUser]) = {
authUser.map { u => // Init actions
logger.info("AfterApiAuth.innerLoginUserInitAction started successfully")
logger.debug("AfterApiAuth.innerLoginUserInitAction started successfully")
sofitInitAction(u)
} match {
case Full(_) => logger.warn("AfterApiAuth.innerLoginUserInitAction completed successfully")
case userInitActionFailure => logger.warn("AfterApiAuth.innerLoginUserInitAction: " + userInitActionFailure)
case Full(_) => logger.debug("AfterApiAuth.innerLoginUserInitAction completed successfully")
case Empty => // Init actions are not started at all
case userInitActionFailure => logger.error("AfterApiAuth.innerLoginUserInitAction: " + userInitActionFailure)
}
}
/**

View File

@ -124,7 +124,7 @@ object ApiRole extends MdcLoggable{
// ALL
case class CanGetSystemLogCacheAll(requiresBankId: Boolean = false) extends ApiRole
lazy val canGetSystemLogCacheAll = CanGetSystemLogCacheAll()
case class CanUpdateAgentStatusAtAnyBank(requiresBankId: Boolean = false) extends ApiRole
lazy val canUpdateAgentStatusAtAnyBank = CanUpdateAgentStatusAtAnyBank()
@ -1003,6 +1003,9 @@ object ApiRole extends MdcLoggable{
case class CanGetAllConnectorMethods(requiresBankId: Boolean = false) extends ApiRole
lazy val canGetAllConnectorMethods = CanGetAllConnectorMethods()
case class CanGetSystemConnectorMethodNames(requiresBankId: Boolean = false) extends ApiRole
lazy val canGetSystemConnectorMethodNames = CanGetSystemConnectorMethodNames()
case class CanCreateDynamicResourceDoc(requiresBankId: Boolean = false) extends ApiRole
lazy val canCreateDynamicResourceDoc = CanCreateDynamicResourceDoc()

View File

@ -18,6 +18,8 @@ object ApiTag {
val apiTagTransactionRequestAttribute = ResourceDocTag("Transaction-Request-Attribute")
val apiTagVrp = ResourceDocTag("VRP")
val apiTagApi = ResourceDocTag("API")
val apiTagOAuth = ResourceDocTag("OAuth")
val apiTagOIDC = ResourceDocTag("OIDC")
val apiTagBank = ResourceDocTag("Bank")
val apiTagBankAttribute = ResourceDocTag("Bank-Attribute")
val apiTagAccount = ResourceDocTag("Account")

View File

@ -3160,7 +3160,7 @@ object NewStyle extends MdcLoggable{
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(methodRoutingTTL second) {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(methodRoutingTTL.second) {
MethodRoutingProvider.connectorMethodProvider.vend.getMethodRoutings(methodName, isBankIdExactMatch, bankIdPattern)
}
}
@ -3213,7 +3213,7 @@ object NewStyle extends MdcLoggable{
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(endpointMappingTTL second) {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(endpointMappingTTL.second) {
{(EndpointMappingProvider.endpointMappingProvider.vend.getAllEndpointMappings(bankId), callContext)}
}
}
@ -3327,7 +3327,7 @@ object NewStyle extends MdcLoggable{
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(dynamicEntityTTL second) {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(dynamicEntityTTL.second) {
DynamicEntityProvider.connectorMethodProvider.vend.getDynamicEntities(bankId, returnBothBankAndSystemLevel)
}
}
@ -3338,7 +3338,7 @@ object NewStyle extends MdcLoggable{
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(dynamicEntityTTL second) {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(dynamicEntityTTL.second) {
DynamicEntityProvider.connectorMethodProvider.vend.getDynamicEntitiesByUserId(userId: String)
}
}

View File

@ -76,7 +76,7 @@ trait APIMethods121 {
def checkIfLocationPossible(lat:Double,lon:Double) : Box[Unit] = {
if(scala.math.abs(lat) <= 90 & scala.math.abs(lon) <= 180)
Full()
Full(())
else
Failure("Coordinates not possible")
}
@ -132,7 +132,7 @@ trait APIMethods121 {
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory.getApiInfoJSON(apiVersion,apiVersionStatus), HttpCode.`200`(cc.callContext))
}

View File

@ -26,6 +26,8 @@ TESOBE (http://www.tesobe.com/)
*/
package code.api.v1_2_1
import scala.language.implicitConversions
import scala.language.reflectiveCalls
import code.api.OBPRestHelper
import code.api.util.APIUtil.{OBPEndpoint, getAllowedEndpoints}
import com.openbankproject.commons.util.{ApiVersion,ApiVersionStatus}
@ -40,7 +42,7 @@ object OBPAPI1_2_1 extends OBPRestHelper with APIMethods121 with MdcLoggable wit
val version : ApiVersion = ApiVersion.v1_2_1 // "1.2.1"
val versionStatus = ApiVersionStatus.DEPRECATED.toString
lazy val endpointsOf1_2_1 = List(
lazy val endpointsOf1_2_1: Seq[OBPEndpoint] = List(
Implementations1_2_1.root,
Implementations1_2_1.getBanks,
Implementations1_2_1.bankById,

View File

@ -50,7 +50,7 @@ trait APIMethods130 {
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory.getApiInfoJSON(OBPAPI1_3_0.version, OBPAPI1_3_0.versionStatus), HttpCode.`200`(cc.callContext))
}

View File

@ -1,5 +1,6 @@
package code.api.v1_3_0
import scala.language.reflectiveCalls
import code.api.OBPRestHelper
import code.api.util.APIUtil.{OBPEndpoint, getAllowedEndpoints}
import com.openbankproject.commons.util.{ApiVersion,ApiVersionStatus}

View File

@ -1,5 +1,6 @@
package code.api.v1_4_0
import scala.language.reflectiveCalls
import code.api.Constant._
import code.api.util.ApiRole._
import code.api.util.ApiTag._
@ -84,7 +85,7 @@ trait APIMethods140 extends MdcLoggable with APIMethods130 with APIMethods121{
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory.getApiInfoJSON(OBPAPI1_4_0.version, OBPAPI1_4_0.versionStatus), HttpCode.`200`(cc.callContext))
}

View File

@ -530,7 +530,7 @@ object JSONFactory1_4_0 extends MdcLoggable{
jsonResponseBodyFieldsI18n:String
): ResourceDocJson = {
val cacheKey = LOCALISED_RESOURCE_DOC_PREFIX + s"operationId:${operationId}-locale:$locale- isVersion4OrHigher:$isVersion4OrHigher".intern()
Caching.memoizeSyncWithImMemory(Some(cacheKey))(CREATE_LOCALISED_RESOURCE_DOC_JSON_TTL seconds) {
Caching.memoizeSyncWithImMemory(Some(cacheKey))(CREATE_LOCALISED_RESOURCE_DOC_JSON_TTL.seconds) {
val fieldsDescription =
if (resourceDocUpdatedTags.tags.toString.contains("Dynamic-Entity")
|| resourceDocUpdatedTags.tags.toString.contains("Dynamic-Endpoint")

View File

@ -1,5 +1,6 @@
package code.api.v1_4_0
import scala.language.reflectiveCalls
import code.api.OBPRestHelper
import code.api.util.APIUtil.{OBPEndpoint, getAllowedEndpoints}
import com.openbankproject.commons.util.{ApiVersion,ApiVersionStatus}

View File

@ -1,5 +1,6 @@
package code.api.v2_0_0
import scala.language.reflectiveCalls
import code.TransactionTypes.TransactionType
import code.api.APIFailureNewStyle
import code.api.Constant._
@ -147,7 +148,7 @@ trait APIMethods200 {
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory121.getApiInfoJSON(OBPAPI2_0_0.version, OBPAPI2_0_0.versionStatus), HttpCode.`200`(cc.callContext))
}

View File

@ -26,6 +26,7 @@ TESOBE (http://www.tesobe.com/)
*/
package code.api.v2_0_0
import scala.language.reflectiveCalls
import code.api.OBPRestHelper
import code.api.util.APIUtil.{OBPEndpoint, getAllowedEndpoints}
import com.openbankproject.commons.util.{ApiVersion,ApiVersionStatus}

View File

@ -1,5 +1,6 @@
package code.api.v2_1_0
import scala.language.reflectiveCalls
import code.TransactionTypes.TransactionType
import code.api.Constant.CAN_SEE_TRANSACTION_REQUESTS
import code.api.util.ApiTag._
@ -91,7 +92,7 @@ trait APIMethods210 {
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory.getApiInfoJSON(OBPAPI2_1_0.version, OBPAPI2_1_0.versionStatus), HttpCode.`200`(cc.callContext))
}

View File

@ -26,6 +26,7 @@ TESOBE (http://www.tesobe.com/)
*/
package code.api.v2_1_0
import scala.language.reflectiveCalls
import code.api.OBPRestHelper
import code.api.util.APIUtil.{OBPEndpoint, getAllowedEndpoints}
import code.api.util.{APIUtil, VersionedOBPApis}

View File

@ -1,5 +1,6 @@
package code.api.v2_2_0
import scala.language.reflectiveCalls
import code.api.Constant._
import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON._
import code.api.util.APIUtil._
@ -79,7 +80,7 @@ trait APIMethods220 {
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory.getApiInfoJSON(OBPAPI2_2_0.version, OBPAPI2_2_0.versionStatus), HttpCode.`200`(cc.callContext))
}
@ -535,14 +536,14 @@ trait APIMethods220 {
_ <- entitlementsByBank.filter(_.roleName == CanCreateEntitlementAtOneBank.toString()).size > 0 match {
case true =>
// Already has entitlement
Full()
Full(())
case false =>
Full(Entitlement.entitlement.vend.addEntitlement(bank.id, u.userId, CanCreateEntitlementAtOneBank.toString()))
}
_ <- entitlementsByBank.filter(_.roleName == CanReadDynamicResourceDocsAtOneBank.toString()).size > 0 match {
case true =>
// Already has entitlement
Full()
Full(())
case false =>
Full(Entitlement.entitlement.vend.addEntitlement(bank.id, u.userId, CanReadDynamicResourceDocsAtOneBank.toString()))
}
@ -1246,7 +1247,7 @@ trait APIMethods220 {
(account, callContext)
}
}else
Future{(Full(), Some(cc))}
Future{(Full(()), Some(cc))}
otherAccountRoutingSchemeOBPFormat = if(postJson.other_account_routing_scheme.equalsIgnoreCase("AccountNo")) "ACCOUNT_NUMBER" else StringHelpers.snakify(postJson.other_account_routing_scheme).toUpperCase

View File

@ -1,6 +1,7 @@
package code.api.v2_2_0
import scala.language.reflectiveCalls
import code.api.OBPRestHelper
import code.api.util.APIUtil.{OBPEndpoint, getAllowedEndpoints}
import code.api.util.{APIUtil, VersionedOBPApis}

View File

@ -1,5 +1,6 @@
package code.api.v3_0_0
import scala.language.reflectiveCalls
import code.accountattribute.AccountAttributeX
import code.api.Constant._
import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON
@ -84,7 +85,7 @@ trait APIMethods300 {
cc =>
implicit val ec = EndpointContext(Some(cc))
for {
_ <- Future() // Just start async call
_ <- Future(()) // Just start async call
} yield {
(JSONFactory.getApiInfoJSON(OBPAPI3_0_0.version, OBPAPI3_0_0.versionStatus), HttpCode.`200`(cc.callContext))
}
@ -2118,7 +2119,7 @@ trait APIMethods300 {
hasCanReadGlossaryRole
}
} else {
Future{Full()}
Future{Full(())}
}
json = JSONFactory300.createGlossaryItemsJsonV300(getGlossaryItems)
} yield {

Some files were not shown because too many files have changed in this diff Show More