diff --git a/jans-config-api/docs/jans-config-api-swagger.yaml b/jans-config-api/docs/jans-config-api-swagger.yaml index 873a23a97eb..b8c3d548b5b 100644 --- a/jans-config-api/docs/jans-config-api-swagger.yaml +++ b/jans-config-api/docs/jans-config-api-swagger.yaml @@ -21,7 +21,7 @@ tags: - name: Cache Configuration – in-Memory - name: Cache Configuration – Native-Persistence - name: Configuration – Properties - - name: Configuration – Fido2 + - name: Fido2 - Configuration - name: Configuration – SMTP - name: Configuration – Logging - name: Configuration – JWK - JSON Web Key (JWK) @@ -117,13 +117,13 @@ paths: $ref: '#/components/responses/Unauthorized' '500': $ref: '#/components/responses/InternalServerError' - /jans-config-api/api/v1/fido2/config: + /jans-config-api/fido2/config: get: summary: Gets Jans Authorization Server Fido2 configuration properties. description: Gets Jans Authorization Server Fido2 configuration properties. operationId: get-properties-fido2 tags: - - Configuration – Fido2 + - Fido2 - Configuration responses: '200': description: OK @@ -142,7 +142,7 @@ paths: description: Updates Fido2 configuration properties. operationId: put-properties-fido2 tags: - - Configuration – Fido2 + - Fido2 - Configuration requestBody: content: application/json: diff --git a/jans-config-api/plugins/fido2-plugin/pom.xml b/jans-config-api/plugins/fido2-plugin/pom.xml new file mode 100644 index 00000000000..e9418fc56b7 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/pom.xml @@ -0,0 +1,222 @@ + + + + plugins + io.jans.jans-config-api.plugins + 1.0.0-SNAPSHOT + + 4.0.0 + io.jans.jans-config-api.plugins + fido2-plugin + + 4.4.14 + 4.5.13 + 1.0.0-SNAPSHOT + + + + + + + io.jans + jans-config-api-shared + ${jans.version} + + + io.jans + jans-config-api-server + ${jans.version} + + + io.jans + jans-orm-annotation + ${jans.version} + + + + + + io.smallrye + smallrye-config + 1.5.0 + + + + + commons-collections + commons-collections + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + + + org.apache.httpcomponents + httpcore-nio + ${httpcore.version} + + + + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + jakarta.inject + jakarta.inject-api + + + jakarta.validation + jakarta.validation-api + + + jakarta.ws.rs + jakarta.ws.rs-api + + + + + + io.rest-assured + rest-assured + test + + + com.intuit.karate + karate-junit5 + test + + + com.intuit.karate + karate-apache + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + net.masterthought + cucumber-reporting + test + + + + + + + + ../../profiles/${cfg}/config-build.properties + ../../profiles/${cfg}/config-api-test.properties + + + + + src/test/resources + true + + karate.properties + karate_jenkins.properties + test.properties + *.* + + + + + + + src/main/resources + true + + **/*.xml + **/*.properties + **/*.json + META-INF/services/*.* + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + + src/main/assembly/assembly.xml + + + + + + + + maven-surefire-plugin + + + + integration + + --tags ~@ignore + + + + + integration-tests + integration-test + + test + + + false + !integration + integration + + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + deploy-to-local-folder + package + + copy-resources + + + ../target/plugins + + + ${project.build.directory} + *-distribution.jar + false + + + + + + + + + diff --git a/jans-config-api/plugins/fido2-plugin/src/main/assembly/assembly.xml b/jans-config-api/plugins/fido2-plugin/src/main/assembly/assembly.xml new file mode 100644 index 00000000000..4a93c3a8515 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/assembly/assembly.xml @@ -0,0 +1,19 @@ + + + distribution + + jar + + false + + + ${project.build.directory}/classes + / + + **/* + + + + \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/extensions/Fido2Extension.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/extensions/Fido2Extension.java new file mode 100644 index 00000000000..552cad43472 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/extensions/Fido2Extension.java @@ -0,0 +1,6 @@ +package io.jans.configapi.plugin.fido2.extensions; + +import jakarta.enterprise.inject.spi.Extension; + +public class Fido2Extension implements Extension { +} diff --git a/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/model/config/Fido2ConfigSource.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/model/config/Fido2ConfigSource.java new file mode 100644 index 00000000000..ffbc2f45d4b --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/model/config/Fido2ConfigSource.java @@ -0,0 +1,81 @@ +package io.jans.configapi.plugin.fido2.model.config; + +import io.jans.exception.ConfigurationException; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import jakarta.enterprise.context.ApplicationScoped; + +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@ApplicationScoped +public class Fido2ConfigSource implements ConfigSource { + + private static Logger log = LoggerFactory.getLogger(Fido2ConfigSource.class); + private static final String FILE_CONFIG = "fido2.properties"; + private Properties properties = null; + Map propertiesMap = new HashMap<>(); + + public Fido2ConfigSource() { + this.loadProperties(); + } + + @Override + public Map getProperties() { + log.debug("Getting properties"); + return propertiesMap; + } + + @Override + public Set getPropertyNames() { + log.debug("Getting Property Names"); + try { + return properties.stringPropertyNames(); + + } catch (Exception e) { + log.error("Unable to read properties from file: " + FILE_CONFIG, e); + } + return Collections.emptySet(); + } + + @Override + public int getOrdinal() { + return 800; + } + + @Override + public String getValue(String name) { + log.debug("Fido2ConfigSource()::getValue() - name:{}", name); + try { + return properties.getProperty(name); + } catch (Exception e) { + log.error("Unable to read properties from file: " + FILE_CONFIG, e); + } + + return null; + } + + @Override + public String getName() { + return FILE_CONFIG; + } + + private Properties loadProperties() { + // Load the properties file + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try ( InputStream inputStream = loader.getResourceAsStream(FILE_CONFIG)) { + properties = new Properties(); + properties.load(inputStream); + properties.stringPropertyNames().stream().forEach(key -> propertiesMap.put(key, properties.getProperty(key))); + return properties; + } catch (Exception e) { + throw new ConfigurationException("Failed to load configuration from "+ FILE_CONFIG, e); + } + } + +} diff --git a/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/rest/ApiApplication.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/rest/ApiApplication.java new file mode 100644 index 00000000000..cc868cbfe10 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/rest/ApiApplication.java @@ -0,0 +1,19 @@ +package io.jans.configapi.plugin.fido2.rest; + +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; +import java.util.HashSet; +import java.util.Set; + +@ApplicationPath("/fido2") +public class ApiApplication extends Application { + + @Override + public Set> getClasses() { + HashSet> classes = new HashSet<>(); + + classes.add(Fido2ConfigResource.class); + + return classes; + } +} diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/Fido2ConfigResource.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/rest/Fido2ConfigResource.java similarity index 65% rename from jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/Fido2ConfigResource.java rename to jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/rest/Fido2ConfigResource.java index c92cf1fa20d..fb3bb3cc958 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/Fido2ConfigResource.java +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/rest/Fido2ConfigResource.java @@ -4,13 +4,17 @@ * Copyright (c) 2020, Janssen Project */ -package io.jans.configapi.rest.resource.auth; +package io.jans.configapi.plugin.fido2.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; import io.jans.config.oxtrust.DbApplicationConfiguration; +import io.jans.configapi.core.rest.BaseResource; import io.jans.configapi.core.rest.ProtectedApi; -import io.jans.configapi.service.auth.Fido2Service; +import io.jans.configapi.plugin.fido2.service.Fido2Service; +import io.jans.configapi.plugin.fido2.util.Fido2Util; import io.jans.configapi.util.ApiAccessConstants; -import io.jans.configapi.util.ApiConstants; +import io.jans.configapi.plugin.fido2.util.Constants; import io.jans.configapi.core.util.Jackson; import jakarta.inject.Inject; @@ -21,30 +25,34 @@ import org.slf4j.Logger; -@Path(ApiConstants.FIDO2 + ApiConstants.CONFIG) +@Path(Constants.CONFIG) @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) -public class Fido2ConfigResource extends ConfigBaseResource { +public class Fido2ConfigResource extends BaseResource { private static final String FIDO2_CONFIGURATION = "fido2Configuration"; @Inject - Logger log; + Logger logger; @Inject Fido2Service fido2Service; + + @Inject + Fido2Util fido2Util; @GET @ProtectedApi(scopes = { ApiAccessConstants.FIDO2_CONFIG_READ_ACCESS }) - public Response getFido2Configuration() throws Exception { + public Response getFido2Configuration() throws JsonProcessingException { DbApplicationConfiguration dbApplicationConfiguration = this.fido2Service.find(); + logger.debug("FIDO2 details dbApplicationConfiguration.getDynamicConf():{}" ,dbApplicationConfiguration.getDynamicConf()); return Response.ok(Jackson.asJsonNode(dbApplicationConfiguration.getDynamicConf())).build(); } @PUT @ProtectedApi(scopes = { ApiAccessConstants.FIDO2_CONFIG_WRITE_ACCESS }) public Response updateFido2Configuration(@NotNull String fido2ConfigJson) { - log.debug("FIDO2 details to be updated - fido2ConfigJson = " + fido2ConfigJson); + logger.debug("FIDO2 details to be updated - fido2ConfigJson:{} ",fido2ConfigJson); checkResourceNotNull(fido2ConfigJson, FIDO2_CONFIGURATION); this.fido2Service.merge(fido2ConfigJson); return Response.ok(fido2ConfigJson).build(); diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/Fido2Service.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/service/Fido2Service.java similarity index 95% rename from jans-config-api/server/src/main/java/io/jans/configapi/service/auth/Fido2Service.java rename to jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/service/Fido2Service.java index ae8ddc126ab..5f76582357f 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/Fido2Service.java +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/service/Fido2Service.java @@ -4,7 +4,7 @@ * Copyright (c) 2020, Janssen Project */ -package io.jans.configapi.service.auth; +package io.jans.configapi.plugin.fido2.service; import io.jans.config.oxtrust.DbApplicationConfiguration; import io.jans.configapi.configuration.ConfigurationFactory; @@ -15,9 +15,6 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -/** - * @author Yuriy Zabrovarnyy - */ @ApplicationScoped public class Fido2Service { diff --git a/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/util/Constants.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/util/Constants.java new file mode 100644 index 00000000000..a55d0418ec3 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/util/Constants.java @@ -0,0 +1,14 @@ +/* + * Janssen Project software is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. + * + * Copyright (c) 2020, Janssen Project + */ + +package io.jans.configapi.plugin.fido2.util; + +public class Constants { + + private Constants() {} + + public static final String CONFIG = "/config"; +} \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/util/Fido2Util.java b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/util/Fido2Util.java new file mode 100644 index 00000000000..839231b8379 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/java/io/jans/configapi/plugin/fido2/util/Fido2Util.java @@ -0,0 +1,37 @@ +/* + * Janssen Project software is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. + * + * Copyright (c) 2020, Janssen Project + */ + +package io.jans.configapi.plugin.fido2.util; + +import io.jans.configapi.plugin.fido2.model.config.Fido2ConfigSource; + +import java.util.Map; +import java.util.Set; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import org.slf4j.Logger; + +@ApplicationScoped +public class Fido2Util { + + @Inject + Logger logger; + + @Inject + Fido2ConfigSource fido2ConfigSource; + + public Map getProperties() { + logger.debug(" Fido2Util - fido2ConfigSource.getProperties():{}", fido2ConfigSource.getProperties()); + return fido2ConfigSource.getProperties(); + } + + public Set getPropertyNames() { + logger.debug(" Fido2Util - ido2ConfigSource.getPropertyNames():{}", fido2ConfigSource.getPropertyNames()); + return fido2ConfigSource.getPropertyNames(); + } +} diff --git a/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/beans.xml b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/beans.xml new file mode 100644 index 00000000000..bf2ab180c1c --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/beans.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension new file mode 100644 index 00000000000..092999a38b8 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension @@ -0,0 +1 @@ +io.jans.configapi.plugin.fido2.extensions.Fido2Extension \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/javax.ws.rs.ext.Providers b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/javax.ws.rs.ext.Providers new file mode 100644 index 00000000000..b2c9664d366 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/javax.ws.rs.ext.Providers @@ -0,0 +1,3 @@ +io.jans.configapi.filters.AuthorizationFilter +io.jans.configapi.filters.LoggingFilter + diff --git a/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource new file mode 100644 index 00000000000..14ed3f42d44 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource @@ -0,0 +1 @@ +io.jans.configapi.plugin.fido2.model.config.Fido2ConfigSource \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/main/resources/fido2.properties b/jans-config-api/plugins/fido2-plugin/src/main/resources/fido2.properties new file mode 100644 index 00000000000..6c5c08a213b --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/main/resources/fido2.properties @@ -0,0 +1,3 @@ +default.max.count=200 +default.list.size = "50"; +default.list.start.index = "1"; diff --git a/jans-config-api/plugins/fido2-plugin/src/test/java/io/jans/configapi/KarateTestRunner.java b/jans-config-api/plugins/fido2-plugin/src/test/java/io/jans/configapi/KarateTestRunner.java new file mode 100644 index 00000000000..34da4586ef9 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/java/io/jans/configapi/KarateTestRunner.java @@ -0,0 +1,18 @@ +/* + * Janssen Project software is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. + * + * Copyright (c) 2020, Janssen Project + */ + +package io.jans.configapi; + +import com.intuit.karate.junit5.Karate; + +public class KarateTestRunner { + + @Karate.Test + Karate testFullPath() throws Exception { + return Karate.run("src/test/resources/feature"); + } + +} diff --git a/jans-config-api/plugins/fido2-plugin/src/test/java/io/jans/configapi/TestJenkinsRunner.java b/jans-config-api/plugins/fido2-plugin/src/test/java/io/jans/configapi/TestJenkinsRunner.java new file mode 100644 index 00000000000..a7f7d2d80c2 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/java/io/jans/configapi/TestJenkinsRunner.java @@ -0,0 +1,44 @@ +/* + * Janssen Project software is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. + * + * Copyright (c) 2020, Janssen Project + */ + +package io.jans.configapi; + +import com.intuit.karate.Results; +import com.intuit.karate.Runner; + +import io.jans.as.common.model.registration.Client; +import net.masterthought.cucumber.Configuration; +import net.masterthought.cucumber.ReportBuilder; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class TestJenkinsRunner { + + @Test + void testParallel() { + System.setProperty("karate.env", "jenkins"); + Results results = Runner.path("src/test/resources/feature").tags("~@ignore").parallel(1); + generateReport(results.getReportDir()); + Assertions.assertEquals(0, results.getFailCount(), results.getErrorMessages()); + } + + public static void generateReport(String karateOutputPath) { + Collection jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] { "json" }, true); + List jsonPaths = new ArrayList(jsonFiles.size()); + jsonFiles.forEach(file -> jsonPaths.add(file.getAbsolutePath())); + Configuration config = new Configuration(new File("target"), "karateTesting"); + ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); + reportBuilder.generateReports(); + } +} diff --git a/jans-config-api/server/src/test/resources/feature/fido2/dynamiconf.json b/jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/dynamiconf.json similarity index 100% rename from jans-config-api/server/src/test/resources/feature/fido2/dynamiconf.json rename to jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/dynamiconf.json diff --git a/jans-config-api/server/src/test/resources/feature/fido2/fido2.feature b/jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/fido2.feature similarity index 97% rename from jans-config-api/server/src/test/resources/feature/fido2/fido2.feature rename to jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/fido2.feature index 3d71ca9f577..3aa65783d1c 100644 --- a/jans-config-api/server/src/test/resources/feature/fido2/fido2.feature +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/fido2.feature @@ -1,7 +1,7 @@ Feature: Verify Fido2 configuration endpoint - Background: + Background:fido2Url * def mainUrl = fido2Url diff --git a/jans-config-api/server/src/test/resources/feature/fido2/fido2.json b/jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/fido2.json similarity index 100% rename from jans-config-api/server/src/test/resources/feature/fido2/fido2.json rename to jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/fido2.json diff --git a/jans-config-api/server/src/test/resources/feature/fido2/ref_dynami_conf.json b/jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/ref_dynami_conf.json similarity index 100% rename from jans-config-api/server/src/test/resources/feature/fido2/ref_dynami_conf.json rename to jans-config-api/plugins/fido2-plugin/src/test/resources/feature/fido2/ref_dynami_conf.json diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/karate-config-jenkins.js b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate-config-jenkins.js new file mode 100644 index 00000000000..2bf718528aa --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate-config-jenkins.js @@ -0,0 +1,58 @@ +function() { + + var stream = read('classpath:karate_jenkins.properties'); + var props = new java.util.Properties(); + props.load(stream); + + var env = props.get('karate.env'); // get java system property 'karate.env' + karate.configure("ssl", true); + + if (!env) { + env = 'dev'; //env can be anything: dev, qa, staging, etc. + } + + var url = props.get('karate.test.url'); + var port = props.get('karate.test.port'); + var baseUrl = url + (port ? ':' + port : ''); + + karate.log('karate_jenkins env :', env); + karate.log('karate_jenkins url :', url); + karate.log('karate_jenkins port :', port); + karate.log('karate_jenkins baseUrl :', baseUrl); + + var testStream = read('classpath:test.properties'); + var testProps = new java.util.Properties(); + testProps.load(testStream); + karate.log(' testProps = '+testProps); + var testClientId = testProps.get('test.client.id'); + var testClientSecret = testProps.get('test.client.secret'); + var tokenEndpoint = testProps.get('token.endpoint'); + var testScopes = testProps.get('test.scopes'); + var issuer = testProps.get('test.issuer'); + karate.log(' testClientId = '+testClientId); + karate.log(' testClientSecret = '+testClientSecret); + karate.log(' tokenEndpoint = '+tokenEndpoint); + karate.log(' testScopes = '+testScopes); + karate.log(' issuer = '+issuer); + + + var config = { + env: env, + baseUrl: baseUrl, + testProps: testProps, + issuer: issuer, + accessToken: '123', + + fido2Url: baseUrl + '/jans-config-api/fido2/config', + + }; + + karate.configure('connectTimeout', 30000); + karate.configure('readTimeout', 60000); + + var result = karate.callSingle('classpath:token.feature', config); + print(' result.response = '+result.response); + config.accessToken = result.response.access_token; + + return config; +} \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/karate-config.js b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate-config.js new file mode 100644 index 00000000000..9c37722c842 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate-config.js @@ -0,0 +1,57 @@ +function() { + + var stream = read('classpath:karate.properties'); + var props = new java.util.Properties(); + props.load(stream); + + var env = props.get('karate.env'); // get java system property 'karate.env' + karate.configure("ssl", true); + + if (!env) { + env = 'dev'; //env can be anything: dev, qa, staging, etc. + } + + var url = props.get('karate.test.url'); + var port = props.get('karate.test.port'); + var baseUrl = url + (port ? ':' + port : ''); + + karate.log('karate env :', env); + karate.log('karate url :', url); + karate.log('karate port :', port); + karate.log('karate baseUrl :', baseUrl); + + var testStream = read('classpath:test.properties'); + var testProps = new java.util.Properties(); + testProps.load(testStream); + karate.log(' testProps = '+testProps); + var testClientId = testProps.get('test.client.id'); + var testClientSecret = testProps.get('test.client.secret'); + var tokenEndpoint = testProps.get('token.endpoint'); + var testScopes = testProps.get('test.scopes'); + var issuer = testProps.get('test.issuer'); + karate.log(' testClientId = '+testClientId); + karate.log(' testClientSecret = '+testClientSecret); + karate.log(' tokenEndpoint = '+tokenEndpoint); + karate.log(' testScopes = '+testScopes); + karate.log(' issuer = '+issuer); + + + var config = { + env: env, + baseUrl: baseUrl, + testProps: testProps, + issuer: issuer, + accessToken: '123', + + fido2Url: baseUrl + '/jans-config-api/fido2/config', + }; + + karate.configure('connectTimeout', 30000); + karate.configure('readTimeout', 60000); + + var result = karate.callSingle('classpath:token.feature', config); + print(' result.response = '+result.response); + config.accessToken = result.response.access_token; + + return config; +} \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/karate.properties b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate.properties new file mode 100644 index 00000000000..41c0d369aff --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate.properties @@ -0,0 +1,5 @@ +#karate.test.url=http://localhost +#karate.test.port=8080 +#karate.test.url=https://jenkins-config-api.gluu.org/jans-config-api +#karate.test.port=443 +karate.test.url=${test.server} diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/karate_jenkins.properties b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate_jenkins.properties new file mode 100644 index 00000000000..0b44a8d7b13 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/karate_jenkins.properties @@ -0,0 +1,2 @@ +karate.test.url=${test.server} +#karate.test.port=443 diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/logback-test.xml b/jans-config-api/plugins/fido2-plugin/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..fea195eb039 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/logback-test.xml @@ -0,0 +1,24 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + target/karate.log + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/test.properties b/jans-config-api/plugins/fido2-plugin/src/test/resources/test.properties new file mode 100644 index 00000000000..4257f297907 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/test.properties @@ -0,0 +1,8 @@ +test.scopes=${test.scopes} + +# Test env Setting +token.endpoint=${token.endpoint} +token.grant.type=${token.grant.type} +test.client.id=${test.client.id} +test.client.secret=${test.client.secret} +test.issuer=${test.issuer} \ No newline at end of file diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/testClient.feature b/jans-config-api/plugins/fido2-plugin/src/test/resources/testClient.feature new file mode 100644 index 00000000000..34cfdffc438 --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/testClient.feature @@ -0,0 +1,13 @@ +@ignore +Feature: This Feature is to get token to test the test cases + +Background: +* def mainUrl = test_url + +Scenario: Get Token +Given url mainUrl +And print url +And request '' +When method POST +Then status 204 +And print response diff --git a/jans-config-api/plugins/fido2-plugin/src/test/resources/token.feature b/jans-config-api/plugins/fido2-plugin/src/test/resources/token.feature new file mode 100644 index 00000000000..ef0ad0d262d --- /dev/null +++ b/jans-config-api/plugins/fido2-plugin/src/test/resources/token.feature @@ -0,0 +1,45 @@ +@ignore +Feature: This Feature is to get token to test the test cases - Do not remove ignore tag + +Background: +* def mainUrl = testProps.get('token.endpoint'); +* def grantType = testProps.get('token.grant.type'); +* def clientId = testProps.get('test.client.id'); +* def clientSecret = testProps.get('test.client.secret'); +* def scopes = testProps.get('test.scopes'); +* def authStr = clientId+':'+clientSecret +* def Base64 = Java.type('java.util.Base64') +* def encodedAuth = Base64.encoder.encodeToString(authStr.bytes) +* def encodedScopes = java.net.URLDecoder.decode(scopes, 'UTF-8') + + +Scenario: Get Token +Given url mainUrl +And print 'mainUrl = '+mainUrl +And print 'grantType = '+grantType +And print 'clientId = '+clientId +And print 'clientSecret = '+clientSecret +And print 'scopes = '+scopes +And print 'authStr = '+authStr +And print 'encodedAuth = '+encodedAuth +And print 'encodedScopes = '+encodedScopes +And header Accept = 'application/json' +And header Authorization = 'Basic '+encodedAuth +And form field grant_type = grantType +And form field scope = scopes +When method POST +Then status 200 +And print 'token response = '+response + + + + +#Scenario: Get Token +#Given url 'https://pujavs.jans.server/jans-auth/restv1/token' +#And header Accept = 'application/json' +#And header Authorization = 'Basic MTgwMi45ZGNkOThhZC1mZTJjLTRmZDktYjcxNy1kOTQzNmQ5ZjIwMDk6dGVzdDEyMzQ=' +#And form field grant_type = 'client_credentials' +#And form field scope = 'https://jans.io/oauth/config/openid/clients.readonly' +#When method POST +#Then status 200 +#And print 'token response = '+response diff --git a/jans-config-api/plugins/pom.xml b/jans-config-api/plugins/pom.xml index 357f71a63af..620d50a58f4 100644 --- a/jans-config-api/plugins/pom.xml +++ b/jans-config-api/plugins/pom.xml @@ -21,6 +21,7 @@ admin-ui-plugin scim-plugin user-mgt-plugin + fido2-plugin diff --git a/jans-config-api/plugins/user-mgt-plugin/pom.xml b/jans-config-api/plugins/user-mgt-plugin/pom.xml index be3cae74439..d2a918a92fa 100644 --- a/jans-config-api/plugins/user-mgt-plugin/pom.xml +++ b/jans-config-api/plugins/user-mgt-plugin/pom.xml @@ -10,10 +10,13 @@ 4.0.0 io.jans.jans-config-api.plugins user-mgt-plugin + 4.4.14 4.5.13 1.0.0-SNAPSHOT + + src/main/java/io/jans/configapi/plugin/fido2/model/config/* diff --git a/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/rest/UserResource.java b/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/rest/UserResource.java index fc77a2f9e57..b44658cd1b2 100644 --- a/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/rest/UserResource.java +++ b/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/rest/UserResource.java @@ -78,7 +78,7 @@ public Response getUsers(@DefaultValue(ApiConstants.DEFAULT_LIST_SIZE) @QueryPar } @GET - @ProtectedApi(scopes = { ApiAccessConstants.USER_WRITE_ACCESS }) + @ProtectedApi(scopes = { ApiAccessConstants.USER_READ_ACCESS }) @Path(ApiConstants.INUM_PATH) public Response getUserByInum(@PathParam(ApiConstants.INUM) @NotNull String inum) throws EncryptionException, IllegalAccessException, InvocationTargetException { diff --git a/jans-config-api/profiles/local/test.properties b/jans-config-api/profiles/local/test.properties index 51b045927ce..ad853e2d0f1 100644 --- a/jans-config-api/profiles/local/test.properties +++ b/jans-config-api/profiles/local/test.properties @@ -9,67 +9,9 @@ test.scopes=https://jans.io/oauth/config/acrs.readonly https://jans.io/oauth/con #test.issuer=https://jenkins-config-api.gluu.org # Local Setting -#pujavs.jans.server -#token.endpoint=https://pujavs.jans.server/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1802.9dcd98ad-fe2c-4fd9-b717-d9436d9f2009 -#test.client.secret=test1234 -#test.issuer=https://pujavs.jans.server - -# pujavs.jans.server2 -#token.endpoint=https://pujavs.jans.server2/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1801.86d83471-fe91-4522-ac47-a256956c0f23 -#test.client.secret=wndq7RoRnyqm -#test.issuer=https:// pujavs.jans.server2 - -# pujavs.jans.server5 -#token.endpoint=https://pujavs.jans.server5/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1800.0f2aeab1-efee-4b89-a7f1-570c15a68ff3 -#test.client.secret=fxa2iV1Oi0HS -#test.issuer=https:// pujavs.jans.server5 - - -# pujavs.jans.server3 -#token.endpoint=https://pujavs.jans.server2/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1801.e0396ed5-055d-4986-9afc-342373995f0e -#test.client.secret=Dk3RaLUYSdJn -#test.issuer=https:// pujavs.jans.server3 - -# jans.server1 -#token.endpoint=https://jans.server1/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1800.d166622d-6771-4d5a-8fab-555566b20091 -#test.client.secret=slkveBOhwJn5 -#test.issuer=https://jans.server1 - -# jans.server2 -#token.endpoint=https://jans.server2/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1800.5ad89818-e1c6-45ba-873d-d549dfad67a4 -#test.client.secret=9ZW2HaDakqD4 -#test.issuer=https://jans.server2 - -# jans.server3 -#token.endpoint=https://jans.server3/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1800.1adcb34a-e1a5-4b4d-86d0-f92c62aab52b -#test.client.secret=aDiH4IuuGddZ -#test.issuer=https://jans.server3 - -# jans.server4 -#token.endpoint=https://jans.server4/jans-auth/restv1/token -#token.grant.type=client_credentials -#test.client.id=1800.7e78990f-fdae-40e9-9433-4fe20645851d -#test.client.secret=GfUrIapPM71X -#test.issuer=https://jans.server4 - - # jans.server -token.endpoint=https://jans.server/jans-auth/restv1/token +token.endpoint=https://jans.server1/jans-auth/restv1/token token.grant.type=client_credentials -test.client.id=1800.231f5c29-8e4b-40a9-b939-3d3db4bd40ef -test.client.secret=Vwp8xXgdpjoN -test.issuer=https://jans.server \ No newline at end of file +test.client.id=1800.8af1e2d8-f3be-4905-9f3f-710867fb1ed1 +test.client.secret=7JPDywnYrEhN +test.issuer=https://jans.server1 \ No newline at end of file diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/rest/ApiApplication.java b/jans-config-api/server/src/main/java/io/jans/configapi/rest/ApiApplication.java index c8e20124a8a..629039c8a4b 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/rest/ApiApplication.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/rest/ApiApplication.java @@ -38,7 +38,6 @@ public Set> getClasses() { classes.add(ConfigSmtpResource.class); classes.add(CouchbaseConfigurationResource.class); classes.add(CustomScriptResource.class); - classes.add(Fido2ConfigResource.class); classes.add(JwksResource.class); classes.add(LdapConfigurationResource.class); classes.add(LoggingResource.class); diff --git a/jans-config-api/server/src/test/resources/karate-config-jenkins.js b/jans-config-api/server/src/test/resources/karate-config-jenkins.js index 1e7158443ce..18fe8da88ee 100644 --- a/jans-config-api/server/src/test/resources/karate-config-jenkins.js +++ b/jans-config-api/server/src/test/resources/karate-config-jenkins.js @@ -42,9 +42,9 @@ function() { testProps: testProps, issuer: issuer, accessToken: '123', + statUrl: baseUrl + '/jans-config-api/api/v1/stat', healthUrl: baseUrl + '/jans-config-api/api/v1/health', - fido2Url: baseUrl + '/jans-config-api/api/v1/fido2/config', acrsUrl: baseUrl + '/jans-config-api/api/v1/acrs', authConfigurationUrl: baseUrl + '/jans-config-api/api/v1/jans-auth-server/config', scriptsUrl: baseUrl + '/jans-config-api/api/v1/config/scripts', diff --git a/jans-config-api/server/src/test/resources/karate-config.js b/jans-config-api/server/src/test/resources/karate-config.js index bfc916ad7b0..ea53dbab7a6 100644 --- a/jans-config-api/server/src/test/resources/karate-config.js +++ b/jans-config-api/server/src/test/resources/karate-config.js @@ -42,9 +42,9 @@ function() { testProps: testProps, issuer: issuer, accessToken: '123', - statUrl: baseUrl + '/jans-config-api/api/v1/stat', + + statUrl: baseUrl + '/jans-config-api/api/v1/stat', healthUrl: baseUrl + '/jans-config-api/api/v1/health', - fido2Url: baseUrl + '/jans-config-api/api/v1/fido2/config', acrsUrl: baseUrl + '/jans-config-api/api/v1/acrs', authConfigurationUrl: baseUrl + '/jans-config-api/api/v1/jans-auth-server/config', scriptsUrl: baseUrl + '/jans-config-api/api/v1/config/scripts',