From 10418b7f3ea8c682961fc201545169663d507bf6 Mon Sep 17 00:00:00 2001 From: Serhii Tsymbaliuk Date: Thu, 17 Jun 2021 13:56:19 +0200 Subject: [PATCH] WebUI: Improve subordinate ids user workflow - add "Subordinate ID Statistics" page - add button for generating subid in "Subordinate ids" tab of user details page - allow to navigate directly to owner details from subordinate id page - adjust i18n strings Ticket: https://pagure.io/freeipa/issue/8361 Signed-off-by: Serhii Tsymbaliuk Reviewed-By: Francois Cami Reviewed-By: Rob Crittenden Reviewed-By: Francois Cami Reviewed-By: Rob Crittenden --- install/ui/src/freeipa/details.js | 8 ++- .../ui/src/freeipa/navigation/menu_spec.js | 19 ++++++- install/ui/src/freeipa/subid.js | 43 +++++++++++++++- install/ui/src/freeipa/user.js | 49 +++++++++++++++---- ipaserver/plugins/internal.py | 22 ++++++--- 5 files changed, 121 insertions(+), 20 deletions(-) diff --git a/install/ui/src/freeipa/details.js b/install/ui/src/freeipa/details.js index b557bbcef9a427a87eee3216f4345fc853cbaaff..2704cbd0ba98efa877cf5ec8a878e688ee6807e9 100644 --- a/install/ui/src/freeipa/details.js +++ b/install/ui/src/freeipa/details.js @@ -602,6 +602,12 @@ exp.details_facet = IPA.details_facet = function(spec, no_init) { */ that.facet_group = spec.facet_group || 'settings'; + /** + * Indicates if the details facet depends on pkey + * @property {boolean} + */ + that.require_pkey = spec.require_pkey !== undefined ? spec.require_pkey : true; + /** * Widgets * @property {IPA.widget_container} @@ -1105,7 +1111,7 @@ exp.details_facet = IPA.details_facet = function(spec, no_init) { */ that.refresh = function(on_success, on_error) { - if (!that.get_pkey() && that.entity.redirect_facet) { + if (that.require_pkey && !that.get_pkey() && that.entity.redirect_facet) { that.redirect(); return; } diff --git a/install/ui/src/freeipa/navigation/menu_spec.js b/install/ui/src/freeipa/navigation/menu_spec.js index 6ccd06919fbe04c7e8d2034ff7a1f644f373c607..a205dfade2f9508edbdc23ee6f7247508cc0479c 100644 --- a/install/ui/src/freeipa/navigation/menu_spec.js +++ b/install/ui/src/freeipa/navigation/menu_spec.js @@ -104,7 +104,24 @@ var nav = {}; } ] }, - { entity: 'subid' } + { + name: 'subid', + label: '@i18n:tabs.subid', + children: [ + { + name: 'subid', + entity: 'subid', + facet: 'search', + label: '@i18n:tabs.subid' + }, + { + name: 'subid-stats', + entity: 'subid', + facet: 'stats', + label: '@i18n:objects.subid.stats' + } + ] + } ] }, { diff --git a/install/ui/src/freeipa/subid.js b/install/ui/src/freeipa/subid.js index f286165070b08badf77cac6c30e93cab916c2acc..32f75bb7854cd3e84417a66870e99d34d49617e3 100644 --- a/install/ui/src/freeipa/subid.js +++ b/install/ui/src/freeipa/subid.js @@ -31,6 +31,7 @@ return { }, { $type: 'details', + disable_facet_tabs: true, sections: [ { name: 'details', @@ -38,9 +39,11 @@ return { 'ipauniqueid', 'description', { + $type: 'link', name: 'ipaowner', label: '@i18n:objects.subid.ipaowner', - title: '@mo-param:subid:ipaowner:label' + title: '@mo-param:subid:ipaowner:label', + other_entity: 'user' }, { name: 'ipasubgidnumber', @@ -65,6 +68,44 @@ return { ] } ] + }, + { + $type: 'details', + name: 'stats', + label: '@i18n:objects.subid.stats', + refresh_command_name: 'stats', + check_rights: false, + no_update: true, + disable_facet_tabs: true, + disable_breadcrumb: true, + require_pkey: false, + fields: [ + { + name: 'assigned_subids', + label: '@i18n:objects.subid.assigned_subids', + read_only: true + }, + { + name: 'baseid', + label: '@i18n:objects.subid.baseid', + read_only: true + }, + { + name: 'dna_remaining', + label: '@i18n:objects.subid.dna_remaining', + read_only: true + }, + { + name: 'rangesize', + label: '@i18n:objects.subid.rangesize', + read_only: true + }, + { + name: 'remaining_subids', + label: '@i18n:objects.subid.remaining_subids', + read_only: true + } + ] } ], adder_dialog: { diff --git a/install/ui/src/freeipa/user.js b/install/ui/src/freeipa/user.js index 56bb6f4feffb637d33a57aecf9a98f08d4639550..6a56320c580f58a1aba84e598736631986421113 100644 --- a/install/ui/src/freeipa/user.js +++ b/install/ui/src/freeipa/user.js @@ -464,7 +464,7 @@ return { }, { $type: 'subid_generate', - hide_cond: ['preserved-user'], + hide_cond: ['preserved-user', 'self-service-other'], enable_cond: ['no-subid'] } ], @@ -556,8 +556,35 @@ return { { $type: 'association', name: 'memberof_subid', + columns: [ + 'ipauniqueid', + 'ipasubuidnumber', + 'ipasubgidnumber' + ], associator: IPA.serial_associator, - read_only: true + read_only: true, + state: { + evaluators: [ + IPA.user.self_service_other_user_evaluator, + IPA.user.preserved_user_evaluator, + IPA.user.has_subid_evaluator + ] + }, + actions: [ + { + $type: 'subid_generate', + name: 'subid_generate', + hide_cond: ['preserved-user', 'self-service-other'], + enable_cond: ['no-subid'] + } + ], + control_buttons: [ + { + name: 'subid_generate', + label: '@i18n:objects.user.auto_subid', + icon: 'fa-plus' + } + ] } ], standard_association_facets: { @@ -1216,14 +1243,16 @@ IPA.user.subid_generate_action = function(spec) { var that = IPA.action(spec); that.execute_action = function(facet) { - - var subid_e = reg.entity.get('subid'); - var dialog = subid_e.get_dialog('add'); - dialog.open(); - if (!IPA.is_selfservice) { - var owner = facet.get_pkey(); - dialog.get_field('ipaowner').set_value([owner]); - } + var owner = facet.get_pkey(); + var command = rpc.command({ + entity: 'subid', + method: 'generate' + }); + command.set_option('ipaowner', owner); + command.on_success = function(data, text_status, xhr) { + facet.refresh(); + }; + command.execute(); }; return that; diff --git a/ipaserver/plugins/internal.py b/ipaserver/plugins/internal.py index 5ef940c2b88cc2b132a15d619772349b30731306..29e09f0067ec60d014e61c49313455d64478ef22 100644 --- a/ipaserver/plugins/internal.py +++ b/ipaserver/plugins/internal.py @@ -1364,6 +1364,20 @@ class i18n_messages(Command): "undel_success": _("${count} user(s) restored"), "user_categories": _("User categories"), }, + "subid": { + "add": _("Add subid"), + "assigned_subids": _("Assigned subids"), + "baseid": _("Base ID"), + "dna_remaining": _("DNA remaining"), + "ipaowner": _("Owner"), + "ipasubgidcount": _("SubGID range size"), + "ipasubgidnumber": _("SubGID range start"), + "ipasubuidcount": _("SubUID range size"), + "ipasubuidnumber": _("SubUID range start"), + "rangesize": _("Range size"), + "remaining_subids": _("Remaining subids"), + "stats": _("Subordinate ID Statistics"), + }, "sudocmd": { "add": _("Add sudo command"), "add_into_sudocmdgroups": _( @@ -1547,13 +1561,6 @@ class i18n_messages(Command): "Drive to mount a home directory" ), }, - "subid": { - "identity": _("Subordinate user and group id"), - "subuidnumber": _("Subordinate user id"), - "subuidcount": _("Subordinate user id count"), - "subgidnumber": _("Subordinate group id"), - "subgidcount": _("Subordinate group id count"), - }, "trustconfig": { "options": _("Options"), }, @@ -1942,6 +1949,7 @@ class i18n_messages(Command): "network_services": _("Network Services"), "policy": _("Policy"), "role": _("Role-Based Access Control"), + "subid": _("Subordinate IDs"), "sudo": _("Sudo"), "topology": _("Topology"), "trust": _("Trusts"), -- 2.26.3