Skip to content

Commit 418fccd

Browse files
Limit the federated IDP authenticator property update based on the configured max limit
1 parent f5bb237 commit 418fccd

File tree

2 files changed

+51
-0
lines changed
  • components/org.wso2.carbon.identity.api.server.idp
    • org.wso2.carbon.identity.api.server.idp.common/src/main/java/org/wso2/carbon/identity/api/server/idp/common
    • org.wso2.carbon.identity.api.server.idp.v1/src/main/java/org/wso2/carbon/identity/api/server/idp/v1/core

2 files changed

+51
-0
lines changed

components/org.wso2.carbon.identity.api.server.idp/org.wso2.carbon.identity.api.server.idp.common/src/main/java/org/wso2/carbon/identity/api/server/idp/common/Constants.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ public class Constants {
9595
public static final String TENANT_DOMAIN_KEY = "tenantDomain";
9696
public static final String SEARCH_VALUE_AUTHENTICATION_PROVISIONING = SERV_PROVISIONING + "," + SERV_AUTHENTICATION;
9797

98+
public static final String MAX_FEDERATED_AUTHENTICATORS_PROPERTY_LIMIT =
99+
"MaxFederatedAuthenticatorPropertiesPerIdP";
100+
98101
/**
99102
* Enum for error messages.
100103
*/
@@ -161,6 +164,10 @@ public enum ErrorMessage {
161164
ERROR_COED_MULTIPLE_USER_DEFINED_AUTHENTICATORS_FOUND("60044", "Invalid federated " +
162165
"authenticators combination.", "Allow to have only one user defined " +
163166
"federated authenticator and no system authenticators."),
167+
ERROR_CODE_MAX_FEDERATED_AUTHENTICATOR_PROPERTY_EXCEEDED("60045",
168+
"Maximum number of authenticator properties exceeded.",
169+
"Maximum number of allowed properties for a federated authenticator have been exceeded. " +
170+
"Max allowed: %s."),
164171

165172
// Server Error starting from 650xx.
166173
ERROR_CODE_ERROR_ADDING_IDP("65002",

components/org.wso2.carbon.identity.api.server.idp/org.wso2.carbon.identity.api.server.idp.v1/src/main/java/org/wso2/carbon/identity/api/server/idp/v1/core/ServerIdpManagementService.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ public IdentityProviderResponse addIDP(IdentityProviderPOSTRequest identityProvi
264264
IdentityProvider identityProvider;
265265
try {
266266
validateSystemReservedIDP(identityProviderPOSTRequest.getName());
267+
validateFederatedAuthenticatorsPropertyLimit(identityProviderPOSTRequest.getFederatedAuthenticators());
267268
identityProvider = identityProviderManager.addIdPWithResourceId(createIDP(identityProviderPOSTRequest),
268269
ContextLoader.getTenantDomainFromContext());
269270
} catch (IdentityProviderManagementException e) {
@@ -747,6 +748,10 @@ public FederatedAuthenticator updateFederatedAuthenticator(String idpId, String
747748
// IDP object.
748749
IdentityProvider idpToUpdate = createIdPClone(idp);
749750

751+
if (authenticator.getProperties() != null) {
752+
validateAuthenticatorPropertyLimit(authenticator.getProperties().size());
753+
}
754+
750755
checkAuthenticatorExistence(federatedAuthenticatorId, tenantDomain);
751756
// Create new FederatedAuthenticatorConfig to store the federated authenticator information.
752757
FederatedAuthenticatorConfig authConfig = updateFederatedAuthenticatorConfig(federatedAuthenticatorId,
@@ -3762,4 +3767,43 @@ private enum IdpOperation {
37623767
CREATION,
37633768
UPDATE
37643769
}
3770+
3771+
private void validateFederatedAuthenticatorsPropertyLimit(
3772+
FederatedAuthenticatorRequest federatedAuthenticatorRequest) {
3773+
3774+
if (federatedAuthenticatorRequest == null || federatedAuthenticatorRequest.getAuthenticators() == null) {
3775+
return;
3776+
}
3777+
3778+
for (FederatedAuthenticator authenticator : federatedAuthenticatorRequest.getAuthenticators()) {
3779+
if (authenticator.getProperties() != null) {
3780+
validateAuthenticatorPropertyLimit(authenticator.getProperties().size());
3781+
}
3782+
}
3783+
}
3784+
3785+
private void validateAuthenticatorPropertyLimit(int propertyCount) {
3786+
3787+
int maxFederatedAuthenticatorPropertyLimit;
3788+
try {
3789+
maxFederatedAuthenticatorPropertyLimit = Integer.parseInt(IdentityUtil
3790+
.getProperty(Constants.MAX_FEDERATED_AUTHENTICATORS_PROPERTY_LIMIT));
3791+
} catch (NumberFormatException e) {
3792+
if (log.isDebugEnabled()) {
3793+
log.debug("The system property: " + Constants.MAX_FEDERATED_AUTHENTICATORS_PROPERTY_LIMIT +
3794+
" is not a valid integer.");
3795+
}
3796+
return;
3797+
}
3798+
3799+
if (propertyCount > maxFederatedAuthenticatorPropertyLimit) {
3800+
if (log.isDebugEnabled()) {
3801+
log.debug("The number of properties provided for the federated authenticator exceeds the maximum " +
3802+
"allowed limit of: " + maxFederatedAuthenticatorPropertyLimit);
3803+
}
3804+
throw handleException(Response.Status.BAD_REQUEST,
3805+
Constants.ErrorMessage.ERROR_CODE_MAX_FEDERATED_AUTHENTICATOR_PROPERTY_EXCEEDED,
3806+
String.valueOf(maxFederatedAuthenticatorPropertyLimit));
3807+
}
3808+
}
37653809
}

0 commit comments

Comments
 (0)