diff --git a/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapui.java b/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapui.java index 8b850a54c42d5d7b0d19d13483d6dd8d1588ef2c..907deacf605a3970c72c385332b4ac9fa09cb461 100644 --- a/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapui.java +++ b/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapui.java @@ -32,7 +32,7 @@ public class DummyAuthzServerSoapui implements DummyAuthzServer { } /** - * Constructor with the path for the class. + * Constructor with the path for the class. */ public DummyAuthzServerSoapui(String path) { audienceSecretRetriever = new AudienceSecretRetrieverForSoapui(path); @@ -90,8 +90,8 @@ public class DummyAuthzServerSoapui implements DummyAuthzServer { } catch (EncodingException | TokenRequestException e) { LOGGER.error("Error generating Access Token", e); } - return token; - } + return token; + } } diff --git a/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGenerator.java b/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGenerator.java index 0e52ad2381ece3743304550087c38c97e4b38be5..3fe9ee15cbc77103c6a26ad976046f7d751d2d8a 100644 --- a/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGenerator.java +++ b/access-token-provider-api/src/main/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGenerator.java @@ -69,7 +69,7 @@ public class TokenGenerator { throw new TokenRequestException("Unsupported issuer"); } - if (accessTokenRequest.getAudience() ==null || accessTokenRequest.getAudience().isEmpty()) { + if (accessTokenRequest.getAudience() == null || accessTokenRequest.getAudience().isEmpty()) { throw new TokenRequestException("Audience is null or empty"); } diff --git a/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapuiTest.java b/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapuiTest.java index 1fb14a903b8a14b6e8916014773c68654f8a5357..8f0042970e738ad14662d2393003be6f17cc51c8 100644 --- a/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapuiTest.java +++ b/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/DummyAuthzServerSoapuiTest.java @@ -14,7 +14,7 @@ class DummyAuthzServerSoapuiTest { private static final String AUDIENCE = "audience"; /** - * get access token with an Audience path defined + * get access token with an Audience path defined */ @Test public void getAccessTokenWithPathAudienceTest() { diff --git a/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGeneratorTest.java b/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGeneratorTest.java index 4e21eba398ce593ac0090aba790db034bfc2c3b3..702ef7417b58654e9ee408642fcfcc9b81d9292b 100644 --- a/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGeneratorTest.java +++ b/access-token-provider-api/src/test/java/net/ihe/gazelle/app/accesstokenproviderapi/application/TokenGeneratorTest.java @@ -13,6 +13,9 @@ import java.time.Duration; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +/** + * Tests for {@link TokenGenerator} + */ class TokenGeneratorTest { private static final String ALGORITHM = "HS256"; @@ -23,11 +26,20 @@ class TokenGeneratorTest { private static final Duration DURATION = Duration.ofMinutes(5); private static AudienceSecretRetrieverTestImpl AUDIENCE_RETRIEVER = new AudienceSecretRetrieverTestImpl(); + /** + * Init audience available to generate token. + */ @BeforeEach public void initAudience() { AUDIENCE_RETRIEVER.addAudience(AUDIENCE, "myBeautifulKeyWhichIsAJWTSecretSoSecret"); } + /** + * Default generation of a token + * + * @throws EncodingException if something wrong happens during encoding + * @throws TokenRequestException if the token request is not valid + */ @Test public void generateAccessTokenTest() throws EncodingException, TokenRequestException { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, AUDIENCE, DURATION, TOKEN_TYPE); @@ -41,9 +53,11 @@ class TokenGeneratorTest { assertNotNull(encodedIUAToken); } - + /** + * Test with a null signature. + */ @Test - public void generateAccessTokenNullSignatureTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullSignatureTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(null, SUBJECT, AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(null); @@ -54,8 +68,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating token with unsupported issuer. + */ @Test - public void generateAccessTokenUnsupportedIssuerTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenUnsupportedIssuerTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest("blabla", SUBJECT, AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -66,8 +83,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with a null subject. + */ @Test - public void generateAccessTokenNullIssuerTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullIssuerTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(null, SUBJECT, AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -78,8 +98,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with unsupported subject. + */ @Test - public void generateAccessTokenUnsupportedSubjectTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenUnsupportedSubjectTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, "subject", AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -90,8 +113,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with null subject. + */ @Test - public void generateAccessTokenNullSubjectTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullSubjectTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, null, AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -102,8 +128,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with unsupported token type. + */ @Test - public void generateAccessTokenUnsupportedTokenTypeTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenUnsupportedTokenTypeTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, AUDIENCE, DURATION, TokenType.SAML); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -114,8 +143,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with null token type. + */ @Test - public void generateAccessTokenNullTokenTypeTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullTokenTypeTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, AUDIENCE, DURATION, null); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -126,8 +158,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with unsupported algo. + */ @Test - public void generateAccessTokenUnsupportedAlgoTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenUnsupportedAlgoTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature("algo", "secret")); @@ -138,8 +173,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with null algo. + */ @Test - public void generateAccessTokenNullAlgoTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullAlgoTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, AUDIENCE, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(null, "secret")); @@ -150,8 +188,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with null audience. + */ @Test - public void generateAccessTokenNullAudienceTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullAudienceTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, null, DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -162,8 +203,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } + /** + * Test generating a token with unsupported audience. + */ @Test - public void generateAccessTokenUnknownAudienceTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenUnknownAudienceTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, "pouet", DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -174,9 +218,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } - + /** + * Test generating a token with empty audience. + */ @Test - public void generateAccessTokenEmptyAudienceTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenEmptyAudienceTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, "", DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -187,9 +233,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } - + /** + * Test generating a token with empty secret. + */ @Test - public void generateAccessTokenEmptySecretTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenEmptySecretTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, "pouet", DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -200,9 +248,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } - + /** + * Test generating a token with null secret. + */ @Test - public void generateAccessTokenNullSecretTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenNullSecretTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, "pouet", DURATION, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); @@ -213,9 +263,11 @@ class TokenGeneratorTest { assertThrows(TokenRequestException.class, () -> tokenGenerator.generateAccessToken(accessTokenRequest), "Unsupported issuer"); } - + /** + * Test generating a token with null Duration. + */ @Test - public void generateAccessTokenDurationNullTest() throws EncodingException, TokenRequestException { + public void generateAccessTokenDurationNullTest() { AccessTokenRequest accessTokenRequest = new AccessTokenRequest(ISSUER, SUBJECT, "pouet", null, TOKEN_TYPE); accessTokenRequest.setSignature(new SymmetricSignature(ALGORITHM, "secret")); diff --git a/audience-retriever/pom.xml b/audience-retriever/pom.xml index a191e10242df4e5fed6f549f4c7e83a64709bd36..df3b5e911c0a3c63d91769345822d9f8bcfb9d28 100644 --- a/audience-retriever/pom.xml +++ b/audience-retriever/pom.xml @@ -32,6 +32,14 @@ <artifactId>framework.preferences-model-api</artifactId> <version>1.0.0</version> </dependency> + + <!-- Implementation of Operational Preferences --> + <dependency> + <groupId>net.ihe.gazelle</groupId> + <artifactId>framework.operational-preferences-service</artifactId> + <version>1.0.0</version> + </dependency> + </dependencies> </project> diff --git a/audience-retriever/src/test/java/net/ihe/gazelle/app/audienceretriever/adapter/AudienceSecretRetrieverForSoapuiTest.java b/audience-retriever/src/test/java/net/ihe/gazelle/app/audienceretriever/adapter/AudienceSecretRetrieverForSoapuiTest.java index 07611a2b66fe9fb2ea67971e771c09ff7d3065b7..367b104ce2e757277a64688f6c88b2e5840a5f19 100644 --- a/audience-retriever/src/test/java/net/ihe/gazelle/app/audienceretriever/adapter/AudienceSecretRetrieverForSoapuiTest.java +++ b/audience-retriever/src/test/java/net/ihe/gazelle/app/audienceretriever/adapter/AudienceSecretRetrieverForSoapuiTest.java @@ -15,7 +15,8 @@ class AudienceSecretRetrieverForSoapuiTest { */ @Test void retrieveSecretForAudienceWithPropertiesPathTest() { - AudienceSecretRetrieverForSoapui audienceSecretRetrieverForSoapui = new AudienceSecretRetrieverForSoapui("/opt/simulators/audience.properties"); + AudienceSecretRetrieverForSoapui audienceSecretRetrieverForSoapui = new AudienceSecretRetrieverForSoapui("/opt/simulators/audience" + + ".properties"); assertNull(audienceSecretRetrieverForSoapui.retrieveSecretForAudience("monpetitsecret")); } diff --git a/audience-retriever/src/test/resources/README.txt b/audience-retriever/src/test/resources/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..c6f818dec4fc4af999ff9c6b505592351a4c9e14 --- /dev/null +++ b/audience-retriever/src/test/resources/README.txt @@ -0,0 +1 @@ +Put here your test resources. \ No newline at end of file diff --git a/dummy-authorization-server-service/README.md b/dummy-authorization-server-service/README.md new file mode 100644 index 0000000000000000000000000000000000000000..aa0368e627e52da59cbeca548a18979bb80096a3 --- /dev/null +++ b/dummy-authorization-server-service/README.md @@ -0,0 +1,39 @@ +#Â Dummy Authorization Server Service + +This service mock an Access Token Provider, giving a mocked token using one of available user id +and a secret that can be configured depending on the used audience. + +##Â Request examples + +```http://localhost:8780/authorization-server/mock-token?userId=aamrein&audienceId=audience``` + +| Parameter Name | Usage | +|-------------|-----------------------------------------------------------------------| +| userId | User for whom the token is generated | +| audienceId | ID of the audience used to retrieve secret in Gazelle configurations. | + +The response body to this request will be the content of the generated token. + +## Available user ID + +| User ID | +|----------| +| aamrein | + +## Install the tool + +Sources are available [here](https://gitlab.inria.fr/gazelle/applications/test-execution/simulator/access-token-provider) + +Deploy the `app.dummy-authorization-server-service-X.X.X.war` artifact in a wildfly 18 server. +No specific wildfly configuration is needed for the tool to work. + +## Configure Audiences + +Edit the file `/opt/simulators/audience.properties`, add a property for each audience that needs to be configured : + +``` +audience1=secret1 +audience2=secret2 +audience3=secret3 +... +``` \ No newline at end of file diff --git a/dummy-authorization-server-service/pom.xml b/dummy-authorization-server-service/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b494a152864051db6b8c3bd11ccbbf2a36f97bc5 --- /dev/null +++ b/dummy-authorization-server-service/pom.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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> + <parent> + <artifactId>app.access-token-provider</artifactId> + <groupId>net.ihe.gazelle</groupId> + <version>1.0.0-SNAPSHOT</version> + </parent> + + <groupId>net.ihe.gazelle</groupId> + <artifactId>app.dummy-authorization-server-service</artifactId> + <name>Dummy Authorization Server Service</name> + <version>1.0.0-SNAPSHOT</version> + <packaging>war</packaging> + + + <dependencies> + <dependency> + <groupId>javax</groupId> + <artifactId>javaee-api</artifactId> + <version>8.0.1</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>net.ihe.gazelle</groupId> + <artifactId>app.access-token-provider-api</artifactId> + <version>1.0.0-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/AuthorizationServerService.java b/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/AuthorizationServerService.java new file mode 100644 index 0000000000000000000000000000000000000000..a445982f1222feb810d2f21a74def8affcfb7fa7 --- /dev/null +++ b/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/AuthorizationServerService.java @@ -0,0 +1,52 @@ +package net.ihe.gazelle.app.dummyauthorizationserverservice.adapter; + + +import net.ihe.gazelle.app.accesstokenproviderapi.application.DummyAuthzServer; +import net.ihe.gazelle.app.accesstokenproviderapi.application.DummyAuthzServerSoapui; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; +import javax.ws.rs.ext.Provider; + +/** + * Service for Mock Access Token Provider. + */ +@Provider +@Path(value = "/mock-token") +public class AuthorizationServerService { + + private DummyAuthzServer dummyAuthzServer; + + /** + * Default constructor for the class. + */ + public AuthorizationServerService() { + dummyAuthzServer = new DummyAuthzServerSoapui(); + } + + /** + * Setter for the dummyAuthzServer property. + * + * @param dummyAuthzServer value to set to the property. + */ + public void setDummyAuthzServer(DummyAuthzServer dummyAuthzServer) { + this.dummyAuthzServer = dummyAuthzServer; + } + + /** + * get a dummy access token + * + * @param userId + * @param audienceId + * @param purposeOfUse + * @param resourceId + * @return an access token + */ + @GET + public byte[] getAccessToken(@QueryParam("userId") String userId, @QueryParam("audienceId") String audienceId, + @QueryParam("purposeOfUse") String purposeOfUse, @QueryParam("resourceId") String resourceId) { + return dummyAuthzServer.getAccessToken(userId, audienceId, purposeOfUse, resourceId); + } + +} diff --git a/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/DummyAuthorizationServerServiceApplication.java b/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/DummyAuthorizationServerServiceApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..90f6d456b3bdaf8c7aba3e1ca966b1388d6c72a4 --- /dev/null +++ b/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/DummyAuthorizationServerServiceApplication.java @@ -0,0 +1,23 @@ +package net.ihe.gazelle.app.dummyauthorizationserverservice.adapter; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; +import java.util.HashSet; +import java.util.Set; + +/** + * Our Application + */ +@ApplicationPath("/") +public class DummyAuthorizationServerServiceApplication extends Application { + + /** + * {@inheritDoc} + */ + @Override + public Set<Class<?>> getClasses() { + Set<Class<?>> s = new HashSet<>(); + s.add(AuthorizationServerService.class); + return s; + } +} diff --git a/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/OperationalPreferencesDummy.java b/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/OperationalPreferencesDummy.java new file mode 100644 index 0000000000000000000000000000000000000000..34a7f6799fda60e08e126f2f99a1554a6f2a3d96 --- /dev/null +++ b/dummy-authorization-server-service/src/main/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/OperationalPreferencesDummy.java @@ -0,0 +1,21 @@ +package net.ihe.gazelle.app.dummyauthorizationserverservice.adapter; + +import net.ihe.gazelle.framework.preferencesmodelapi.application.OperationalPreferencesClientApplication; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Define mandatory preferences. + */ +public class OperationalPreferencesDummy implements OperationalPreferencesClientApplication { + + /** + * {@inheritDoc} + */ + @Override + public Map<String, List<String>> wantedMandatoryPreferences() { + return new HashMap<>(); + } +} diff --git a/dummy-authorization-server-service/src/main/resources/META-INF/beans.xml b/dummy-authorization-server-service/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000000000000000000000000000000000000..d29f9c2aedd99b79a8f82a7f18d27124c2e62358 --- /dev/null +++ b/dummy-authorization-server-service/src/main/resources/META-INF/beans.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans bean-discovery-mode="all" version="2.0" + xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"> +</beans> \ No newline at end of file diff --git a/dummy-authorization-server-service/src/main/resources/soapui/DummyAccessTokenProvider.xml b/dummy-authorization-server-service/src/main/resources/soapui/DummyAccessTokenProvider.xml new file mode 100644 index 0000000000000000000000000000000000000000..93b4d01d9ac9641a639488d9e08c99a63e7a4945 --- /dev/null +++ b/dummy-authorization-server-service/src/main/resources/soapui/DummyAccessTokenProvider.xml @@ -0,0 +1,314 @@ +<?xml version="1.0" encoding="UTF-8"?> +<con:soapui-project id="511bc175-43ea-4daa-b8b0-8135770e4931" activeEnvironment="Default" name="REST Project 1" resourceRoot="" soapui-version="5.5.0" + xmlns:con="http://eviware.com/soapui/config"> + <con:settings/> + <con:interface xsi:type="con:RestService" id="a83dfcbb-6422-4e5a-a181-094eaf6314b0" wadlVersion="http://wadl.dev.java.net/2009/02" + name="http://localhost:8780" type="rest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:settings/> + <con:definitionCache type="TEXT" rootPart=""/> + <con:endpoints> + <con:endpoint>http://localhost:8780</con:endpoint> + </con:endpoints> + <con:resource name="Mock-token" path="/authorization-server/mock-token" id="7270205e-e39c-4360-84e7-e29e05aad49b"> + <con:settings/> + <con:parameters> + <con:parameter> + <con:name>userId</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + <con:parameter> + <con:name>audienceId</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + <con:parameter> + <con:name>purposeOfUse</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + <con:parameter> + <con:name>resourceId</con:name> + <con:value/> + <con:style>QUERY</con:style> + <con:default/> + <con:description xsi:nil="true"/> + </con:parameter> + </con:parameters> + <con:method name="Mock-token 1" id="abfda5a1-8402-4e07-af8d-89b02e4d0c72" method="GET"> + <con:settings/> + <con:parameters/> + <con:representation type="RESPONSE"> + <con:mediaType>application/octet-stream</con:mediaType> + <con:status>200</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>0</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>0</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>0</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="FAULT"> + <con:mediaType>text/html</con:mediaType> + <con:status>404</con:status> + <con:params/> + <con:element>html</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>0</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>0</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:representation type="RESPONSE"> + <con:mediaType xsi:nil="true"/> + <con:status>204</con:status> + <con:params/> + <con:element>data</con:element> + </con:representation> + <con:request name="Request 1" id="1039bbd9-95cf-452e-ad96-4cfb23827782" mediaType="application/json"> + <con:settings/> + <con:endpoint>http://localhost:8780</con:endpoint> + <con:request/> + <con:credentials> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="resourceId" value="12"/> + <con:entry key="purposeOfUse" value="test"/> + <con:entry key="audienceId" value="audience"/> + <con:entry key="userId" value="test"/> + </con:parameters> + <con:parameterOrder> + <con:entry>userId</con:entry> + <con:entry>audienceId</con:entry> + <con:entry>purposeOfUse</con:entry> + <con:entry>resourceId</con:entry> + </con:parameterOrder> + </con:request> + </con:method> + </con:resource> + </con:interface> + <con:testSuite id="99a0a2d5-1bf9-4cd6-a66d-29830e75aef8" name="Test Mock Token Provider"> + <con:settings/> + <con:runType>SEQUENTIAL</con:runType> + <con:testCase id="f4ab98d6-051e-4e34-9dca-7aac5409f375" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" + name="Request" searchProperties="true"> + <con:settings/> + <con:testStep type="restrequest" name="Valid request" id="fa834a0a-6dc7-4d84-a15a-f13224626c4e"> + <con:settings/> + <con:config service="http://localhost:8780" resourcePath="/authorization-server/mock-token" methodName="Mock-token 1" + xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="Mock-token 1 - Request 1" id="1039bbd9-95cf-452e-ad96-4cfb23827782" mediaType="application/json"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> + </con:settings> + <con:endpoint>http://localhost:8780</con:endpoint> + <con:request/> + <con:originalUri>http://localhost/authorization-server/mock-token</con:originalUri> + <con:assertion type="Simple Contains" id="eec24b99-0b19-4a1e-93f7-d791268e2f6d" name="Contains"> + <con:configuration> + <token>.+\..+\..+</token> + <ignoreCase>false</ignoreCase> + <useRegEx>true</useRegEx> + </con:configuration> + </con:assertion> + <con:credentials> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="audienceId" value="audience"/> + <con:entry key="userId" value="aamrein"/> + </con:parameters> + <con:parameterOrder> + <con:entry>userId</con:entry> + <con:entry>audienceId</con:entry> + <con:entry>purposeOfUse</con:entry> + <con:entry>resourceId</con:entry> + </con:parameterOrder> + </con:restRequest> + </con:config> + </con:testStep> + <con:properties/> + </con:testCase> + <con:testCase id="81ffbff9-1a6a-4389-951a-3f8ed143f4e8" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" + name="Unknown UserID" searchProperties="true"> + <con:settings/> + <con:testStep type="restrequest" name="Unknown userID" id="0821bbbe-9ed6-490b-88f5-c46be620eae6"> + <con:settings/> + <con:config service="http://localhost:8780" resourcePath="/authorization-server/mock-token" methodName="Mock-token 1" + xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="Unknown userID" id="1039bbd9-95cf-452e-ad96-4cfb23827782" mediaType="application/json"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> + </con:settings> + <con:endpoint>http://localhost:8780</con:endpoint> + <con:request/> + <con:originalUri>http://localhost/authorization-server/mock-token</con:originalUri> + <con:assertion type="Valid HTTP Status Codes" id="60be561e-c058-42cd-882f-0e60e9226c65" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>204</codes> + </con:configuration> + </con:assertion> + <con:credentials> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="audienceId" value="audience43"/> + <con:entry key="userId" value="aamrein"/> + </con:parameters> + <con:parameterOrder> + <con:entry>userId</con:entry> + <con:entry>audienceId</con:entry> + <con:entry>purposeOfUse</con:entry> + <con:entry>resourceId</con:entry> + </con:parameterOrder> + </con:restRequest> + </con:config> + </con:testStep> + <con:properties/> + </con:testCase> + <con:testCase id="0b0c480f-8389-40e2-83bf-1adfad6f874f" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" + name="Unknown Audience" searchProperties="true"> + <con:settings/> + <con:testStep type="restrequest" name="Unknown audience" id="b3d2c1e7-36a2-43ad-8056-5ff54b75677b"> + <con:settings/> + <con:config service="http://localhost:8780" resourcePath="/authorization-server/mock-token" methodName="Mock-token 1" + xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <con:restRequest name="Unknown audience" id="1039bbd9-95cf-452e-ad96-4cfb23827782" mediaType="application/json"> + <con:settings> + <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting> + </con:settings> + <con:endpoint>http://localhost:8780</con:endpoint> + <con:request/> + <con:originalUri>http://localhost/authorization-server/mock-token</con:originalUri> + <con:assertion type="Valid HTTP Status Codes" id="60be561e-c058-42cd-882f-0e60e9226c65" name="Valid HTTP Status Codes"> + <con:configuration> + <codes>204</codes> + </con:configuration> + </con:assertion> + <con:credentials> + <con:authType>No Authorization</con:authType> + </con:credentials> + <con:jmsConfig JMSDeliveryMode="PERSISTENT"/> + <con:jmsPropertyConfig/> + <con:parameters> + <con:entry key="audienceId" value="audience"/> + <con:entry key="userId" value="wbars"/> + </con:parameters> + <con:parameterOrder> + <con:entry>userId</con:entry> + <con:entry>audienceId</con:entry> + <con:entry>purposeOfUse</con:entry> + <con:entry>resourceId</con:entry> + </con:parameterOrder> + </con:restRequest> + </con:config> + </con:testStep> + <con:properties/> + </con:testCase> + <con:properties/> + </con:testSuite> + <con:properties/> + <con:wssContainer/> + <con:oAuth2ProfileContainer/> + <con:oAuth1ProfileContainer/> +</con:soapui-project> \ No newline at end of file diff --git a/dummy-authorization-server-service/src/main/webapp/WEB-INF/jboss-web.xml b/dummy-authorization-server-service/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000000000000000000000000000000000000..b832b6ea657c580d51bc40526ad9c4dbf3e568f5 --- /dev/null +++ b/dummy-authorization-server-service/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jboss-web> + <context-root>authorization-server</context-root> +</jboss-web> \ No newline at end of file diff --git a/dummy-authorization-server-service/src/main/webapp/WEB-INF/web.xml b/dummy-authorization-server-service/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..e84277a95f80e2ed59f5518458b90b473057e968 --- /dev/null +++ b/dummy-authorization-server-service/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,7 @@ +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" + version="3.1"> + +</web-app> diff --git a/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/AuthorizationServerServiceTest.java b/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/AuthorizationServerServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b0d55465d28b9e78a1a6c869c774169e3824f22c --- /dev/null +++ b/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/AuthorizationServerServiceTest.java @@ -0,0 +1,29 @@ +package net.ihe.gazelle.app.dummyauthorizationserverservice.adapter; + +import net.ihe.gazelle.app.accesstokenproviderapi.application.DummyAuthzServerSoapui; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Tests for {@link AuthorizationServerService} + */ +class AuthorizationServerServiceTest { + + private static final String SUBJECT = "aamrein"; + private static final String AUDIENCE = "audience"; + + /** + * Test the generation of a token + */ + @Test + public void getAccessToken() { + AuthorizationServerService authorizationServerService = new AuthorizationServerService(); + DummyAuthzServerSoapui dummyAuthzServer = new DummyAuthzServerSoapui(); + dummyAuthzServer.setAudienceSecretRetriever((String audience) -> "myBeautifulKeyWhichIsAJWTSecretSoSecret"); + authorizationServerService.setDummyAuthzServer(dummyAuthzServer); + + assertNotNull(authorizationServerService.getAccessToken(SUBJECT, AUDIENCE, null, null), + "Provided access token shall not be null !"); + } +} \ No newline at end of file diff --git a/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/DummyAuthorizationServerServiceApplicationTest.java b/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/DummyAuthorizationServerServiceApplicationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1abdbf9f2e380298181c80658ac2a8ab3cd33f52 --- /dev/null +++ b/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/DummyAuthorizationServerServiceApplicationTest.java @@ -0,0 +1,24 @@ +package net.ihe.gazelle.app.dummyauthorizationserverservice.adapter; + +import org.junit.jupiter.api.Test; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class DummyAuthorizationServerServiceApplicationTest { + + /** + * Test class getter. + */ + @Test + void getClasses() { + DummyAuthorizationServerServiceApplication application = new DummyAuthorizationServerServiceApplication(); + + Set classes = application.getClasses(); + + assertNotNull(classes, "Classes map shall not be null !"); + assertEquals(1, classes.size(), "Classes map shall contain a single element !"); + } +} \ No newline at end of file diff --git a/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/OperationalPreferencesDummyTest.java b/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/OperationalPreferencesDummyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3bd30b4de8262009eedfc15b106f13c970ccc9a7 --- /dev/null +++ b/dummy-authorization-server-service/src/test/java/net/ihe/gazelle/app/dummyauthorizationserverservice/adapter/OperationalPreferencesDummyTest.java @@ -0,0 +1,25 @@ +package net.ihe.gazelle.app.dummyauthorizationserverservice.adapter; + +import net.ihe.gazelle.framework.preferencesmodelapi.application.OperationalPreferencesClientApplication; +import net.ihe.gazelle.framework.preferencesmodelapi.application.OperationalPreferencesService; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class OperationalPreferencesDummyTest { + + /** + * Test wanted mandatroy preferences list. + */ + @Test + void wantedMandatoryPreferences() { + OperationalPreferencesClientApplication operationalPreferencesService = new OperationalPreferencesDummy(); + + Map wantedMandatoryPreferences = operationalPreferencesService.wantedMandatoryPreferences(); + + assertNotNull(wantedMandatoryPreferences, "Wanted Mandatory Preferences map shall not be null !"); + assertEquals(0, wantedMandatoryPreferences.entrySet().size(), "Wanted Mandatory Preferences map shall be empty"); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 590807fc5115bd8de1967305b7944041c13b6032..88a3a45e97ca83d2883fd93549cd6351c8e8c355 100644 --- a/pom.xml +++ b/pom.xml @@ -201,5 +201,6 @@ <modules> <module>access-token-provider-api</module> <module>audience-retriever</module> - </modules> -</project> + <module>dummy-authorization-server-service</module> + </modules> +</project> \ No newline at end of file