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',