diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/pom.xml b/components/application-mgt/org.wso2.carbon.identity.application.common/pom.xml index 92f0fe257c29..655f561c0f0b 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/pom.xml +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/pom.xml @@ -61,6 +61,10 @@ org.wso2.carbon.identity.framework org.wso2.carbon.identity.central.log.mgt + + org.wso2.carbon.identity.framework + org.wso2.carbon.identity.action.management + diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/AuthenticatorEndpointConfiguration.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/AuthenticatorEndpointConfiguration.java new file mode 100644 index 000000000000..e0565fe2d496 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/AuthenticatorEndpointConfiguration.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.identity.application.common.model; + +import org.wso2.carbon.identity.action.management.model.Authentication; +import org.wso2.carbon.identity.action.management.model.Authentication.Property; +import org.wso2.carbon.identity.action.management.model.EndpointConfig; + +import java.util.HashMap; +import java.util.NoSuchElementException; + +/** + * The authenticator endpoint configuration model. + */ +public class AuthenticatorEndpointConfiguration { + + private String uri; + private String authenticationType; + private HashMap authenticationProperties; + + public AuthenticatorEndpointConfiguration() { + } + + public AuthenticatorEndpointConfiguration(AuthenticatorEndpointConfigurationBuilder builder) { + + this.uri = builder.uri; + this.authenticationProperties = builder.authenticationProperties; + this.authenticationType = builder.authenticationType; + } + + public String getUri() { + + return uri; + } + + public HashMap getAuthenticationProperties() { + + return authenticationProperties; + } + + public String getAuthenticationType() { + + return authenticationType; + } + + /** + * AuthenticatorEndpointConfiguration builder. + */ + public static class AuthenticatorEndpointConfigurationBuilder { + + private String uri; + private String authenticationType; + private HashMap authenticationProperties; + + public AuthenticatorEndpointConfigurationBuilder() { + } + + public AuthenticatorEndpointConfigurationBuilder uri(String uri) { + + this.uri = uri; + return this; + } + + public AuthenticatorEndpointConfigurationBuilder authenticationProperties( + HashMap authentication) { + + this.authenticationProperties = authentication; + return this; + } + + public AuthenticatorEndpointConfigurationBuilder authenticationType(String authenticationType) { + + this.authenticationType = authenticationType; + return this; + } + + public AuthenticatorEndpointConfiguration build() { + + try { + EndpointConfig.EndpointConfigBuilder actionEndpointConfigBuilder = + new EndpointConfig.EndpointConfigBuilder(); + actionEndpointConfigBuilder.uri(this.uri); + actionEndpointConfigBuilder.authentication(buildAuthentication( + this.authenticationType, this.authenticationProperties)); + actionEndpointConfigBuilder.build(); + } catch (Exception e) { + throw new IllegalArgumentException("Endpoint configuration of the authenticator is not in expected " + + "format.", e); + } + return new AuthenticatorEndpointConfiguration(this); + } + + private Authentication buildAuthentication(String authenticationType, + HashMap properties) throws NoSuchElementException { + + switch (Authentication.Type.valueOf(authenticationType)) { + case BASIC: + return new Authentication.BasicAuthBuilder( + getProperty(properties, Property.USERNAME.getName()), + getProperty(properties, Property.PASSWORD.getName())).build(); + case BEARER: + return new Authentication.BearerAuthBuilder( + getProperty(properties, Property.ACCESS_TOKEN.getName())).build(); + case API_KEY: + return new Authentication.APIKeyAuthBuilder( + getProperty(properties, Property.HEADER.getName()), + getProperty(properties, Property.VALUE.getName())).build(); + case NONE: + return new Authentication.NoneAuthBuilder().build(); + default: + throw new IllegalArgumentException(); + } + } + + private String getProperty(HashMap actionEndpointProperties, String propertyName) { + + if (actionEndpointProperties.containsKey(propertyName)) { + return actionEndpointProperties.get(propertyName); + } else { + throw new NoSuchElementException("Property " + propertyName + + " is not found in the endpoint configuration."); + } + } + } +} diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/FederatedAuthenticatorConfig.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/FederatedAuthenticatorConfig.java index 7805ecfd177f..fe35e5aa8626 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/FederatedAuthenticatorConfig.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/FederatedAuthenticatorConfig.java @@ -67,6 +67,11 @@ public class FederatedAuthenticatorConfig implements Serializable { @XmlElement(name = "DefinedBy") protected DefinedByType definedByType; + public FederatedAuthenticatorConfig() { + + definedByType = DefinedByType.SYSTEM; + } + public static FederatedAuthenticatorConfig build(OMElement federatedAuthenticatorConfigOM) { if (federatedAuthenticatorConfigOM == null) { diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/LocalAuthenticatorConfig.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/LocalAuthenticatorConfig.java index 89e09a467774..9bfb17987135 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/LocalAuthenticatorConfig.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/LocalAuthenticatorConfig.java @@ -67,6 +67,11 @@ public class LocalAuthenticatorConfig implements Serializable { @XmlElement(name = "DefinedBy") protected DefinedByType definedByType; + public LocalAuthenticatorConfig() { + + definedByType = DefinedByType.SYSTEM; + } + /* * * diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedFederatedAuthenticatorConfig.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedFederatedAuthenticatorConfig.java new file mode 100644 index 000000000000..64de3a37faf9 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedFederatedAuthenticatorConfig.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.identity.application.common.model; + +import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants.DefinedByType; + +/** + * The user defined federated authenticator configuration model. + */ +public class UserDefinedFederatedAuthenticatorConfig extends FederatedAuthenticatorConfig { + + private static final String TAG_CUSTOM = "CUSTOM"; + + protected AuthenticatorEndpointConfiguration endpointConfig; + + public UserDefinedFederatedAuthenticatorConfig() { + + definedByType = DefinedByType.USER; + setTags(new String[]{TAG_CUSTOM}); + } + + /** + * Get the endpoint config of the User defined federated authenticator config. + * + * @return DefinedByType + */ + public AuthenticatorEndpointConfiguration getEndpointConfig() { + + return endpointConfig; + } + + /** + * Set the defined by type of the User defined federated authenticator config. + * + * @param endpointConfig The endpoint config of the User defined federated authenticator config. + */ + public void setEndpointConfig(AuthenticatorEndpointConfiguration endpointConfig) { + + this.endpointConfig = endpointConfig; + } +} diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedLocalAuthenticatorConfig.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedLocalAuthenticatorConfig.java new file mode 100644 index 000000000000..f8e4f5be7753 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedLocalAuthenticatorConfig.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.identity.application.common.model; + +import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants.AuthenticationType; +import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants.DefinedByType; + +/** + * The user defined local authenticator configuration model. + */ +public class UserDefinedLocalAuthenticatorConfig extends LocalAuthenticatorConfig { + + private static final String TAG_2FA = "2FA"; + private static final String TAG_CUSTOM = "CUSTOM"; + + protected AuthenticatorEndpointConfiguration endpointConfig; + + public UserDefinedLocalAuthenticatorConfig(AuthenticationType type) { + + definedByType = DefinedByType.USER; + if (AuthenticationType.VERIFICATION == type) { + setTags(new String[]{TAG_CUSTOM, TAG_2FA}); + } else { + setTags(new String[]{TAG_CUSTOM}); + } + } + + /** + * Get the endpoint config of the User defined local authenticator config. + * + * @return DefinedByType + */ + public AuthenticatorEndpointConfiguration getEndpointConfig() { + + return endpointConfig; + } + + /** + * Set the defined by type of the User defined local authenticator config. + * + * @param endpointConfig The endpoint config of the User defined local authenticator config. + */ + public void setEndpointConfig(AuthenticatorEndpointConfiguration endpointConfig) { + + this.endpointConfig = endpointConfig; + } +} diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/java/org/wso2/carbon/identity/application/common/model/test/UserDefinedAuthenticatorTest.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/java/org/wso2/carbon/identity/application/common/model/test/UserDefinedAuthenticatorTest.java new file mode 100644 index 000000000000..bfedeed07790 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/java/org/wso2/carbon/identity/application/common/model/test/UserDefinedAuthenticatorTest.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.identity.application.common.model.test; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.wso2.carbon.identity.application.common.model.AuthenticatorEndpointConfiguration; +import org.wso2.carbon.identity.application.common.model.AuthenticatorEndpointConfiguration.AuthenticatorEndpointConfigurationBuilder; +import org.wso2.carbon.identity.application.common.model.UserDefinedFederatedAuthenticatorConfig; +import org.wso2.carbon.identity.application.common.model.UserDefinedLocalAuthenticatorConfig; +import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants; + +import java.util.HashMap; + +import static org.testng.Assert.assertEquals; + +public class UserDefinedAuthenticatorTest { + + private static final String URI = "http://localhost:8080"; + + @Test + public void createUserDefinedLocalVerificationAuthenticator() { + + UserDefinedLocalAuthenticatorConfig config = + new UserDefinedLocalAuthenticatorConfig(AuthenticatorPropertyConstants.AuthenticationType.VERIFICATION); + assertEquals(config.getTags(), new String[]{"CUSTOM", "2FA"}); + assertEquals(config.getDefinedByType(), AuthenticatorPropertyConstants.DefinedByType.USER); + } + + @Test + public void createUserDefinedLocalIdentificationAuthenticator() { + + UserDefinedLocalAuthenticatorConfig config = + new UserDefinedLocalAuthenticatorConfig( + AuthenticatorPropertyConstants.AuthenticationType.IDENTIFICATION); + assertEquals(config.getTags(), new String[]{"CUSTOM"}); + assertEquals(config.getDefinedByType(), AuthenticatorPropertyConstants.DefinedByType.USER); + } + + @Test + public void createUserDefinedFederatedAuthenticator() { + + UserDefinedFederatedAuthenticatorConfig config = new UserDefinedFederatedAuthenticatorConfig(); + assertEquals(config.getTags(), new String[]{"CUSTOM"}); + assertEquals(config.getDefinedByType(), AuthenticatorPropertyConstants.DefinedByType.USER); + } + + @DataProvider(name = "endpointConfig") + public Object[][] endpointConfig() { + return new Object[][] { + {URI, "BASIC", new HashMap() {{ + put("username", "value1"); + put("password", "value2"); + }}}, + {URI, "BEARER", new HashMap() {{ + put("accessToken", "value1"); + }}} + }; + } + + @Test(dataProvider = "endpointConfig") + public void createEndpointConfigurationTest(String uri, String authenticationType, HashMap endpointConfig) { + + AuthenticatorEndpointConfigurationBuilder endpointConfigBuilder = + new AuthenticatorEndpointConfigurationBuilder(); + endpointConfigBuilder.uri(uri); + endpointConfigBuilder.authenticationType(authenticationType); + endpointConfigBuilder.authenticationProperties(endpointConfig); + AuthenticatorEndpointConfiguration authenticatorEndpointConfiguration = endpointConfigBuilder.build(); + + assertEquals(authenticatorEndpointConfiguration.getUri(), uri); + assertEquals(authenticatorEndpointConfiguration.getAuthenticationType(), authenticationType); + assertEquals(authenticatorEndpointConfiguration.getAuthenticationProperties(), endpointConfig); + } + + @DataProvider(name = "invalidEndpointConfig") + public Object[][] invalidEndpointConfig() { + return new Object[][] { + {URI, "INVALID", new HashMap() {{ + put("username", "value1"); + put("password", "value2"); + }}}, + {URI, "BEARER", new HashMap() {{ + put("invalidProp", "value1"); + }}}, + {URI, "BASIC", new HashMap() {{ + put("username", "value1"); + }}} + }; + } + + @Test(dataProvider = "invalidEndpointConfig", expectedExceptions = IllegalArgumentException.class) + public void invalidEndpointConfigurationTest(String uri, String authenticationType, HashMap endpointConfig) { + + AuthenticatorEndpointConfigurationBuilder endpointConfigBuilder = + new AuthenticatorEndpointConfigurationBuilder(); + endpointConfigBuilder.uri(uri); + endpointConfigBuilder.authenticationType(authenticationType); + endpointConfigBuilder.authenticationProperties(endpointConfig); + endpointConfigBuilder.build(); + } +} diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/resources/testng.xml b/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/resources/testng.xml index 8a3e112753b7..917b616e3e8a 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/resources/testng.xml +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/test/resources/testng.xml @@ -21,6 +21,7 @@ +