summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--install/static/entity.js147
-rwxr-xr-xinstall/static/hbac.js36
-rwxr-xr-xinstall/static/hbacsvc.js22
-rwxr-xr-xinstall/static/hbacsvcgroup.js23
-rwxr-xr-xinstall/static/sudocmd.js17
-rwxr-xr-xinstall/static/sudocmdgroup.js20
-rwxr-xr-xinstall/static/sudorule.js37
-rw-r--r--install/static/test/data/ipa_init.json109
-rw-r--r--install/static/webui.js2
-rw-r--r--ipalib/plugins/hbacsvc.py2
-rw-r--r--ipalib/plugins/sudocmd.py2
-rw-r--r--ipalib/plugins/sudocmdgroup.py2
-rw-r--r--ipalib/plugins/sudorule.py2
13 files changed, 168 insertions, 253 deletions
diff --git a/install/static/entity.js b/install/static/entity.js
index 5d59b3c72..9b62ce375 100644
--- a/install/static/entity.js
+++ b/install/static/entity.js
@@ -367,40 +367,89 @@ function ipa_entity_setup(container) {
facet.refresh();
}
+
+
+/*Returns the entity requested, as well as:
+ any nested tabs underneath it or
+ its parent tab and the others nested at the same level*/
+
+IPA.nested_tabs = function(entity_name){
+
+ var siblings = [];
+
+ for (var top_tab_index = 0;
+ top_tab_index < IPA.tab_set.length;
+ top_tab_index += 1){
+ var top_tab = IPA.tab_set[top_tab_index];
+ for (var subtab_index = 0;
+ subtab_index < top_tab.children.length;
+ subtab_index += 1){
+ if(top_tab.children[subtab_index].name){
+ if (top_tab.children[subtab_index].name === entity_name){
+ siblings.push(entity_name);
+ if (top_tab.children[subtab_index].children){
+ var nested_entities = top_tab.children[subtab_index].children;
+ for (var nested_index = 0;
+ nested_index < nested_entities.length;
+ nested_index += 1){
+ siblings.push (nested_entities[nested_index].name);
+ }
+ }
+ }else{
+ if (top_tab.children[subtab_index].children){
+ var nested_entities = top_tab.children[subtab_index].children;
+ for (var nested_index = 0;
+ nested_index < nested_entities.length;
+ nested_index += 1){
+ if (nested_entities[nested_index].name === entity_name){
+ siblings.push(top_tab.children[subtab_index].name);
+ for (var nested_index2 = 0;
+ nested_index2 < nested_entities.length;
+ nested_index2 += 1){
+ siblings.push(nested_entities[nested_index2].name);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return siblings;
+}
+
+
+
function ipa_facet_create_action_panel(container) {
var that = this;
var entity_name = that.entity_name;
-
var action_panel = $('<div/>', {
"class": "action-panel",
html: $('<h3>',{
text: IPA.metadata[entity_name].label
})
}).appendTo(container);
-
function build_link(other_facet,label){
var li = $('<li/>', {
"class" : other_facet.display_class,
title: other_facet.name,
text: label,
click: function(entity_name, other_facet_name) {
- return function() {
- if($(this).hasClass('entity-facet-disabled')){
- return false;
- }
- var this_pkey = $('input[id=pkey]', action_panel).val();
- IPA.switch_and_show_page(
- entity_name, other_facet_name,
- this_pkey);
-
+ return function() {
+ if($(this).hasClass('entity-facet-disabled')){
return false;
- };
- }(entity_name, other_facet_name)
- });
+ }
+ var this_pkey = $('input[id=pkey]', action_panel).val();
+ IPA.switch_and_show_page(
+ entity_name, other_facet_name,
+ this_pkey);
+ return false;
+ };
+ }(entity_name, other_facet_name)
+ });
return li;
}
-
/*Note, for debugging purposes, it is useful to set var pkey_type = 'text';*/
var pkey_type = 'hidden';
$('<input/>', {
@@ -408,36 +457,62 @@ function ipa_facet_create_action_panel(container) {
id:'pkey',
name:'pkey'
}).appendTo(action_panel);
-
var ul = $('<ul/>', {'class': 'action'}).appendTo(action_panel);
-
var entity = IPA.get_entity(entity_name);
var facet_name = ipa_current_facet(entity);
-
var other_facet = entity.facets[0];
var other_facet_name = other_facet.name;
- var main_facet = build_link(other_facet,other_facet.label);
-
- /*assumeing for now that entities with only a single facet
- do not have search*/
- if (entity.facets.length > 0 ){
- main_facet.text( 'List ' + IPA.metadata[entity_name].label);
- }
- main_facet.appendTo(ul);
-
- ul.append($('<li><span class="action-controls"/></li>'));
- for (var i=1; i<entity.facets.length; i++) {
- other_facet = entity.facets[i];
- other_facet_name = other_facet.name;
-
- ul.append(build_link(other_facet,other_facet.label));
+ var nested_tabs = IPA.nested_tabs(entity_name);
+ var main_facet = build_link(other_facet,other_facet.label)
+ for (var nested_index = 0 ;
+ nested_index < nested_tabs.length;
+ nested_index += 1){
+ if (nested_tabs[nested_index] === entity_name){
+ /*assume for now that entities with only a single facet
+ do not have search*/
+ if (entity.facets.length > 0 ){
+ main_facet.text( 'List ' + IPA.metadata[entity_name].label);
+ }
+ main_facet.appendTo(ul);
+
+ ul.append($('<li><span class="action-controls"/></li>'));
+ for (var i=1; i<entity.facets.length; i++) {
+ other_facet = entity.facets[i];
+ other_facet_name = other_facet.name;
+
+ if (other_facet.label) {
+ ul.append(build_link(other_facet,other_facet.label));
+ } else { // For now empty label indicates an association facet
+ var attribute_members = IPA.metadata[entity_name].attribute_members;
+ for (var attribute_member in attribute_members) {
+ var other_entities = attribute_members[attribute_member];
+ for (var j = 0; j < other_entities.length; j++) {
+ var other_entity = other_entities[j];
+ var label = IPA.metadata[other_entity].label;
+ ul.append(build_link(other_facet,label,other_entity));
+ }
+ }
+ }
+ }
+ }else{
+ $('<li/>', {
+ title: nested_tabs[nested_index],
+ text: IPA.metadata[nested_tabs[nested_index]].label,
+ "class": "search-facet",
+ click: function() {
+ var state = {};
+ state[nested_tabs[0]+'-entity'] =
+ this.title;
+ nav_push_state(state);
+ return false;
+ }
+ }).appendTo(ul);
+ }
}
-
/*When we land on the search page, disable all facets
- that require a pkey until one is selected*/
+ that require a pkey until one is selected*/
if (facet_name === 'search'){
$('.entity-facet', action_panel).addClass('entity-facet-disabled');
}
-
return action_panel;
}
diff --git a/install/static/hbac.js b/install/static/hbac.js
index a6162b8bf..0d6ed7373 100755
--- a/install/static/hbac.js
+++ b/install/static/hbac.js
@@ -120,50 +120,18 @@ function ipa_hbac_search_facet(spec) {
'label': 'Cull Disabled Rules'
}));
*/
- var action_panel = that.get_action_panel();
-
- var ul = $('ul', action_panel);
-
- $('<li/>', {
- title: 'hbacsvc',
- text: 'HBAC Services'
- }).appendTo(ul);
-
- $('<li/>', {
- title: 'hbacsvcgroup',
- text: 'HBAC Service Groups'
- }).appendTo(ul);
that.search_facet_create(container);
- // TODO: replace with IPA.metadata[that.entity_name].label
+
container.children().last().prepend(
- $('<h2/>', { 'html': 'HBAC Rules' }));
+ $('<h2/>', { 'html': IPA.metadata.hbac.label }));
container.children().last().prepend('<br/><br/>');
};
that.setup = function(container) {
-
that.search_facet_setup(container);
-
- var action_panel = that.get_action_panel();
-
- var li = $('li[title=hbacsvc]', action_panel);
- li.click(function() {
- var state = {};
- state['hbac-entity'] = 'hbacsvc';
- nav_push_state(state);
- return false;
- });
-
- li = $('li[title=hbacsvcgroup]', action_panel);
- li.click(function() {
- var state = {};
- state['hbac-entity'] = 'hbacsvcgroup';
- nav_push_state(state);
- return false;
- });
};
return that;
diff --git a/install/static/hbacsvc.js b/install/static/hbacsvc.js
index c4140272e..a0ef75d14 100755
--- a/install/static/hbacsvc.js
+++ b/install/static/hbacsvc.js
@@ -89,29 +89,9 @@ function ipa_hbacsvc_search_facet(spec) {
};
that.create = function(container) {
-
- var action_panel = that.get_action_panel();
-
- var ul = $('ul', action_panel);
-
- /*Note that we add the rules at the top of the action panel
- so that the HBAC entities always show in the same order.*/
-
- $('<li/>', {
- title: 'hbac',
- text: 'HBAC Rules'
- }).prependTo(ul);
-
- $('<li/>', {
- title: 'hbacsvcgroup',
- text: 'HBAC Service Groups'
- }).appendTo(ul);
-
that.search_facet_create(container);
-
- // TODO: replace with IPA.metadata[that.entity_name].label
container.children().last().prepend(
- $('<h2/>', { 'html': 'HBAC Services' }));
+ $('<h2/>', { 'html': IPA.metadata.hbacsvc.label }));
container.children().last().prepend('<br/><br/>');
};
diff --git a/install/static/hbacsvcgroup.js b/install/static/hbacsvcgroup.js
index 914c73543..f06fe4f9d 100755
--- a/install/static/hbacsvcgroup.js
+++ b/install/static/hbacsvcgroup.js
@@ -102,31 +102,10 @@ function ipa_hbacsvcgroup_search_facet(spec) {
};
that.create = function(container) {
-
- var action_panel = that.get_action_panel();
-
- var ul = $('ul', action_panel);
-
- /*Note that we add these at the top of the action panel
- so that the HBAC entities always show in the same order.*/
- $('<li/>', {
- title: 'hbacsvc',
- text: 'HBAC Services'
- }).prependTo(ul);
-
- $('<li/>', {
- title: 'hbac',
- text: 'HBAC Rules'
- }).prependTo(ul);
-
-
that.search_facet_create(container);
-
- // TODO: replace with IPA.metadata[that.entity_name].label
container.children().last().prepend(
- $('<h2/>', { 'html': 'HBAC Service Groups' }));
+ $('<h2/>', { 'html':IPA.metadata.hbacsvcgroup.label }));
container.children().last().prepend('<br/><br/>');
-
};
that.setup = function(container) {
diff --git a/install/static/sudocmd.js b/install/static/sudocmd.js
index 0e335627e..3ad71eb52 100755
--- a/install/static/sudocmd.js
+++ b/install/static/sudocmd.js
@@ -90,25 +90,10 @@ function ipa_sudocmd_search_facet(spec) {
that.create = function(container) {
- var action_panel = that.get_action_panel();
-
- var ul = $('ul', action_panel);
-
- $('<li/>', {
- title: 'sudorule',
- text: 'SUDO Rules'
- }).prependTo(ul);
-
- $('<li/>', {
- title: 'sudocmdgroup',
- text: 'SUDO Command Groups'
- }).appendTo(ul);
-
that.search_facet_create(container);
- // TODO: replace with IPA.metadata[that.entity_name].label
container.children().last().prepend(
- $('<h2/>', { 'html': 'SUDO Commands' }));
+ $('<h2/>', { 'html': IPA.metadata.sudocmd.label }));
container.children().last().prepend('<br/><br/>');
};
diff --git a/install/static/sudocmdgroup.js b/install/static/sudocmdgroup.js
index c8b7edf8d..22762aec0 100755
--- a/install/static/sudocmdgroup.js
+++ b/install/static/sudocmdgroup.js
@@ -103,28 +103,10 @@ function ipa_sudocmdgroup_search_facet(spec) {
that.create = function(container) {
- var action_panel = that.get_action_panel();
-
- var ul = $('ul', action_panel);
-
- /*Make sure that these go at the top of the action panel
- and in the same order as on the other SUDO entity pages */
- $('<li/>', {
- title: 'sudocmd',
- text: 'SUDO Command'
- }).prependTo(ul);
-
- $('<li/>', {
- title: 'sudorule',
- text: 'SUDO Rules'
- }).prependTo(ul);
-
-
that.search_facet_create(container);
- // TODO: replace with IPA.metadata[that.entity_name].label
container.children().last().prepend(
- $('<h2/>', { 'html': 'SUDO Command Groups' }));
+ $('<h2/>', { 'html': IPA.metadata.sudocmdgroup.label }));
container.children().last().prepend('<br/><br/>');
};
diff --git a/install/static/sudorule.js b/install/static/sudorule.js
index 023cafde2..9e0e4e589 100755
--- a/install/static/sudorule.js
+++ b/install/static/sudorule.js
@@ -91,51 +91,16 @@ function ipa_sudorule_search_facet(spec) {
};
that.create = function(container) {
-
- var action_panel = that.get_action_panel();
-
- var ul = $('ul', action_panel);
-
- $('<li/>', {
- title: 'sudocmd',
- text: 'SUDO Commands'
- }).appendTo(ul);
-
- $('<li/>', {
- title: 'sudocmdgroup',
- text: 'SUDO Command Groups'
- }).appendTo(ul);
-
that.search_facet_create(container);
- // TODO: replace with IPA.metadata[that.entity_name].label
container.children().last().prepend(
- $('<h2/>', { 'html': 'SUDO Rules' }));
+ $('<h2/>', { 'html': IPA.metadata.sudorule.label }));
container.children().last().prepend('<br/><br/>');
};
that.setup = function(container) {
-
that.search_facet_setup(container);
-
- var action_panel = that.get_action_panel();
-
- var li = $('li[title=sudocmd]', action_panel);
- li.click(function() {
- var state = {};
- state['sudorule-entity'] = 'sudocmd';
- nav_push_state(state);
- return false;
- });
-
- li = $('li[title=sudocmdgroup]', action_panel);
- li.click(function() {
- var state = {};
- state['sudorule-entity'] = 'sudocmdgroup';
- nav_push_state(state);
- return false;
- });
};
return that;
diff --git a/install/static/test/data/ipa_init.json b/install/static/test/data/ipa_init.json
index 84fc02cc0..1de684904 100644
--- a/install/static/test/data/ipa_init.json
+++ b/install/static/test/data/ipa_init.json
@@ -6,37 +6,6 @@
"results": [
{
"error": null,
- "messages": {
- "ajax": {
- "401": "Your kerberos ticket no longer valid.Please run KInit and then click 'retry'If this is your first time running the IPA Web UI<a href='/ipa/errors/ssbrowser.html'> Follow these directions</a> to configure your browser."
- },
- "button": {
- "add": "Add",
- "enroll": "Enroll",
- "find": "Find",
- "remove": "Delete",
- "reset": "Reset",
- "update": "Update"
- },
- "details": {
- "account": "Account Details",
- "contact": "Contact Details",
- "employee": " Employee Information",
- "identity": "Identity Details",
- "mailing": "Mailing Address",
- "misc": "Misc. Information",
- "to_top": "Back to Top"
- },
- "login": {
- "header": "Logged In As"
- },
- "search": {
- "delete_confirm": "Do you really want to delete the selected entries?",
- "quick_links": "Quick Links",
- "select_all": "Select All",
- "unselect_all": "Unselect All"
- }
- },
"metadata": {
"aci": {
"__base64__": ""
@@ -1090,11 +1059,11 @@
"include": null,
"label": "Group name",
"length": null,
- "maxlength": 33,
+ "maxlength": 255,
"minlength": null,
"multivalue": false,
"name": "cn",
- "pattern": "^[a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?$",
+ "pattern": "^[a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,252}[a-zA-Z0-9_.$-]?$",
"pattern_errmsg": "may only include letters, numbers, _, -, . and $",
"primary_key": true,
"query": false,
@@ -1638,7 +1607,7 @@
"objectclass",
"aci"
],
- "label": "Services",
+ "label": "HBAC Services",
"methods": [
"add",
"del",
@@ -1807,6 +1776,9 @@
"enrolledby": [
"user"
],
+ "managedby": [
+ "host"
+ ],
"memberof": [
"hostgroup",
"netgroup",
@@ -1824,7 +1796,8 @@
"nsosversion",
"usercertificate",
"memberof",
- "krblastpwdchange"
+ "krblastpwdchange",
+ "managedby"
],
"hidden_attributes": [
"objectclass",
@@ -1833,10 +1806,12 @@
"label": "Hosts",
"methods": [
"add",
+ "add_managedby",
"del",
"disable",
"find",
"mod",
+ "remove_managedby",
"show"
],
"name": "host",
@@ -2559,6 +2534,9 @@
],
"uuid_attribute": "ipauniqueid"
},
+ "pkinit": {
+ "__base64__": ""
+ },
"pwpolicy": {
"attribute_members": {},
"container_dn": "cn=AYOUNG.BOSTON.DEVEL.REDHAT.COM,cn=kerberos",
@@ -2972,7 +2950,7 @@
"objectclass",
"aci"
],
- "label": "SudoCmds",
+ "label": "SUDO Commands",
"methods": [
"add",
"del",
@@ -3071,7 +3049,7 @@
"objectclass",
"aci"
],
- "label": "Sudo Command Groups",
+ "label": "SUDO Command Groups",
"methods": [
"add",
"add_member",
@@ -3232,7 +3210,7 @@
"objectclass",
"aci"
],
- "label": "SudoRule",
+ "label": "SUDO",
"methods": [
"add",
"add_allow_command",
@@ -3699,11 +3677,11 @@
"include": null,
"label": "User login",
"length": null,
- "maxlength": 33,
+ "maxlength": 255,
"minlength": null,
"multivalue": false,
"name": "uid",
- "pattern": "^[a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?$",
+ "pattern": "^[a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,252}[a-zA-Z0-9_.$-]?$",
"pattern_errmsg": "may only include letters, numbers, _, -, . and $",
"primary_key": true,
"query": false,
@@ -4145,19 +4123,19 @@
"Administrator"
],
"gidnumber": [
- "1010626268"
+ "757995011"
],
"homedirectory": [
"/home/admin"
],
"ipauniqueid": [
- "73321718-f35011df-8e89dc8d-0b6df103"
+ "297bbe44-f810-11df-8f59-525400674dcd"
],
"krblastpwdchange": [
- "20101118201738Z"
+ "20101124211850Z"
],
"krbpasswordexpiration": [
- "20110216201738Z"
+ "20110222211850Z"
],
"krbprincipalname": [
"admin@AYOUNG.BOSTON.DEVEL.REDHAT.COM"
@@ -4198,7 +4176,7 @@
"admin"
],
"uidnumber": [
- "1010626268"
+ "757995011"
]
}
],
@@ -4206,18 +4184,18 @@
"truncated": false
},
{
- "count": 64,
+ "count": 67,
"error": null,
"result": {
"basedn": "dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
- "bin": "/var/www",
+ "bin": "/home/ayoung/devel/freeipa",
"ca_agent_port": 9443,
"ca_ee_port": 9444,
"ca_host": "ipa.ayoung.boston.devel.redhat.com",
"ca_port": 9180,
- "conf": "/etc/ipa/server.conf",
- "conf_default": "/etc/ipa/default.conf",
- "confdir": "/etc/ipa",
+ "conf": "/root/.ipa/lite.conf",
+ "conf_default": "/root/.ipa/default.conf",
+ "confdir": "/root/.ipa",
"config_loaded": true,
"container_accounts": "cn=accounts",
"container_applications": "cn=applications,cn=configs,cn=policies",
@@ -4243,39 +4221,42 @@
"container_taskgroup": "cn=taskgroups,cn=accounts",
"container_user": "cn=users,cn=accounts",
"container_virtual": "cn=virtual operations",
- "context": "server",
+ "context": "lite",
"debug": false,
"domain": "ayoung.boston.devel.redhat.com",
- "dot_ipa": "/var/www/.ipa",
+ "dot_ipa": "/root/.ipa",
"enable_ra": true,
"fallback": true,
- "home": "/var/www",
+ "home": "/root",
"host": "ipa.ayoung.boston.devel.redhat.com",
"in_server": true,
- "in_tree": false,
+ "in_tree": true,
"interactive": true,
- "ipalib": "/usr/lib/python2.6/site-packages/ipalib",
+ "ipalib": "/home/ayoung/devel/freeipa/ipalib",
"ldap_uri": "ldapi://%2fvar%2frun%2fslapd-AYOUNG-BOSTON-DEVEL-REDHAT-COM.socket",
- "log": null,
- "logdir": "/var/log/ipa",
+ "lite_host": "127.0.0.1",
+ "lite_pem": "/root/.ipa/lite.pem",
+ "lite_port": 8888,
+ "log": "/root/.ipa/log/lite.log",
+ "logdir": "/root/.ipa/log",
"mode": "production",
"mount_ipa": "/ipa/",
"mount_jsonserver": "json",
"mount_xmlserver": "xml",
"prompt_all": false,
- "ra_plugin": "dogtag",
+ "ra_plugin": "selfsign",
"realm": "AYOUNG.BOSTON.DEVEL.REDHAT.COM",
"rpc_json_uri": "http://localhost:8888/ipa/json",
- "script": "/var/www/mod_wsgi",
- "site_packages": "/usr/lib/python2.6/site-packages",
- "startup_traceback": false,
+ "script": "/home/ayoung/devel/freeipa/lite-server.py",
+ "site_packages": "/home/ayoung/devel/freeipa",
+ "startup_traceback": true,
"verbose": 0,
"webui_assets_dir": null,
"webui_prod": true,
- "xmlrpc_uri": "https://ipa.ayoung.boston.devel.redhat.com/ipa/xml"
+ "xmlrpc_uri": "http://localhost:8888/ipa/xml"
},
- "summary": "64 variables",
- "total": 64
+ "summary": "67 variables",
+ "total": 67
}
]
}
diff --git a/install/static/webui.js b/install/static/webui.js
index 0e3adb27d..4b2156c01 100644
--- a/install/static/webui.js
+++ b/install/static/webui.js
@@ -38,7 +38,7 @@ var admin_tab_set = [
{name:'hbacsvc', setup: ipa_entity_setup},
{name:'hbacsvcgroup', setup: ipa_entity_setup}
]},
- {name:'sudorule', setup: ipa_entity_setup,children:[
+ {name:'sudorule', label:'SUDO', setup: ipa_entity_setup,children:[
{name:'sudocmd', setup: ipa_entity_setup},
{name:'sudocmdgroup', setup: ipa_entity_setup}
]},
diff --git a/ipalib/plugins/hbacsvc.py b/ipalib/plugins/hbacsvc.py
index 4074eb33d..c04a8ed67 100644
--- a/ipalib/plugins/hbacsvc.py
+++ b/ipalib/plugins/hbacsvc.py
@@ -57,7 +57,7 @@ class hbacsvc(LDAPObject):
default_attributes = ['cn', 'description', 'memberindirect',]
uuid_attribute = 'ipauniqueid'
- label = _('Services')
+ label = _('HBAC Services')
takes_params = (
Str('cn',
diff --git a/ipalib/plugins/sudocmd.py b/ipalib/plugins/sudocmd.py
index 1fef17217..33683c328 100644
--- a/ipalib/plugins/sudocmd.py
+++ b/ipalib/plugins/sudocmd.py
@@ -57,7 +57,7 @@ class sudocmd(LDAPObject):
'sudocmd', 'description',
]
uuid_attribute = 'ipauniqueid'
- label = _('SudoCmds')
+ label = _('SUDO Commands')
takes_params = (
Str('sudocmd',
diff --git a/ipalib/plugins/sudocmdgroup.py b/ipalib/plugins/sudocmdgroup.py
index 5476f99cf..c6cecaf56 100644
--- a/ipalib/plugins/sudocmdgroup.py
+++ b/ipalib/plugins/sudocmdgroup.py
@@ -64,7 +64,7 @@ class sudocmdgroup(LDAPObject):
'memberindirect': ['sudocmd', 'sudocmdgroup'],
}
- label = _('Sudo Command Groups')
+ label = _('SUDO Command Groups')
takes_params = (
Str('cn',
diff --git a/ipalib/plugins/sudorule.py b/ipalib/plugins/sudorule.py
index df0ae5c4d..6a81b86b9 100644
--- a/ipalib/plugins/sudorule.py
+++ b/ipalib/plugins/sudorule.py
@@ -46,7 +46,7 @@ class sudorule(LDAPObject):
'memberdenycmd': ['sudocmd', 'sudocmdgroup'],
}
- label = _('SudoRule')
+ label = _('SUDO')
takes_params = (
Str('cn',