From 44bf32f43acf629083218dc91d5d4c110ac8d308 Mon Sep 17 00:00:00 2001 From: Thisara-Welmilla Date: Thu, 7 Nov 2024 10:52:16 +0530 Subject: [PATCH] Add new authenticator configs for user defined auth extensions. --- .../dao/impl/ActionManagementDAOImpl.java | 28 +--- .../management/model/Authentication.java | 59 ++++++++ .../AuthenticatorEndpointConfiguration.java | 141 ------------------ ...serDefinedAuthenticatorEndpointConfig.java | 88 +++++++++++ ...erDefinedFederatedAuthenticatorConfig.java | 6 +- .../UserDefinedLocalAuthenticatorConfig.java | 6 +- .../test/UserDefinedAuthenticatorTest.java | 20 +-- 7 files changed, 168 insertions(+), 180 deletions(-) delete mode 100644 components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/AuthenticatorEndpointConfiguration.java create mode 100644 components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedAuthenticatorEndpointConfig.java diff --git a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/dao/impl/ActionManagementDAOImpl.java b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/dao/impl/ActionManagementDAOImpl.java index 43121fbb930d..95bc2f54917a 100644 --- a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/dao/impl/ActionManagementDAOImpl.java +++ b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/dao/impl/ActionManagementDAOImpl.java @@ -437,29 +437,11 @@ private EndpointConfig getActionEndpointConfigById(String actionUUID, Integer te Authentication authentication = null; if (actionEndpointProperties.containsKey(ActionMgtConstants.AUTHN_TYPE_ATTRIBUTE)) { - Authentication.Type authnType = Authentication.Type.valueOf( - actionEndpointProperties.get(ActionMgtConstants.AUTHN_TYPE_ATTRIBUTE)); - switch (authnType) { - case BASIC: - authentication = new Authentication.BasicAuthBuilder( - actionEndpointProperties.get(Authentication.Property.USERNAME.getName()), - actionEndpointProperties.get(Authentication.Property.PASSWORD.getName())).build(); - break; - case BEARER: - authentication = new Authentication.BearerAuthBuilder( - actionEndpointProperties.get(Authentication.Property.ACCESS_TOKEN.getName())).build(); - break; - case API_KEY: - authentication = new Authentication.APIKeyAuthBuilder( - actionEndpointProperties.get(Authentication.Property.HEADER.getName()), - actionEndpointProperties.get(Authentication.Property.VALUE.getName())).build(); - break; - case NONE: - authentication = new Authentication.NoneAuthBuilder().build(); - break; - default: - break; - } + authentication = new Authentication.AuthenticationBuilder() + .type(Authentication.Type.valueOf( + actionEndpointProperties.get(ActionMgtConstants.AUTHN_TYPE_ATTRIBUTE))) + .properties(actionEndpointProperties) + .build(); } else { throw ActionManagementUtil.handleServerException( ActionMgtConstants.ErrorMessages.ERROR_NO_AUTHENTICATION_TYPE, null); diff --git a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/model/Authentication.java b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/model/Authentication.java index 5d1717a7aa71..2f77394f2d5a 100644 --- a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/model/Authentication.java +++ b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/model/Authentication.java @@ -19,6 +19,7 @@ package org.wso2.carbon.identity.action.management.model; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.wso2.carbon.identity.action.management.ActionSecretProcessor; import org.wso2.carbon.identity.action.management.constant.ActionMgtConstants; import org.wso2.carbon.identity.action.management.exception.ActionMgtException; @@ -27,6 +28,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; /** * Authentication class which hold supported authentication types and their properties. @@ -233,4 +236,60 @@ public Authentication build() { return new Authentication(this); } } + + /** + * This builder build endpoint by taking the authentication type and properties as input. + */ + public static class AuthenticationBuilder { + + private Type authType; + private Map authPropertiesMap; + + public AuthenticationBuilder type(Type type) { + + this.authType = type; + return this; + } + + public AuthenticationBuilder properties(Map authPropertiesMap) { + + this.authPropertiesMap = authPropertiesMap; + return this; + } + + public Authentication build() { + + switch (authType) { + case BASIC: + return new Authentication.BasicAuthBuilder( + getProperty(authPropertiesMap, Property.USERNAME.getName()), + getProperty(authPropertiesMap, Property.PASSWORD.getName())).build(); + case BEARER: + return new Authentication.BearerAuthBuilder( + getProperty(authPropertiesMap, Property.ACCESS_TOKEN.getName())).build(); + case API_KEY: + return new Authentication.APIKeyAuthBuilder( + getProperty(authPropertiesMap, Property.HEADER.getName()), + getProperty(authPropertiesMap, Property.VALUE.getName())).build(); + case NONE: + return new Authentication.NoneAuthBuilder().build(); + default: + throw new IllegalArgumentException(); + } + } + + private String getProperty(Map actionEndpointProperties, String propertyName) { + + if (actionEndpointProperties != null && actionEndpointProperties.containsKey(propertyName)) { + String propValue = actionEndpointProperties.get(propertyName); + if (StringUtils.isNotBlank(propValue)) { + return propValue; + } + throw new IllegalArgumentException(String.format("The Property %s cannot be blank.", propertyName)); + } + + throw new NoSuchElementException(String.format("The Property %s is not found in the authentication " + + "configuration.", propertyName)); + } + } } 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 deleted file mode 100644 index e0565fe2d496..000000000000 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/AuthenticatorEndpointConfiguration.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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/UserDefinedAuthenticatorEndpointConfig.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedAuthenticatorEndpointConfig.java new file mode 100644 index 000000000000..ac1066e95866 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/UserDefinedAuthenticatorEndpointConfig.java @@ -0,0 +1,88 @@ +/* + * 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.EndpointConfig; + +import java.util.Map; + +/** + * The authenticator endpoint configuration model. + */ +public class UserDefinedAuthenticatorEndpointConfig { + + private final EndpointConfig endpointConfig; + + private UserDefinedAuthenticatorEndpointConfig(UserDefinedAuthenticatorEndpointConfigBuilder builder) { + + endpointConfig = builder.endpointConfig; + } + + public EndpointConfig getEndpointConfig() { + + return endpointConfig; + } + + /** + * UserDefinedAuthenticatorEndpointConfig builder. + */ + public static class UserDefinedAuthenticatorEndpointConfigBuilder { + + private String uri; + private String authenticationType; + private Map authenticationProperties; + private EndpointConfig endpointConfig; + + public UserDefinedAuthenticatorEndpointConfigBuilder() { + } + + public UserDefinedAuthenticatorEndpointConfigBuilder uri(String uri) { + + this.uri = uri; + return this; + } + + public UserDefinedAuthenticatorEndpointConfigBuilder authenticationProperties( + Map authentication) { + + this.authenticationProperties = authentication; + return this; + } + + public UserDefinedAuthenticatorEndpointConfigBuilder authenticationType(String authenticationType) { + + this.authenticationType = authenticationType; + return this; + } + + public UserDefinedAuthenticatorEndpointConfig build() { + + EndpointConfig.EndpointConfigBuilder endpointConfigBuilder = new EndpointConfig.EndpointConfigBuilder(); + endpointConfigBuilder.uri(uri); + endpointConfigBuilder.authentication(new Authentication.AuthenticationBuilder() + .type(Authentication.Type.valueOf(authenticationType)) + .properties(authenticationProperties) + .build()); + endpointConfig = endpointConfigBuilder.build(); + + return new UserDefinedAuthenticatorEndpointConfig(this); + } + } +} 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 index 64de3a37faf9..4679585e9a15 100644 --- 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 @@ -27,7 +27,7 @@ public class UserDefinedFederatedAuthenticatorConfig extends FederatedAuthentica private static final String TAG_CUSTOM = "CUSTOM"; - protected AuthenticatorEndpointConfiguration endpointConfig; + protected UserDefinedAuthenticatorEndpointConfig endpointConfig; public UserDefinedFederatedAuthenticatorConfig() { @@ -40,7 +40,7 @@ public UserDefinedFederatedAuthenticatorConfig() { * * @return DefinedByType */ - public AuthenticatorEndpointConfiguration getEndpointConfig() { + public UserDefinedAuthenticatorEndpointConfig getEndpointConfig() { return endpointConfig; } @@ -50,7 +50,7 @@ public AuthenticatorEndpointConfiguration getEndpointConfig() { * * @param endpointConfig The endpoint config of the User defined federated authenticator config. */ - public void setEndpointConfig(AuthenticatorEndpointConfiguration endpointConfig) { + public void setEndpointConfig(UserDefinedAuthenticatorEndpointConfig 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 index f8e4f5be7753..c372fb17f8d9 100644 --- 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 @@ -29,7 +29,7 @@ public class UserDefinedLocalAuthenticatorConfig extends LocalAuthenticatorConfi private static final String TAG_2FA = "2FA"; private static final String TAG_CUSTOM = "CUSTOM"; - protected AuthenticatorEndpointConfiguration endpointConfig; + protected UserDefinedAuthenticatorEndpointConfig endpointConfig; public UserDefinedLocalAuthenticatorConfig(AuthenticationType type) { @@ -46,7 +46,7 @@ public UserDefinedLocalAuthenticatorConfig(AuthenticationType type) { * * @return DefinedByType */ - public AuthenticatorEndpointConfiguration getEndpointConfig() { + public UserDefinedAuthenticatorEndpointConfig getEndpointConfig() { return endpointConfig; } @@ -56,7 +56,7 @@ public AuthenticatorEndpointConfiguration getEndpointConfig() { * * @param endpointConfig The endpoint config of the User defined local authenticator config. */ - public void setEndpointConfig(AuthenticatorEndpointConfiguration endpointConfig) { + public void setEndpointConfig(UserDefinedAuthenticatorEndpointConfig 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 index bfedeed07790..7af36a9ce2e3 100644 --- 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 @@ -20,8 +20,8 @@ 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.UserDefinedAuthenticatorEndpointConfig; +import org.wso2.carbon.identity.application.common.model.UserDefinedAuthenticatorEndpointConfig.UserDefinedAuthenticatorEndpointConfigBuilder; 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; @@ -78,16 +78,16 @@ public Object[][] endpointConfig() { public void createEndpointConfigurationTest(String uri, String authenticationType, HashMap endpointConfig) { - AuthenticatorEndpointConfigurationBuilder endpointConfigBuilder = - new AuthenticatorEndpointConfigurationBuilder(); + UserDefinedAuthenticatorEndpointConfigBuilder endpointConfigBuilder = + new UserDefinedAuthenticatorEndpointConfigBuilder(); endpointConfigBuilder.uri(uri); endpointConfigBuilder.authenticationType(authenticationType); endpointConfigBuilder.authenticationProperties(endpointConfig); - AuthenticatorEndpointConfiguration authenticatorEndpointConfiguration = endpointConfigBuilder.build(); + UserDefinedAuthenticatorEndpointConfig UserDefinedAuthenticatorEndpointConfig = endpointConfigBuilder.build(); - assertEquals(authenticatorEndpointConfiguration.getUri(), uri); - assertEquals(authenticatorEndpointConfiguration.getAuthenticationType(), authenticationType); - assertEquals(authenticatorEndpointConfiguration.getAuthenticationProperties(), endpointConfig); + assertEquals(UserDefinedAuthenticatorEndpointConfig.getUri(), uri); + assertEquals(UserDefinedAuthenticatorEndpointConfig.getAuthenticationType(), authenticationType); + assertEquals(UserDefinedAuthenticatorEndpointConfig.getAuthenticationProperties(), endpointConfig); } @DataProvider(name = "invalidEndpointConfig") @@ -110,8 +110,8 @@ public Object[][] invalidEndpointConfig() { public void invalidEndpointConfigurationTest(String uri, String authenticationType, HashMap endpointConfig) { - AuthenticatorEndpointConfigurationBuilder endpointConfigBuilder = - new AuthenticatorEndpointConfigurationBuilder(); + UserDefinedAuthenticatorEndpointConfigBuilder endpointConfigBuilder = + new UserDefinedAuthenticatorEndpointConfigBuilder(); endpointConfigBuilder.uri(uri); endpointConfigBuilder.authenticationType(authenticationType); endpointConfigBuilder.authenticationProperties(endpointConfig);