summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipa-admintools/ipa-addgroup16
-rw-r--r--ipa-admintools/ipa-adduser34
-rw-r--r--ipa-admintools/ipa-deldelegation4
-rw-r--r--ipa-admintools/ipa-findgroup2
-rw-r--r--ipa-admintools/ipa-finduser2
-rw-r--r--ipa-admintools/ipa-usermod30
-rw-r--r--ipa-client/ipaclient/Makefile.am1
-rw-r--r--ipa-client/ipaclient/__init__.py2
-rw-r--r--ipa-client/ipaclient/ipadiscovery.py14
-rw-r--r--ipa-python/MANIFEST.in2
-rw-r--r--ipa-python/dnsclient.py (renamed from ipa-client/ipaclient/dnsclient.py)0
-rw-r--r--ipa-python/ipavalidate.py28
-rw-r--r--ipa-python/test/test_ipavalidate.py71
-rw-r--r--ipa-server/ipa-gui/ipagui/forms/ipapolicy.py10
-rw-r--r--ipa-server/ipa-gui/ipagui/static/css/style.css4
-rw-r--r--ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py2
-rw-r--r--ipa-server/ipa-install/share/default-aci.ldif1
17 files changed, 125 insertions, 98 deletions
diff --git a/ipa-admintools/ipa-addgroup b/ipa-admintools/ipa-addgroup
index 15d42a91e..8169dea12 100644
--- a/ipa-admintools/ipa-addgroup
+++ b/ipa-admintools/ipa-addgroup
@@ -62,28 +62,28 @@ def main():
if (len(args) != 2):
while (cont != True):
cn = raw_input("Group name: ")
- if (ipavalidate.plain(cn, notEmpty=True)):
- print "Field is required and must be letters or '."
+ if (ipavalidate.String(cn, notEmpty=True)):
+ print "Please enter a value"
else:
cont = True
else:
cn = args[1]
- if (ipavalidate.plain(cn, notEmpty=True)):
- print "Group name is required and must be letters or '."
+ if (ipavalidate.ipastsring(cn, notEmpty=True)):
+ print "Please enter a value"
return 1
cont = False
if not options.desc:
while (cont != True):
desc = raw_input("Description: ")
- if (ipavalidate.plain(desc, notEmpty=True)):
- print "Field is required and must be letters or '."
+ if (ipavalidate.String(desc, notEmpty=True)):
+ print "Please enter a value"
else:
cont = True
else:
desc = options.desc
- if (ipavalidate.plain(desc, notEmpty=True)):
- print "First name is required and must be letters or '."
+ if (ipavalidate.String(desc, notEmpty=True)):
+ print "Please enter a value"
return 1
if options.gid:
diff --git a/ipa-admintools/ipa-adduser b/ipa-admintools/ipa-adduser
index 96b43e0d5..298834258 100644
--- a/ipa-admintools/ipa-adduser
+++ b/ipa-admintools/ipa-adduser
@@ -92,42 +92,42 @@ def main():
if not options.gn:
while (cont != True):
givenname = raw_input("First name: ")
- if (ipavalidate.plain(givenname, notEmpty=True)):
- print "Field is required and must be letters or '"
+ if (ipavalidate.String(givenname, notEmpty=True)):
+ print "Please enter a value"
else:
cont = True
else:
givenname = options.gn
- if (ipavalidate.plain(givenname, notEmpty=True)):
- print "First name is required and must be letters or '"
+ if (ipavalidate.String(givenname, notEmpty=True)):
+ print "Please enter a value"
return 1
cont = False
if not options.sn:
while (cont != True):
lastname = raw_input("Last name: ")
- if (ipavalidate.plain(lastname, notEmpty=True)):
- print "Field is required and must be letters or '"
+ if (ipavalidate.String(lastname, notEmpty=True)):
+ print "Please enter a value"
else:
cont = True
else:
lastname = options.sn
- if (ipavalidate.plain(lastname, notEmpty=True)):
- print "Last name is required and must be letters or '"
+ if (ipavalidate.String(lastname, notEmpty=True)):
+ print "Please enter a value"
return 1
cont = False
if (len(args) != 2):
while (cont != True):
username = raw_input("Login name: ")
- if (ipavalidate.plain(username, notEmpty=True)):
- print "Field is required and must be letters or '"
+ if (ipavalidate.Plain(username, notEmpty=True, allowSpaces=False)):
+ print "Please enter a value"
else:
cont = True
else:
username = args[1]
- if (ipavalidate.plain(username, notEmpty=True)):
- print "Username is required and must be letters or '"
+ if (ipavalidate.Plain(username, notEmpty=True, allowSpaces=False)):
+ print "Username is required and may only include letters and numbers"
return 1
if not options.password:
@@ -147,7 +147,7 @@ def main():
if options.mail:
mail = options.mail
- if (ipavalidate.email(mail)):
+ if (ipavalidate.Email(mail)):
print "The email provided seem not a valid email."
return 1
@@ -158,8 +158,8 @@ def main():
if not options.gecos:
while (cont != True):
gecos = raw_input("gecos []: ")
- if (ipavalidate.plain(gecos, notEmpty=False)):
- print "Must be letters, numbers, spaces or '"
+ if (ipavalidate.String(gecos, notEmpty=False)):
+ print "Please enter a value"
else:
cont = True
cont = False
@@ -168,8 +168,8 @@ def main():
directory = raw_input("home directory [/home/"+username+"]: ")
if directory == "":
directory = "/home/"+username
- if (ipavalidate.path(directory, notEmpty=False)):
- print "Must be letters, numbers, spaces or '"
+ if (ipavalidate.Path(directory, notEmpty=False)):
+ print "Please enter a value"
else:
cont = True
cont = False
diff --git a/ipa-admintools/ipa-deldelegation b/ipa-admintools/ipa-deldelegation
index 7ad17c38b..030d462ff 100644
--- a/ipa-admintools/ipa-deldelegation
+++ b/ipa-admintools/ipa-deldelegation
@@ -65,6 +65,7 @@ def main():
if not(isinstance(aci_str_list,list) or isinstance(aci_str_list,tuple)):
aci_str_list = [aci_str_list]
+ acistr = None
for aci_str in aci_str_list:
try:
aci = ipa.aci.ACI(aci_str)
@@ -76,7 +77,7 @@ def main():
pass
if acistr is None:
- print "No delegation %s found." % args[1]
+ print "No delegation '%s' found." % args[1]
return 2
old_aci_index = aci_str_list.index(acistr)
@@ -86,6 +87,7 @@ def main():
aci_entry.setValue('aci', new_aci_str_list)
client.update_entry(aci_entry)
+ print "Delegation removed."
except xmlrpclib.Fault, fault:
if fault.faultCode == errno.ECONNREFUSED:
print "The IPA XML-RPC service is not responding."
diff --git a/ipa-admintools/ipa-findgroup b/ipa-admintools/ipa-findgroup
index d84a2c62f..73b0bb1bc 100644
--- a/ipa-admintools/ipa-findgroup
+++ b/ipa-admintools/ipa-findgroup
@@ -67,7 +67,7 @@ def main():
return 2
elif counter == -1:
print "These results are truncated."
- print "Please revine your search and try again."
+ print "Please refine your search and try again."
for ent in groups:
try:
diff --git a/ipa-admintools/ipa-finduser b/ipa-admintools/ipa-finduser
index 81e8898a2..2ee19dfe0 100644
--- a/ipa-admintools/ipa-finduser
+++ b/ipa-admintools/ipa-finduser
@@ -92,7 +92,7 @@ def main():
return 2
elif counter == -1:
print "These results are truncated."
- print "Please revine your search and try again."
+ print "Please refine your search and try again."
for ent in users:
attr = ent.attrList()
diff --git a/ipa-admintools/ipa-usermod b/ipa-admintools/ipa-usermod
index 9d3e7794c..5d33700f9 100644
--- a/ipa-admintools/ipa-usermod
+++ b/ipa-admintools/ipa-usermod
@@ -124,8 +124,8 @@ def main():
if not options.gn:
while (cont != True):
givenname = raw_input("First name: [%s] " % user.getValue('givenname'))
- if (ipavalidate.plain(givenname, notEmpty=False)):
- print "Must be letters or '"
+ if (ipavalidate.String(givenname, notEmpty=False)):
+ print "Please enter a value"
else:
cont = True
if len(givenname) < 1:
@@ -133,16 +133,16 @@ def main():
cont = True
else:
givenname = options.gn
- if (ipavalidate.plain(givenname, notEmpty=True)):
- print "First name must be letters or '"
+ if (ipavalidate.String(givenname, notEmpty=True)):
+ print "Please enter a value"
return 1
cont = False
if not options.sn:
while (cont != True):
lastname = raw_input(" Last name: [%s] " % user.getValue('sn'))
- if (ipavalidate.plain(lastname, notEmpty=False)):
- print "Must be letters or '"
+ if (ipavalidate.String(lastname, notEmpty=False)):
+ print "Please enter a value"
else:
cont = True
if len(lastname) < 1:
@@ -150,21 +150,21 @@ def main():
cont = True
else:
lastname = options.sn
- if (ipavalidate.plain(lastname, notEmpty=True)):
- print "Last name must be letters or '"
+ if (ipavalidate.String(lastname, notEmpty=True)):
+ print "Please enter a value"
return 1
cont = False
if not options.mail:
while (cont != True):
mail = raw_input("E-mail addr: [%s]" % user.getValue('mail'))
- if (ipavalidate.email(mail, notEmpty=False)):
- print "Must include a user and domain name"
+ if (ipavalidate.Email(mail, notEmpty=False)):
+ print "E-mail must include a user and domain name"
else:
cont = True
else:
mail = options.mail
- if (ipavalidate.email(mail)):
+ if (ipavalidate.Email(mail)):
print "E-mail must include a user and domain name"
return 1
@@ -174,8 +174,8 @@ def main():
if not options.gecos:
while (cont != True):
gecos = raw_input("gecos: [%s] " % user.getValue('gecos'))
- if (ipavalidate.plain(gecos, notEmpty=False)):
- print "Must be letters, numbers, spaces or '"
+ if (ipavalidate.String(gecos, notEmpty=False)):
+ print "Please enter a value"
else:
cont = True
@@ -183,8 +183,8 @@ def main():
if not options.directory:
while (cont != True):
directory = raw_input("home directory: [%s] " % user.getValue('homeDirectory'))
- if (ipavalidate.path(gecos, notEmpty=False)):
- print "Must be letters, numbers, spaces or '"
+ if (ipavalidate.Path(gecos, notEmpty=False)):
+ print "Valid path is required"
else:
cont = True
cont = False
diff --git a/ipa-client/ipaclient/Makefile.am b/ipa-client/ipaclient/Makefile.am
index 038238926..290ffef8d 100644
--- a/ipa-client/ipaclient/Makefile.am
+++ b/ipa-client/ipaclient/Makefile.am
@@ -3,7 +3,6 @@ NULL =
appdir = $(IPA_DATA_DIR)/ipaclient
app_PYTHON = \
__init__.py \
- dnsclient.py \
ipachangeconf.py \
ipadiscovery.py \
ntpconf.py \
diff --git a/ipa-client/ipaclient/__init__.py b/ipa-client/ipaclient/__init__.py
index c07a549a5..ba14d3c4c 100644
--- a/ipa-client/ipaclient/__init__.py
+++ b/ipa-client/ipaclient/__init__.py
@@ -18,5 +18,5 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-__all__ = ["ipadiscovery", "ipachangeconf", "dnsclient"]
+__all__ = ["ipadiscovery", "ipachangeconf"]
diff --git a/ipa-client/ipaclient/ipadiscovery.py b/ipa-client/ipaclient/ipadiscovery.py
index 6f44ffd1b..939d41056 100644
--- a/ipa-client/ipaclient/ipadiscovery.py
+++ b/ipa-client/ipaclient/ipadiscovery.py
@@ -20,7 +20,7 @@
import socket
import logging
-import dnsclient
+import ipa.dnsclient
import ldap
from ldap import LDAPError
@@ -191,10 +191,10 @@ class IPADiscovery:
# terminate the name
if not qname.endswith("."):
qname += "."
- results = dnsclient.query(qname, dnsclient.DNS_C_IN, dnsclient.DNS_T_SRV)
+ results = ipa.dnsclient.query(qname, ipa.dnsclient.DNS_C_IN, ipa.dnsclient.DNS_T_SRV)
for result in results:
- if result.dns_type == dnsclient.DNS_T_SRV:
+ if result.dns_type == ipa.dnsclient.DNS_T_SRV:
rserver = result.rdata.server.rstrip(".")
if result.rdata.port and result.rdata.port != 389:
rserver += ":" + str(result.rdata.port)
@@ -214,10 +214,10 @@ class IPADiscovery:
# terminate the name
if not qname.endswith("."):
qname += "."
- results = dnsclient.query(qname, dnsclient.DNS_C_IN, dnsclient.DNS_T_TXT)
+ results = ipa.dnsclient.query(qname, ipa.dnsclient.DNS_C_IN, ipa.dnsclient.DNS_T_TXT)
for result in results:
- if result.dns_type == dnsclient.DNS_T_TXT:
+ if result.dns_type == ipa.dnsclient.DNS_T_TXT:
realm = result.rdata.data
if realm:
break
@@ -228,9 +228,9 @@ class IPADiscovery:
# terminate the name
if not qname.endswith("."):
qname += "."
- results = dnsclient.query(qname, dnsclient.DNS_C_IN, dnsclient.DNS_T_SRV)
+ results = ipa.dnsclient.query(qname, ipa.dnsclient.DNS_C_IN, ipa.dnsclient.DNS_T_SRV)
for result in results:
- if result.dns_type == dnsclient.DNS_T_SRV:
+ if result.dns_type == ipa.dnsclient.DNS_T_SRV:
qname = result.rdata.server.rstrip(".")
if result.rdata.port and result.rdata.port != 88:
qname += ":" + str(result.rdata.port)
diff --git a/ipa-python/MANIFEST.in b/ipa-python/MANIFEST.in
index 49f2126a6..e2cad6f22 100644
--- a/ipa-python/MANIFEST.in
+++ b/ipa-python/MANIFEST.in
@@ -1,3 +1,3 @@
include *.conf
-include freeipa-python.spec*
+include ipa-python.spec*
diff --git a/ipa-client/ipaclient/dnsclient.py b/ipa-python/dnsclient.py
index bc8a229cd..bc8a229cd 100644
--- a/ipa-client/ipaclient/dnsclient.py
+++ b/ipa-python/dnsclient.py
diff --git a/ipa-python/ipavalidate.py b/ipa-python/ipavalidate.py
index 3a6699e16..36d94e02d 100644
--- a/ipa-python/ipavalidate.py
+++ b/ipa-python/ipavalidate.py
@@ -19,7 +19,7 @@
import re
-def email(mail, notEmpty=True):
+def Email(mail, notEmpty=True):
"""Do some basic validation of an e-mail address.
Return 0 if ok
Return 1 if not
@@ -49,7 +49,7 @@ def email(mail, notEmpty=True):
return 0
-def plain(text, notEmpty=False):
+def Plain(text, notEmpty=False, allowSpaces=True):
"""Do some basic validation of a plain text field
Return 0 if ok
Return 1 if not
@@ -57,23 +57,33 @@ def plain(text, notEmpty=False):
If notEmpty is True the this will return an error if the field
is "" or None.
"""
- textRE = re.compile(r"^[a-zA-Z_\-0-9\'\ ]*$")
-
- if not text and notEmpty is True:
- return 1
-
- if text is None:
+ if (text is None) or (not text.strip()):
if notEmpty is True:
return 1
else:
return 0
+ if allowSpaces:
+ textRE = re.compile(r"^[a-zA-Z_\-0-9\'\ ]*$")
+ else:
+ textRE = re.compile(r"^[a-zA-Z_\-0-9\']*$")
if not textRE.search(text):
return 1
return 0
-def path(text, notEmpty=False):
+def String(text, notEmpty=False):
+ """A string type. This is much looser in what it allows than plain"""
+
+ if text is None or not text.strip():
+ if notEmpty is True:
+ return 1
+ else:
+ return 0
+
+ return 0
+
+def Path(text, notEmpty=False):
"""Do some basic validation of a path
Return 0 if ok
Return 1 if not
diff --git a/ipa-python/test/test_ipavalidate.py b/ipa-python/test/test_ipavalidate.py
index 507f7e022..677866d04 100644
--- a/ipa-python/test/test_ipavalidate.py
+++ b/ipa-python/test/test_ipavalidate.py
@@ -31,39 +31,54 @@ class TestValidate(unittest.TestCase):
def tearDown(self):
pass
- def test_validemail(self):
- self.assertEqual(0, ipavalidate.email("test@freeipa.org"))
- self.assertEqual(0, ipavalidate.email("", notEmpty=False))
+ def test_validEmail(self):
+ self.assertEqual(0, ipavalidate.Email("test@freeipa.org"))
+ self.assertEqual(0, ipavalidate.Email("", notEmpty=False))
- def test_invalidemail(self):
- self.assertEqual(1, ipavalidate.email("test"))
- self.assertEqual(1, ipavalidate.email("test@freeipa"))
- self.assertEqual(1, ipavalidate.email("test@.com"))
- self.assertEqual(1, ipavalidate.email(""))
- self.assertEqual(1, ipavalidate.email(None))
+ def test_invalidEmail(self):
+ self.assertEqual(1, ipavalidate.Email("test"))
+ self.assertEqual(1, ipavalidate.Email("test@freeipa"))
+ self.assertEqual(1, ipavalidate.Email("test@.com"))
+ self.assertEqual(1, ipavalidate.Email(""))
+ self.assertEqual(1, ipavalidate.Email(None))
- def test_validplain(self):
- self.assertEqual(0, ipavalidate.plain("Joe User"))
- self.assertEqual(0, ipavalidate.plain("Joe O'Malley"))
- self.assertEqual(0, ipavalidate.plain("", notEmpty=False))
- self.assertEqual(0, ipavalidate.plain(None, notEmpty=False))
+ def test_validPlain(self):
+ self.assertEqual(0, ipavalidate.Plain("Joe User"))
+ self.assertEqual(0, ipavalidate.Plain("Joe O'Malley"))
+ self.assertEqual(0, ipavalidate.Plain("", notEmpty=False))
+ self.assertEqual(0, ipavalidate.Plain(None, notEmpty=False))
+ self.assertEqual(0, ipavalidate.Plain("JoeUser", allowSpaces=False))
+ self.assertEqual(0, ipavalidate.Plain("JoeUser", allowSpaces=True))
- def test_invalidplain(self):
- self.assertEqual(1, ipavalidate.plain("Joe (User)"))
- self.assertEqual(1, ipavalidate.plain("", notEmpty=True))
- self.assertEqual(1, ipavalidate.plain(None, notEmpty=True))
+ def test_invalidPlain(self):
+ self.assertEqual(1, ipavalidate.Plain("Joe (User)"))
+ self.assertEqual(1, ipavalidate.Plain("Joe C. User"))
+ self.assertEqual(1, ipavalidate.Plain("", notEmpty=True))
+ self.assertEqual(1, ipavalidate.Plain(None, notEmpty=True))
+ self.assertEqual(1, ipavalidate.Plain("Joe User", allowSpaces=False))
- def test_validpath(self):
- self.assertEqual(0, ipavalidate.path("/"))
- self.assertEqual(0, ipavalidate.path("/home/user"))
- self.assertEqual(0, ipavalidate.path("../home/user"))
- self.assertEqual(0, ipavalidate.path("", notEmpty=False))
- self.assertEqual(0, ipavalidate.path(None, notEmpty=False))
+ def test_validString(self):
+ self.assertEqual(0, ipavalidate.String("Joe User"))
+ self.assertEqual(0, ipavalidate.String("Joe O'Malley"))
+ self.assertEqual(1, ipavalidate.Plain("Joe C. User"))
+ self.assertEqual(0, ipavalidate.String("", notEmpty=False))
+ self.assertEqual(0, ipavalidate.String(None, notEmpty=False))
- def test_invalidpath(self):
- self.assertEqual(1, ipavalidate.path("(foo)"))
- self.assertEqual(1, ipavalidate.path("", notEmpty=True))
- self.assertEqual(1, ipavalidate.path(None, notEmpty=True))
+ def test_invalidString(self):
+ self.assertEqual(1, ipavalidate.String("", notEmpty=True))
+ self.assertEqual(1, ipavalidate.String(None, notEmpty=True))
+
+ def test_validPath(self):
+ self.assertEqual(0, ipavalidate.Path("/"))
+ self.assertEqual(0, ipavalidate.Path("/home/user"))
+ self.assertEqual(0, ipavalidate.Path("../home/user"))
+ self.assertEqual(0, ipavalidate.Path("", notEmpty=False))
+ self.assertEqual(0, ipavalidate.Path(None, notEmpty=False))
+
+ def test_invalidPath(self):
+ self.assertEqual(1, ipavalidate.Path("(foo)"))
+ self.assertEqual(1, ipavalidate.Path("", notEmpty=True))
+ self.assertEqual(1, ipavalidate.Path(None, notEmpty=True))
if __name__ == '__main__':
unittest.main()
diff --git a/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py b/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py
index c48b8ced4..0f9591fb5 100644
--- a/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py
+++ b/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py
@@ -9,8 +9,8 @@ class IPAPolicyFields(object):
ipasearchtimelimit = widgets.TextField(name="ipasearchtimelimit", label="Search Time Limit (sec.)", attrs=dict(size=6,maxlength=6))
ipasearchrecordslimit = widgets.TextField(name="ipasearchrecordslimit", label="Search Records Limit", attrs=dict(size=6,maxlength=6))
ipahomesrootdir = widgets.TextField(name="ipahomesrootdir", label="Root for Home Directories")
- ipadefaultloginshell = widgets.TextField(name="ipadefaultloginshell", label="Default shell")
- ipadefaultprimarygroup = widgets.TextField(name="ipadefaultprimarygroup", label="Default Users group")
+ ipadefaultloginshell = widgets.TextField(name="ipadefaultloginshell", label="Default Shell")
+ ipadefaultprimarygroup = widgets.TextField(name="ipadefaultprimarygroup", label="Default User Group")
ipamaxusernamelength = widgets.TextField(name="ipamaxusernamelength", label="Max. Username Length", attrs=dict(size=3,maxlength=3))
ipapwdexpadvnotify = widgets.TextField(name="ipapwdexpadvnotify", label="Password Expiration Notification (days)", attrs=dict(size=3,maxlength=3))
ipauserobjectclasses = widgets.TextField(name="ipauserobjectclasses", label="Default User Object Classes", attrs=dict(size=50))
@@ -24,9 +24,9 @@ class IPAPolicyFields(object):
# From cn=accounts
krbmaxpwdlife = widgets.TextField(name="krbmaxpwdlife", label="Max. Password Lifetime (days)", attrs=dict(size=3,maxlength=3))
krbminpwdlife = widgets.TextField(name="krbminpwdlife", label="Min. Password Lifetime (hours)", attrs=dict(size=3,maxlength=3))
- krbpwdmindiffchars = widgets.TextField(name="krbpwdmindiffchars", label="Min. number of character classes", attrs=dict(size=3,maxlength=3))
- krbpwdminlength = widgets.TextField(name="krbpwdminlength", label="Min. Length of password", attrs=dict(size=3,maxlength=3))
- krbpwdhistorylength = widgets.TextField(name="krbpwdhistorylength", label="Password History size", attrs=dict(size=3,maxlength=3))
+ krbpwdmindiffchars = widgets.TextField(name="krbpwdmindiffchars", label="Min. Number of Character Classes", attrs=dict(size=3,maxlength=3))
+ krbpwdminlength = widgets.TextField(name="krbpwdminlength", label="Min. Length of Password", attrs=dict(size=3,maxlength=3))
+ krbpwdhistorylength = widgets.TextField(name="krbpwdhistorylength", label="Password History Size", attrs=dict(size=3,maxlength=3))
password_orig = widgets.HiddenField(name="password_orig")
diff --git a/ipa-server/ipa-gui/ipagui/static/css/style.css b/ipa-server/ipa-gui/ipagui/static/css/style.css
index 6d68e8e37..8017e7427 100644
--- a/ipa-server/ipa-gui/ipagui/static/css/style.css
+++ b/ipa-server/ipa-gui/ipagui/static/css/style.css
@@ -395,9 +395,9 @@ ul.checkboxlist li input {
.sortcol {
cursor: pointer;
- padding-right: 20px !important;
+ padding-left: 10px !important;
background-repeat: no-repeat !important;
- background-position: right center !important;
+ background-position: left center !important;
text-decoration: underline;
}
.sortasc {
diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py b/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py
index 142d34430..cee239e72 100644
--- a/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py
+++ b/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py
@@ -71,7 +71,7 @@ class DelegationController(IPAController):
new_aci.source_group = kw.get('source_group_dn')
new_aci.dest_group = kw.get('dest_group_dn')
new_aci.attrs = kw.get('attrs')
- if (new_aci.attrs, str):
+ if isinstance(new_aci.attrs, str):
new_aci.attrs = [new_aci.attrs]
# Look for an existing ACI of the same name
diff --git a/ipa-server/ipa-install/share/default-aci.ldif b/ipa-server/ipa-install/share/default-aci.ldif
index b2c3f7980..95743eebb 100644
--- a/ipa-server/ipa-install/share/default-aci.ldif
+++ b/ipa-server/ipa-install/share/default-aci.ldif
@@ -23,6 +23,7 @@ dn: cn=accounts,$SUFFIX
changetype: modify
add: aci
aci: (targetattr = "krbMaxPwdLife || krbMinPwdLife || krbPwdMinDiffChars || krbPwdMinLength || krbPwdHistoryLength")(version 3.0;acl "Admins can write password policy"; allow (write) groupdn="ldap:///cn=admins,cn=groups,cn=accounts,$SUFFIX";)
+aci: (targetattr = "aci")(version 3.0;acl "Admins can manage delegations"; allow (write, delete) groupdn="ldap:///cn=admins,cn=groups,cn=accounts,$SUFFIX";)
dn: cn=services,cn=accounts,$SUFFIX
changetype: modify