diff --git a/.gitignore b/.gitignore index 8d3666bc0a80c1792b326355cd0404571b87fc79..46c5209862c5e38c9a2f85fe620d1af68fbaf49d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,45 @@ **/out **/*.iml **/dependency-reduced-pom.xml +HELP.md +target/ +bin/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ +.gradle/ + +### macOS ### +*.DS_Store + +### Integration tests ### +.gradle + +### Environment Configuration ### +*.env diff --git a/NOTICE b/NOTICE index 218b1b9361416803fd45fba2c2281a95c0ada292..3d261895f12486e51fbcde0eba0c8e0efde1f1a6 100644 --- a/NOTICE +++ b/NOTICE @@ -44,11 +44,10 @@ The following software have components provided under the terms of this license: - Commons Digester (from http://commons.apache.org/digester/) - Commons IO (from http://commons.apache.org/io/) - Converter: Jackson (from ) -- Data Mapper for Jackson (from http://jackson.codehaus.org) - Elastic JNA Distribution (from https://github.com/java-native-access/jna) - Elasticsearch: 5.0.0-alpha5 (from https://github.com/elastic/elasticsearch) -- Expression Language 3.0 (from http://uel.java.net) - Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el) +- Expression Language 3.0 (from http://uel.java.net) - FindBugs-jsr305 (from http://findbugs.sourceforge.net/) - Google APIs Client Library for Java (from ) - Google App Engine extensions to the Google HTTP Client Library for Java. (from ) @@ -82,7 +81,6 @@ The following software have components provided under the terms of this license: - JSON library from Android SDK (from http://developer.android.com/sdk) - JSONassert (from https://github.com/skyscreamer/JSONassert) - Jackson (from http://jackson.codehaus.org) -- Jackson (from http://jackson.codehaus.org) - Jackson 2 extensions to the Google HTTP Client Library for Java. (from https://github.com/google/google-http-java-client.git/google-http-client-jackson2) - Jackson dataformat: CBOR (from http://github.com/FasterXML/jackson-dataformats-binary) - Jackson datatype: JSR310 (from http://wiki.fasterxml.com/JacksonModuleJSR310) @@ -99,8 +97,8 @@ The following software have components provided under the terms of this license: - Jakarta Bean Validation API (from https://beanvalidation.org) - Java Native Access (from https://github.com/java-native-access/jna) - Java Native Access Platform (from https://github.com/java-native-access/jna) -- Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet) - Java Servlet API (from http://servlet-spec.java.net) +- Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet) - Java UUID Generator (from http://wiki.fasterxml.com/JugHome) - Javassist (from http://www.javassist.org/) - Joda-Time (from http://www.joda.org/joda-time/) @@ -126,11 +124,9 @@ The following software have components provided under the terms of this license: - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java) -- Microsoft Application Insights Logback Appender (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Azure Netty HTTP Client Library (from https://github.com/Azure/azure-sdk-for-java) - Mockito (from http://www.mockito.org) - Mockito (from http://mockito.org) -- Mockito (from http://mockito.org) - Netty Reactive Streams Implementation (from ) - Netty/Buffer (from http://netty.io/) - Netty/Codec (from ) @@ -150,7 +146,6 @@ The following software have components provided under the terms of this license: - Nimbus LangTag (from https://bitbucket.org/connect2id/nimbus-language-tags) - Non-Blocking Reactive Foundation for the JVM (from https://github.com/reactor/reactor) - OAuth 2.0 SDK with OpenID Connect extensions (from https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions) -- OAuth2 for Spring Security (from ) - Objenesis (from http://objenesis.org) - OkHttp (from ) - OkHttp Logging Interceptor (from ) @@ -171,7 +166,6 @@ The following software have components provided under the terms of this license: - Spring Boot Actuator (from http://projects.spring.io/spring-boot/) - Spring Boot Actuator AutoConfigure (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-actuator-autoconfigure) - Spring Boot AutoConfigure (from http://projects.spring.io/spring-boot/) -- Spring Boot Configuration Processor (from http://projects.spring.io/spring-boot/) - Spring Boot Json Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-json) - Spring Boot Log4J2 Starter (from http://projects.spring.io/spring-boot/) - Spring Boot Logging Starter (from http://projects.spring.io/spring-boot/) @@ -192,7 +186,6 @@ The following software have components provided under the terms of this license: - Spring Expression Language (SpEL) (from https://github.com/spring-projects/spring-framework) - Spring Plugin - Core (from ) - Spring Plugin - Metadata Extension (from ) -- Spring Security JWT Library (from http://github.com/spring-projects/spring-security-oauth) - Spring TestContext Framework (from https://github.com/spring-projects/spring-framework) - Spring Web (from https://github.com/spring-projects/spring-framework) - Spring Web MVC (from https://github.com/spring-projects/spring-framework) @@ -233,6 +226,8 @@ The following software have components provided under the terms of this license: - lettuce (from http://github.com/mp911de/lettuce/wiki) - micrometer-core (from https://github.com/micrometer-metrics/micrometer) - micrometer-registry-azure-monitor (from https://github.com/micrometer-metrics/micrometer) +- org.apiguardian:apiguardian-api (from https://github.com/apiguardian-team/apiguardian) +- org.opentest4j:opentest4j (from https://github.com/ota4j-team/opentest4j) - org.xmlunit:xmlunit-core (from http://www.xmlunit.org/) - parent-join (from https://github.com/elastic/elasticsearch) - powermock-api-support (from ) @@ -250,9 +245,6 @@ The following software have components provided under the terms of this license: - secure-sm (from https://github.com/elastic/elasticsearch) - spring-security-config (from http://spring.io/spring-security) - spring-security-core (from http://spring.io/spring-security) -- spring-security-oauth2-client (from http://spring.io/spring-security) -- spring-security-oauth2-core (from http://spring.io/spring-security) -- spring-security-oauth2-jose (from http://spring.io/spring-security) - spring-security-web (from http://spring.io/spring-security) - springfox-core (from https://github.com/springfox/springfox) - springfox-schema (from https://github.com/springfox/springfox) @@ -303,7 +295,6 @@ The following software have components provided under the terms of this license: - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java) -- Microsoft Application Insights Logback Appender (from https://github.com/Microsoft/ApplicationInsights-Java) - Mockito (from http://www.mockito.org) - NanoHttpd-Core (from ) - Netty/Codec/HTTP (from ) @@ -338,7 +329,6 @@ The following software have components provided under the terms of this license: - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java) -- Microsoft Application Insights Logback Appender (from https://github.com/Microsoft/ApplicationInsights-Java) ======================================================================== CC0-1.0 @@ -382,6 +372,7 @@ The following software have components provided under the terms of this license: - Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el) - JUnit (from http://junit.org) +- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) - Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet) - Logback Classic Module (from ) - Logback Core Module (from ) @@ -389,8 +380,12 @@ The following software have components provided under the terms of this license: - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java) -- Microsoft Application Insights Logback Appender (from https://github.com/Microsoft/ApplicationInsights-Java) - SnakeYAML (from http://www.snakeyaml.org) +- org.junit.jupiter:junit-jupiter-api (from http://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-engine (from http://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-params (from http://junit.org/junit5/) +- org.junit.platform:junit-platform-commons (from http://junit.org/junit5/) +- org.junit.platform:junit-platform-engine (from http://junit.org/junit5/) ======================================================================== EPL-2.0 @@ -398,7 +393,13 @@ EPL-2.0 The following software have components provided under the terms of this license: - Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el) +- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) - Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet) +- org.junit.jupiter:junit-jupiter-api (from http://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-engine (from http://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-params (from http://junit.org/junit5/) +- org.junit.platform:junit-platform-commons (from http://junit.org/junit5/) +- org.junit.platform:junit-platform-engine (from http://junit.org/junit5/) ======================================================================== GPL-2.0-only @@ -436,8 +437,8 @@ The following software have components provided under the terms of this license: - Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el) - Java Architecture For XML Binding (from ) - Java Architecture For XML Binding (from ) -- Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet) - Java Servlet API (from http://servlet-spec.java.net) +- Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet) - Java(TM) API for WebSocket (from ) - JavaBeans Activation Framework (from ) - JavaBeans Activation Framework API jar (from ) @@ -475,7 +476,6 @@ The following software have components provided under the terms of this license: - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java) -- Microsoft Application Insights Logback Appender (from https://github.com/Microsoft/ApplicationInsights-Java) - XNIO API (from http://www.jboss.org/xnio) ======================================================================== @@ -507,7 +507,6 @@ The following software have components provided under the terms of this license: - Azure Metrics Spring Boot Starter (from https://github.com/Microsoft/azure-spring-boot) - Azure Spring Boot AutoConfigure (from https://github.com/Microsoft/azure-spring-boot) - Azure Spring Boot Starter (from https://github.com/Microsoft/azure-spring-boot) -- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html) - Checker Qual (from https://checkerframework.org) - Checker Qual (from https://checkerframework.org) - Extensions on Apache Proton-J library (from https://github.com/Azure/qpid-proton-j-extensions) @@ -521,7 +520,6 @@ The following software have components provided under the terms of this license: - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java) -- Microsoft Application Insights Logback Appender (from https://github.com/Microsoft/ApplicationInsights-Java) - Microsoft Azure Java Core Library (from https://github.com/Azure/azure-sdk-for-java) - Microsoft Azure Netty HTTP Client Library (from https://github.com/Azure/azure-sdk-for-java) - Microsoft Azure SDK annotations (from https://github.com/Microsoft/java-api-annotations) @@ -533,13 +531,12 @@ The following software have components provided under the terms of this license: - Microsoft Azure common module for Storage (from https://github.com/Azure/azure-sdk-for-java) - Mockito (from http://mockito.org) - Mockito (from http://www.mockito.org) -- Mockito (from http://mockito.org) - Netty/Codec/HTTP (from ) - Netty/Common (from ) - Project Lombok (from https://projectlombok.org) - SLF4J API Module (from http://www.slf4j.org) - adal4j (from https://github.com/AzureAD/azure-activedirectory-library-for-java) -- jwks-rsa (from http://www.auth0.com) +- mockito-junit-jupiter (from https://github.com/mockito/mockito) - msal4j (from https://github.com/AzureAD/microsoft-authentication-library-for-java) - spring-security-core (from http://spring.io/spring-security) @@ -591,8 +588,6 @@ public-domain The following software have components provided under the terms of this license: - Asynchronous Http Client (from ) -- Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs (from http://www.bouncycastle.org/java.html) -- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html) - Guava: Google Core Libraries for Java (from https://github.com/google/guava.git) - Guava: Google Core Libraries for Java (from https://github.com/google/guava.git) - HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) @@ -602,7 +597,6 @@ The following software have components provided under the terms of this license: - Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java) - Microsoft Azure client library for Blob Storage (from https://github.com/Azure/azure-sdk-for-java) - Project Lombok (from https://projectlombok.org) -- Spring Security JWT Library (from http://github.com/spring-projects/spring-security-oauth) - Spring Web (from https://github.com/spring-projects/spring-framework) ======================================================================== @@ -610,9 +604,13 @@ unknown ======================================================================== The following software have components provided under the terms of this license: -- Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs (from http://www.bouncycastle.org/java.html) -- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html) - Byte Buddy (without dependencies) (from ) - Common Annotations 1.2 API (from ) +- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-api (from http://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-engine (from http://junit.org/junit5/) +- org.junit.jupiter:junit-jupiter-params (from http://junit.org/junit5/) +- org.junit.platform:junit-platform-commons (from http://junit.org/junit5/) +- org.junit.platform:junit-platform-engine (from http://junit.org/junit5/) diff --git a/pom.xml b/pom.xml index 82222e319212e78aa07b53a438c5cd83134f2166..8bd5ba30b24c8439eba7b3a8753faba987fef264 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,7 @@ <module>notification-core</module> <module>provider/notification-gcp</module> <module>provider/notification-azure</module> + <module>provider/notification-ibm</module> </modules> <distributionManagement> diff --git a/provider/notification-azure/src/main/resources/application-dev.properties b/provider/notification-azure/src/main/resources/application-dev.properties deleted file mode 100644 index 8b813dc1784a50c0c30757b538411288463c6f21..0000000000000000000000000000000000000000 --- a/provider/notification-azure/src/main/resources/application-dev.properties +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright © Microsoft Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -spring.profiles.active=dev diff --git a/provider/notification-azure/src/main/resources/application-local.properties b/provider/notification-azure/src/main/resources/application-local.properties deleted file mode 100644 index fb39e6ddf74882fef0613994f0289b100130a0ee..0000000000000000000000000000000000000000 --- a/provider/notification-azure/src/main/resources/application-local.properties +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright © Microsoft Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Log settings -logging.level.org.springframework.web=DEBUG -spring.profiles.active=local -LOG_PREFIX=notification - -# Service settings -app.entitlements=${entitlements_service_endpoint} -app.register=${registeration_service_endpoint} -app.project=opendes -server.port=8080 - -# Azure AD configuration -azure.activedirectory.client-id=${aad_client_id} -azure.activedirectory.AppIdUri=api://${azure.activedirectory.client-id} -azure.activedirectory.session-stateless=true - -aad.oboApi=${aad_client_id} -azure.application-insights.instrumentation-key=${appinsights_key} - -# Azure CosmosDB configuration -azure.cosmosdb.uri=${cosmosdb_account} -azure.cosmosdb.database=${cosmosdb_database} -tenantInfo.container.name=TenantInfo - -# Azure KeyVault configuration -azure.keyvault.url=${KEYVAULT_URI} - -# Application name -spring.application.name=notification-azure - -# Logging configuration -logging.transaction.enabled=true -logging.slf4jlogger.enabled=true -logging.mdccontext.enabled=true \ No newline at end of file diff --git a/provider/notification-azure/src/main/resources/application.properties b/provider/notification-azure/src/main/resources/application.properties index b002ba80420d352f9cf651df059e9c6fbb75cdd3..fa4ec0f92bebcde028de96d66d0e1cc9b5877bcc 100644 --- a/provider/notification-azure/src/main/resources/application.properties +++ b/provider/notification-azure/src/main/resources/application.properties @@ -12,11 +12,39 @@ # See the License for the specific language governing permissions and # limitations under the License. -LOG_PREFIX=notification -server.servlet.contextPath=/ +server.servlet.context-path=/api/notification/v1 app.expireTime=300 app.maxCacheSize=10 server.error.whitelabel.enabled=false +# Service settings +app.entitlements=${entitlements_service_endpoint} +app.register=${registeration_service_endpoint} +app.project=opendes +server.port=8080 + +# Azure AD configuration +azure.activedirectory.client-id=${aad_client_id} +azure.activedirectory.AppIdUri=api://${azure.activedirectory.client-id} +azure.activedirectory.session-stateless=true + +aad.oboApi=${aad_client_id} +azure.application-insights.instrumentation-key=${appinsights_key} +# Azure CosmosDB configuration +azure.cosmosdb.uri=${cosmosdb_account} +azure.cosmosdb.database=${cosmosdb_database} +tenantInfo.container.name=TenantInfo +# Azure KeyVault configuration +azure.keyvault.url=${KEYVAULT_URI} + +# Application name +spring.application.name=notification-azure + +# Logging configuration +logging.level.org.springframework.web=DEBUG +LOG_PREFIX=notification +logging.transaction.enabled=true +logging.slf4jlogger.enabled=true +logging.mdccontext.enabled=true \ No newline at end of file diff --git a/provider/notification-ibm/pom.xml b/provider/notification-ibm/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..4785cb376bf118e52fb830a03b4a24af12d4e628 --- /dev/null +++ b/provider/notification-ibm/pom.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2020 IBM Corp. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.opengroup.osdu</groupId> + <artifactId>notification-ibm</artifactId> + <version>1.0.0</version> + <name>notification-ibm</name> + <description>IBM implementation for Notification service</description> + <packaging>jar</packaging> + + <parent> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-notification</artifactId> + <version>1.0.0</version> + <relativePath>../../pom.xml</relativePath> + </parent> + + <properties> + <java.version>8</java.version> + <maven.compiler.target>${java.version}</maven.compiler.target> + <maven.compiler.source>${java.version}</maven.compiler.source> + </properties> + + <repositories> + <repository> + <id>${gitlab-server}</id> + <url>https://community.opengroup.org/api/v4/groups/17/-/packages/maven</url> + </repository> + </repositories> + + <distributionManagement> + <repository> + <id>${gitlab-server}</id> + <url>https://community.opengroup.org/api/v4/projects/143/packages/maven</url> + </repository> + <snapshotRepository> + <id>${gitlab-server}</id> + <url>https://community.opengroup.org/api/v4/projects/143/packages/maven</url> + </snapshotRepository> + </distributionManagement> + + <dependencies> + <!-- <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-core-common</artifactId> + </dependency> --> + + + <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-core-lib-ibm</artifactId> + <version>0.3.6-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>notification-core</artifactId> + <version>1.0.0</version> + </dependency> + + <!-- unit test dependencies --> + <dependency> + <groupId>org.powermock</groupId> + <artifactId>powermock-api-mockito2</artifactId> + <version>2.0.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.powermock</groupId> + <artifactId>powermock-module-junit4</artifactId> + <version>2.0.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-all</artifactId> + <version>2.0.2-beta</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + <configuration> + <classifier>spring-boot</classifier> + <mainClass> + org.opengroup.osdu.notification.provider.ibm.Application + </mainClass> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>maven-war-plugin</artifactId> + <configuration> + <failOnMissingWebXml>false</failOnMissingWebXml> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/Application.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/Application.java new file mode 100644 index 0000000000000000000000000000000000000000..c9d86a36cd3c806ecbeff46775806f05290f6cd4 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/Application.java @@ -0,0 +1,33 @@ +/* + * Copyright 2017-2020, Schlumberger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opengroup.osdu.notification.provider.ibm; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; + +@SpringBootApplication +@ComponentScan({"org.opengroup.osdu"}) +@EnableAsync +public class Application { + + public static void main(String[] args) { + SpringApplication.run(new Class[] { Application.class} , args); + } +} + diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/di/ServiceAccountJwtClientFactory.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/di/ServiceAccountJwtClientFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..f2a5c0684481a3c680429b929eeae0b62af2c21d --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/di/ServiceAccountJwtClientFactory.java @@ -0,0 +1,38 @@ +/* + * Copyright 2017-2020, Schlumberger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opengroup.osdu.notification.provider.ibm.di; +import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; +import org.opengroup.osdu.notification.provider.ibm.util.AppProperties; +import org.opengroup.osdu.notification.provider.ibm.util.ServiceAccountJwtIBMClientImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AbstractFactoryBean; +import org.springframework.stereotype.Component; + + +public class ServiceAccountJwtClientFactory extends AbstractFactoryBean<IServiceAccountJwtClient> { + + + @Override + public IServiceAccountJwtClient createInstance() throws Exception { + return new ServiceAccountJwtIBMClientImpl(); + } + + @Override + public Class<?> getObjectType() { + return IServiceAccountJwtClient.class; + } +} diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/pubsub/PubsubHandshakeHandler.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/pubsub/PubsubHandshakeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..3680099f20293589e7fdc2127d09acb7b7277974 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/pubsub/PubsubHandshakeHandler.java @@ -0,0 +1,15 @@ +package org.opengroup.osdu.notification.provider.ibm.pubsub; + +import org.opengroup.osdu.notification.provider.interfaces.IPubsubHandshakeHandler; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +@Component +@Lazy +public class PubsubHandshakeHandler implements IPubsubHandshakeHandler { + + @Override + public String getHandshakeResponse() { + return null; + } +} \ No newline at end of file diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/pubsub/PubsubRequestBodyExtractor.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/pubsub/PubsubRequestBodyExtractor.java new file mode 100644 index 0000000000000000000000000000000000000000..b65fad2e80446a5e344e9ee47fc79a3166dcf31c --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/pubsub/PubsubRequestBodyExtractor.java @@ -0,0 +1,123 @@ +package org.opengroup.osdu.notification.provider.ibm.pubsub; + +import com.google.common.base.Strings; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.common.model.storage.MessageContent; +import org.opengroup.osdu.core.common.model.http.AppException; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.opengroup.osdu.notification.provider.interfaces.IPubsubRequestBodyExtractor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Component +@RequestScope +public class PubsubRequestBodyExtractor implements IPubsubRequestBodyExtractor { + private static final String INVALID_PUBSUB_MESSAGE = "Invalid pubsub message"; + private static final Gson GSON = new Gson(); + private MessageContent messageContent; + private JsonObject root = null; + + @Autowired + private HttpServletRequest request; + + @Autowired + private JaxRsDpsLog log; + + public Map<String, String> extractAttributesFromRequestBody() { + if (this.messageContent == null) { + this.messageContent = this.extractPubsubMessageFromRequestBody(); + } + return this.messageContent.getAttributes(); + } + + public String extractDataFromRequestBody() { + if (this.messageContent == null) { + this.messageContent = this.extractPubsubMessageFromRequestBody(); + } + return this.messageContent.getData(); + } + + public String extractNotificationIdFromRequestBody() { + if (this.root == null) { + this.root = this.extractRootJsonElementFromRequestBody(); + } + JsonElement subscription = this.root.get("subscription"); + if (subscription == null) { + throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "subscription object not found"); + } + + String[] fullNotificationId = subscription.getAsString().split("/"); + return fullNotificationId[fullNotificationId.length - 1]; + } + + @Override + public boolean isHandshakeRequest() { + return false; + } + + private MessageContent extractPubsubMessageFromRequestBody() { + if (this.root == null) { + this.root = this.extractRootJsonElementFromRequestBody(); + } + JsonElement message = this.root.get("message"); + if (message == null) { + throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "message object not found"); + } + MessageContent content = GSON.fromJson(message.toString(), MessageContent.class); + + Map<String, String> attributes = content.getAttributes(); + if (attributes == null || attributes.isEmpty()) { + log.error("Incorrect Message: " + message.toString() ); + throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "attribute map not found"); + } + String data = content.getData(); + if (Strings.isNullOrEmpty(data)) { + throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "data field not found"); + } + Map<String, String> lowerCase = new HashMap<>(); + attributes.forEach((key, value) -> lowerCase.put(key.toLowerCase(), value)); + if (Strings.isNullOrEmpty(attributes.get("data-partition-id"))) { + throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, + "No tenant information from pubsub message."); + } + content.setAttributes(lowerCase); + + String decoded = new String(Base64.getDecoder().decode(data)); + content.setData(decoded); + + return content; + } + + private JsonObject extractRootJsonElementFromRequestBody() { + try { + JsonParser jsonParser = new JsonParser(); + BufferedReader reader = request.getReader(); + Stream<String> lines = reader.lines(); + String requestBody = lines.collect(Collectors.joining("\n")); + JsonElement rootElement = jsonParser.parse(requestBody); + if (!(rootElement instanceof JsonObject)) { + throw new AppException(HttpStatus.BAD_REQUEST.value(), "RequestBody is not JsonObject.", + "Request Body should be JsonObject to be processed."); + } + return rootElement.getAsJsonObject(); + } catch (IOException e) { + throw new AppException(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Request payload parsing error", + "Unable to parse request payload.", e); + } + } +} diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/security/SecurityConfig.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/security/SecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..3dbea65398b173700bdb8d677b9b91b94abcece7 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/security/SecurityConfig.java @@ -0,0 +1,34 @@ +/* + * Copyright 2017-2020, Schlumberger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opengroup.osdu.notification.provider.ibm.security; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + httpSecurity + .httpBasic().disable() + .csrf().disable(); //disable default authN. AuthN handled by endpoints proxy + } +} \ No newline at end of file diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/AppProperties.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/AppProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..1fcf572ec76296e65b398a37220b4e68c9987574 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/AppProperties.java @@ -0,0 +1,45 @@ +/** + * Copyright 2020 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opengroup.osdu.notification.provider.ibm.util; + +import org.opengroup.osdu.notification.provider.interfaces.IAppProperties; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +public class AppProperties implements IAppProperties { + + @Value("${app.entitlements}") + private String authorizeAPI; + @Value("${app.register}") + private String registerAPI; + @Value("${app.expireTime}") + private int expireTime; + @Value("${app.maxCacheSize}") + private int maxCacheSize; + + + public String getAuthorizeAPI() { + return authorizeAPI; + } + + public String getRegisterAPI() { + return registerAPI; + } + + +} diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/GoogleServiceAccountImpl.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/GoogleServiceAccountImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..323e59920f928b331477df8591485a1f878e1f29 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/GoogleServiceAccountImpl.java @@ -0,0 +1,36 @@ +/* + * Copyright 2017-2020, Schlumberger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opengroup.osdu.notification.provider.ibm.util; + +import org.apache.http.impl.client.CloseableHttpClient; +//import org.opengroup.osdu.core.gcp.GoogleIdToken.IGoogleIdTokenFactory; +import org.opengroup.osdu.notification.provider.interfaces.IGoogleServiceAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import lombok.SneakyThrows; + +@Component +public class GoogleServiceAccountImpl implements IGoogleServiceAccount { + + @SneakyThrows + @Override + public String getIdToken(String keyString, String audience) { + // TODO for GSA token validation check whether we have to impl + return "token";//this.googleIdTokenFactory.getGoogleIdToken(keyString, audience, this.closeableHttpClient); + } +} \ No newline at end of file diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/IBMServiceAccountValidatorImpl.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/IBMServiceAccountValidatorImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..5a492f2e0047855f5bf2b37a5b63356ea98927d9 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/IBMServiceAccountValidatorImpl.java @@ -0,0 +1,45 @@ +/** + * Copyright 2020 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opengroup.osdu.notification.provider.ibm.util; + +import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; +import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.notification.provider.interfaces.IServiceAccountValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class IBMServiceAccountValidatorImpl implements IServiceAccountValidator { + + + @Override + public boolean isValidPublisherServiceAccount(String jwt) { + //call isValidServiceAccount() + // Check whether IBM have to implement the service account verification for PubSub Role + // Marking it to return true, for the integration tests. + return true; + } + + @Override + public boolean isValidServiceAccount(String jwt, String userIdentity, String... googleAudiences) { + // Marking it to return true, for the integration tests. + return true; + } +} diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/JwtValidity.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/JwtValidity.java new file mode 100644 index 0000000000000000000000000000000000000000..223df82639c66c143fd9f105496843129d8356e6 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/JwtValidity.java @@ -0,0 +1,17 @@ +package org.opengroup.osdu.notification.provider.ibm.util; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class JwtValidity { + + String token; + long expiryTime; + + JwtValidity(String jwt, long expiryTime) { + this.token = jwt; + this.expiryTime = expiryTime; + } +} diff --git a/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/ServiceAccountJwtIBMClientImpl.java b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/ServiceAccountJwtIBMClientImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..7d3d658df3b2dd2fd5e169656cf9a782db1c7504 --- /dev/null +++ b/provider/notification-ibm/src/main/java/org/opengroup/osdu/notification/provider/ibm/util/ServiceAccountJwtIBMClientImpl.java @@ -0,0 +1,136 @@ +package org.opengroup.osdu.notification.provider.ibm.util; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +import javax.net.ssl.HttpsURLConnection; + +import org.apache.http.HttpStatus; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.common.model.http.AppException; +import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; +import org.opengroup.osdu.core.ibm.util.KeyCloakProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +public class ServiceAccountJwtIBMClientImpl implements IServiceAccountJwtClient { + + //private AppProperties config; + /*@Autowired + JaxRsDpsLog log;*/ + @Value("${keycloak.url}") + private String url; + @Value("${keycloak.realm}") + private String realm; + @Value("${keycloak.client_id}") + private String client_id; + @Value("${keycloak.client_secert}") + private String client_secret; + private String grant_type = "password"; + @Value("${keycloak.user}") + private String user; + @Value("${keycloak.password}") + private String pwd; + +/* public ServiceAccountJwtIBMClientImpl(AppProperties config) { + if (config == null) { + throw new IllegalArgumentException("AppProperties is null when initializing jwt client."); + } else { + this.config = config; + } + }*/ + + @Override + public String getIdToken(String tenantName) { + /* String t1=null; + try { + t1=KeyCloakProvider.getToken(user, pwd); + System.out.println("************t1 "+t1); + return "Bearer "+t1; + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + }*/ + String token_endpoint = String.format("https://%s/auth/realms/%s/protocol/openid-connect/token", url, realm); + URL url; + String token = null; + HttpsURLConnection con; + try { + url = new URL(token_endpoint); + con = (HttpsURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + Map<String, String> parameters = new HashMap<>(); + parameters.put("grant_type", grant_type); + parameters.put("client_id", client_id); + parameters.put("client_secret", client_secret); + parameters.put("username", user); + parameters.put("password", pwd); + + con.setDoOutput(true); + DataOutputStream out = new DataOutputStream(con.getOutputStream()); + out.writeBytes(getParamsString(parameters)); + out.flush(); + out.close(); + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuffer content = new StringBuffer(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + + con.disconnect(); + + Gson gson = new Gson(); + JsonObject jobj = gson.fromJson(content.toString(), JsonObject.class); + token = jobj.get("access_token").getAsString(); + token = "Bearer "+token; + } catch (MalformedURLException e) { + log.error("MalformedURLException while generating token"+e.getMessage()); + e.printStackTrace(); + } catch (IOException e) { + log.error("IOException while generating token"+e.getMessage()); + throw new AppException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Provided invalid details", "Error generating token"); + } + return token; + // TODO : Implement jwtCache for storing generated token + } + + private static String getParamsString(Map<String, String> params) + throws UnsupportedEncodingException { + StringBuilder result = new StringBuilder(); + + for (Map.Entry<String, String> entry : params.entrySet()) { + result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); + result.append("="); + result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); + result.append("&"); + } + + String resultString = result.toString(); + return resultString.length() > 0 + ? resultString.substring(0, resultString.length() - 1) + : resultString; + } + +} + + diff --git a/provider/notification-ibm/src/main/resources/application.properties b/provider/notification-ibm/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..fc48a50162bb8a48ffffd25b28d9e22aeeb0977f --- /dev/null +++ b/provider/notification-ibm/src/main/resources/application.properties @@ -0,0 +1,26 @@ +# +# Copyright 2017-2020, Schlumberger +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOG_PREFIX=notification +server.servlet.contextPath=/ +app.expireTime=300 +app.maxCacheSize=10 +server.error.whitelabel.enabled=false + +keycloak.url=TODO +keycloak.realm=TODO +keycloak.client_id=TODO +keycloak.client_secert=TODO \ No newline at end of file