Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public void handleEvent(Event event) throws IdentityEventException {
}

boolean supportMultipleMobileNumbers =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Comment on lines 122 to +123

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 1

Suggested change
boolean supportMultipleMobileNumbers =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
boolean supportMultipleMobileNumbers =
Utils.isMultiMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
if (log.isDebugEnabled()) {
log.debug("Multiple mobile numbers support is " + (supportMultipleMobileNumbers ? "enabled" : "disabled") + " for user: " + user.getLoggableUserId());
}


boolean enable = isMobileVerificationOnUpdateEnabled(user.getTenantDomain());

Expand Down Expand Up @@ -342,7 +342,7 @@ private void preSetUserClaimOnMobileNumberUpdate(Map<String, String> claims, Use
}

boolean supportMultipleMobileNumbers =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Comment on lines 344 to +345

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 2

Suggested change
boolean supportMultipleMobileNumbers =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
boolean supportMultipleMobileNumbers =
Utils.isMultiMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
if (log.isDebugEnabled()) {
log.debug("Checking multiple mobile numbers support for claim update. Support enabled: " + supportMultipleMobileNumbers);
}


// Update multiple mobile numbers only if they’re in the claims map.
// This avoids issues with updating the primary mobile number due to user store limitations on multiple
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ public void handleEvent(Event event) throws IdentityEventException {
}

boolean supportMultipleEmails =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiEmailAddressesPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Comment on lines 124 to +125

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 3

Suggested change
boolean supportMultipleEmails =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiEmailAddressesPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
boolean supportMultipleEmails =
Utils.isMultiEmailAddressesPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
if (log.isDebugEnabled()) {
log.debug("Multiple email addresses support: " + supportMultipleEmails + " for user: " + user.getLoggableUserId());
}


boolean enable = false;

Expand Down Expand Up @@ -552,7 +552,7 @@ private void preSetUserClaimsOnEmailUpdate(Map<String, String> claims, UserStore
}

boolean supportMultipleEmails =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiEmailAddressesPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Comment on lines 554 to +555

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 4

Suggested change
boolean supportMultipleEmails =
Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
Utils.isMultiEmailAddressesPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
boolean supportMultipleEmails =
Utils.isMultiEmailAddressesPerUserEnabled(user.getTenantDomain(), user.getUserStoreDomain());
if (log.isDebugEnabled()) {
log.debug("Checking multiple email support for email update. Support enabled: " + supportMultipleEmails);
}

// Update multiple email address related claims only if they’re in the claims map.
// This avoids issues with updating the primary email address due to user store limitations on multiple
// email addresses.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,10 @@ public static String getSignUpConfigs(String key, String tenantDomain) throws Id
Property[] connectorConfigs;
IdentityGovernanceService identityGovernanceService = IdentityRecoveryServiceDataHolder.getInstance()
.getIdentityGovernanceService();
connectorConfigs = identityGovernanceService.getConfiguration(new String[]{key,}, tenantDomain);
connectorConfigs = identityGovernanceService.getConfiguration(new String[]{key}, tenantDomain);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 5

Suggested change
connectorConfigs = identityGovernanceService.getConfiguration(new String[]{key}, tenantDomain);
connectorConfigs = identityGovernanceService.getConfiguration(new String[]{key}, tenantDomain);
if (log.isDebugEnabled()) {
log.debug("Retrieved sign up configuration for key: " + key + " in tenant: " + tenantDomain);
}

if (connectorConfigs == null || connectorConfigs.length == 0 || connectorConfigs[0] == null) {
return null;
}
return connectorConfigs[0].getValue();
} catch (IdentityGovernanceException e) {
throw Utils.handleServerException(
Expand All @@ -708,7 +711,10 @@ public static String getConnectorConfig(String key, String tenantDomain) throws
Property[] connectorConfigs;
IdentityGovernanceService identityGovernanceService = IdentityRecoveryServiceDataHolder.getInstance()
.getIdentityGovernanceService();
connectorConfigs = identityGovernanceService.getConfiguration(new String[]{key,}, tenantDomain);
connectorConfigs = identityGovernanceService.getConfiguration(new String[]{key}, tenantDomain);
if (connectorConfigs == null || connectorConfigs.length == 0 || connectorConfigs[0] == null) {
return null;
}
return connectorConfigs[0].getValue();
} catch (IdentityGovernanceException e) {
throw new IdentityEventException("Error while getting connector configurations", e);
Expand Down Expand Up @@ -1524,8 +1530,64 @@ public static boolean isUseVerifyClaimEnabled() {
*/
public static boolean isMultiEmailsAndMobileNumbersPerUserEnabled(String tenantDomain, String userStoreDomain) {

if (!Boolean.parseBoolean(IdentityUtil.getProperty(
IdentityRecoveryConstants.ConnectorConfig.SUPPORT_MULTI_EMAILS_AND_MOBILE_NUMBERS_PER_USER))) {
return isMultiEmailAddressesPerUserEnabled(tenantDomain, userStoreDomain)
&& isMultiMobileNumbersPerUserEnabled(tenantDomain, userStoreDomain);
}

/**
* Check if multiple email addresses are supported for the given tenant and user store.
*
* @param tenantDomain Tenant domain.
* @param userStoreDomain User store domain.
* @return True if multiple email addresses are supported.
*/
public static boolean isMultiEmailAddressesPerUserEnabled(String tenantDomain, String userStoreDomain) {

if (!isMultiEmailOrMobileConfigEnabled()) {
return false;
}

if (StringUtils.isBlank(tenantDomain) || StringUtils.isBlank(userStoreDomain)) {
return false;
}

try {
List<LocalClaim> localClaims =
IdentityRecoveryServiceDataHolder.getInstance().getClaimMetadataManagementService()
.getLocalClaims(tenantDomain);

List<String> requiredEmailClaims = new ArrayList<>();
requiredEmailClaims.add(IdentityRecoveryConstants.EMAIL_ADDRESSES_CLAIM);

boolean isEmailVerificationOnUpdateEnabled;
try {
isEmailVerificationOnUpdateEnabled = isEmailVerificationOnUpdateEnabled(tenantDomain);
} catch (IdentityEventException e) {
log.error("Error while retrieving email verification on update config.", e);
Comment on lines +1564 to +1566

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Log Improvement Suggestion No: 6

Suggested change
isEmailVerificationOnUpdateEnabled = isEmailVerificationOnUpdateEnabled(tenantDomain);
} catch (IdentityEventException e) {
log.error("Error while retrieving email verification on update config.", e);
} catch (IdentityEventException e) {
log.error("Error while retrieving email verification on update config for tenant: " + tenantDomain);
return false;

return false;
}

if (isEmailVerificationOnUpdateEnabled) {
requiredEmailClaims.add(IdentityRecoveryConstants.VERIFIED_EMAIL_ADDRESSES_CLAIM);
}

return areClaimsSupportedForUserStore(localClaims, requiredEmailClaims, userStoreDomain);
} catch (ClaimMetadataException e) {
log.error("Error while retrieving multiple emails config.", e);
return false;
}
}

/**
* Check if multiple mobile numbers are supported for the given tenant and user store.
*
* @param tenantDomain Tenant domain.
* @param userStoreDomain User store domain.
* @return True if multiple mobile numbers are supported.
*/
public static boolean isMultiMobileNumbersPerUserEnabled(String tenantDomain, String userStoreDomain) {

if (!isMultiEmailOrMobileConfigEnabled()) {
return false;
}

Expand All @@ -1538,21 +1600,55 @@ public static boolean isMultiEmailsAndMobileNumbersPerUserEnabled(String tenantD
IdentityRecoveryServiceDataHolder.getInstance().getClaimMetadataManagementService()
.getLocalClaims(tenantDomain);

List<String> requiredClaims = Arrays.asList(
IdentityRecoveryConstants.VERIFIED_MOBILE_NUMBERS_CLAIM,
IdentityRecoveryConstants.MOBILE_NUMBERS_CLAIM,
IdentityRecoveryConstants.EMAIL_ADDRESSES_CLAIM,
IdentityRecoveryConstants.VERIFIED_EMAIL_ADDRESSES_CLAIM);
List<String> requiredMobileClaims = new ArrayList<>();
requiredMobileClaims.add(IdentityRecoveryConstants.MOBILE_NUMBERS_CLAIM);

boolean isMobileVerificationOnUpdateEnabled;
try {
isMobileVerificationOnUpdateEnabled = isMobileVerificationOnUpdateEnabled(tenantDomain);
} catch (IdentityEventException e) {
log.error("Error while retrieving mobile verification on update config.", e);
return false;
}

// Check if all required claims are valid for the user store.
return requiredClaims.stream().allMatch(claimUri ->
isClaimSupportedForUserStore(localClaims, claimUri, userStoreDomain));
if (isMobileVerificationOnUpdateEnabled) {
requiredMobileClaims.add(IdentityRecoveryConstants.VERIFIED_MOBILE_NUMBERS_CLAIM);
}

return areClaimsSupportedForUserStore(localClaims, requiredMobileClaims, userStoreDomain);
} catch (ClaimMetadataException e) {
log.error("Error while retrieving multiple emails and mobiles config.", e);
log.error("Error while retrieving multiple mobile numbers config.", e);
return false;
}
}

private static boolean isMultiEmailOrMobileConfigEnabled() {

return Boolean.parseBoolean(IdentityUtil.getProperty(
IdentityRecoveryConstants.ConnectorConfig.SUPPORT_MULTI_EMAILS_AND_MOBILE_NUMBERS_PER_USER));
}

private static boolean isEmailVerificationOnUpdateEnabled(String tenantDomain) throws IdentityEventException {

String configValue = Utils.getConnectorConfig(
IdentityRecoveryConstants.ConnectorConfig.ENABLE_EMAIL_VERIFICATION_ON_UPDATE, tenantDomain);
return Boolean.parseBoolean(configValue);
}

private static boolean isMobileVerificationOnUpdateEnabled(String tenantDomain) throws IdentityEventException {

String configValue = Utils.getConnectorConfig(
IdentityRecoveryConstants.ConnectorConfig.ENABLE_MOBILE_NUM_VERIFICATION_ON_UPDATE, tenantDomain);
return Boolean.parseBoolean(configValue);
}

private static boolean areClaimsSupportedForUserStore(List<LocalClaim> localClaims, List<String> claimUris,
String userStoreDomain) {

return claimUris.stream().allMatch(claimUri ->
isClaimSupportedForUserStore(localClaims, claimUri, userStoreDomain));
}

/**
* Check if a claim is supported and not excluded for a specific user store.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,7 @@ private static Map<String, String> getUserClaimsFromEvent(Event event2) {
private void mockUtilMethods(boolean mobileVerificationEnabled, boolean multiAttributeEnabled,
boolean useVerifyClaimEnabled) {

mockedUtils.when(() -> Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(anyString(), anyString()))
mockedUtils.when(() -> Utils.isMultiMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(multiAttributeEnabled);
mockedUtils.when(Utils::isUseVerifyClaimEnabled).thenReturn(useVerifyClaimEnabled);
mockedUtils.when(() -> Utils.getConnectorConfig(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,7 @@ private void mockPrimaryEmailVerificationStatus(boolean isVerified) {
private void mockUtilMethods(boolean emailVerificationEnabled, boolean multiAttributeEnabled,
boolean userVerifyClaimEnabled, boolean notificationOnEmailUpdate) {

mockedUtils.when(() -> Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(anyString(), anyString()))
mockedUtils.when(() -> Utils.isMultiEmailAddressesPerUserEnabled(anyString(), anyString()))
.thenReturn(multiAttributeEnabled);
mockedUtils.when(Utils::isUseVerifyClaimEnabled).thenReturn(userVerifyClaimEnabled);
mockGetConnectorConfig(IdentityRecoveryConstants.ConnectorConfig.ENABLE_EMAIL_VERIFICATION_ON_UPDATE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1034,6 +1034,10 @@ public void testGetConfirmedSelfRegisteredUserMobileVerificationOnUpdate()
try (MockedStatic<Utils> mockedUtils = mockStatic(Utils.class)) {
mockedUtils.when(() -> Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.isMultiEmailAddressesPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.isMultiMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.getConnectorConfig(
eq(IdentityRecoveryConstants.ConnectorConfig.ENABLE_MOBILE_VERIFICATION_BY_PRIVILEGED_USER),
anyString()))
Expand Down Expand Up @@ -1064,6 +1068,10 @@ public void testGetConfirmedSelfRegisteredUserMobileVerificationOnUpdate()
try (MockedStatic<Utils> mockedUtils = mockStatic(Utils.class)) {
mockedUtils.when(() -> Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.isMultiEmailAddressesPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.isMultiMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.getConnectorConfig(
eq(IdentityRecoveryConstants.ConnectorConfig.ENABLE_MOBILE_VERIFICATION_BY_PRIVILEGED_USER),
anyString()))
Expand All @@ -1087,6 +1095,10 @@ public void testGetConfirmedSelfRegisteredUserMobileVerificationOnUpdate()
try (MockedStatic<Utils> mockedUtils = mockStatic(Utils.class)) {
mockedUtils.when(() -> Utils.isMultiEmailsAndMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.isMultiEmailAddressesPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.isMultiMobileNumbersPerUserEnabled(anyString(), anyString()))
.thenReturn(true);
mockedUtils.when(() -> Utils.getConnectorConfig(
eq(IdentityRecoveryConstants.ConnectorConfig.ENABLE_MOBILE_VERIFICATION_BY_PRIVILEGED_USER),
anyString()))
Expand Down Expand Up @@ -2034,7 +2046,24 @@ private void mockMultiAttributeEnabled(Boolean isEnabled) throws ClaimMetadataEx
mockedIdentityUtil.when(() -> IdentityUtil.getProperty(
eq(IdentityRecoveryConstants.ConnectorConfig.SUPPORT_MULTI_EMAILS_AND_MOBILE_NUMBERS_PER_USER)))
.thenReturn(isEnabled.toString());
if (!isEnabled) return;

org.wso2.carbon.identity.application.common.model.Property emailVerificationOnUpdate =
new org.wso2.carbon.identity.application.common.model.Property();
emailVerificationOnUpdate.setName(IdentityRecoveryConstants.ConnectorConfig.ENABLE_EMAIL_VERIFICATION_ON_UPDATE);
emailVerificationOnUpdate.setValue(Boolean.toString(isEnabled));
try {
when(identityGovernanceService.getConfiguration(
eq(new String[]{IdentityRecoveryConstants.ConnectorConfig.ENABLE_EMAIL_VERIFICATION_ON_UPDATE}),
eq(TEST_TENANT_DOMAIN_NAME))).thenReturn(
new org.wso2.carbon.identity.application.common.model.Property[]{emailVerificationOnUpdate});
} catch (IdentityGovernanceException e) {
throw new RuntimeException(e);
}

if (!isEnabled) {
return;
}

// Mock ClaimMetadataManagementService.
ClaimMetadataManagementService claimMetadataManagementService = mock(ClaimMetadataManagementService.class);
when(identityRecoveryServiceDataHolder.getClaimMetadataManagementService())
Expand Down
Loading