Blame SOURCES/0001-WebUI-Fix-IPA-Error-3007-RequirmentError-while-addin_rhbz#1757045.patch

ec5dc4
From c2ba333b9681d008d9c528a79dbdd76ce11a3ecd Mon Sep 17 00:00:00 2001
ec5dc4
From: Serhii Tsymbaliuk <stsymbal@redhat.com>
ec5dc4
Date: Thu, 28 May 2020 08:47:49 +0200
ec5dc4
Subject: [PATCH 01/22] WebUI: Fix "IPA Error 3007: RequirmentError" while
ec5dc4
 adding idoverrideuser association
ec5dc4
ec5dc4
Add builder for association adder dialog which allows to override behavior of the component.
ec5dc4
Replace default implementation with a custom one for idoverrideuser.
ec5dc4
Replace text filter with 'ID view' select box in the idoverrideuser dialog.
ec5dc4
ec5dc4
Ticket: https://pagure.io/freeipa/issue/8335
ec5dc4
ec5dc4
Signed-off-by: Serhii Tsymbaliuk <stsymbal@redhat.com>
ec5dc4
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
ec5dc4
---
ec5dc4
 install/ui/src/freeipa/association.js | 13 ++++-
ec5dc4
 install/ui/src/freeipa/dialog.js      | 73 ++++++++++++++++-----------
ec5dc4
 install/ui/src/freeipa/group.js       | 14 +++++
ec5dc4
 install/ui/src/freeipa/idviews.js     | 58 +++++++++++++++++++++
ec5dc4
 ipaserver/plugins/internal.py         |  6 +++
ec5dc4
 5 files changed, 133 insertions(+), 31 deletions(-)
ec5dc4
ec5dc4
diff --git a/install/ui/src/freeipa/association.js b/install/ui/src/freeipa/association.js
ec5dc4
index f10ccb2a5..b083a79f9 100644
ec5dc4
--- a/install/ui/src/freeipa/association.js
ec5dc4
+++ b/install/ui/src/freeipa/association.js
ec5dc4
@@ -25,6 +25,7 @@
ec5dc4
 define([
ec5dc4
     'dojo/_base/lang',
ec5dc4
     'dojo/Deferred',
ec5dc4
+    './builder',
ec5dc4
     './metadata',
ec5dc4
     './ipa',
ec5dc4
     './jquery',
ec5dc4
@@ -38,7 +39,7 @@ define([
ec5dc4
     './facet',
ec5dc4
     './search',
ec5dc4
     './dialog'],
ec5dc4
-        function(lang, Deferred, metadata_provider, IPA, $, metadata,
ec5dc4
+        function(lang, Deferred, builder, metadata_provider, IPA, $, metadata,
ec5dc4
                  navigation, phases, reg, rpc, su, text) {
ec5dc4
 
ec5dc4
 /**
ec5dc4
@@ -1209,7 +1210,8 @@ exp.association_facet = IPA.association_facet = function (spec, no_init) {
ec5dc4
 
ec5dc4
         var pkeys = that.data.result.result[that.get_attribute_name()];
ec5dc4
 
ec5dc4
-        var dialog = IPA.association_adder_dialog({
ec5dc4
+        var dialog = builder.build('association_adder_dialog', {
ec5dc4
+            $type: that.other_entity.name,
ec5dc4
             title: title,
ec5dc4
             entity: that.entity,
ec5dc4
             pkey: pkey,
ec5dc4
@@ -1675,6 +1677,13 @@ IPA.attr_read_only_evaluator = function(spec) {
ec5dc4
     return that;
ec5dc4
 };
ec5dc4
 
ec5dc4
+// Create a registry for adder dialogs where key is name of 'other entity'.
ec5dc4
+// It allows to override dialogs for some specific cases of association
ec5dc4
+// creation.
ec5dc4
+var dialog_builder = builder.get('association_adder_dialog');
ec5dc4
+dialog_builder.factory = IPA.association_adder_dialog;
ec5dc4
+reg.set('association_adder_dialog', dialog_builder.registry);
ec5dc4
+
ec5dc4
 phases.on('registration', function() {
ec5dc4
     var w = reg.widget;
ec5dc4
     var f = reg.field;
ec5dc4
diff --git a/install/ui/src/freeipa/dialog.js b/install/ui/src/freeipa/dialog.js
ec5dc4
index c153120df..d67d63b6d 100644
ec5dc4
--- a/install/ui/src/freeipa/dialog.js
ec5dc4
+++ b/install/ui/src/freeipa/dialog.js
ec5dc4
@@ -919,35 +919,7 @@ IPA.adder_dialog = function(spec) {
ec5dc4
             'class': 'input-group col-md-12 adder-dialog-top'
ec5dc4
         }).appendTo(container);
ec5dc4
 
ec5dc4
-        var filter_placeholder = text.get('@i18n:association.filter_placeholder');
ec5dc4
-        filter_placeholder = filter_placeholder.replace('${other_entity}',
ec5dc4
-            that.other_entity.metadata.label);
ec5dc4
-
ec5dc4
-        that.filter_field = $('<input/>', {
ec5dc4
-            type: 'text',
ec5dc4
-            name: 'filter',
ec5dc4
-            'class': 'form-control',
ec5dc4
-            'placeholder': filter_placeholder,
ec5dc4
-            keyup: function(event) {
ec5dc4
-                if (event.keyCode === keys.ENTER) {
ec5dc4
-                    that.search();
ec5dc4
-                    return false;
ec5dc4
-                }
ec5dc4
-            }
ec5dc4
-        }).appendTo(input_group);
ec5dc4
-
ec5dc4
-        var input_group_btn = $('
', {
ec5dc4
-            'class': 'input-group-btn'
ec5dc4
-        }).appendTo(input_group);
ec5dc4
-
ec5dc4
-        that.find_button = IPA.button({
ec5dc4
-            name: 'find',
ec5dc4
-            label: '@i18n:buttons.filter',
ec5dc4
-            click: function() {
ec5dc4
-                that.search();
ec5dc4
-                return false;
ec5dc4
-            }
ec5dc4
-        }).appendTo(input_group_btn);
ec5dc4
+        that.filter_field = that.get_filter_field(input_group);
ec5dc4
 
ec5dc4
         var row = $('
', { 'class': 'row adder-dialog-main'}).appendTo(container);
ec5dc4
         //
ec5dc4
@@ -1132,6 +1104,49 @@ IPA.adder_dialog = function(spec) {
ec5dc4
         return that.filter_field.val();
ec5dc4
     };
ec5dc4
 
ec5dc4
+    /**
ec5dc4
+     * Return field for filtering available items
ec5dc4
+     *
ec5dc4
+     * Default implementation returns text input + "Filter" button.
ec5dc4
+     * It can be overridden.
ec5dc4
+     *
ec5dc4
+     * @param {HTMLElement} input_group - container for a filter field
ec5dc4
+     * @return {HTMLElement}
ec5dc4
+     */
ec5dc4
+    that.get_filter_field = function(input_group) {
ec5dc4
+        var filter_placeholder = text.get(
ec5dc4
+            '@i18n:association.filter_placeholder'
ec5dc4
+        ).replace('${other_entity}', that.other_entity.metadata.label);
ec5dc4
+
ec5dc4
+        var filter_field = $('<input/>', {
ec5dc4
+            type: 'text',
ec5dc4
+            name: 'filter',
ec5dc4
+            'class': 'form-control',
ec5dc4
+            'placeholder': filter_placeholder,
ec5dc4
+            keyup: function(event) {
ec5dc4
+                if (event.keyCode === keys.ENTER) {
ec5dc4
+                    that.search();
ec5dc4
+                    return false;
ec5dc4
+                }
ec5dc4
+            }
ec5dc4
+        }).appendTo(input_group);
ec5dc4
+
ec5dc4
+        var input_group_btn = $('
', {
ec5dc4
+            'class': 'input-group-btn'
ec5dc4
+        }).appendTo(input_group);
ec5dc4
+
ec5dc4
+        that.find_button = IPA.button({
ec5dc4
+            name: 'find',
ec5dc4
+            label: '@i18n:buttons.filter',
ec5dc4
+            click: function() {
ec5dc4
+                that.search();
ec5dc4
+                return false;
ec5dc4
+            }
ec5dc4
+        }).appendTo(input_group_btn);
ec5dc4
+
ec5dc4
+        return filter_field;
ec5dc4
+    };
ec5dc4
+
ec5dc4
     /**
ec5dc4
      * Clear rows in available table
ec5dc4
      */
ec5dc4
diff --git a/install/ui/src/freeipa/group.js b/install/ui/src/freeipa/group.js
ec5dc4
index e46d8c7e3..2984bd4b2 100644
ec5dc4
--- a/install/ui/src/freeipa/group.js
ec5dc4
+++ b/install/ui/src/freeipa/group.js
ec5dc4
@@ -205,6 +205,20 @@ return {
ec5dc4
             add_title: '@i18n:objects.group.add_into_sudo',
ec5dc4
             remove_method: 'remove_user',
ec5dc4
             remove_title: '@i18n:objects.group.remove_from_sudo'
ec5dc4
+        },
ec5dc4
+        {
ec5dc4
+            $type: 'association',
ec5dc4
+            name: 'member_idoverrideuser',
ec5dc4
+            associator: IPA.serial_associator,
ec5dc4
+            add_title: '@i18n:objects.group.add_idoverride_user',
ec5dc4
+            remove_title: '@i18n:objects.group.remove_idoverride_users',
ec5dc4
+            columns: [
ec5dc4
+                {
ec5dc4
+                    name: 'ipaanchoruuid',
ec5dc4
+                    label: '@i18n:objects.idoverrideuser.anchor_label',
ec5dc4
+                    link: false
ec5dc4
+                }
ec5dc4
+            ]
ec5dc4
         }
ec5dc4
     ],
ec5dc4
     standard_association_facets: true,
ec5dc4
diff --git a/install/ui/src/freeipa/idviews.js b/install/ui/src/freeipa/idviews.js
ec5dc4
index 35dc998c8..a4fca6205 100644
ec5dc4
--- a/install/ui/src/freeipa/idviews.js
ec5dc4
+++ b/install/ui/src/freeipa/idviews.js
ec5dc4
@@ -966,6 +966,58 @@ idviews.unapply_action = function(spec) {
ec5dc4
     return that;
ec5dc4
 };
ec5dc4
 
ec5dc4
+idviews.idoverrideuser_adder_dialog = function(spec) {
ec5dc4
+
ec5dc4
+    spec = spec || {};
ec5dc4
+
ec5dc4
+    var that = IPA.association_adder_dialog(spec);
ec5dc4
+
ec5dc4
+    that.base_search = that.search;
ec5dc4
+
ec5dc4
+    that.search = function() {
ec5dc4
+        // Search for users only in case a ID view is selected
ec5dc4
+        if (that.get_filter()) {
ec5dc4
+            that.base_search();
ec5dc4
+        }
ec5dc4
+    };
ec5dc4
+
ec5dc4
+    /**
ec5dc4
+     * Replace default text filter with a select box for filtering by ID view
ec5dc4
+     */
ec5dc4
+    that.get_filter_field = function(input_group) {
ec5dc4
+
ec5dc4
+        var filter_field = $('<select/>', {
ec5dc4
+            name: 'filter',
ec5dc4
+            'class': 'form-control',
ec5dc4
+            change: function(event) {
ec5dc4
+                that.search();
ec5dc4
+            }
ec5dc4
+        }).appendTo(input_group);
ec5dc4
+
ec5dc4
+        rpc.command({
ec5dc4
+            entity: 'idview',
ec5dc4
+            method: 'find',
ec5dc4
+            on_success: function(data) {
ec5dc4
+                var results = data.result;
ec5dc4
+
ec5dc4
+                for (var i=0; i
ec5dc4
+                    var result = results.result[i];
ec5dc4
+                    $('<option/>', {
ec5dc4
+                        text: result.cn[0],
ec5dc4
+                        value: result.cn[0]
ec5dc4
+                    }).appendTo(filter_field);
ec5dc4
+                }
ec5dc4
+
ec5dc4
+                that.search();
ec5dc4
+            }
ec5dc4
+        }).execute();
ec5dc4
+
ec5dc4
+        return filter_field;
ec5dc4
+    };
ec5dc4
+
ec5dc4
+    return that;
ec5dc4
+};
ec5dc4
+
ec5dc4
 /**
ec5dc4
  * ID View entity specification object
ec5dc4
  * @member idviews
ec5dc4
@@ -993,6 +1045,7 @@ idviews.register = function() {
ec5dc4
     var f = reg.facet;
ec5dc4
     var a = reg.action;
ec5dc4
     var w = reg.widget;
ec5dc4
+    var ad = reg.association_adder_dialog;
ec5dc4
 
ec5dc4
     e.register({type: 'idview', spec: idviews.spec});
ec5dc4
     e.register({
ec5dc4
@@ -1012,6 +1065,11 @@ idviews.register = function() {
ec5dc4
 
ec5dc4
     w.register('idviews_certs', idviews.idviews_certs_widget);
ec5dc4
     w.register('cert_textarea', idviews.cert_textarea_widget);
ec5dc4
+
ec5dc4
+    ad.register({
ec5dc4
+        type: 'idoverrideuser',
ec5dc4
+        factory: idviews.idoverrideuser_adder_dialog
ec5dc4
+    });
ec5dc4
 };
ec5dc4
 
ec5dc4
 phases.on('registration', idviews.register);
ec5dc4
diff --git a/ipaserver/plugins/internal.py b/ipaserver/plugins/internal.py
ec5dc4
index 5f2b1fdc2..7622e65dc 100644
ec5dc4
--- a/ipaserver/plugins/internal.py
ec5dc4
+++ b/ipaserver/plugins/internal.py
ec5dc4
@@ -835,6 +835,9 @@ class i18n_messages(Command):
ec5dc4
                     "Remove users from member managers for user group "
ec5dc4
                     "'${primary_key}'"
ec5dc4
                 ),
ec5dc4
+                "add_idoverride_user": _(
ec5dc4
+                    "Add user ID override into user group '${primary_key}'"
ec5dc4
+                ),
ec5dc4
                 "details": _("Group Settings"),
ec5dc4
                 "external": _("External"),
ec5dc4
                 "groups": _("Groups"),
ec5dc4
@@ -868,6 +871,9 @@ class i18n_messages(Command):
ec5dc4
                 "remove_users": _(
ec5dc4
                     "Remove users from user group '${primary_key}'"
ec5dc4
                 ),
ec5dc4
+                "remove_idoverride_users": _(
ec5dc4
+                    "Remove user ID overrides from user group '${primary_key}'"
ec5dc4
+                ),
ec5dc4
                 "type": _("Group Type"),
ec5dc4
                 "user_groups": _("User Groups"),
ec5dc4
             },
ec5dc4
-- 
ec5dc4
2.26.2
ec5dc4