From 5fe52b8bfcfb5be5f4c85a9a496b4fa15c4652f0 Mon Sep 17 00:00:00 2001
From: Thisara-Welmilla <thisara@wso2.com>
Date: Tue, 10 Dec 2024 17:50:30 +0530
Subject: [PATCH 1/3] Add tags in the idp authenticator responses.

---
 .../v1/core/ServerIdpManagementService.java   | 57 ++--------------
 ...atedAuthenticatorConfigBuilderFactory.java | 66 ++++++++++++++++---
 2 files changed, 63 insertions(+), 60 deletions(-)

diff --git a/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 b/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
index 4a08eb348c..846711ec5f 100644
--- a/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
+++ b/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
@@ -588,33 +588,10 @@ public FederatedAuthenticatorListResponse getFederatedAuthenticators(String idpI
             listResponse = new FederatedAuthenticatorListResponse();
             FederatedAuthenticatorConfig[] fedAuthConfigs = idP.getFederatedAuthenticatorConfigs();
             if (fedAuthConfigs != null) {
-                List<FederatedAuthenticatorListItem> fedAuthList = new ArrayList<>();
-                String defaultAuthenticator = null;
-                for (FederatedAuthenticatorConfig config : fedAuthConfigs) {
-                    String fedAuthId = base64URLEncode(config.getName());
-                    FederatedAuthenticatorListItem listItem = new FederatedAuthenticatorListItem();
-                    listItem.setAuthenticatorId(fedAuthId);
-                    listItem.setName(config.getName());
-                    listItem.setIsEnabled(config.isEnabled());
-                    listItem.setDefinedBy(
-                            FederatedAuthenticatorListItem.DefinedByEnum.valueOf(config.getDefinedByType().toString()));
-                    FederatedAuthenticatorConfig federatedAuthenticatorConfig =
-                            ApplicationAuthenticatorService.getInstance().getFederatedAuthenticatorByName(
-                                    config.getName());
-                    if (federatedAuthenticatorConfig != null) {
-                        String[] tags = federatedAuthenticatorConfig.getTags();
-                        if (ArrayUtils.isNotEmpty(tags)) {
-                            listItem.setTags(Arrays.asList(tags));
-                        }
-                    }
-                    listItem.setSelf(
-                            ContextLoader.buildURIForBody(String.format(V1_API_PATH_COMPONENT + IDP_PATH_COMPONENT +
-                                    "/%s/federated-authenticators/%s", idpId, fedAuthId)).toString());
-                    fedAuthList.add(listItem);
-                    if (idP.getDefaultAuthenticatorConfig() != null) {
-                        defaultAuthenticator = base64URLEncode(idP.getDefaultAuthenticatorConfig().getName());
-                    }
-                }
+                List<FederatedAuthenticatorListItem> fedAuthList = FederatedAuthenticatorConfigBuilderFactory.build(
+                        fedAuthConfigs, idP.getResourceId());
+                String defaultAuthenticator = (idP.getDefaultAuthenticatorConfig() != null ? base64URLEncode(idP
+                        .getDefaultAuthenticatorConfig().getName()) : null);
                 listResponse.setDefaultAuthenticatorId(defaultAuthenticator);
                 listResponse.setAuthenticators(fedAuthList);
             }
@@ -2428,30 +2405,8 @@ private FederatedAuthenticatorListResponse createFederatedAuthenticatorResponse(
 
         FederatedAuthenticatorConfig[] fedAuthConfigs = idp.getFederatedAuthenticatorConfigs();
         FederatedAuthenticatorListResponse fedAuthIDPResponse = new FederatedAuthenticatorListResponse();
-        List<FederatedAuthenticatorListItem> authenticators = new ArrayList<>();
-        for (FederatedAuthenticatorConfig fedAuthConfig : fedAuthConfigs) {
-            FederatedAuthenticatorListItem fedAuthListItem = new FederatedAuthenticatorListItem();
-            fedAuthListItem.setAuthenticatorId(base64URLEncode(fedAuthConfig.getName()));
-            fedAuthListItem.setName(fedAuthConfig.getName());
-            fedAuthListItem.setIsEnabled(fedAuthConfig.isEnabled());
-            fedAuthListItem.setDefinedBy(FederatedAuthenticatorListItem.DefinedByEnum.valueOf(
-                    fedAuthConfig.getDefinedByType().toString()));
-            FederatedAuthenticatorConfig federatedAuthenticatorConfig =
-                    ApplicationAuthenticatorService.getInstance().getFederatedAuthenticatorByName(
-                            fedAuthConfig.getName());
-            if (federatedAuthenticatorConfig != null) {
-                String[] tags = federatedAuthenticatorConfig.getTags();
-                if (ArrayUtils.isNotEmpty(tags)) {
-                    fedAuthListItem.setTags(Arrays.asList(tags));
-                }
-            }
-            fedAuthListItem.setSelf(
-                    ContextLoader.buildURIForBody(String.format(V1_API_PATH_COMPONENT + IDP_PATH_COMPONENT +
-                                    "/%s/federated-authenticators/%s", idp.getResourceId(),
-                            base64URLEncode(fedAuthConfig.getName())))
-                            .toString());
-            authenticators.add(fedAuthListItem);
-        }
+        List<FederatedAuthenticatorListItem> authenticators =
+                FederatedAuthenticatorConfigBuilderFactory.build(fedAuthConfigs, idp.getResourceId());
         fedAuthIDPResponse.setDefaultAuthenticatorId(idp.getDefaultAuthenticatorConfig() != null ? base64URLEncode(idp
                 .getDefaultAuthenticatorConfig().getName()) : null);
         fedAuthIDPResponse.setAuthenticators(authenticators);
diff --git a/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/impl/FederatedAuthenticatorConfigBuilderFactory.java b/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
index 2223458692..ef6c99e585 100644
--- a/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
+++ b/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
@@ -20,11 +20,13 @@
 
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
+import org.wso2.carbon.identity.api.server.common.ContextLoader;
 import org.wso2.carbon.identity.api.server.idp.common.Constants;
 import org.wso2.carbon.identity.api.server.idp.common.IdentityProviderServiceHolder;
 import org.wso2.carbon.identity.api.server.idp.v1.model.AuthenticationType;
 import org.wso2.carbon.identity.api.server.idp.v1.model.Endpoint;
 import org.wso2.carbon.identity.api.server.idp.v1.model.FederatedAuthenticator;
+import org.wso2.carbon.identity.api.server.idp.v1.model.FederatedAuthenticatorListItem;
 import org.wso2.carbon.identity.api.server.idp.v1.model.FederatedAuthenticatorPUTRequest;
 import org.wso2.carbon.identity.application.common.ApplicationAuthenticatorService;
 import org.wso2.carbon.identity.application.common.model.FederatedAuthenticatorConfig;
@@ -38,6 +40,7 @@
 import org.wso2.carbon.idp.mgt.IdentityProviderManagementServerException;
 
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.List;
@@ -47,7 +50,10 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static org.wso2.carbon.identity.api.server.common.Constants.V1_API_PATH_COMPONENT;
+import static org.wso2.carbon.identity.api.server.common.Util.base64URLEncode;
 import static org.wso2.carbon.identity.api.server.idp.common.Constants.GOOGLE_PRIVATE_KEY;
+import static org.wso2.carbon.identity.api.server.idp.common.Constants.IDP_PATH_COMPONENT;
 
 /**
  * The factory class for building federated authenticator configuration related models.
@@ -118,15 +124,9 @@ public static FederatedAuthenticator build(FederatedAuthenticatorConfig config)
 
         federatedAuthenticator.setName(config.getName());
         federatedAuthenticator.setIsEnabled(config.isEnabled());
-
-        FederatedAuthenticatorConfig federatedAuthenticatorConfig =
-                ApplicationAuthenticatorService.getInstance().getFederatedAuthenticatorByName(
-                        config.getName());
-        if (federatedAuthenticatorConfig != null) {
-            String[] tags = federatedAuthenticatorConfig.getTags();
-            if (ArrayUtils.isNotEmpty(tags)) {
-                federatedAuthenticator.setTags(Arrays.asList(tags));
-            }
+        String[] tags = resolveAuthenticatorTags(config);
+        if (ArrayUtils.isNotEmpty(tags)) {
+            federatedAuthenticator.setTags(Arrays.asList(tags));
         }
 
         if (DefinedByType.SYSTEM == config.getDefinedByType()) {
@@ -141,6 +141,37 @@ public static FederatedAuthenticator build(FederatedAuthenticatorConfig config)
 
         return federatedAuthenticator;
     }
+
+    /**
+     * Builds a list of FederatedAuthenticatorListItem instances based on the given array of
+     * FederatedAuthenticatorConfig.
+     *
+     * @param fedAuthConfigs Array of FederatedAuthenticatorConfig instances.
+     * @return List of FederatedAuthenticatorListItem instances.
+     */
+    public static List<FederatedAuthenticatorListItem> build(FederatedAuthenticatorConfig[] fedAuthConfigs,
+                                                             String idpResourceId) {
+
+        List<FederatedAuthenticatorListItem> authenticators = new ArrayList<>();
+        for (FederatedAuthenticatorConfig config : fedAuthConfigs) {
+            FederatedAuthenticatorListItem authenticatorListItem = new FederatedAuthenticatorListItem();
+            authenticatorListItem.setAuthenticatorId(base64URLEncode(config.getName()));
+            authenticatorListItem.setName(config.getName());
+            authenticatorListItem.setIsEnabled(config.isEnabled());
+            authenticatorListItem.definedBy(FederatedAuthenticatorListItem.DefinedByEnum.valueOf(
+                    config.getDefinedByType().toString()));
+            String[] tags = resolveAuthenticatorTags(config);
+            if (ArrayUtils.isNotEmpty(tags)) {
+                authenticatorListItem.setTags(Arrays.asList(tags));
+            }
+            authenticatorListItem.setSelf(ContextLoader.buildURIForBody(String.format(V1_API_PATH_COMPONENT +
+                     IDP_PATH_COMPONENT + "/%s/federated-authenticators/%s", idpResourceId,
+                                    base64URLEncode(config.getName()))).toString());
+            authenticators.add(authenticatorListItem);
+        }
+
+        return authenticators;
+    }
     
     private static FederatedAuthenticatorConfig createFederatedAuthenticatorConfig(Config config)
             throws IdentityProviderManagementClientException {
@@ -435,6 +466,23 @@ private static void resolveEndpointConfiguration(FederatedAuthenticator authenti
         }
     }
 
+    private static String[] resolveAuthenticatorTags(FederatedAuthenticatorConfig config) {
+
+        /* If the authenticator is defined by the user, return the tags of the authenticator config. Otherwise, return
+        the tags of the system registered federated authenticator template.
+         */
+        if (DefinedByType.USER == config.getDefinedByType()) {
+            return config.getTags();
+
+        }
+        FederatedAuthenticatorConfig federatedAuthenticatorConfig =
+                ApplicationAuthenticatorService.getInstance().getFederatedAuthenticatorByName(config.getName());
+        if (federatedAuthenticatorConfig != null) {
+            return federatedAuthenticatorConfig.getTags();
+        }
+        return new String[0];
+    }
+
     /**
      * Config class to build FederatedAuthenticatorConfig.
      */

From 97b733472ae101946928210f25037b568a46dab5 Mon Sep 17 00:00:00 2001
From: Thisara-Welmilla <thisara@wso2.com>
Date: Tue, 17 Dec 2024 21:51:45 +0530
Subject: [PATCH 2/3] Address comments.

---
 ...atedAuthenticatorConfigBuilderFactory.java | 26 +++++++++----------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/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/impl/FederatedAuthenticatorConfigBuilderFactory.java b/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
index ef6c99e585..2b891823e2 100644
--- a/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
+++ b/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
@@ -18,7 +18,6 @@
 
 package org.wso2.carbon.identity.api.server.idp.v1.impl;
 
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.wso2.carbon.identity.api.server.common.ContextLoader;
 import org.wso2.carbon.identity.api.server.idp.common.Constants;
@@ -124,9 +123,9 @@ public static FederatedAuthenticator build(FederatedAuthenticatorConfig config)
 
         federatedAuthenticator.setName(config.getName());
         federatedAuthenticator.setIsEnabled(config.isEnabled());
-        String[] tags = resolveAuthenticatorTags(config);
-        if (ArrayUtils.isNotEmpty(tags)) {
-            federatedAuthenticator.setTags(Arrays.asList(tags));
+        List<String> tags = resolveAuthenticatorTags(config);
+        if (tags.isEmpty()) {
+            federatedAuthenticator.setTags(tags);
         }
 
         if (DefinedByType.SYSTEM == config.getDefinedByType()) {
@@ -147,6 +146,7 @@ public static FederatedAuthenticator build(FederatedAuthenticatorConfig config)
      * FederatedAuthenticatorConfig.
      *
      * @param fedAuthConfigs Array of FederatedAuthenticatorConfig instances.
+     * @param idpResourceId  Identity provider resource ID.
      * @return List of FederatedAuthenticatorListItem instances.
      */
     public static List<FederatedAuthenticatorListItem> build(FederatedAuthenticatorConfig[] fedAuthConfigs,
@@ -160,9 +160,9 @@ public static List<FederatedAuthenticatorListItem> build(FederatedAuthenticatorC
             authenticatorListItem.setIsEnabled(config.isEnabled());
             authenticatorListItem.definedBy(FederatedAuthenticatorListItem.DefinedByEnum.valueOf(
                     config.getDefinedByType().toString()));
-            String[] tags = resolveAuthenticatorTags(config);
-            if (ArrayUtils.isNotEmpty(tags)) {
-                authenticatorListItem.setTags(Arrays.asList(tags));
+            List<String> tags = resolveAuthenticatorTags(config);
+            if (tags.isEmpty()) {
+                authenticatorListItem.setTags(tags);
             }
             authenticatorListItem.setSelf(ContextLoader.buildURIForBody(String.format(V1_API_PATH_COMPONENT +
                      IDP_PATH_COMPONENT + "/%s/federated-authenticators/%s", idpResourceId,
@@ -466,21 +466,19 @@ private static void resolveEndpointConfiguration(FederatedAuthenticator authenti
         }
     }
 
-    private static String[] resolveAuthenticatorTags(FederatedAuthenticatorConfig config) {
+    private static List<String> resolveAuthenticatorTags(FederatedAuthenticatorConfig config) {
 
         /* If the authenticator is defined by the user, return the tags of the authenticator config. Otherwise, return
         the tags of the system registered federated authenticator template.
          */
         if (DefinedByType.USER == config.getDefinedByType()) {
-            return config.getTags();
-
+            return Arrays.asList(config.getTags());
         }
+
         FederatedAuthenticatorConfig federatedAuthenticatorConfig =
                 ApplicationAuthenticatorService.getInstance().getFederatedAuthenticatorByName(config.getName());
-        if (federatedAuthenticatorConfig != null) {
-            return federatedAuthenticatorConfig.getTags();
-        }
-        return new String[0];
+        return federatedAuthenticatorConfig != null ? Arrays.asList(federatedAuthenticatorConfig.getTags())
+                : new ArrayList<>();
     }
 
     /**

From bfca516a6e8495b5ac3f5d9d99f3f5adbc10210d Mon Sep 17 00:00:00 2001
From: Thisara-Welmilla <thisara@wso2.com>
Date: Wed, 18 Dec 2024 08:52:08 +0530
Subject: [PATCH 3/3] Addressed comments.

---
 ...atedAuthenticatorConfigBuilderFactory.java | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/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/impl/FederatedAuthenticatorConfigBuilderFactory.java b/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
index 2b891823e2..3b31190a81 100644
--- a/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
+++ b/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/impl/FederatedAuthenticatorConfigBuilderFactory.java
@@ -18,6 +18,7 @@
 
 package org.wso2.carbon.identity.api.server.idp.v1.impl;
 
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.wso2.carbon.identity.api.server.common.ContextLoader;
 import org.wso2.carbon.identity.api.server.idp.common.Constants;
@@ -123,9 +124,9 @@ public static FederatedAuthenticator build(FederatedAuthenticatorConfig config)
 
         federatedAuthenticator.setName(config.getName());
         federatedAuthenticator.setIsEnabled(config.isEnabled());
-        List<String> tags = resolveAuthenticatorTags(config);
-        if (tags.isEmpty()) {
-            federatedAuthenticator.setTags(tags);
+        String[] tags = resolveAuthenticatorTags(config);
+        if (ArrayUtils.isNotEmpty(tags)) {
+            federatedAuthenticator.setTags(Arrays.asList(tags));
         }
 
         if (DefinedByType.SYSTEM == config.getDefinedByType()) {
@@ -160,9 +161,9 @@ public static List<FederatedAuthenticatorListItem> build(FederatedAuthenticatorC
             authenticatorListItem.setIsEnabled(config.isEnabled());
             authenticatorListItem.definedBy(FederatedAuthenticatorListItem.DefinedByEnum.valueOf(
                     config.getDefinedByType().toString()));
-            List<String> tags = resolveAuthenticatorTags(config);
-            if (tags.isEmpty()) {
-                authenticatorListItem.setTags(tags);
+            String[] tags = resolveAuthenticatorTags(config);
+            if (ArrayUtils.isNotEmpty(tags)) {
+                authenticatorListItem.setTags(Arrays.asList(tags));
             }
             authenticatorListItem.setSelf(ContextLoader.buildURIForBody(String.format(V1_API_PATH_COMPONENT +
                      IDP_PATH_COMPONENT + "/%s/federated-authenticators/%s", idpResourceId,
@@ -466,19 +467,18 @@ private static void resolveEndpointConfiguration(FederatedAuthenticator authenti
         }
     }
 
-    private static List<String> resolveAuthenticatorTags(FederatedAuthenticatorConfig config) {
+    private static String[] resolveAuthenticatorTags(FederatedAuthenticatorConfig config) {
 
         /* If the authenticator is defined by the user, return the tags of the authenticator config. Otherwise, return
         the tags of the system registered federated authenticator template.
          */
         if (DefinedByType.USER == config.getDefinedByType()) {
-            return Arrays.asList(config.getTags());
+            return config.getTags();
         }
-
         FederatedAuthenticatorConfig federatedAuthenticatorConfig =
                 ApplicationAuthenticatorService.getInstance().getFederatedAuthenticatorByName(config.getName());
-        return federatedAuthenticatorConfig != null ? Arrays.asList(federatedAuthenticatorConfig.getTags())
-                : new ArrayList<>();
+        return federatedAuthenticatorConfig != null ? federatedAuthenticatorConfig.getTags()
+                : new String[0];
     }
 
     /**