Skip to content

Commit

Permalink
Add service layer support to manage the user defined local authentica…
Browse files Browse the repository at this point in the history
…tors
  • Loading branch information
Thisara-Welmilla committed Dec 2, 2024
1 parent 20e9f48 commit 69baa2f
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@
org.apache.commons.logging; version="${import.package.version.commons.logging}",
org.apache.commons.lang; version="${commons-lang.wso2.osgi.version.range}",
org.apache.commons.collections; version="${commons-collections.wso2.osgi.version.range}",
org.wso2.carbon.database.utils.jdbc; version="${org.wso2.carbon.database.utils.version.range}",
org.wso2.carbon.database.utils.jdbc.exceptions; version="${org.wso2.carbon.database.utils.version.range}",

org.apache.axis2.*; version="${axis2.osgi.version.range}",

Expand All @@ -107,6 +109,8 @@
org.wso2.carbon.identity.core.cache; version="${carbon.identity.package.import.version.range}",
org.wso2.carbon.identity.central.log.mgt.*; version="${carbon.identity.package.import.version.range}",
org.wso2.carbon.identity.action.management.*; version="${carbon.identity.package.import.version.range}",
org.osgi.framework; version="${osgi.framework.imp.pkg.version.range}",
org.osgi.service.component; version="${osgi.service.component.imp.pkg.version.range}",

com.fasterxml.jackson.annotation; version="${com.fasterxml.jackson.annotation.version.range}"
</Import-Package>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,23 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.identity.application.common.constant.AuthenticatorMgtErrorConstants.ErrorMessages;
import org.wso2.carbon.identity.application.common.dao.impl.AuthenticatorManagementDAOImpl;
import org.wso2.carbon.identity.application.common.dao.impl.CacheBackedAuthenticatorMgtDAO;
import org.wso2.carbon.identity.application.common.exception.AuthenticatorMgtClientException;
import org.wso2.carbon.identity.application.common.exception.AuthenticatorMgtException;
import org.wso2.carbon.identity.application.common.model.FederatedAuthenticatorConfig;
import org.wso2.carbon.identity.application.common.model.LocalAuthenticatorConfig;
import org.wso2.carbon.identity.application.common.model.RequestPathAuthenticatorConfig;
import org.wso2.carbon.identity.application.common.model.UserDefinedLocalAuthenticatorConfig;
import org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.AuthenticatorMgtError;
import org.wso2.carbon.identity.application.common.util.UserDefinedLocalAuthenticatorValidator;
import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants.DefinedByType;
import org.wso2.carbon.identity.core.util.IdentityTenantUtil;

import java.util.ArrayList;
import java.util.List;

import static org.wso2.carbon.identity.application.common.constant.AuthenticatorMgtErrorConstants.ErrorMessages.ERROR_CODE_INVALID_DEFINED_BY_AUTH_PROVIDED;
import static org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.buildClientException;
import static org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.buildRuntimeServerException;

/**
* Application authenticator service.
Expand Down Expand Up @@ -150,8 +150,8 @@ public void addLocalAuthenticator(LocalAuthenticatorConfig authenticator) {

if (authenticator != null) {
if (authenticator.getDefinedByType() != DefinedByType.SYSTEM) {
throw new AuthenticatorMgtServerRuntimeException(
ERROR_CODE_INVALID_DEFINED_BY_AUTH_PROVIDED.getMessage());
throw buildRuntimeServerException(
AuthenticatorMgtError.ERROR_CODE_INVALID_DEFINED_BY_AUTH_PROVIDED, null);
}
localAuthenticators.add(authenticator);
}
Expand Down Expand Up @@ -201,9 +201,8 @@ public UserDefinedLocalAuthenticatorConfig addUserDefinedLocalAuthenticator(

LocalAuthenticatorConfig config = getLocalAuthenticatorByName(authenticatorConfig.getName(), tenantDomain);
if (config != null) {
ErrorMessages error = ErrorMessages.ERROR_AUTHENTICATOR_ALREADY_EXIST;
throw new AuthenticatorMgtClientException(error.getCode(), error.getMessage(),
String.format(error.getDescription(), authenticatorConfig.getName()));
throw buildClientException(AuthenticatorMgtError.ERROR_AUTHENTICATOR_ALREADY_EXIST,
authenticatorConfig.getName());
}
authenticatorValidator.validateAuthenticatorName(authenticatorConfig.getName());
authenticatorValidator.validateForBlank("Display name", authenticatorConfig.getDisplayName());
Expand Down Expand Up @@ -281,9 +280,7 @@ private UserDefinedLocalAuthenticatorConfig resolveExistingAuthenticator(String
getUserDefinedLocalAuthenticator(authenticatorName, IdentityTenantUtil.getTenantId(tenantDomain));

if (existingAuthenticatorConfig == null) {
ErrorMessages error = ErrorMessages.ERROR_NOT_FOUND_AUTHENTICATOR;
throw new AuthenticatorMgtClientException(error.getCode(), error.getMessage(),
String.format(error.getDescription(), authenticatorName));
throw buildClientException(AuthenticatorMgtError.ERROR_NOT_FOUND_AUTHENTICATOR, authenticatorName);
}

return existingAuthenticatorConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,14 @@
*/
public class AuthenticatorMgtServerException extends AuthenticatorMgtException {

public AuthenticatorMgtServerException(String errorCode, String message, Throwable cause) {
public AuthenticatorMgtServerException(String errorCode, String message, String description) {

super(message, errorCode, cause);
super(message, errorCode, description);
}

public AuthenticatorMgtServerException(String errorCode, String message, String description,
Throwable cause) {

super(message, description, errorCode, cause);
}

public AuthenticatorMgtServerException(String message) {

super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class AuthenticatorMgtServerRuntimeException extends RuntimeException {
private final String errorCode;
private final String description;

public AuthenticatorMgtServerRuntimeException(String message, String description, String errorCode) {
public AuthenticatorMgtServerRuntimeException(String errorCode, String message, String description) {

super(message);
this.errorCode = errorCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,68 @@
* under the License.
*/

package org.wso2.carbon.identity.application.common.constant;
package org.wso2.carbon.identity.application.common.util;

import org.apache.commons.lang.ArrayUtils;
import org.wso2.carbon.identity.application.common.exception.AuthenticatorMgtClientException;
import org.wso2.carbon.identity.application.common.exception.AuthenticatorMgtServerException;
import org.wso2.carbon.identity.application.common.exception.AuthenticatorMgtServerRuntimeException;

/**
* Constants for authenticator configuration management service.
* Utility class for building authenticator management exceptions.
*/
public class AuthenticatorMgtErrorConstants {
public class AuthenticatorMgtExceptionBuilder {

private AuthenticatorMgtExceptionBuilder() {

}

public static AuthenticatorMgtClientException buildClientException(AuthenticatorMgtError error, String... data) {

String description = error.getDescription();
if (ArrayUtils.isNotEmpty(data)) {
description = String.format(description, data);
}

return new AuthenticatorMgtClientException(error.getCode(), error.getMessage(), description);
}

public static AuthenticatorMgtServerException buildServerException(AuthenticatorMgtError error, String... data) {

String description = error.getDescription();
if (ArrayUtils.isNotEmpty(data)) {
description = String.format(description, data);
}

return new AuthenticatorMgtServerException(error.getCode(), error.getMessage(), description);
}

public static AuthenticatorMgtServerException buildServerException(AuthenticatorMgtError error, Throwable e,
String... data) {

String description = error.getDescription();
if (ArrayUtils.isNotEmpty(data)) {
description = String.format(description, data);
}

return new AuthenticatorMgtServerException(error.getCode(), error.getMessage(), description, e);
}

public static AuthenticatorMgtServerRuntimeException buildRuntimeServerException(AuthenticatorMgtError error,
Throwable e, String... data) {

String description = error.getDescription();
if (ArrayUtils.isNotEmpty(data)) {
description = String.format(description, data);
}

return new AuthenticatorMgtServerRuntimeException(error.getCode(), error.getMessage(), description);
}

/**
* Error messages.
* Enum class to represent the rule metadata errors.
*/
public enum ErrorMessages {
public enum AuthenticatorMgtError {

// Client errors.
ERROR_NOT_FOUND_AUTHENTICATOR("60001", "No Authenticator found.",
Expand All @@ -52,13 +103,17 @@ public enum ErrorMessages {
ERROR_CODE_ENDPOINT_CONFIG_MGT("65005", "Error while managing endpoint configurations.",
"Error while managing endpoint configurations for the user defined local authenticator %s."),
ERROR_CODE_INVALID_DEFINED_BY_AUTH_PROVIDED("65006", "Error while adding local authenticator.",
"Only system defined authenticators are allowed to add via this method.");
"Only system defined authenticators are allowed to add via this method."),
ERROR_CODE_NO_AUTHENTICATOR_FOUND("65007", "No authenticator found.",
"No authenticator found by given authenticator name: %s."),
ERROR_CODE_NO_ACTION_ID_FOUND("65008", "No action id found.",
"No action id found for the authenticator: %s.");

private final String code;
private final String message;
private final String description;

ErrorMessages(String code, String message, String description) {
AuthenticatorMgtError(String code, String message, String description) {

this.code = code;
this.message = message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@
import org.wso2.carbon.identity.application.common.model.Property;
import org.wso2.carbon.identity.application.common.model.UserDefinedAuthenticatorEndpointConfig;
import org.wso2.carbon.identity.application.common.model.UserDefinedLocalAuthenticatorConfig;
import org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.AuthenticatorMgtError;
import org.wso2.carbon.identity.core.util.IdentityTenantUtil;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import static org.wso2.carbon.identity.application.common.constant.AuthenticatorMgtErrorConstants
.ErrorMessages.ERROR_CODE_ENDPOINT_CONFIG_MGT;
import static org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.buildServerException;

/**
* This class responsible for managing authenticator endpoint configurations for the user defined Local
Expand Down Expand Up @@ -63,8 +63,7 @@ public void addEndpointConfigurations(UserDefinedLocalAuthenticatorConfig config
endpointProperty.setValue(action.getId());
config.setProperties(new Property[]{endpointProperty});
} catch (ActionMgtException e) {
throw new AuthenticatorMgtServerException(ERROR_CODE_ENDPOINT_CONFIG_MGT.getCode(),
"Error occurred while adding associated action for the authenticator:" + config.getName(), e);
throw buildServerException(AuthenticatorMgtError.ERROR_CODE_ENDPOINT_CONFIG_MGT, e, config.getName());
}
}

Expand All @@ -89,9 +88,8 @@ public void updateEndpointConfigurations(UserDefinedLocalAuthenticatorConfig new
IdentityTenantUtil.getTenantDomain(tenantId));
newConfig.setProperties(oldConfig.getProperties());
} catch (ActionMgtException e) {
throw new AuthenticatorMgtServerException(ERROR_CODE_ENDPOINT_CONFIG_MGT.getCode(),
String.format("Error occurred while updating associated action with id %s for the authenticator %s",
actionId, oldConfig.getName()), e);
throw buildServerException(AuthenticatorMgtError.ERROR_CODE_ENDPOINT_CONFIG_MGT, e,
actionId, oldConfig.getName());
}
}

Expand All @@ -106,6 +104,9 @@ public void updateEndpointConfigurations(UserDefinedLocalAuthenticatorConfig new
public UserDefinedLocalAuthenticatorConfig resolveEndpointConfigurations(UserDefinedLocalAuthenticatorConfig config,
int tenantId) throws AuthenticatorMgtServerException {

if (config == null) {
return null;
}
String actionId = getActionIdFromProperty(config.getProperties(), config.getName());
try {
Action action = ApplicationCommonServiceDataHolder.getInstance().getActionManagementService()
Expand All @@ -116,9 +117,8 @@ public UserDefinedLocalAuthenticatorConfig resolveEndpointConfigurations(UserDef
config.setEndpointConfig(buildUserDefinedAuthenticatorEndpointConfig(action.getEndpoint()));
return config;
} catch (ActionMgtException e) {
throw new AuthenticatorMgtServerException(ERROR_CODE_ENDPOINT_CONFIG_MGT.getCode(),
String.format("Error occurred retrieving associated action with id %s for the authenticator %s",
actionId, config.getName()), e);
throw buildServerException(AuthenticatorMgtError.ERROR_CODE_ENDPOINT_CONFIG_MGT, e,
actionId, config.getName());
}
}

Expand Down Expand Up @@ -154,9 +154,8 @@ public void deleteEndpointConfigurations(UserDefinedLocalAuthenticatorConfig con
actionId,
IdentityTenantUtil.getTenantDomain(tenantId));
} catch (ActionMgtException e) {
throw new AuthenticatorMgtServerException(ERROR_CODE_ENDPOINT_CONFIG_MGT.getCode(),
String.format("Error occurred while deleting associated action with id %s for the authenticator %s",
actionId, config.getName()), e);
throw buildServerException(AuthenticatorMgtError.ERROR_CODE_ENDPOINT_CONFIG_MGT, e,
actionId, config.getName());
}
}

Expand Down Expand Up @@ -186,8 +185,7 @@ private String getActionIdFromProperty(Property[] properties, String authenticat
.filter(property -> ACTION_ID_PROPERTY.equals(property.getName()))
.map(Property::getValue)
.findFirst()
.orElseThrow(() -> new AuthenticatorMgtServerException(
"No action Id was found in the properties of the authenticator configurations for" +
" the authenticator: " + authenticatorName));
.orElseThrow(() -> buildServerException(AuthenticatorMgtError.ERROR_CODE_NO_ACTION_ID_FOUND,
authenticatorName));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
package org.wso2.carbon.identity.application.common.util;

import org.apache.commons.lang.StringUtils;
import org.wso2.carbon.identity.application.common.constant.AuthenticatorMgtErrorConstants.ErrorMessages;
import org.wso2.carbon.identity.application.common.exception.AuthenticatorMgtClientException;
import org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.AuthenticatorMgtError;
import org.wso2.carbon.identity.base.AuthenticatorPropertyConstants.DefinedByType;

import java.util.regex.Pattern;

import static org.wso2.carbon.identity.application.common.util.AuthenticatorMgtExceptionBuilder.buildClientException;

/**
* User Defined Local Authenticator Validator class.
*/
Expand All @@ -43,9 +45,7 @@ public class UserDefinedLocalAuthenticatorValidator {
public void validateForBlank(String fieldName, String fieldValue) throws AuthenticatorMgtClientException {

if (StringUtils.isBlank(fieldValue)) {
ErrorMessages error = ErrorMessages.ERROR_BLANK_FIELD_VALUE;
throw new AuthenticatorMgtClientException(error.getCode(), error.getMessage(),
String.format(error.getDescription(), fieldName));
throw buildClientException(AuthenticatorMgtError.ERROR_BLANK_FIELD_VALUE, fieldName);
}
}

Expand All @@ -59,9 +59,8 @@ public void validateAuthenticatorName(String name) throws AuthenticatorMgtClient

boolean isValidName = authenticatorNameRegexPattern.matcher(name).matches();
if (!isValidName) {
ErrorMessages error = ErrorMessages.ERROR_INVALID_AUTHENTICATOR_NAME;
throw new AuthenticatorMgtClientException(error.getCode(), error.getMessage(),
String.format(error.getDescription(), name, AUTHENTICATOR_NAME_REGEX));
throw buildClientException(AuthenticatorMgtError.ERROR_INVALID_AUTHENTICATOR_NAME,
name, AUTHENTICATOR_NAME_REGEX);
}
}

Expand All @@ -75,8 +74,7 @@ public void validateDefinedByType(DefinedByType definedByType)
throws AuthenticatorMgtClientException {

if (definedByType != DefinedByType.USER) {
ErrorMessages error = ErrorMessages.ERROR_OP_ON_SYSTEM_AUTHENTICATOR;
throw new AuthenticatorMgtClientException(error.getCode(), error.getMessage(), error.getDescription());
throw buildClientException(AuthenticatorMgtError.ERROR_OP_ON_SYSTEM_AUTHENTICATOR);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,18 @@
description="Delete actions"/>
</Scopes>
</APIResource>
<APIResource name="Custom Local Authenticator Management API" identifier="/api/server/v1/authenticators/custom"
requiresAuthorization="true"
description="API representation of the Custom Local Authenticator Management API" type="TENANT">
<Scopes>
<Scope displayName="Create Custom Local Authenticator" name="internal_custom_authenticator_create"
description="Create new custom local authenticator"/>
<Scope displayName="Update Custom Local Authenticator" name="internal_custom_authenticator_update"
description="Update custom local authenticator"/>
<Scope displayName="Delete Custom Local Authenticator" name="internal_custom_authenticator_delete"
description="Delete custom local authenticator"/>
</Scopes>
</APIResource>
<APIResource name="Branding Preference Management API"
identifier="/api/server/v1/branding-preference" requiresAuthorization="true"
description="API representation of the Branding Preference Management API" type="TENANT">
Expand Down
Loading

0 comments on commit 69baa2f

Please sign in to comment.