This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/3_0_X by this push:
     new e2e12a9282 [SYNCOPE-1737] Managing releaseAttrs via 
DefaultAttrReleasePolicyConf (#418)
e2e12a9282 is described below

commit e2e12a9282a22bca1899335e65832561699223aa
Author: Francesco Chicchiriccò <ilgro...@users.noreply.github.com>
AuthorDate: Fri Mar 3 13:59:19 2023 +0100

    [SYNCOPE-1737] Managing releaseAttrs via DefaultAttrReleasePolicyConf (#418)
---
 .../policies/AccessPolicyAttrsDirectoryPanel.java  | 142 ---------------------
 .../policies/AccessPolicyAttrsWizardBuilder.java   |  61 ---------
 .../console/policies/AccessPolicyModalPanel.java   |   1 -
 .../policies/AttrReleasePolicyModalPanel.java      |   5 +
 .../policies/AttrReleasePolicyModalPanel.html      |   3 +
 .../console/commons/ConnectorDataProvider.java     |   5 +-
 .../console/commons/ResourceDataProvider.java      |  11 +-
 .../markup/html/form/AjaxGridFieldPanel.java       |  14 +-
 .../client/console/panels/ListViewPanel.java       |  10 +-
 .../policies/PolicyDirectoryPanel.properties       |   1 +
 .../policies/PolicyDirectoryPanel_fr_CA.properties |   1 +
 .../policies/PolicyDirectoryPanel_it.properties    |   1 +
 .../policies/PolicyDirectoryPanel_ja.properties    |   1 +
 .../policies/PolicyDirectoryPanel_pt_BR.properties |   1 +
 .../policies/PolicyDirectoryPanel_ru.properties    |   1 +
 .../syncope/common/lib/attr/JDBCAttrRepoConf.java  |  14 --
 .../syncope/common/lib/attr/LDAPAttrRepoConf.java  |  14 --
 .../common/lib/auth/JDBCAuthModuleConf.java        |  11 --
 .../common/lib/auth/LDAPAuthModuleConf.java        |  11 --
 .../common/lib/policy/AttrReleasePolicyTO.java     |   4 +-
 .../lib/policy/DefaultAttrReleasePolicyConf.java   |   8 ++
 .../apache/syncope/common/lib/wa/WAClientApp.java  |   8 --
 .../api/entity/policy/AttrReleasePolicy.java       |   2 +-
 .../src/test/resources/domains/MasterContent.xml   |  14 +-
 .../jpa/entity/policy/JPAAttrReleasePolicy.java    |   4 +-
 .../core/persistence/jpa/inner/AuthModuleTest.java |   1 -
 .../src/test/resources/domains/MasterContent.xml   |  14 +-
 .../provisioning/java/ProvisioningContext.java     |   9 +-
 .../java/data/wa/WAClientAppDataBinderImpl.java    |  53 +-------
 .../org/apache/syncope/fit/AbstractITCase.java     |   2 +
 .../apache/syncope/fit/core/AuthModuleITCase.java  |   2 -
 .../org/apache/syncope/fit/core/GroupITCase.java   |   2 +-
 .../syncope/fit/core/wa/WAClientAppITCase.java     |  50 +-------
 .../org/apache/syncope/fit/AbstractITCase.java     |   3 +
 .../apache/syncope/fit/sra/AbstractSRAITCase.java  |  33 +++++
 .../org/apache/syncope/fit/sra/OIDCSRAITCase.java  |   3 +-
 .../apache/syncope/fit/ui/AbstractUIITCase.java    |   5 +
 .../apache/syncope/fit/ui/SAML2SP4UIITCase.java    |   4 +
 pom.xml                                            |   4 +-
 .../wa/bootstrap/AttrRepoPropertySourceMapper.java |  10 +-
 .../bootstrap/AuthModulePropertySourceMapper.java  |  13 +-
 .../wa/starter/mapping/AttrReleaseMapper.java      |   3 +-
 .../starter/mapping/DefaultAttrReleaseMapper.java  |  13 +-
 .../starter/mapping/OIDCRPClientAppTOMapper.java   |  25 +++-
 .../starter/mapping/RegisteredServiceMapper.java   |   2 +-
 .../syncope/wa/starter/WAServiceRegistryTest.java  |  17 +--
 46 files changed, 170 insertions(+), 446 deletions(-)

diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyAttrsDirectoryPanel.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyAttrsDirectoryPanel.java
deleted file mode 100644
index 72a9bf6592..0000000000
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyAttrsDirectoryPanel.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.policies;
-
-import java.util.List;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.AMConstants;
-import org.apache.syncope.client.console.panels.AttrListDirectoryPanel;
-import org.apache.syncope.client.console.rest.PolicyRestClient;
-import 
org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
-import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
-import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
-import org.apache.syncope.common.lib.Attr;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.policy.AccessPolicyTO;
-import org.apache.syncope.common.lib.policy.DefaultAccessPolicyConf;
-import org.apache.syncope.common.lib.types.IdRepoEntitlement;
-import org.apache.syncope.common.lib.types.PolicyType;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.model.IModel;
-import org.danekja.java.util.function.serializable.SerializableFunction;
-
-public class AccessPolicyAttrsDirectoryPanel extends AttrListDirectoryPanel {
-
-    private static final long serialVersionUID = 33604877627114L;
-
-    private final BaseModal<AccessPolicyTO> wizardModal;
-
-    private final IModel<AccessPolicyTO> accessPolicyModel;
-
-    private final SerializableFunction<DefaultAccessPolicyConf, List<Attr>> 
attrsAccessor;
-
-    public AccessPolicyAttrsDirectoryPanel(
-            final String id,
-            final BaseModal<AccessPolicyTO> wizardModal,
-            final IModel<AccessPolicyTO> model,
-            final SerializableFunction<DefaultAccessPolicyConf, List<Attr>> 
attrsAccessor,
-            final PageReference pageRef) {
-
-        super(id, pageRef, false);
-
-        this.wizardModal = wizardModal;
-        this.accessPolicyModel = model;
-        this.attrsAccessor = attrsAccessor;
-
-        setOutputMarkupId(true);
-
-        enableUtilityButton();
-        setFooterVisibility(false);
-
-        addNewItemPanelBuilder(
-                new AccessPolicyAttrsWizardBuilder(model.getObject(), 
attrsAccessor, new Attr(), pageRef), true);
-
-        initResultTable();
-    }
-
-    @Override
-    protected ActionsPanel<Attr> getActions(final IModel<Attr> model) {
-        ActionsPanel<Attr> panel = super.getActions(model);
-
-        panel.add(new ActionLink<>() {
-
-            private static final long serialVersionUID = -3722207913631435501L;
-
-            @Override
-            public void onClick(final AjaxRequestTarget target, final Attr 
ignore) {
-                try {
-                    attrsAccessor.apply((DefaultAccessPolicyConf) 
accessPolicyModel.getObject().getConf()).
-                            remove(model.getObject());
-                    PolicyRestClient.update(PolicyType.ACCESS, 
accessPolicyModel.getObject());
-
-                    
SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
-                    target.add(container);
-                } catch (SyncopeClientException e) {
-                    LOG.error("While updating {}", 
accessPolicyModel.getObject().getKey(), e);
-                    SyncopeConsoleSession.get().onException(e);
-                }
-                ((BaseWebPage) 
pageRef.getPage()).getNotificationPanel().refresh(target);
-            }
-        }, ActionLink.ActionType.DELETE, IdRepoEntitlement.POLICY_UPDATE, 
true);
-
-        return panel;
-    }
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof ExitEvent) {
-            AjaxRequestTarget target = 
ExitEvent.class.cast(event.getPayload()).getTarget();
-            wizardModal.close(target);
-        } else if (event.getPayload() instanceof 
AjaxWizard.EditItemActionEvent) {
-            @SuppressWarnings("unchecked")
-            AjaxWizard.EditItemActionEvent<?> payload = 
(AjaxWizard.EditItemActionEvent<?>) event.getPayload();
-            payload.getTarget().ifPresent(actionTogglePanel::close);
-        }
-        super.onEvent(event);
-    }
-
-    @Override
-    protected AttrListProvider dataProvider() {
-        return new AccessPolicyAttrsProvider(rows);
-    }
-
-    @Override
-    protected String paginatorRowsKey() {
-        return AMConstants.PREF_ACCESS_POLICY_CONF_ATTRS_PAGINATOR_ROWS;
-    }
-
-    protected final class AccessPolicyAttrsProvider extends AttrListProvider {
-
-        private static final long serialVersionUID = -185944053385660794L;
-
-        private AccessPolicyAttrsProvider(final int paginatorRows) {
-            super(paginatorRows);
-        }
-
-        @Override
-        protected List<Attr> list() {
-            return attrsAccessor.apply((DefaultAccessPolicyConf) 
accessPolicyModel.getObject().getConf());
-        }
-    }
-}
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyAttrsWizardBuilder.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyAttrsWizardBuilder.java
deleted file mode 100644
index a9029e9008..0000000000
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyAttrsWizardBuilder.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.policies;
-
-import java.io.Serializable;
-import java.util.List;
-import org.apache.syncope.client.console.rest.PolicyRestClient;
-import org.apache.syncope.client.console.wizards.AttrWizardBuilder;
-import org.apache.syncope.common.lib.Attr;
-import org.apache.syncope.common.lib.policy.AccessPolicyTO;
-import org.apache.syncope.common.lib.policy.DefaultAccessPolicyConf;
-import org.apache.syncope.common.lib.types.PolicyType;
-import org.apache.wicket.PageReference;
-import org.danekja.java.util.function.serializable.SerializableFunction;
-
-public class AccessPolicyAttrsWizardBuilder extends AttrWizardBuilder {
-
-    private static final long serialVersionUID = 33625775269155L;
-
-    private final AccessPolicyTO accessPolicy;
-
-    private final SerializableFunction<DefaultAccessPolicyConf, List<Attr>> 
attrsAccessor;
-
-    public AccessPolicyAttrsWizardBuilder(
-            final AccessPolicyTO accessPolicy,
-            final SerializableFunction<DefaultAccessPolicyConf, List<Attr>> 
attrsAccessor,
-            final Attr attr,
-            final PageReference pageRef) {
-
-        super(attr, pageRef);
-        this.accessPolicy = accessPolicy;
-        this.attrsAccessor = attrsAccessor;
-    }
-
-    @Override
-    protected Serializable onApplyInternal(final Attr modelObject) {
-        attrsAccessor.apply((DefaultAccessPolicyConf) accessPolicy.getConf()).
-                removeIf(p -> modelObject.getSchema().equals(p.getSchema()));
-        attrsAccessor.apply((DefaultAccessPolicyConf) 
accessPolicy.getConf()).add(modelObject);
-
-        PolicyRestClient.update(PolicyType.ACCESS, accessPolicy);
-
-        return null;
-    }
-}
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyModalPanel.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyModalPanel.java
index f64256fe00..abb8ec28f5 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyModalPanel.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AccessPolicyModalPanel.java
@@ -38,7 +38,6 @@ public class AccessPolicyModalPanel extends 
AbstractModalPanel<AccessPolicyTO> {
 
     private final IModel<AccessPolicyTO> model;
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
     public AccessPolicyModalPanel(
             final BaseModal<AccessPolicyTO> modal,
             final IModel<AccessPolicyTO> model,
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.java
index fd02a70995..a3a7ae2ebe 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.java
@@ -30,6 +30,7 @@ import 
org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
 import 
org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
+import 
org.apache.syncope.client.ui.commons.markup.html.form.AjaxGridFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
 import 
org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
 import 
org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
@@ -69,6 +70,10 @@ public class AttrReleasePolicyModalPanel extends 
AbstractModalPanel<AttrReleaseP
         super(modal, pageRef);
         this.model = model;
 
+        add(new AjaxGridFieldPanel<>(
+                "releaseAttrs", "releaseAttrs",
+                new PropertyModel<>(model.getObject().getConf(), 
"releaseAttrs")));
+
         AjaxTextFieldPanel allowedAttr = new AjaxTextFieldPanel("panel", 
"allowedAttrs", new Model<>());
         add(new MultiFieldPanel.Builder<String>(
                 new PropertyModel<>(model.getObject().getConf(), 
"allowedAttrs")).build(
diff --git 
a/client/am/console/src/main/resources/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.html
 
b/client/am/console/src/main/resources/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.html
index aa0da3f6f6..38daa422e4 100644
--- 
a/client/am/console/src/main/resources/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.html
+++ 
b/client/am/console/src/main/resources/org/apache/syncope/client/console/policies/AttrReleasePolicyModalPanel.html
@@ -18,6 +18,9 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:wicket="http://wicket.apache.org";>
   <wicket:extend>
+    <div class="form-group">
+      <span wicket:id="releaseAttrs"/>
+    </div>
     <div class="form-group">
       <span wicket:id="allowedAttrs"/>
     </div>
diff --git 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ConnectorDataProvider.java
 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ConnectorDataProvider.java
index 8d7f7cb388..c175b20213 100644
--- 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ConnectorDataProvider.java
+++ 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ConnectorDataProvider.java
@@ -23,7 +23,6 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -85,8 +84,8 @@ public class ConnectorDataProvider extends 
DirectoryDataProvider<Serializable> {
             LOG.error("While searching", e);
             SyncopeConsoleSession.get().onException(e);
 
-            Optional<AjaxRequestTarget> target = 
RequestCycle.get().find(AjaxRequestTarget.class);
-            target.ifPresent(t -> ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(t));
+            RequestCycle.get().find(AjaxRequestTarget.class).
+                    ifPresent(t -> ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(t));
         }
 
         SortParam<String> sortParam = getSort();
diff --git 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ResourceDataProvider.java
 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ResourceDataProvider.java
index b19c8c1173..bd59e2b2c8 100644
--- 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ResourceDataProvider.java
+++ 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/ResourceDataProvider.java
@@ -19,11 +19,9 @@
 package org.apache.syncope.client.console.commons;
 
 import java.io.Serializable;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -67,7 +65,7 @@ public class ResourceDataProvider extends 
DirectoryDataProvider<Serializable> {
 
     @Override
     public Iterator<ResourceTO> iterator(final long first, final long count) {
-        List<ResourceTO> result = Collections.emptyList();
+        List<ResourceTO> result = List.of();
 
         try {
             currentPage = ((int) first / paginatorRows);
@@ -85,9 +83,8 @@ public class ResourceDataProvider extends 
DirectoryDataProvider<Serializable> {
             LOG.error("While searching", e);
             SyncopeConsoleSession.get().onException(e);
 
-            Optional<AjaxRequestTarget> target = 
RequestCycle.get().find(AjaxRequestTarget.class);
-            target.ifPresent(ajaxRequestTarget
-                    -> ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(ajaxRequestTarget));
+            RequestCycle.get().find(AjaxRequestTarget.class).
+                    ifPresent(t -> ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(t));
         }
 
         SortParam<String> sortParam = getSort();
@@ -137,7 +134,7 @@ public class ResourceDataProvider extends 
DirectoryDataProvider<Serializable> {
             SyncopeConsoleSession.get().onException(e);
 
             RequestCycle.get().find(AjaxRequestTarget.class).
-                    ifPresent(target -> ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(target));
+                    ifPresent(t -> ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(t));
         }
 
         return result;
diff --git 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxGridFieldPanel.java
 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxGridFieldPanel.java
index fbf9ecf12a..2d62d4c347 100644
--- 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxGridFieldPanel.java
+++ 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxGridFieldPanel.java
@@ -37,7 +37,7 @@ import 
org.wicketstuff.egrid.provider.EditableListDataProvider;
 
 public class AjaxGridFieldPanel<K, V, S> extends Panel {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 7589570522964677729L;
 
     public AjaxGridFieldPanel(final String id, final String name, final 
IModel<Map<K, V>> model) {
         super(id, model);
@@ -45,13 +45,13 @@ public class AjaxGridFieldPanel<K, V, S> extends Panel {
         add(new Label(AbstractFieldPanel.LABEL, new ResourceModel(name, 
name)));
 
         add(new AjaxGrid<>(
-            "grid",
-            getColumns(),
-            new 
EditableListDataProvider<>(model.getObject().entrySet().stream().
-                map(entry -> MutablePair.of(entry.getKey(), entry.getValue())).
-                collect(Collectors.toList())), 10) {
+                "grid",
+                getColumns(),
+                new 
EditableListDataProvider<>(model.getObject().entrySet().stream().
+                        map(entry -> MutablePair.of(entry.getKey(), 
entry.getValue())).
+                        collect(Collectors.toList())), 10) {
 
-            private static final long serialVersionUID = 1L;
+            private static final long serialVersionUID = -1315456128897492459L;
 
             @Override
             protected boolean displayHeader() {
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index db77482b24..c44531d1c4 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -250,14 +250,12 @@ public abstract class ListViewPanel<T extends 
Serializable> extends WizardMgtPan
         // used to perform selectable enabling check condition
         this.check.setObject(check);
 
-        Optional<AjaxRequestTarget> target = 
RequestCycle.get().find(AjaxRequestTarget.class);
-        if (target.isPresent()) {
+        RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(t -> {
             // reload group selector
-            target.get().add(
-                    groupSelector.setVisible(check == 
CheckAvailability.AVAILABLE), groupSelector.getMarkupId());
+            t.add(groupSelector.setVisible(check == 
CheckAvailability.AVAILABLE), groupSelector.getMarkupId());
             // reload the list view panel
-            target.get().add(ListViewPanel.this, getMarkupId());
-        }
+            t.add(ListViewPanel.this, getMarkupId());
+        });
     }
 
     protected abstract Component getValueComponent(String key, T bean);
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.properties
index 8db5446b72..0c4e2d0c6c 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.properties
@@ -48,3 +48,4 @@ fetchAroundProvisioning=Fetch Around Provisioning
 updateDelta=Update Delta
 conf=Configuration
 accessPolicyConf.title=Access Policy Configuration
+releaseAttrs=Attributes to Release
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_fr_CA.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_fr_CA.properties
index edf43897f9..3775e15689 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_fr_CA.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_fr_CA.properties
@@ -48,3 +48,4 @@ fetchAroundProvisioning=Fetch Around Provisioning
 updateDelta=Update Delta
 conf=Configuration
 accessPolicyConf.title=Access Policy Configuration
+releaseAttrs=Attributes to Release
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_it.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_it.properties
index 3f3b8a2c31..05615626b7 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_it.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_it.properties
@@ -48,3 +48,4 @@ fetchAroundProvisioning=Fetch Around Provisioning
 updateDelta=Update Delta
 conf=Configurazione
 accessPolicyConf.title=Configurazione Accesso
+releaseAttrs=Attributi da Rilasciare
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ja.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ja.properties
index 5ac2d6e170..7e799cd8a9 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ja.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ja.properties
@@ -48,3 +48,4 @@ fetchAroundProvisioning=Fetch Around Provisioning
 updateDelta=Update Delta
 conf=Configuration
 accessPolicyConf.title=Access Policy Configuration
+releaseAttrs=Attributes to Release
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_pt_BR.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_pt_BR.properties
index e12adf4376..32740d406a 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_pt_BR.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_pt_BR.properties
@@ -48,3 +48,4 @@ fetchAroundProvisioning=Fetch Around Provisioning
 updateDelta=Update Delta
 conf=Configuration
 accessPolicyConf.title=Access Policy Configuration
+releaseAttrs=Attributes to Release
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ru.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ru.properties
index c8a3c08e24..895e24d1ff 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ru.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/policies/PolicyDirectoryPanel_ru.properties
@@ -49,3 +49,4 @@ fetchAroundProvisioning=Fetch Around Provisioning
 updateDelta=Update Delta
 conf=Configuration
 accessPolicyConf.title=Access Policy Configuration
+releaseAttrs=Attributes to Release
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/JDBCAttrRepoConf.java
 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/JDBCAttrRepoConf.java
index 1c25e5fe51..e99b36a7cf 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/JDBCAttrRepoConf.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/JDBCAttrRepoConf.java
@@ -76,16 +76,6 @@ public class JDBCAttrRepoConf extends AbstractJDBCConf 
implements AttrRepoConf {
      */
     private final List<String> username = new ArrayList<>(0);
 
-    /**
-     * Map of attributes to fetch from the database.
-     * Attributes are defined using a key-value structure
-     * where CAS allows the attribute name/key to be renamed virtually
-     * to a different attribute. The key is the attribute fetched
-     * from the data source and the value is the attribute name CAS should
-     * use for virtual renames.
-     */
-    private final Map<String, String> attributes = new HashMap<>(0);
-
     /**
      * Collection of attributes, used to build the SQL query, that should go 
through
      * a case canonicalization process defined as {@code key->value}.
@@ -139,10 +129,6 @@ public class JDBCAttrRepoConf extends AbstractJDBCConf 
implements AttrRepoConf {
         return username;
     }
 
-    public Map<String, String> getAttributes() {
-        return attributes;
-    }
-
     public List<String> getCaseInsensitiveQueryAttributes() {
         return caseInsensitiveQueryAttributes;
     }
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/LDAPAttrRepoConf.java
 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/LDAPAttrRepoConf.java
index 6819a53b12..d1528a4e51 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/LDAPAttrRepoConf.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/attr/LDAPAttrRepoConf.java
@@ -27,16 +27,6 @@ public class LDAPAttrRepoConf extends AbstractLDAPConf 
implements AttrRepoConf {
 
     private static final long serialVersionUID = -471527731042579422L;
 
-    /**
-     * Map of attributes to fetch from the database.
-     * Attributes are defined using a key-value structure
-     * where CAS allows the attribute name/key to be renamed virtually
-     * to a different attribute. The key is the attribute fetched
-     * from the data source and the value is the attribute name CAS should
-     * use for virtual renames.
-     */
-    private final Map<String, String> attributes = new HashMap<>(0);
-
     /**
      * Whether all existing attributes should be passed
      * down to the query builder map and be used in the construction
@@ -59,10 +49,6 @@ public class LDAPAttrRepoConf extends AbstractLDAPConf 
implements AttrRepoConf {
         this.useAllQueryAttributes = useAllQueryAttributes;
     }
 
-    public Map<String, String> getAttributes() {
-        return attributes;
-    }
-
     public Map<String, String> getQueryAttributes() {
         return queryAttributes;
     }
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
index 6b2d750b09..628a659fbd 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/JDBCAuthModuleConf.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import org.apache.syncope.common.lib.AbstractJDBCConf;
 import org.apache.syncope.common.lib.to.AuthModuleTO;
@@ -43,11 +41,6 @@ public class JDBCAuthModuleConf extends AbstractJDBCConf 
implements AuthModuleCo
      */
     private String fieldDisabled;
 
-    /**
-     * List of column names to fetch as user attributes.
-     */
-    private final List<String> principalAttributeList = new ArrayList<>();
-
     public String getFieldPassword() {
         return fieldPassword;
     }
@@ -72,10 +65,6 @@ public class JDBCAuthModuleConf extends AbstractJDBCConf 
implements AuthModuleCo
         this.fieldDisabled = fieldDisabled;
     }
 
-    public List<String> getPrincipalAttributeList() {
-        return principalAttributeList;
-    }
-
     @Override
     public Map<String, Object> map(final AuthModuleTO authModule, final Mapper 
mapper) {
         return mapper.map(authModule, this);
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
index a3233d75df..2f131b7c47 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/auth/LDAPAuthModuleConf.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.common.lib.auth;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import org.apache.syncope.common.lib.AbstractLDAPConf;
 import org.apache.syncope.common.lib.to.AuthModuleTO;
@@ -35,11 +33,6 @@ public class LDAPAuthModuleConf extends AbstractLDAPConf 
implements AuthModuleCo
      */
     private String userIdAttribute;
 
-    /**
-     * List of attribute names to fetch as user attributes.
-     */
-    private final List<String> principalAttributeList = new ArrayList<>();
-
     public String getUserIdAttribute() {
         return userIdAttribute;
     }
@@ -48,10 +41,6 @@ public class LDAPAuthModuleConf extends AbstractLDAPConf 
implements AuthModuleCo
         this.userIdAttribute = userIdAttribute;
     }
 
-    public List<String> getPrincipalAttributeList() {
-        return principalAttributeList;
-    }
-
     @Override
     public Map<String, Object> map(final AuthModuleTO authModule, final Mapper 
mapper) {
         return mapper.map(authModule, this);
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
index 4d37215fde..35d3765f0a 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
@@ -29,7 +29,7 @@ public class AttrReleasePolicyTO extends PolicyTO {
 
     private int order;
 
-    private Boolean status;
+    private boolean status = true;
 
     private AttrReleasePolicyConf conf;
 
@@ -50,7 +50,7 @@ public class AttrReleasePolicyTO extends PolicyTO {
         this.order = order;
     }
 
-    public Boolean getStatus() {
+    public boolean getStatus() {
         return status;
     }
 
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAttrReleasePolicyConf.java
 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAttrReleasePolicyConf.java
index 0c65f46dbf..6bc299092f 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAttrReleasePolicyConf.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/DefaultAttrReleasePolicyConf.java
@@ -22,7 +22,9 @@ import 
com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 public class DefaultAttrReleasePolicyConf implements AttrReleasePolicyConf {
@@ -105,6 +107,8 @@ public class DefaultAttrReleasePolicyConf implements 
AttrReleasePolicyConf {
         }
     }
 
+    private final Map<String, Object> releaseAttrs = new HashMap<>();
+
     /**
      * Specify the list of allowed attribute to release.
      * Use the special {@code *} to release everything.
@@ -119,6 +123,10 @@ public class DefaultAttrReleasePolicyConf implements 
AttrReleasePolicyConf {
 
     private final PrincipalAttrRepoConf principalAttrRepoConf = new 
PrincipalAttrRepoConf();
 
+    public Map<String, Object> getReleaseAttrs() {
+        return releaseAttrs;
+    }
+
     @JacksonXmlElementWrapper(localName = "allowedAttrs")
     @JacksonXmlProperty(localName = "allowedAttr")
     public List<String> getAllowedAttrs() {
diff --git 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java
index ab30e9d5a0..a27e7dfa0c 100644
--- 
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java
+++ 
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/wa/WAClientApp.java
@@ -21,9 +21,7 @@ package org.apache.syncope.common.lib.wa;
 import 
com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import org.apache.syncope.common.lib.BaseBean;
 import org.apache.syncope.common.lib.policy.AccessPolicyTO;
 import org.apache.syncope.common.lib.policy.AttrReleasePolicyTO;
@@ -45,8 +43,6 @@ public class WAClientApp implements BaseBean {
 
     private AttrReleasePolicyTO attrReleasePolicy;
 
-    private final Map<String, Object> releaseAttrs = new HashMap<>();
-
     public ClientAppTO getClientAppTO() {
         return clientAppTO;
     }
@@ -84,8 +80,4 @@ public class WAClientApp implements BaseBean {
     public void setAttrReleasePolicy(final AttrReleasePolicyTO 
attrReleasePolicy) {
         this.attrReleasePolicy = attrReleasePolicy;
     }
-
-    public Map<String, Object> getReleaseAttrs() {
-        return releaseAttrs;
-    }
 }
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AttrReleasePolicy.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AttrReleasePolicy.java
index ce4f635677..46e520c327 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AttrReleasePolicy.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AttrReleasePolicy.java
@@ -26,7 +26,7 @@ public interface AttrReleasePolicy extends Policy {
 
     void setOrder(int order);
 
-    Boolean getStatus();
+    boolean getStatus();
 
     void setStatus(Boolean status);
 
diff --git 
a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml 
b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index d778a528c7..d44dfc76c7 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -58,14 +58,14 @@ under the License.
 
   <!-- Attr Release Policies -->
   <AttrReleasePolicy arporder="0" name="DenyAttrReleasePolicy" 
id="219935c7-deb3-40b3-8a9a-683037e523a2"
-                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","allowedAttrs":[],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
+                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","releaseAttrs":[],"allowedAttrs":[],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
   <AttrReleasePolicy arporder="0" name="AllowedAttrReleasePolicy" 
id="319935c7-deb3-40b3-8a9a-683037e523a2"
-                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","allowedAttrs":["cn","givenName","uid"],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
+                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","releaseAttrs":[],"allowedAttrs":["cn","givenName","uid"],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
       
   <!-- Authentication modules -->
   <AuthModule id="DefaultLDAPAuthModule" authModuleState="ACTIVE"
-              description="LDAP auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.LDAPAuthModuleConf","userIdAttribute":"cn","bindDn":
 "${testds.bindDn}", 
"bindCredential":"${testds.password}","ldapUrl":"ldap://localhost:${testds.port}","searchFilter":"cn={user}","baseDn":"ou=People,${testds.rootDn}","subtreeSearch":true,"principalAttributeList":["sn","givenName","mail","cn"]}'
-              
items='[{"intAttrName":"mail","extAttrName":"mail","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"givenName","extAttrName":"givenName","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"sn","extAttrName":"sn","conn
 [...]
+              description="LDAP auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.LDAPAuthModuleConf","userIdAttribute":"cn","bindDn":
 "${testds.bindDn}", 
"bindCredential":"${testds.password}","ldapUrl":"ldap://localhost:${testds.port}","searchFilter":"cn={user}","baseDn":"ou=People,${testds.rootDn}","subtreeSearch":true}'
+              
items='[{"intAttrName":"mail","extAttrName":"email","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"givenName","extAttrName":"firstname","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"sn","extAttrName":"surname"
 [...]
   <AuthModule id="DefaultJDBCAuthModule" authModuleState="ACTIVE"
               description="JDBC auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.JDBCAuthModuleConf","sql":"SELECT
 * FROM users_table WHERE name=?", "fieldPassword": "password"}'/>
   <AuthModule id="DefaultGoogleMfaAuthModule" authModuleState="ACTIVE"
@@ -84,7 +84,7 @@ under the License.
               description="Static auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.StaticAuthModuleConf","users":{"syncope1":
 "$cynop3"}}'/>
   <AuthModule id="DefaultSyncopeAuthModule" authModuleState="ACTIVE"
               description="Syncope auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.SyncopeAuthModuleConf","domain":"Master"}'
-              
items='[{"intAttrName":"syncopeUserAttr_surname","extAttrName":"family_name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"syncopeUserAttr_fullname","extAttrName":"name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAtt
 [...]
+              
items='[{"intAttrName":"syncopeUserAttr_surname","extAttrName":"family_name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"syncopeUserAttr_fullname","extAttrName":"name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAtt
 [...]
   <AuthModule id="DefaultU2FAuthModule" authModuleState="ACTIVE"
               description="U2F auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.U2FAuthModuleConf","expireDevices":40}'/>
   <AuthModule id="DefaultOAuth20AuthModule" description="OAuth20 auth module" 
authModuleOrder="0" 
@@ -93,9 +93,9 @@ under the License.
 
   <!-- Attribute repositories -->
   <AttrRepo id="DefaultLDAPAttrRepo" attrRepoState="ACTIVE"
-            description="LDAP attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.LDAPAttrRepoConf","searchFilter":"cn={user}","subtreeSearch":true,"ldapUrl":"ldap://localhost:${testds.port}","bindDn":"${testds.bindDn}","bindCredential":"${testds.password}","baseDn":"ou=People,${testds.rootDn}","attributes":{},"useAllQueryAttributes":true,"queryAttributes":{}}'/>
+            description="LDAP attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.LDAPAttrRepoConf","searchFilter":"cn={user}","subtreeSearch":true,"ldapUrl":"ldap://localhost:${testds.port}","bindDn":"${testds.bindDn}","bindCredential":"${testds.password}","baseDn":"ou=People,${testds.rootDn}","useAllQueryAttributes":true,"queryAttributes":{}}'/>
   <AttrRepo id="DefaultJDBCAttrRepo" attrRepoState="ACTIVE"
-            description="JDBC attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.JDBCAttrRepoConf","sql":"SELECT
 * FROM table WHERE 
name=?","dialect":"org.hibernate.dialect.H2Dialect","driverClass":"org.h2.Driver","url":"jdbc:h2:mem:syncopedb;DB_CLOSE_DELAY=-1","user":"username","password":"password","singleRow":true,"requireAllAttributes":true,"caseCanonicalization":"NONE","queryType":"AND","columnMappings":{},"username":[],"attributes":{},"caseInsensitiveQueryAttributes
 [...]
+            description="JDBC attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.JDBCAttrRepoConf","sql":"SELECT
 * FROM table WHERE 
name=?","dialect":"org.hibernate.dialect.H2Dialect","driverClass":"org.h2.Driver","url":"jdbc:h2:mem:syncopedb;DB_CLOSE_DELAY=-1","user":"username","password":"password","singleRow":true,"requireAllAttributes":true,"caseCanonicalization":"NONE","queryType":"AND","columnMappings":{},"username":[],"caseInsensitiveQueryAttributes":[],"queryAttri
 [...]
   <AttrRepo id="DefaultStubAttrRepo" attrRepoState="ACTIVE"
             description="Stub attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.StubAttrRepoConf","attributes":{"attr1":"value1"}}'
             
items='[{"intAttrName":"attr1","extAttrName":"identifier","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]}]'/>
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
index 72fbeb9953..de3ccd1492 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAttrReleasePolicy.java
@@ -54,8 +54,8 @@ public class JPAAttrReleasePolicy extends AbstractPolicy 
implements AttrReleaseP
     }
 
     @Override
-    public Boolean getStatus() {
-        return status;
+    public boolean getStatus() {
+        return status == null ? true : status;
     }
 
     @Override
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
index 0670556a26..e15996ff0f 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AuthModuleTest.java
@@ -217,7 +217,6 @@ public class AuthModuleTest extends AbstractTest {
         JDBCAuthModuleConf conf = new JDBCAuthModuleConf();
         conf.setSql("SELECT * FROM table WHERE name=?");
         conf.setFieldPassword("password");
-        conf.getPrincipalAttributeList().addAll(List.of("sn", "cn:commonName", 
"givenName"));
 
         saveAuthModule("JDBCAuthModuleTest", conf);
     }
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml 
b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index f804bf8eda..6d56bc1698 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -58,14 +58,14 @@ under the License.
 
   <!-- Attr Release Policies -->
   <AttrReleasePolicy arporder="0" name="DenyAttrReleasePolicy" 
id="219935c7-deb3-40b3-8a9a-683037e523a2"
-                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","allowedAttrs":[],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
+                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","releaseAttrs":[],"allowedAttrs":[],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
   <AttrReleasePolicy arporder="0" name="AllowedAttrReleasePolicy" 
id="319935c7-deb3-40b3-8a9a-683037e523a2"
-                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","allowedAttrs":["cn","givenName","uid"],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
+                     
jsonConf='{"_class":"org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf","releaseAttrs":[],"allowedAttrs":["cn","givenName","uid"],"excludedAttrs":[],"includeOnlyAttrs":[],"principalIdAttr":null,"principalAttrRepoConf":{"mergingStrategy":"MULTIVALUED","ignoreResolvedAttributes":false,"expiration":0,"timeUnit":"HOURS","attrRepos":[]}}'/>
 
   <!-- Authentication modules -->
   <AuthModule id="DefaultLDAPAuthModule" authModuleState="ACTIVE"
-              description="LDAP auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.LDAPAuthModuleConf","userIdAttribute":"cn","bindDn":
 "${testds.bindDn}", 
"bindCredential":"${testds.password}","ldapUrl":"ldap://localhost:${testds.port}","searchFilter":"cn={user}","baseDn":"ou=People,${testds.rootDn}","subtreeSearch":true,"principalAttributeList":["sn","givenName","mail","cn"]}'
-              
items='[{"intAttrName":"mail","extAttrName":"mail","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"givenName","extAttrName":"givenName","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"sn","extAttrName":"sn","conn
 [...]
+              description="LDAP auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.LDAPAuthModuleConf","userIdAttribute":"cn","bindDn":
 "${testds.bindDn}", 
"bindCredential":"${testds.password}","ldapUrl":"ldap://localhost:${testds.port}","searchFilter":"cn={user}","baseDn":"ou=People,${testds.rootDn}","subtreeSearch":true}'
+              
items='[{"intAttrName":"mail","extAttrName":"email","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"givenName","extAttrName":"firstname","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"sn","extAttrName":"surname"
 [...]
   <AuthModule id="DefaultJDBCAuthModule" authModuleState="ACTIVE"
               description="JDBC auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.JDBCAuthModuleConf","sql":"SELECT
 * FROM users_table WHERE name=?", "fieldPassword": "password"}'/>
   <AuthModule id="DefaultGoogleMfaAuthModule" authModuleState="ACTIVE"
@@ -84,7 +84,7 @@ under the License.
               description="Static auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.StaticAuthModuleConf","users":{"syncope1":
 "$cynop3"}}'/>
   <AuthModule id="DefaultSyncopeAuthModule" authModuleState="ACTIVE"
               description="Syncope auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.SyncopeAuthModuleConf","domain":"Master"}'
-              
items='[{"intAttrName":"syncopeUserAttr_surname","extAttrName":"family_name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"syncopeUserAttr_fullname","extAttrName":"name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAtt
 [...]
+              
items='[{"intAttrName":"syncopeUserAttr_surname","extAttrName":"family_name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAttrName":"syncopeUserAttr_fullname","extAttrName":"name","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]},{"intAtt
 [...]
   <AuthModule id="DefaultU2FAuthModule" authModuleState="ACTIVE"
               description="U2F auth module" 
jsonConf='{"_class":"org.apache.syncope.common.lib.auth.U2FAuthModuleConf","expireDevices":40}'/>
   <AuthModule id="DefaultOAuth20AuthModule" description="OAuth20 auth module" 
authModuleOrder="0"
@@ -92,9 +92,9 @@ under the License.
 
   <!-- Attribute repositories -->
   <AttrRepo id="DefaultLDAPAttrRepo" attrRepoState="ACTIVE"
-            description="LDAP attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.LDAPAttrRepoConf","searchFilter":"cn={user}","subtreeSearch":true,"ldapUrl":"ldap://localhost:${testds.port}","bindDn":"${testds.bindDn}","bindCredential":"${testds.password}","baseDn":"ou=People,${testds.rootDn}","attributes":{},"useAllQueryAttributes":true,"queryAttributes":{}}'/>
+            description="LDAP attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.LDAPAttrRepoConf","searchFilter":"cn={user}","subtreeSearch":true,"ldapUrl":"ldap://localhost:${testds.port}","bindDn":"${testds.bindDn}","bindCredential":"${testds.password}","baseDn":"ou=People,${testds.rootDn}","useAllQueryAttributes":true,"queryAttributes":{}}'/>
   <AttrRepo id="DefaultJDBCAttrRepo" attrRepoState="ACTIVE"
-            description="JDBC attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.JDBCAttrRepoConf","sql":"SELECT
 * FROM table WHERE 
name=?","dialect":"org.hibernate.dialect.H2Dialect","driverClass":"org.h2.Driver","url":"jdbc:h2:mem:syncopedb;DB_CLOSE_DELAY=-1","user":"username","password":"password","singleRow":true,"requireAllAttributes":true,"caseCanonicalization":"NONE","queryType":"AND","columnMappings":{},"username":[],"attributes":{},"caseInsensitiveQueryAttributes
 [...]
+            description="JDBC attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.JDBCAttrRepoConf","sql":"SELECT
 * FROM table WHERE 
name=?","dialect":"org.hibernate.dialect.H2Dialect","driverClass":"org.h2.Driver","url":"jdbc:h2:mem:syncopedb;DB_CLOSE_DELAY=-1","user":"username","password":"password","singleRow":true,"requireAllAttributes":true,"caseCanonicalization":"NONE","queryType":"AND","columnMappings":{},"username":[],"caseInsensitiveQueryAttributes":[],"queryAttri
 [...]
   <AttrRepo id="DefaultStubAttrRepo" attrRepoState="ACTIVE"
             description="Stub attr repo" 
jsonConf='{"_class":"org.apache.syncope.common.lib.attr.StubAttrRepoConf","attributes":{"attr1":"value1"}}'
             
items='[{"intAttrName":"attr1","extAttrName":"identifier","connObjectKey":false,"password":false,"mandatoryCondition":"false","purpose":"NONE","propagationJEXLTransformer":null,"pullJEXLTransformer":null,"transformers":[]}]'/>
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
index 253723deb5..0d632c9348 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
@@ -35,9 +35,7 @@ import 
org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ApplicationDAO;
-import org.apache.syncope.core.persistence.api.dao.AttrRepoDAO;
 import org.apache.syncope.core.persistence.api.dao.AuditConfDAO;
-import org.apache.syncope.core.persistence.api.dao.AuthModuleDAO;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
 import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
@@ -1241,11 +1239,8 @@ public class ProvisioningContext {
     public WAClientAppDataBinder waClientAppDataBinder(
             final ClientAppDataBinder clientAppDataBinder,
             final PolicyDataBinder policyDataBinder,
-            final AuthModuleDataBinder authModuleDataBinder,
-            final AuthModuleDAO authModuleDAO,
-            final AttrRepoDAO attrRepoDAO) {
+            final AuthModuleDataBinder authModuleDataBinder) {
 
-        return new WAClientAppDataBinderImpl(
-                clientAppDataBinder, policyDataBinder, authModuleDataBinder, 
authModuleDAO, attrRepoDAO);
+        return new WAClientAppDataBinderImpl(clientAppDataBinder, 
policyDataBinder, authModuleDataBinder);
     }
 }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/wa/WAClientAppDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/wa/WAClientAppDataBinderImpl.java
index 7012ab1a91..c43678ace8 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/wa/WAClientAppDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/wa/WAClientAppDataBinderImpl.java
@@ -18,15 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.data.wa;
 
-import org.apache.syncope.common.lib.policy.AttrReleasePolicyConf;
-import org.apache.syncope.common.lib.policy.AuthPolicyConf;
-import org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf;
-import org.apache.syncope.common.lib.policy.DefaultAuthPolicyConf;
 import org.apache.syncope.common.lib.wa.WAClientApp;
-import org.apache.syncope.core.persistence.api.dao.AttrRepoDAO;
-import org.apache.syncope.core.persistence.api.dao.AuthModuleDAO;
-import org.apache.syncope.core.persistence.api.entity.am.AttrRepo;
-import org.apache.syncope.core.persistence.api.entity.am.AuthModule;
 import org.apache.syncope.core.persistence.api.entity.am.ClientApp;
 import org.apache.syncope.core.provisioning.api.data.AuthModuleDataBinder;
 import org.apache.syncope.core.provisioning.api.data.ClientAppDataBinder;
@@ -45,22 +37,14 @@ public class WAClientAppDataBinderImpl implements 
WAClientAppDataBinder {
 
     protected final AuthModuleDataBinder authModuleDataBinder;
 
-    protected final AuthModuleDAO authModuleDAO;
-
-    protected final AttrRepoDAO attrRepoDAO;
-
     public WAClientAppDataBinderImpl(
             final ClientAppDataBinder clientAppDataBinder,
             final PolicyDataBinder policyDataBinder,
-            final AuthModuleDataBinder authModuleDataBinder,
-            final AuthModuleDAO authModuleDAO,
-            final AttrRepoDAO attrRepoDAO) {
+            final AuthModuleDataBinder authModuleDataBinder) {
 
         this.clientAppDataBinder = clientAppDataBinder;
         this.policyDataBinder = policyDataBinder;
         this.authModuleDataBinder = authModuleDataBinder;
-        this.authModuleDAO = authModuleDAO;
-        this.attrRepoDAO = attrRepoDAO;
     }
 
     @Override
@@ -69,28 +53,11 @@ public class WAClientAppDataBinderImpl implements 
WAClientAppDataBinder {
         
waClientApp.setClientAppTO(clientAppDataBinder.getClientAppTO(clientApp));
 
         try {
-            AuthPolicyConf authPolicyConf = null;
             if (clientApp.getAuthPolicy() != null) {
-                authPolicyConf = clientApp.getAuthPolicy().getConf();
                 
waClientApp.setAuthPolicy(policyDataBinder.getPolicyTO(clientApp.getAuthPolicy()));
             } else if (clientApp.getRealm() != null && 
clientApp.getRealm().getAuthPolicy() != null) {
-                authPolicyConf = 
clientApp.getRealm().getAuthPolicy().getConf();
                 
waClientApp.setAuthPolicy(policyDataBinder.getPolicyTO(clientApp.getRealm().getAuthPolicy()));
             }
-            if (authPolicyConf instanceof DefaultAuthPolicyConf) {
-                ((DefaultAuthPolicyConf) 
authPolicyConf).getAuthModules().forEach(key -> {
-                    AuthModule authModule = authModuleDAO.find(key);
-                    if (authModule == null) {
-                        LOG.warn("AuthModule " + authModule + " not found");
-                    } else {
-                        
waClientApp.getAuthModules().add(authModuleDataBinder.getAuthModuleTO(authModule));
-
-                        authModule.getItems().
-                                forEach(item -> 
waClientApp.getReleaseAttrs().put(
-                                item.getIntAttrName(), item.getExtAttrName()));
-                    }
-                });
-            }
 
             if (clientApp.getAccessPolicy() != null) {
                 
waClientApp.setAccessPolicy(policyDataBinder.getPolicyTO(clientApp.getAccessPolicy()));
@@ -98,31 +65,13 @@ public class WAClientAppDataBinderImpl implements 
WAClientAppDataBinder {
                 
waClientApp.setAccessPolicy(policyDataBinder.getPolicyTO(clientApp.getRealm().getAccessPolicy()));
             }
 
-            AttrReleasePolicyConf attrReleasePolicyConf = null;
             if (clientApp.getAttrReleasePolicy() != null) {
-                attrReleasePolicyConf = 
clientApp.getAttrReleasePolicy().getConf();
                 waClientApp.setAttrReleasePolicy(
                         
policyDataBinder.getPolicyTO(clientApp.getAttrReleasePolicy()));
             } else if (clientApp.getRealm() != null && 
clientApp.getRealm().getAttrReleasePolicy() != null) {
-                attrReleasePolicyConf = 
clientApp.getRealm().getAttrReleasePolicy().getConf();
                 waClientApp.setAttrReleasePolicy(
                         
policyDataBinder.getPolicyTO(clientApp.getRealm().getAttrReleasePolicy()));
             }
-            if (attrReleasePolicyConf instanceof DefaultAttrReleasePolicyConf
-                    && ((DefaultAttrReleasePolicyConf) 
attrReleasePolicyConf).getPrincipalAttrRepoConf() != null) {
-
-                (((DefaultAttrReleasePolicyConf) 
attrReleasePolicyConf).getPrincipalAttrRepoConf()).
-                        getAttrRepos().forEach(key -> {
-                            AttrRepo attrRepo = attrRepoDAO.find(key);
-                            if (attrRepo == null) {
-                                LOG.warn("AttrRepo " + attrRepo + " not 
found");
-                            } else {
-                                attrRepo.getItems().
-                                        forEach(item -> 
waClientApp.getReleaseAttrs().put(
-                                        item.getIntAttrName(), 
item.getExtAttrName()));
-                            }
-                        });
-            }
         } catch (Exception e) {
             LOG.error("While building the configuration from an application's 
policy ", e);
         }
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index d32c8baa49..c2d14891cd 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -943,6 +943,8 @@ public abstract class AbstractITCase {
         policy.setStatus(Boolean.TRUE);
 
         DefaultAttrReleasePolicyConf conf = new DefaultAttrReleasePolicyConf();
+        conf.getReleaseAttrs().put("uid", "username");
+        conf.getReleaseAttrs().put("cn", "fullname");
         conf.getAllowedAttrs().addAll(List.of("cn", "givenName"));
         conf.getIncludeOnlyAttrs().add("cn");
 
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
index 0785f8d3cb..58f1f70439 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthModuleITCase.java
@@ -128,8 +128,6 @@ public class AuthModuleITCase extends AbstractITCase {
                 conf = new JDBCAuthModuleConf();
                 JDBCAuthModuleConf.class.cast(conf).setSql("SELECT * FROM 
table WHERE name=?");
                 
JDBCAuthModuleConf.class.cast(conf).setFieldPassword("password");
-                
JDBCAuthModuleConf.class.cast(conf).getPrincipalAttributeList().addAll(
-                        List.of("sn", "cn:commonName", "givenName"));
                 break;
 
             case OIDC:
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
index d2e6760f05..a6da6138c9 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
@@ -304,7 +304,7 @@ public class GroupITCase extends AbstractITCase {
         try {
             groupService2.update(groupUR);
             fail("This should not happen");
-        } catch (ForbiddenException e) {
+        } catch (Exception e) {
             assertNotNull(e);
         }
 
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/wa/WAClientAppITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/wa/WAClientAppITCase.java
index 24f801b281..9ef5a4389e 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/wa/WAClientAppITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/wa/WAClientAppITCase.java
@@ -31,8 +31,7 @@ import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.lib.policy.AccessPolicyTO;
 import org.apache.syncope.common.lib.policy.AttrReleasePolicyTO;
 import org.apache.syncope.common.lib.policy.AuthPolicyTO;
-import org.apache.syncope.common.lib.to.AuthModuleTO;
-import org.apache.syncope.common.lib.to.Item;
+import org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf;
 import org.apache.syncope.common.lib.to.OIDCRPClientAppTO;
 import org.apache.syncope.common.lib.to.SAML2SPClientAppTO;
 import org.apache.syncope.common.lib.types.ClientAppType;
@@ -113,47 +112,12 @@ public class WAClientAppITCase extends AbstractITCase {
 
         WAClientApp waClientApp = 
WA_CLIENT_APP_SERVICE.read(oidcrpto.getClientAppId(), null);
         assertNotNull(waClientApp);
-        assertTrue(waClientApp.getReleaseAttrs().isEmpty());
-
-        // add items to the authentication module
-        addItems();
-        try {
-            waClientApp = 
WA_CLIENT_APP_SERVICE.read(oidcrpto.getClientAppId(), null);
-            assertNotNull(waClientApp);
-            assertFalse(waClientApp.getReleaseAttrs().isEmpty());
-            assertEquals("username", waClientApp.getReleaseAttrs().get("uid"));
-            assertEquals("fullname", waClientApp.getReleaseAttrs().get("cn"));
-        } finally {
-            removeItems();
-        }
-    }
-
-    private void addItems() {
-        AuthModuleTO authModuleTO = AUTH_MODULE_SERVICE.read(AUTH_MODULE);
-
-        Item keyMapping = new Item();
-        keyMapping.setIntAttrName("uid");
-        keyMapping.setExtAttrName("username");
-        authModuleTO.getItems().add(keyMapping);
-
-        Item fullnameMapping = new Item();
-        fullnameMapping.setIntAttrName("cn");
-        fullnameMapping.setExtAttrName("fullname");
-        authModuleTO.getItems().add(fullnameMapping);
-
-        AUTH_MODULE_SERVICE.update(authModuleTO);
-
-        authModuleTO = AUTH_MODULE_SERVICE.read(AUTH_MODULE);
-        assertFalse(authModuleTO.getItems().isEmpty());
-    }
-
-    private void removeItems() {
-        AuthModuleTO authModuleTO = AUTH_MODULE_SERVICE.read(AUTH_MODULE);
-        authModuleTO.getItems().clear();
-
-        AUTH_MODULE_SERVICE.update(authModuleTO);
+        assertTrue(waClientApp.getAttrReleasePolicy().getConf() instanceof 
DefaultAttrReleasePolicyConf);
 
-        authModuleTO = AUTH_MODULE_SERVICE.read(AUTH_MODULE);
-        assertTrue(authModuleTO.getItems().isEmpty());
+        DefaultAttrReleasePolicyConf attrReleasePolicyConf =
+                (DefaultAttrReleasePolicyConf) 
waClientApp.getAttrReleasePolicy().getConf();
+        assertFalse(attrReleasePolicyConf.getReleaseAttrs().isEmpty());
+        assertEquals("username", 
attrReleasePolicyConf.getReleaseAttrs().get("uid"));
+        assertEquals("fullname", 
attrReleasePolicyConf.getReleaseAttrs().get("cn"));
     }
 }
diff --git 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index 3959370575..b596f3c9c7 100644
--- a/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ b/fit/wa-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import org.apache.commons.lang3.tuple.Triple;
+import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.http.Consts;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
@@ -109,6 +110,8 @@ public abstract class AbstractITCase {
         await().atMost(50, TimeUnit.SECONDS).pollInterval(1, 
TimeUnit.SECONDS).until(() -> {
             boolean refreshed = false;
             try {
+                WebClient.create(WA_ADDRESS + "/idp/metadata").get();
+
                 samlIdPEntityService.get(SAML2IdPEntityService.DEFAULT_OWNER);
                 refreshed = true;
             } catch (Exception e) {
diff --git 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/AbstractSRAITCase.java
 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/AbstractSRAITCase.java
index 51758a9b5b..f4eec00fe4 100644
--- 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/AbstractSRAITCase.java
+++ 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/AbstractSRAITCase.java
@@ -46,7 +46,9 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.util.EntityUtils;
+import org.apache.syncope.common.lib.policy.AttrReleasePolicyTO;
 import org.apache.syncope.common.lib.policy.AuthPolicyTO;
+import org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf;
 import org.apache.syncope.common.lib.policy.DefaultAuthPolicyConf;
 import org.apache.syncope.common.lib.to.SRARouteTO;
 import org.apache.syncope.common.lib.types.PolicyType;
@@ -238,6 +240,37 @@ public abstract class AbstractSRAITCase extends 
AbstractITCase {
                 });
     }
 
+    protected static AttrReleasePolicyTO getAttrReleasePolicy() {
+        String description = "SRA attr release policy";
+
+        return POLICY_SERVICE.list(PolicyType.ATTR_RELEASE).stream().
+                map(AttrReleasePolicyTO.class::cast).
+                filter(policy -> description.equals(policy.getName())
+                && policy.getConf() instanceof DefaultAttrReleasePolicyConf).
+                findFirst().
+                orElseGet(() -> {
+                    DefaultAttrReleasePolicyConf policyConf = new 
DefaultAttrReleasePolicyConf();
+                    policyConf.getAllowedAttrs().add("family_name");
+                    policyConf.getAllowedAttrs().add("name");
+                    policyConf.getAllowedAttrs().add("given_name");
+                    policyConf.getAllowedAttrs().add("email");
+                    policyConf.getAllowedAttrs().add("groups");
+
+                    AttrReleasePolicyTO policy = new AttrReleasePolicyTO();
+                    policy.setName(description);
+                    policy.setConf(policyConf);
+
+                    Response response = 
POLICY_SERVICE.create(PolicyType.ATTR_RELEASE, policy);
+                    if (response.getStatusInfo().getStatusCode() != 
Response.Status.CREATED.getStatusCode()) {
+                        fail("Could not create Test Attr Release Policy");
+                    }
+
+                    return POLICY_SERVICE.read(
+                            PolicyType.ATTR_RELEASE,
+                            
response.getHeaderString(RESTHeaders.RESOURCE_KEY));
+                });
+    }
+
     protected static ObjectNode checkGetResponse(
             final CloseableHttpResponse response, final String 
originalRequestURI) throws IOException {
 
diff --git 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/OIDCSRAITCase.java 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/OIDCSRAITCase.java
index 5cb2c39e49..4203b0a5e0 100644
--- 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/OIDCSRAITCase.java
+++ 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/sra/OIDCSRAITCase.java
@@ -113,9 +113,10 @@ public class OIDCSRAITCase extends AbstractSRAITCase {
         clientApp.setSubjectType(OIDCSubjectType.PUBLIC);
         clientApp.getRedirectUris().clear();
         clientApp.getRedirectUris().add(SRA_ADDRESS + "/login/oauth2/code/" + 
sraRegistrationId);
-        clientApp.setAuthPolicy(getAuthPolicy().getKey());
         clientApp.setSignIdToken(true);
         clientApp.setLogoutUri(SRA_ADDRESS + "/logout");
+        clientApp.setAuthPolicy(getAuthPolicy().getKey());
+        clientApp.setAttrReleasePolicy(getAttrReleasePolicy().getKey());
 
         CLIENT_APP_SERVICE.update(ClientAppType.OIDCRP, clientApp);
         CLIENT_APP_SERVICE.pushToWA();
diff --git 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/AbstractUIITCase.java
 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/AbstractUIITCase.java
index 4d1db40dea..bdbf909069 100644
--- 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/AbstractUIITCase.java
+++ 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/AbstractUIITCase.java
@@ -83,6 +83,11 @@ public abstract class AbstractUIITCase extends 
AbstractITCase {
                 orElseGet(() -> {
                     DefaultAttrReleasePolicyConf policyConf = new 
DefaultAttrReleasePolicyConf();
                     
policyConf.getPrincipalAttrRepoConf().getAttrRepos().add(stubAttrRepo);
+                    policyConf.getReleaseAttrs().put("attr1", "identifier");
+                    policyConf.getReleaseAttrs().put("firstname", "givenName");
+                    policyConf.getReleaseAttrs().put("surname", "sn");
+                    policyConf.getReleaseAttrs().put("fullname", "cn");
+                    policyConf.getReleaseAttrs().put("email", "mail");
 
                     AttrReleasePolicyTO policy = new AttrReleasePolicyTO();
                     policy.setName(description);
diff --git 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
index dc2217e73a..2e10162a17 100644
--- 
a/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
+++ 
b/fit/wa-reference/src/test/java/org/apache/syncope/fit/ui/SAML2SP4UIITCase.java
@@ -262,6 +262,10 @@ public class SAML2SP4UIITCase extends AbstractUIITCase {
             }
         }
 
+        if (location.startsWith("http://localhost:8080/syncope-wa";)) {
+            location = WA_ADDRESS + StringUtils.substringAfter(location, 
"http://localhost:8080/syncope-wa";);
+        }
+
         get = new HttpGet(location);
         get.addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_HTML);
         get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, EN_LANGUAGE);
diff --git a/pom.xml b/pom.xml
index 71d729e5ee..1644372351 100644
--- a/pom.xml
+++ b/pom.xml
@@ -413,7 +413,7 @@ under the License.
 
     <cxf.version>3.5.5</cxf.version>
     <bouncycastle.version>1.70</bouncycastle.version>
-    <nimbus-jose-jwt.version>9.30.1</nimbus-jose-jwt.version>
+    <nimbus-jose-jwt.version>9.31</nimbus-jose-jwt.version>
 
     <spring-boot.version>2.7.9</spring-boot.version>
     <spring-cloud-gateway.version>3.1.5</spring-cloud-gateway.version>
@@ -443,7 +443,7 @@ under the License.
 
     <pac4j.version>5.5.0</pac4j.version>
 
-    <cas.version>6.6.6</cas.version>
+    <cas.version>6.6.7-SNAPSHOT</cas.version>
     <cas-client.version>3.6.4</cas-client.version>
 
     <h2.version>2.1.214</h2.version>
diff --git 
a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AttrRepoPropertySourceMapper.java
 
b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AttrRepoPropertySourceMapper.java
index e42ee01dba..28e0e239ea 100644
--- 
a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AttrRepoPropertySourceMapper.java
+++ 
b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AttrRepoPropertySourceMapper.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.wa.bootstrap;
 
 import java.util.Map;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.attr.AttrRepoConf;
@@ -27,6 +28,7 @@ import org.apache.syncope.common.lib.attr.LDAPAttrRepoConf;
 import org.apache.syncope.common.lib.attr.StubAttrRepoConf;
 import org.apache.syncope.common.lib.attr.SyncopeAttrRepoConf;
 import org.apache.syncope.common.lib.to.AttrRepoTO;
+import org.apache.syncope.common.lib.to.Item;
 import org.apereo.cas.configuration.CasCoreConfigurationUtils;
 import 
org.apereo.cas.configuration.model.core.authentication.AttributeRepositoryStates;
 import 
org.apereo.cas.configuration.model.core.authentication.StubPrincipalAttributesProperties;
@@ -59,9 +61,10 @@ public class AttrRepoPropertySourceMapper extends 
PropertySourceMapper implement
         props.setId(attrRepoTO.getKey());
         
props.setState(AttributeRepositoryStates.valueOf(attrRepoTO.getState().name()));
         props.setOrder(attrRepoTO.getOrder());
-        props.setAttributes(conf.getAttributes());
         props.setUseAllQueryAttributes(conf.isUseAllQueryAttributes());
         props.setQueryAttributes(conf.getQueryAttributes());
+        props.setAttributes(attrRepoTO.getItems().stream().
+                collect(Collectors.toMap(Item::getIntAttrName, 
Item::getExtAttrName)));
         fill(props, conf);
 
         return prefix("cas.authn.attribute-repository.ldap[].", 
CasCoreConfigurationUtils.asMap(props));
@@ -80,9 +83,10 @@ public class AttrRepoPropertySourceMapper extends 
PropertySourceMapper implement
         props.setQueryType(conf.getQueryType().name());
         props.setColumnMappings(conf.getColumnMappings());
         props.setUsername(conf.getUsername());
-        props.setAttributes(conf.getAttributes());
         
props.setCaseInsensitiveQueryAttributes(conf.getCaseInsensitiveQueryAttributes());
         props.setQueryAttributes(conf.getQueryAttributes());
+        props.setAttributes(attrRepoTO.getItems().stream().
+                collect(Collectors.toMap(Item::getIntAttrName, 
Item::getExtAttrName)));
         fill(props, conf);
 
         return prefix("cas.authn.attribute-repository.jdbc[].", 
CasCoreConfigurationUtils.asMap(props));
@@ -106,6 +110,8 @@ public class AttrRepoPropertySourceMapper extends 
PropertySourceMapper implement
         props.setBasicAuthUsername(conf.getBasicAuthUsername());
         props.setBasicAuthPassword(conf.getBasicAuthPassword());
         props.setHeaders(props.getHeaders());
+        props.setAttributeMappings(attrRepoTO.getItems().
+                stream().collect(Collectors.toMap(Item::getIntAttrName, 
Item::getExtAttrName)));
 
         return prefix("cas.authn.attribute-repository.syncope.", 
CasCoreConfigurationUtils.asMap(props));
     }
diff --git 
a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AuthModulePropertySourceMapper.java
 
b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AuthModulePropertySourceMapper.java
index 395a5d08bd..3b124dd4a9 100644
--- 
a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AuthModulePropertySourceMapper.java
+++ 
b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/AuthModulePropertySourceMapper.java
@@ -38,6 +38,7 @@ import 
org.apache.syncope.common.lib.auth.StaticAuthModuleConf;
 import org.apache.syncope.common.lib.auth.SyncopeAuthModuleConf;
 import org.apache.syncope.common.lib.auth.U2FAuthModuleConf;
 import org.apache.syncope.common.lib.to.AuthModuleTO;
+import org.apache.syncope.common.lib.to.Item;
 import org.apache.syncope.common.lib.types.AuthModuleState;
 import org.apereo.cas.configuration.CasCoreConfigurationUtils;
 import 
org.apereo.cas.configuration.model.core.authentication.AuthenticationHandlerStates;
@@ -91,7 +92,8 @@ public class AuthModulePropertySourceMapper extends 
PropertySourceMapper impleme
             
props.setType(AbstractLdapAuthenticationProperties.AuthenticationTypes.AUTHENTICATED);
         }
         props.setPrincipalAttributeId(conf.getUserIdAttribute());
-        props.setPrincipalAttributeList(conf.getPrincipalAttributeList());
+        props.setPrincipalAttributeList(authModuleTO.getItems().stream().
+                map(item -> item.getIntAttrName() + ":" + 
item.getExtAttrName()).collect(Collectors.toList()));
         fill(props, conf);
 
         return prefix("cas.authn.ldap[].", 
CasCoreConfigurationUtils.asMap(props));
@@ -107,7 +109,8 @@ public class AuthModulePropertySourceMapper extends 
PropertySourceMapper impleme
         props.setFieldDisabled(conf.getFieldDisabled());
         props.setFieldExpired(conf.getFieldExpired());
         props.setFieldPassword(conf.getFieldPassword());
-        props.setPrincipalAttributeList(conf.getPrincipalAttributeList());
+        props.setPrincipalAttributeList(authModuleTO.getItems().stream().
+                map(item -> item.getIntAttrName() + ":" + 
item.getExtAttrName()).collect(Collectors.toList()));
         fill(props, conf);
 
         return prefix("cas.authn.jdbc.query[].", 
CasCoreConfigurationUtils.asMap(props));
@@ -167,7 +170,9 @@ public class AuthModulePropertySourceMapper extends 
PropertySourceMapper impleme
         props.setScope(conf.getScope());
         props.setPrincipalAttributeId(conf.getUserIdAttribute());
         props.setWithState(conf.isWithState());
-        
+        props.setProfileAttrs(authModuleTO.getItems().stream().
+                collect(Collectors.toMap(Item::getIntAttrName, 
Item::getExtAttrName)));
+
         return prefix("cas.authn.pac4j.oauth2[].", 
CasCoreConfigurationUtils.asMap(props));
     }
 
@@ -215,6 +220,8 @@ public class AuthModulePropertySourceMapper extends 
PropertySourceMapper impleme
         
props.setState(AuthenticationHandlerStates.valueOf(authModuleTO.getState().name()));
         props.setDomain(conf.getDomain());
         props.setUrl(StringUtils.substringBefore(syncopeClient.getAddress(), 
"/rest"));
+        props.setAttributeMappings(authModuleTO.getItems().stream().
+                collect(Collectors.toMap(Item::getIntAttrName, 
Item::getExtAttrName)));
 
         return prefix("cas.authn.syncope.", 
CasCoreConfigurationUtils.asMap(props));
     }
diff --git 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/AttrReleaseMapper.java
 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/AttrReleaseMapper.java
index 8517c46c5e..8a63943fac 100644
--- 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/AttrReleaseMapper.java
+++ 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/AttrReleaseMapper.java
@@ -18,12 +18,11 @@
  */
 package org.apache.syncope.wa.starter.mapping;
 
-import java.util.Map;
 import org.apache.syncope.common.lib.policy.AttrReleasePolicyTO;
 import org.apereo.cas.services.RegisteredServiceAttributeReleasePolicy;
 
 @FunctionalInterface
 public interface AttrReleaseMapper {
 
-    RegisteredServiceAttributeReleasePolicy build(AttrReleasePolicyTO policy, 
Map<String, Object> releaseAttrs);
+    RegisteredServiceAttributeReleasePolicy build(AttrReleasePolicyTO policy);
 }
diff --git 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/DefaultAttrReleaseMapper.java
 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/DefaultAttrReleaseMapper.java
index 0a8334cbf9..ecca60f82c 100644
--- 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/DefaultAttrReleaseMapper.java
+++ 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/DefaultAttrReleaseMapper.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.wa.starter.mapping;
 
 import java.util.HashSet;
-import java.util.Map;
 import org.apache.syncope.common.lib.policy.AttrReleasePolicyTO;
 import org.apache.syncope.common.lib.policy.DefaultAttrReleasePolicyConf;
 import 
org.apereo.cas.authentication.principal.DefaultPrincipalAttributesRepository;
@@ -39,15 +38,13 @@ import org.apereo.cas.util.model.TriStateBoolean;
 public class DefaultAttrReleaseMapper implements AttrReleaseMapper {
 
     @Override
-    public RegisteredServiceAttributeReleasePolicy build(
-            final AttrReleasePolicyTO policy, final Map<String, Object> 
releaseAttrs) {
-
+    public RegisteredServiceAttributeReleasePolicy build(final 
AttrReleasePolicyTO policy) {
         DefaultAttrReleasePolicyConf conf = (DefaultAttrReleasePolicyConf) 
policy.getConf();
 
         ReturnMappedAttributeReleasePolicy returnMapped = null;
-        if (!releaseAttrs.isEmpty()) {
+        if (!conf.getReleaseAttrs().isEmpty()) {
             returnMapped = new ReturnMappedAttributeReleasePolicy();
-            returnMapped.setAllowedAttributes(releaseAttrs);
+            returnMapped.setAllowedAttributes(conf.getReleaseAttrs());
         }
 
         ReturnAllowedAttributeReleasePolicy returnAllowed = null;
@@ -68,9 +65,7 @@ public class DefaultAttrReleaseMapper implements 
AttrReleaseMapper {
         DefaultRegisteredServiceConsentPolicy consentPolicy = new 
DefaultRegisteredServiceConsentPolicy(
                 new HashSet<>(conf.getExcludedAttrs()), new 
HashSet<>(conf.getIncludeOnlyAttrs()));
         consentPolicy.setOrder(policy.getOrder());
-        consentPolicy.setStatus(policy.getStatus() == null
-                ? TriStateBoolean.UNDEFINED
-                : TriStateBoolean.fromBoolean(policy.getStatus()));
+        
consentPolicy.setStatus(TriStateBoolean.fromBoolean(policy.getStatus()));
         attributeReleasePolicy.setConsentPolicy(consentPolicy);
 
         if (conf.getPrincipalIdAttr() != null) {
diff --git 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
index 913999d849..290e9762c5 100644
--- 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
+++ 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
@@ -34,6 +34,7 @@ import 
org.apereo.cas.oidc.claims.OidcCustomScopeAttributeReleasePolicy;
 import org.apereo.cas.oidc.claims.OidcEmailScopeAttributeReleasePolicy;
 import org.apereo.cas.oidc.claims.OidcPhoneScopeAttributeReleasePolicy;
 import org.apereo.cas.oidc.claims.OidcProfileScopeAttributeReleasePolicy;
+import org.apereo.cas.services.BaseMappedAttributeReleasePolicy;
 import org.apereo.cas.services.ChainingAttributeReleasePolicy;
 import org.apereo.cas.services.OidcRegisteredService;
 import org.apereo.cas.services.RegisteredService;
@@ -41,6 +42,7 @@ import 
org.apereo.cas.services.RegisteredServiceAccessStrategy;
 import org.apereo.cas.services.RegisteredServiceAttributeReleasePolicy;
 import org.apereo.cas.services.RegisteredServiceAuthenticationPolicy;
 import org.apereo.cas.services.RegisteredServiceMultifactorPolicy;
+import org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy;
 import org.springframework.context.ConfigurableApplicationContext;
 
 @ClientAppMapFor(clientAppClass = OIDCRPClientAppTO.class)
@@ -91,12 +93,25 @@ public class OIDCRPClientAppTOMapper extends 
AbstractClientAppMapper {
             }
 
             chain.addPolicies(new OidcProfileScopeAttributeReleasePolicy(),
-                new OidcEmailScopeAttributeReleasePolicy(),
-                new OidcAddressScopeAttributeReleasePolicy(),
-                new OidcPhoneScopeAttributeReleasePolicy());
+                    new OidcEmailScopeAttributeReleasePolicy(),
+                    new OidcAddressScopeAttributeReleasePolicy(),
+                    new OidcPhoneScopeAttributeReleasePolicy());
 
-            Set<String> customClaims = 
clientApp.getReleaseAttrs().values().stream().
-                    
map(Objects::toString).collect(Collectors.toCollection(HashSet::new));
+            Set<String> customClaims = new HashSet<>();
+            if (attributeReleasePolicy instanceof 
BaseMappedAttributeReleasePolicy) {
+                customClaims.addAll(((BaseMappedAttributeReleasePolicy) 
attributeReleasePolicy).
+                        getAllowedAttributes().values().stream().
+                        map(Objects::toString).collect(Collectors.toSet()));
+            } else if (attributeReleasePolicy instanceof 
ReturnAllowedAttributeReleasePolicy) {
+                customClaims.addAll(((ReturnAllowedAttributeReleasePolicy) 
attributeReleasePolicy).
+                        
getAllowedAttributes().stream().collect(Collectors.toSet()));
+            } else if (attributeReleasePolicy instanceof 
ChainingAttributeReleasePolicy) {
+                ((ChainingAttributeReleasePolicy) 
attributeReleasePolicy).getPolicies().stream().
+                        
filter(ReturnAllowedAttributeReleasePolicy.class::isInstance).
+                        
findFirst().map(ReturnAllowedAttributeReleasePolicy.class::cast).
+                        map(p -> 
p.getAllowedAttributes().stream().collect(Collectors.toSet())).
+                        ifPresent(customClaims::addAll);
+            }
             
customClaims.removeAll(OidcProfileScopeAttributeReleasePolicy.ALLOWED_CLAIMS);
             
customClaims.removeAll(OidcEmailScopeAttributeReleasePolicy.ALLOWED_CLAIMS);
             
customClaims.removeAll(OidcAddressScopeAttributeReleasePolicy.ALLOWED_CLAIMS);
diff --git 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/RegisteredServiceMapper.java
 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/RegisteredServiceMapper.java
index 954d7c8fc5..b8000e536f 100644
--- 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/RegisteredServiceMapper.java
+++ 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/RegisteredServiceMapper.java
@@ -125,7 +125,7 @@ public class RegisteredServiceMapper {
                 attrReleasePolicyTO.getConf().getClass().getName());
         RegisteredServiceAttributeReleasePolicy attributeReleasePolicy =
                 Optional.ofNullable(attrReleasePolicyConfMapper).
-                        map(mapper -> mapper.build(attrReleasePolicyTO, 
clientApp.getReleaseAttrs())).
+                        map(mapper -> mapper.build(attrReleasePolicyTO)).
                         orElse(null);
 
         return clientAppMapper.map(ctx, clientApp, authPolicy, mfaPolicy, 
accessStrategy, attributeReleasePolicy);
diff --git 
a/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
 
b/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
index 9e94aa2a10..d4733ed0af 100644
--- 
a/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
+++ 
b/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
@@ -53,7 +53,6 @@ import org.apereo.cas.services.OidcRegisteredService;
 import org.apereo.cas.services.RegisteredService;
 import org.apereo.cas.services.RegisteredServiceAccessStrategy;
 import org.apereo.cas.services.RegisteredServiceDelegatedAuthenticationPolicy;
-import org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy;
 import org.apereo.cas.services.ServicesManager;
 import org.apereo.cas.support.saml.services.SamlRegisteredService;
 import org.apereo.cas.util.RandomUtils;
@@ -95,7 +94,6 @@ public class WAServiceRegistryTest extends AbstractTest {
 
     private static void addPolicies(
             final WAClientApp waClientApp,
-            final boolean withReleaseAttributes,
             final boolean withAttrReleasePolicy) {
 
         DefaultAuthPolicyConf authPolicyConf = new DefaultAuthPolicyConf();
@@ -106,10 +104,6 @@ public class WAServiceRegistryTest extends AbstractTest {
 
         waClientApp.setAuthPolicy(authPolicy);
 
-        if (withReleaseAttributes) {
-            waClientApp.getReleaseAttrs().putAll(Map.of("uid", "username", 
"cn", "fullname"));
-        }
-
         AccessPolicyTO accessPolicy = new AccessPolicyTO();
         DefaultAccessPolicyConf accessPolicyConf = new 
DefaultAccessPolicyConf();
         accessPolicyConf.setEnabled(true);
@@ -121,6 +115,7 @@ public class WAServiceRegistryTest extends AbstractTest {
             DefaultAttrReleasePolicyConf attrReleasePolicyConf = new 
DefaultAttrReleasePolicyConf();
             attrReleasePolicyConf.getAllowedAttrs().add("cn");
             
attrReleasePolicyConf.getPrincipalAttrRepoConf().getAttrRepos().add("TestAttrRepo");
+            attrReleasePolicyConf.getReleaseAttrs().putAll(Map.of("uid", 
"username", "cn", "fullname"));
 
             AttrReleasePolicyTO attrReleasePolicy = new AttrReleasePolicyTO();
             attrReleasePolicy.setConf(attrReleasePolicyConf);
@@ -155,7 +150,7 @@ public class WAServiceRegistryTest extends AbstractTest {
         WAClientApp waClientApp = new WAClientApp();
         waClientApp.setClientAppTO(buildOIDCRP());
         Long clientAppId = waClientApp.getClientAppTO().getClientAppId();
-        addPolicies(waClientApp, false, false);
+        addPolicies(waClientApp, false);
 
         SyncopeCoreTestingServer.CLIENT_APPS.add(waClientApp);
         List<WAClientApp> apps = service.list();
@@ -185,7 +180,7 @@ public class WAServiceRegistryTest extends AbstractTest {
         waClientApp = new WAClientApp();
         waClientApp.setClientAppTO(buildSAML2SP());
         clientAppId = waClientApp.getClientAppTO().getClientAppId();
-        addPolicies(waClientApp, false, true);
+        addPolicies(waClientApp, true);
 
         SyncopeCoreTestingServer.CLIENT_APPS.add(waClientApp);
         apps = service.list();
@@ -202,12 +197,12 @@ public class WAServiceRegistryTest extends AbstractTest {
         assertEquals(samlspto.getEntityId(), saml.getServiceId());
         
assertTrue(saml.getAuthenticationPolicy().getRequiredAuthenticationHandlers().contains("TestAuthModule"));
         assertNotNull(found.getAccessStrategy());
-        assertTrue(saml.getAttributeReleasePolicy() instanceof 
ReturnAllowedAttributeReleasePolicy);
+        assertTrue(saml.getAttributeReleasePolicy() instanceof 
ChainingAttributeReleasePolicy);
 
         waClientApp = new WAClientApp();
         waClientApp.setClientAppTO(buildSAML2SP());
         clientAppId = waClientApp.getClientAppTO().getClientAppId();
-        addPolicies(waClientApp, false, false);
+        addPolicies(waClientApp, false);
 
         SyncopeCoreTestingServer.CLIENT_APPS.add(waClientApp);
         apps = service.list();
@@ -246,7 +241,7 @@ public class WAServiceRegistryTest extends AbstractTest {
         waClientApp.setClientAppTO(buildOIDCRP());
         waClientApp.getAuthModules().add(0, authModuleTO);
         Long clientAppId = waClientApp.getClientAppTO().getClientAppId();
-        addPolicies(waClientApp, false, false);
+        addPolicies(waClientApp, false);
         DefaultAuthPolicyConf authPolicyConf = (DefaultAuthPolicyConf) 
waClientApp.getAuthPolicy().getConf();
         authPolicyConf.getAuthModules().clear();
         authPolicyConf.getAuthModules().add(authModuleTO.getKey());


Reply via email to