From 60aa6a2f557c5a69412a02a433b7b9eb0ca6e1a4 Mon Sep 17 00:00:00 2001 From: Thisara-Welmilla Date: Sat, 25 Jan 2025 20:00:38 +0530 Subject: [PATCH 1/2] Add new method to get federated authenticator by name. --- .../ApplicationAuthenticatorService.java | 32 +++++++++++++++++++ .../internal/FrameworkServiceComponent.java | 2 +- .../idp/mgt/IdentityProviderManager.java | 26 +++++++++++---- .../org/wso2/carbon/idp/mgt/IdpManager.java | 15 +++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java index abb1644ec2df..5f85b9bf2a90 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java @@ -161,6 +161,18 @@ public LocalAuthenticatorConfig getLocalAuthenticatorByName(String name, String return getUserDefinedLocalAuthenticator(name, tenantDomain); } + /** + * This returns only SYSTEM defined federated authenticator by name. + * + * @param name The name of the federated application authenticator configuration. + * @return Retrieved FederatedAuthenticatorConfig. + * + * @deprecated It is recommended to use getFederatedAuthenticatorByName(String, String) in + * org.wso2.carbon.idp.mgt.IdentityProviderManager class, or getSystemFederatedAuthenticatorByName(String) + * to retrieve only SYSTEM defined federated application authenticator configuration by name. + * which supports retrieving both USER and SYSTEM defined federated application authenticator configuration by name. + */ + @Deprecated public FederatedAuthenticatorConfig getFederatedAuthenticatorByName(String name) { for (FederatedAuthenticatorConfig federatedAuthenticator : federatedAuthenticators) { if (federatedAuthenticator.getName().equals(name)) { @@ -170,6 +182,26 @@ public FederatedAuthenticatorConfig getFederatedAuthenticatorByName(String name) return null; } + /** + * This returns only SYSTEM defined federated authenticator by name. + * + * @param name The name of the federated application authenticator configuration. + * @return Retrieved FederatedAuthenticatorConfig. + * + * @deprecated It is recommended to use getFederatedAuthenticatorByName(String, String) in + * org.wso2.carbon.idp.mgt.IdentityProviderManager class. + * which supports retrieving both USER and SYSTEM defined federated application authenticator configuration by name. + */ + public FederatedAuthenticatorConfig getSystemDefinedFederatedAuthenticatorByName(String name) { + + for (FederatedAuthenticatorConfig federatedAuthenticator : federatedAuthenticators) { + if (federatedAuthenticator.getName().equals(name)) { + return federatedAuthenticator; + } + } + return null; + } + public RequestPathAuthenticatorConfig getRequestPathAuthenticatorByName(String name) { for (RequestPathAuthenticatorConfig reqPathAuthenticator : requestPathAuthenticators) { if (reqPathAuthenticator.getName().equals(name)) { diff --git a/components/authentication-framework/org.wso2.carbon.identity.application.authentication.framework/src/main/java/org/wso2/carbon/identity/application/authentication/framework/internal/FrameworkServiceComponent.java b/components/authentication-framework/org.wso2.carbon.identity.application.authentication.framework/src/main/java/org/wso2/carbon/identity/application/authentication/framework/internal/FrameworkServiceComponent.java index 42ecadb98176..09a06ac26c2e 100644 --- a/components/authentication-framework/org.wso2.carbon.identity.application.authentication.framework/src/main/java/org/wso2/carbon/identity/application/authentication/framework/internal/FrameworkServiceComponent.java +++ b/components/authentication-framework/org.wso2.carbon.identity.application.authentication.framework/src/main/java/org/wso2/carbon/identity/application/authentication/framework/internal/FrameworkServiceComponent.java @@ -592,7 +592,7 @@ protected void unsetAuthenticator(ApplicationAuthenticator authenticator) { appAuthenticatorService.removeLocalAuthenticator(localAuthenticatorConfig); } else if (authenticator instanceof FederatedApplicationAuthenticator) { FederatedAuthenticatorConfig federatedAuthenticatorConfig = appAuthenticatorService - .getFederatedAuthenticatorByName(authenticatorName); + .getSystemDefinedFederatedAuthenticatorByName(authenticatorName); appAuthenticatorService.removeFederatedAuthenticator(federatedAuthenticatorConfig); } else if (authenticator instanceof RequestPathApplicationAuthenticator) { RequestPathAuthenticatorConfig reqPathAuthenticatorConfig = appAuthenticatorService diff --git a/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdentityProviderManager.java b/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdentityProviderManager.java index 03d875804fa3..db1388b92a95 100644 --- a/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdentityProviderManager.java +++ b/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdentityProviderManager.java @@ -1531,7 +1531,7 @@ public IdentityProvider addIdPWithResourceId(IdentityProvider identityProvider, } handleMetadata(tenantId, identityProvider); - resolveAuthenticatorDefinedByProperty(identityProvider, true); + resolveAuthenticatorDefinedByProperty(identityProvider, true, tenantDomain); String resourceId = dao.addIdP(identityProvider, tenantId, tenantDomain); identityProvider = dao.getIdPByResourceId(resourceId, tenantId, tenantDomain); @@ -1881,7 +1881,7 @@ private void updateIDP(IdentityProvider currentIdentityProvider, IdentityProvide validateIdPIssuerName(currentIdentityProvider, newIdentityProvider, tenantId, tenantDomain); handleMetadata(tenantId, newIdentityProvider); - resolveAuthenticatorDefinedByProperty(newIdentityProvider, false); + resolveAuthenticatorDefinedByProperty(newIdentityProvider, false, tenantDomain); dao.updateIdP(newIdentityProvider, currentIdentityProvider, tenantId, tenantDomain); } @@ -2227,8 +2227,7 @@ private void validateFederatedAuthenticatorConfigName(FederatedAuthenticatorConf for (FederatedAuthenticatorConfig config : federatedAuthConfigs) { if (config.getDefinedByType() == DefinedByType.SYSTEM) { // Check if there is a system registered authenticator given authenticator name. - if (ApplicationAuthenticatorService.getInstance() - .getFederatedAuthenticatorByName(config.getName()) == null) { + if (getFederatedAuthenticatorByName(config.getName(), tenantDomain) == null) { throw IdPManagementUtil.handleClientException(IdPManagementConstants.ErrorMessage .ERROR_CODE_NO_SYSTEM_AUTHENTICATOR_FOUND, new String( Base64.getEncoder().encode(config.getName().getBytes(StandardCharsets.UTF_8)))); @@ -2390,6 +2389,18 @@ public FederatedAuthenticatorConfig[] getAllFederatedAuthenticators(String tenan return allFederatedAuthenticators.toArray(new FederatedAuthenticatorConfig[0]); } + @Override + public FederatedAuthenticatorConfig getFederatedAuthenticatorByName( + String authenticatorName, String tenantDomain) throws IdentityProviderManagementException { + + for (FederatedAuthenticatorConfig fedAuth : getAllFederatedAuthenticators(tenantDomain)) { + if (fedAuth.getName().equals(authenticatorName)) { + return fedAuth; + } + } + return null; + } + private boolean isExistingAuthentication(String authenticatorName, String tenantDomain) throws IdentityProviderManagementException { @@ -2755,7 +2766,8 @@ private boolean isAnOTPLengthConfig(IdentityProviderProperty property) { return false; } - private void resolveAuthenticatorDefinedByProperty(IdentityProvider idp, boolean isNewFederatedAuthenticator) { + private void resolveAuthenticatorDefinedByProperty(IdentityProvider idp, boolean isNewFederatedAuthenticator, + String tenantDomain) throws IdentityProviderManagementException { /* For new federated authenticators: If 'definedByType' is null, set it to default to SYSTEM. */ if (isNewFederatedAuthenticator) { @@ -2772,8 +2784,8 @@ private void resolveAuthenticatorDefinedByProperty(IdentityProvider idp, boolean if not return USER. */ for (FederatedAuthenticatorConfig federatedAuthConfig : idp.getFederatedAuthenticatorConfigs()) { if (federatedAuthConfig.getDefinedByType() == null) { - FederatedAuthenticatorConfig authenticatorConfig = ApplicationAuthenticatorService.getInstance() - .getFederatedAuthenticatorByName(federatedAuthConfig.getName()); + FederatedAuthenticatorConfig authenticatorConfig = getFederatedAuthenticatorByName + (federatedAuthConfig.getName(), tenantDomain); federatedAuthConfig.setDefinedByType(authenticatorConfig.getDefinedByType()); } } diff --git a/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdpManager.java b/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdpManager.java index 27e3489d6d5b..4950a26bc4d8 100644 --- a/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdpManager.java +++ b/components/idp-mgt/org.wso2.carbon.idp.mgt/src/main/java/org/wso2/carbon/idp/mgt/IdpManager.java @@ -607,4 +607,19 @@ default FederatedAuthenticatorConfig[] getAllFederatedAuthenticators(String tena return new FederatedAuthenticatorConfig[0]; } + + /** + * Get the federated authenticator by authenticator name of the tenant domain + * (both system defined and user defined). + * + * @param authenticatorName Authenticator Name. + * @param tenantDomain Tenant Domain. + * @return User all federated authenticators. + * @throws IdentityProviderManagementException If an error occurred while getting the federated authenticator. + */ + default FederatedAuthenticatorConfig getFederatedAuthenticatorByName( + String authenticatorName, String tenantDomain) throws IdentityProviderManagementException { + + return null; + } } From f9d5db76b6d8a58be16d212f9ecc8eea718e4c86 Mon Sep 17 00:00:00 2001 From: Thisara-Welmilla Date: Sat, 25 Jan 2025 21:56:25 +0530 Subject: [PATCH 2/2] Add new method to get federated authenticator by name. --- .../common/ApplicationAuthenticatorService.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java index 5f85b9bf2a90..e86d3d9eb567 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/ApplicationAuthenticatorService.java @@ -168,9 +168,9 @@ public LocalAuthenticatorConfig getLocalAuthenticatorByName(String name, String * @return Retrieved FederatedAuthenticatorConfig. * * @deprecated It is recommended to use getFederatedAuthenticatorByName(String, String) in - * org.wso2.carbon.idp.mgt.IdentityProviderManager class, or getSystemFederatedAuthenticatorByName(String) + * org.wso2.carbon.idp.mgt.IdentityProviderManager class which supports retrieving both USER and SYSTEM defined + * federated application authenticator configuration by name, or getSystemFederatedAuthenticatorByName(String) * to retrieve only SYSTEM defined federated application authenticator configuration by name. - * which supports retrieving both USER and SYSTEM defined federated application authenticator configuration by name. */ @Deprecated public FederatedAuthenticatorConfig getFederatedAuthenticatorByName(String name) { @@ -182,16 +182,6 @@ public FederatedAuthenticatorConfig getFederatedAuthenticatorByName(String name) return null; } - /** - * This returns only SYSTEM defined federated authenticator by name. - * - * @param name The name of the federated application authenticator configuration. - * @return Retrieved FederatedAuthenticatorConfig. - * - * @deprecated It is recommended to use getFederatedAuthenticatorByName(String, String) in - * org.wso2.carbon.idp.mgt.IdentityProviderManager class. - * which supports retrieving both USER and SYSTEM defined federated application authenticator configuration by name. - */ public FederatedAuthenticatorConfig getSystemDefinedFederatedAuthenticatorByName(String name) { for (FederatedAuthenticatorConfig federatedAuthenticator : federatedAuthenticators) {