Sort password policy by priority

'ipa pwpolicy-find' output is now sorted by priority of the policies.
Lower position means lower priority. Global policy is then at the bottom.

The changes has also affected LDAPSearch class in baseldap.py:
LDAPSearch class sorts the search results by primary key be default
(which is usually 'cn'). Therefor a function pointer entries_sortfn
was added. If no sorting function exists, default sorting by primary key
is used.

Sorting function had to be introduced due to the fact that pwpolicy's
primary key is also it's 'cn' and global policy is not allowed to have any
priority.

https://fedorahosted.org/freeipa/ticket/2045
This commit is contained in:
Ondrej Hamada 2011-12-02 13:51:35 +01:00 committed by Rob Crittenden
parent c3dc08b93f
commit 8956fdbf40
2 changed files with 22 additions and 3 deletions

View File

@ -1548,6 +1548,10 @@ class LDAPSearch(BaseLDAPCommand, crud.Search):
member_param_incl_doc = _('Search for %s with these %s %s.')
member_param_excl_doc = _('Search for %s without these %s %s.')
# pointer to function for entries sorting
# if no function is assigned the entries are sorted by their primary key value
entries_sortfn = None
takes_options = (
Int('timelimit?',
label=_('Time Limit'),
@ -1726,9 +1730,12 @@ class LDAPSearch(BaseLDAPCommand, crud.Search):
else:
callback(self, ldap, entries, truncated, *args, **options)
if self.obj.primary_key:
sortfn=lambda x,y: cmp(x[1][self.obj.primary_key.name][0].lower(), y[1][self.obj.primary_key.name][0].lower())
entries.sort(sortfn)
if not self.entries_sortfn:
if self.obj.primary_key:
sortfn=lambda x,y: cmp(x[1][self.obj.primary_key.name][0].lower(), y[1][self.obj.primary_key.name][0].lower())
entries.sort(sortfn)
else:
entries.sort(self.entries_sortfn)
if not options.get('raw', False):
for e in entries:

View File

@ -455,6 +455,18 @@ api.register(pwpolicy_show)
class pwpolicy_find(LDAPSearch):
__doc__ = _('Search for group password policies.')
def sort_priority(self,x,y):
# global policy will be always last in the output
if x[1]['cn'][0] == global_policy_name:
return 1
elif y[1]['cn'][0] == global_policy_name:
return -1
else:
# policies with higher priority will be at the beginning of the list
return cmp(int(x[1]['cospriority'][0]), int(y[1]['cospriority'][0]))
entries_sortfn = sort_priority
def post_callback(self, ldap, entries, truncated, *args, **options):
if options.get('pkey_only', False):
return False