From a62dda652da6f843856e0d6715336e7d2932520b Mon Sep 17 00:00:00 2001
From: Serhii Tsymbaliuk <stsymbal@redhat.com>
Date: Thu, 13 May 2021 17:14:32 +0200
Subject: [PATCH 1/2] WebUI: Add support of 'ipaautoprivategroups' LDAP
 attribute on 'ID Ranges' page

Add 'Auto private groups' field on 'Add ID range' form with the following options: true, false, hybrid.
The field is optional and can be omitted.
Its value can be also modified on 'Range Settings' page after the range is added.

Ticket: https://pagure.io/freeipa/issue/8837

Signed-off-by: Serhii Tsymbaliuk <stsymbal@redhat.com>
---
 install/ui/src/freeipa/idrange.js | 21 +++++++++++++++++++--
 ipaserver/plugins/internal.py     |  1 +
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/install/ui/src/freeipa/idrange.js b/install/ui/src/freeipa/idrange.js
index bcddc941394..0f6c4dc7a8b 100644
--- a/install/ui/src/freeipa/idrange.js
+++ b/install/ui/src/freeipa/idrange.js
@@ -28,7 +28,7 @@ define([
         './search',
         './association',
         './entity'],
-            function(on, IPA, $, phases, reg) {
+            function(on, IPA, $, phases, reg, mod_details) {
 
 var exp = IPA.idrange = {};
 
@@ -82,6 +82,13 @@ return {
                             name: 'ipanttrusteddomainsid',
                             label: '@i18n:objects.idrange.ipanttrusteddomainsid',
                             title: '@mo-param:idrange:ipanttrusteddomainsid:label'
+                        },
+                        {
+                            name: 'ipaautoprivategroups',
+                            $type: 'select',
+                            label: '@i18n:objects.idrange.ipaautoprivategroups',
+                            title: '@mo-param:idrange:ipaautoprivategroups:label',
+                            options: IPA.create_options(['', 'true', 'false', 'hybrid'])
                         }
                     ]
                 }
@@ -141,7 +148,14 @@ return {
             {
                 name: 'ipanttrusteddomainname',
                 enabled: false
-            }
+            },
+            {
+                name: 'ipaautoprivategroups',
+                $type: 'select',
+                label: '@i18n:objects.idrange.ipaautoprivategroups',
+                default_value: '',
+                options: IPA.create_options(['', 'true', 'false', 'hybrid'])
+            },
         ],
         policies: [
                 IPA.idrange_adder_policy
@@ -210,6 +224,7 @@ IPA.idrange_adder_policy = function(spec) {
         var baserid_f = that.container.fields.get_field('ipabaserid');
         var secondarybaserid_f = that.container.fields.get_field('ipasecondarybaserid');
         var trusteddomainname_f = that.container.fields.get_field('ipanttrusteddomainname');
+        var autoprivategroups_f = that.container.fields.get_field('ipaautoprivategroups');
 
         var type_v = type_f.get_value()[0];
         var baserid_v = baserid_f.get_value()[0] || '';
@@ -224,9 +239,11 @@ IPA.idrange_adder_policy = function(spec) {
                 disable(baserid_f);
             }
             require(trusteddomainname_f);
+            enable(autoprivategroups_f);
             disable(secondarybaserid_f);
         } else {
             disable(trusteddomainname_f);
+            disable(autoprivategroups_f);
 
             if (IPA.trust_enabled) {
                 require(baserid_f);
diff --git a/ipaserver/plugins/internal.py b/ipaserver/plugins/internal.py
index 7b61e527eb7..70164eb8654 100644
--- a/ipaserver/plugins/internal.py
+++ b/ipaserver/plugins/internal.py
@@ -1236,6 +1236,7 @@ class i18n_messages(Command):
             "idrange": {
                 "add": _("Add ID range"),
                 "details": _("Range Settings"),
+                "ipaautoprivategroups": _("Auto private groups"),
                 "ipabaseid": _("Base ID"),
                 "ipabaserid": _("Primary RID base"),
                 "ipaidrangesize": _("Range size"),

From a3004b34cbfcd1e2ec5cea8396aa055fd2da0c34 Mon Sep 17 00:00:00 2001
From: Serhii Tsymbaliuk <stsymbal@redhat.com>
Date: Thu, 13 May 2021 17:33:06 +0200
Subject: [PATCH 2/2] WebUI tests: Add test for 'ipaautoprivategroups' field on
 'ID Ranges' page

Add test_range_auto_private_groups test case to test_trust WebUI test suite to cover the field.

Ticket: https://pagure.io/freeipa/issue/8837

Signed-off-by: Serhii Tsymbaliuk <stsymbal@redhat.com>
---
 ipatests/test_webui/task_range.py |  9 +++++++-
 ipatests/test_webui/test_trust.py | 36 +++++++++++++++++++++++++++++--
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/ipatests/test_webui/task_range.py b/ipatests/test_webui/task_range.py
index a02a39c1482..db34f6f11df 100644
--- a/ipatests/test_webui/task_range.py
+++ b/ipatests/test_webui/task_range.py
@@ -147,6 +147,7 @@ def get_add_form_data(self, pkey, range_type=LOCAL_ID_RANGE, size=50,
             range_type=range_type,
             size=size,
             domain=domain,
+            auto_private_groups=kwargs.get('auto_private_groups'),
             callback=self.check_range_type_mod
         )
 
@@ -173,7 +174,7 @@ class RangeAddFormData:
 
     def __init__(self, cn, base_id, base_rid=None, secondary_base_rid=None,
                  range_type=LOCAL_ID_RANGE, size=50, domain=None,
-                 callback=None):
+                 auto_private_groups='', callback=None):
         self.cn = cn
         self.base_id = base_id
         self.base_rid = base_rid
@@ -181,6 +182,7 @@ def __init__(self, cn, base_id, base_rid=None, secondary_base_rid=None,
         self.range_type = range_type
         self.size = size
         self.domain = domain
+        self.auto_private_groups = auto_private_groups
         self.callback = callback
 
     def serialize(self):
@@ -203,6 +205,11 @@ def serialize(self):
                                'ipasecondarybaserid',
                                str(self.secondary_base_rid)))
 
+        if self.range_type != LOCAL_ID_RANGE:
+            serialized.append(('selectbox',
+                               'ipaautoprivategroups',
+                               self.auto_private_groups))
+
         return serialized
 
 
diff --git a/ipatests/test_webui/test_trust.py b/ipatests/test_webui/test_trust.py
index 605f8a2a78f..0dad1ebae47 100644
--- a/ipatests/test_webui/test_trust.py
+++ b/ipatests/test_webui/test_trust.py
@@ -21,12 +21,13 @@
 Trust tests
 """
 
+import pytest
+
 import ipatests.test_webui.data_group as group
 import ipatests.test_webui.data_idviews as idview
 from ipatests.test_webui.ui_driver import UI_driver
 from ipatests.test_webui.ui_driver import screenshot
-from ipatests.test_webui.task_range import range_tasks
-import pytest
+from ipatests.test_webui.task_range import TRUSTED_ID_RANGE, range_tasks
 
 ENTITY = 'trust'
 CONFIG_ENTITY = 'trustconfig'
@@ -160,6 +161,37 @@ def test_range_types(self):
         self.assert_record_value('Active Directory trust range with POSIX attributes', range_pkey, column)
         self.delete_record(range_pkey)
 
+    @screenshot
+    def test_range_auto_private_groups(self):
+        self.init_app()
+
+        r_tasks = range_tasks()
+        r_tasks.driver = self.driver
+        r_tasks.config = self.config
+        r_tasks.get_shifts()
+
+        trust_data = self.get_data()
+        self.add_record(ENTITY, trust_data, navigate=True)
+
+        range_pkeys = []
+        try:
+            for auto_private_groups in ['true', 'false', 'hybrid']:
+                pkey = 'itest-range-apg-{}'.format(auto_private_groups)
+                form_data = r_tasks.get_add_form_data(
+                    pkey,
+                    range_type=TRUSTED_ID_RANGE,
+                    domain=trust_data['pkey'],
+                    auto_private_groups=auto_private_groups
+                )
+                range_data = r_tasks.get_data(pkey, form_data=form_data)
+                self.add_record('idrange', range_data, navigate=True)
+                range_pkeys.append(pkey)
+        finally:
+            self.navigate_to_entity(ENTITY)
+            self.delete_record(trust_data['pkey'])
+            self.navigate_to_entity('idrange')
+            self.delete_record(range_pkeys)
+
     @screenshot
     def test_config_mod(self):
 
