Skip to content

Commit

Permalink
Improve authenticator type resolving.
Browse files Browse the repository at this point in the history
  • Loading branch information
Thisara-Welmilla committed Jan 26, 2025
1 parent baa880b commit 87a79e9
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
import org.apache.commons.lang.StringUtils;
import org.wso2.carbon.identity.api.server.application.management.v1.AuthenticationSequence;
import org.wso2.carbon.identity.api.server.application.management.v1.AuthenticationStepModel;
import org.wso2.carbon.identity.api.server.application.management.v1.Authenticator;
import org.wso2.carbon.identity.api.server.application.management.v1.core.functions.UpdateFunction;
import org.wso2.carbon.identity.api.server.application.management.v1.core.functions.Utils;
import org.wso2.carbon.identity.application.authentication.framework.util.FrameworkConstants;
import org.wso2.carbon.identity.application.common.ApplicationAuthenticatorService;
import org.wso2.carbon.identity.application.common.model.AuthenticationStep;
import org.wso2.carbon.identity.application.common.model.FederatedAuthenticatorConfig;
import org.wso2.carbon.identity.application.common.model.IdentityProvider;
Expand All @@ -31,6 +33,7 @@
import org.wso2.carbon.identity.application.common.model.ServiceProvider;
import org.wso2.carbon.identity.application.common.model.script.AuthenticationScriptConfig;
import org.wso2.carbon.identity.application.mgt.ApplicationConstants;
import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants.DefinedByType;

import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -159,12 +162,14 @@ private AuthenticationStep buildAuthenticationStep(AuthenticationStepModel stepM
if (FrameworkConstants.LOCAL_IDP_NAME.equals(option.getIdp())) {
LocalAuthenticatorConfig localAuthOption = new LocalAuthenticatorConfig();
localAuthOption.setEnabled(true);
localAuthOption.setDefinedByType(resolveDefinedByType(option));
localAuthOption.setName(option.getAuthenticator());
localAuthOptions.add(localAuthOption);
} else {
FederatedAuthenticatorConfig federatedAuthConfig = new FederatedAuthenticatorConfig();
federatedAuthConfig.setEnabled(true);
federatedAuthConfig.setName(option.getAuthenticator());
federatedAuthConfig.setDefinedByType(resolveDefinedByType(option));
IdentityProvider federatedIdp = new IdentityProvider();
federatedIdp.setIdentityProviderName(option.getIdp());
federatedIdp.setFederatedAuthenticatorConfigs(new FederatedAuthenticatorConfig[]{federatedAuthConfig});
Expand All @@ -179,6 +184,25 @@ private AuthenticationStep buildAuthenticationStep(AuthenticationStepModel stepM
return authenticationStep;
}

private DefinedByType resolveDefinedByType(Authenticator authenticator) {

if (FrameworkConstants.LOCAL_IDP_NAME.equals(authenticator.getIdp())) {
LocalAuthenticatorConfig localAuthConfig = ApplicationAuthenticatorService.getInstance()
.getLocalAuthenticatorByName(authenticator.getAuthenticator());
if (localAuthConfig != null) {
return localAuthConfig.getDefinedByType();
}
} else {
FederatedAuthenticatorConfig federatedAuthConfig = ApplicationAuthenticatorService.getInstance()
.getFederatedAuthenticatorByName(authenticator.getAuthenticator());
if (federatedAuthConfig != null) {
return federatedAuthConfig.getDefinedByType();
}
}

return DefinedByType.USER;
}

private int getSubjectStepId(Integer subjectStepId, int numSteps) {

return subjectStepId != null && subjectStepId <= numSteps ? subjectStepId : 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -521,11 +521,10 @@ private void addIdp(IdentityProvider identityProvider, List<Authenticator> authe
authenticator and should always be classified as a SYSTEM type. Otherwise, it can be classified as either
SYSTEM or USER, depending on the 'definedBy' type of the federated authenticator. */
if (identityProvider.getFederatedAuthenticatorConfigs().length == 1) {
FederatedAuthenticatorConfig federatedAuthenticatorConfig = identityProvider
.getFederatedAuthenticatorConfig(identityProvider.getFederatedAuthenticatorConfigs()[0].getName());
DefinedByType definedByType = federatedAuthenticatorConfig.getDefinedByType();
authenticator.definedBy(Authenticator.DefinedByEnum.valueOf(definedByType.toString()));
authenticator.setTags(Arrays.asList(federatedAuthenticatorConfig.getTags()));
FederatedAuthenticatorConfig federatedAuthConfig = resolveFederatedAuthenticatorConfig(identityProvider);
authenticator.definedBy(Authenticator.DefinedByEnum.valueOf(
String.valueOf(federatedAuthConfig.getDefinedByType())));
authenticator.setTags(Arrays.asList(federatedAuthConfig.getTags()));
} else {
authenticator.definedBy(Authenticator.DefinedByEnum.SYSTEM);
}
Expand All @@ -538,6 +537,20 @@ private void addIdp(IdentityProvider identityProvider, List<Authenticator> authe
String.format("/v1/identity-providers/%s", identityProvider.getResourceId())).toString());
}

private FederatedAuthenticatorConfig resolveFederatedAuthenticatorConfig(IdentityProvider identityProvider) {

try {
return idpManager.getFederatedAuthenticatorByName(
identityProvider.getFederatedAuthenticatorConfigs()[0].getName(),
ContextLoader.getTenantDomainFromContext());
} catch (IdentityProviderManagementException e) {
throw handleException(Response.Status.INTERNAL_SERVER_ERROR, Constants.ErrorMessage
.ERROR_CODE_ERROR_LISTING_AUTHENTICATORS, String.format("An error occurred whiling " +
"retrieving federated authenticator configuration for identity provider: %s",
identityProvider.getIdentityProviderName()));
}
}

/**
* Adds the local authenticator to the list of authenticators.
*
Expand Down

0 comments on commit 87a79e9

Please sign in to comment.