diff options
-rw-r--r-- | ipapython/entity.py | 131 | ||||
-rw-r--r-- | ipaserver/install/ldapupdate.py | 31 | ||||
-rw-r--r-- | ipaserver/ipaldap.py | 12 |
3 files changed, 37 insertions, 137 deletions
diff --git a/ipapython/entity.py b/ipapython/entity.py deleted file mode 100644 index 7faa46de..00000000 --- a/ipapython/entity.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright (C) 2007 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import copy - -from ipapython import ipautil -from ipapython.dn import DN - -def copy_CIDict(x): - """Do a deep copy of a CIDict""" - y = {} - for key, value in x.iteritems(): - y[copy.deepcopy(key)] = copy.deepcopy(value) - return y - -class Entity: - """This class represents an IPA user. An LDAP entry consists of a DN - and a list of attributes. Each attribute consists of a name and a list of - values. For the time being I will maintain this. - - In python-ldap, entries are returned as a list of 2-tuples. - Instance variables: - dn - string - the string DN of the entry - data - CIDict - case insensitive dict of the attributes and values - orig_data - CIDict - case insentiive dict of the original attributes and values""" - - def __init__(self,entrydata=None): - """data is the raw data returned from the python-ldap result method, - which is a search result entry or a reference or None. - If creating a new empty entry, data is the string DN.""" - if entrydata: - if isinstance(entrydata,tuple): - self.dn = entrydata[0] - self.data = ipautil.CIDict(entrydata[1]) - elif isinstance(entrydata, DN): - self.dn = entrydata - self.data = ipautil.CIDict() - elif isinstance(entrydata, basestring): - self.dn = DN(entrydata) - self.data = ipautil.CIDict() - elif isinstance(entrydata,dict): - if hasattr(entrydata, 'dn'): - entrydata['dn'] = entrydata.dn - self.dn = entrydata['dn'] - del entrydata['dn'] - self.data = ipautil.CIDict(entrydata) - else: - self.dn = DN() - self.data = ipautil.CIDict() - - assert isinstance(self.dn, DN) - self.orig_data = ipautil.CIDict(copy_CIDict(self.data)) - - dn = ipautil.dn_attribute_property('_dn') - - def __nonzero__(self): - """This allows us to do tests like if entry: returns false if there is no data, - true otherwise""" - return self.data != None and len(self.data) > 0 - - def __str__(self): - return "dn: %s data: %s" % (self.dn, self.data) - - def getValues(self,name): - """Get the list (array) of values for the attribute named name""" - return self.data.get(name) - - def getValue(self,name,default=None): - """Get the first value for the attribute named name""" - value = self.data.get(name,default) - if isinstance(value,list) or isinstance(value,tuple): - return value[0] - else: - return value - - def setValue(self,name,*value): - """Value passed in may be a single value, several values, or a single sequence. - For example: - ent.setValue('name', 'value') - ent.setValue('name', 'value1', 'value2', ..., 'valueN') - ent.setValue('name', ['value1', 'value2', ..., 'valueN']) - ent.setValue('name', ('value1', 'value2', ..., 'valueN')) - Since *value is a tuple, we may have to extract a list or tuple from that - tuple as in the last two examples above""" - if (len(value) < 1): - return - if (len(value) == 1): - self.data[name] = ipautil.utf8_encode_values(value[0]) - else: - self.data[name] = ipautil.utf8_encode_values(value) - - setValues = setValue - - def toTupleList(self): - """Convert the attrs and values to a list of 2-tuples. The first element - of the tuple is the attribute name. The second element is either a - single value or a list of values.""" - return self.data.items() - - def toDict(self): - """Convert the attrs and values to a dict. The dict is keyed on the - attribute name. The value is either single value or a list of values.""" - assert isinstance(self.dn, DN) - result = ipautil.CIDict(self.data) - result['dn'] = self.dn - return result - - def attrList(self): - """Return a list of all attributes in the entry""" - return self.data.keys() - - def origDataDict(self): - """Returns a dict of the original values of the user. Used for updates.""" - assert isinstance(self.dn, DN) - result = ipautil.CIDict(self.orig_data) - result['dn'] = self.dn - return result diff --git a/ipaserver/install/ldapupdate.py b/ipaserver/install/ldapupdate.py index f08ee8b9..0d260640 100644 --- a/ipaserver/install/ldapupdate.py +++ b/ipaserver/install/ldapupdate.py @@ -33,6 +33,7 @@ import pwd import fnmatch import csv import inspect +import copy import krbV import ldap @@ -40,13 +41,37 @@ from ldap.schema.models import ObjectClass, AttributeType from ipaserver.install import installutils from ipaserver import ipaldap -from ipapython import entity, ipautil +from ipapython import ipautil from ipalib import errors from ipalib import api from ipapython.dn import DN from ipapython.ipa_log_manager import * from ipaserver.install.plugins import PRE_UPDATE, POST_UPDATE + +class Entity(ipaldap.Entry): + # TODO: Use ldap2 instead + def __init__(self, entrydata=None): + ipaldap.Entry.__init__(self, entrydata) + y = {} + for key, value in self.data.iteritems(): + y[copy.deepcopy(key)] = copy.deepcopy(value) + self.orig_data = ipautil.CIDict(y) + + def attrList(self): + """Return a list of all attributes in the entry""" + return self.data.keys() + + def origDataDict(self): + """Returns a dict of the original values of the user. + + Used for updates. + """ + result = ipautil.CIDict(self.orig_data) + result['dn'] = self.dn + return result + + class BadSyntax(installutils.ScriptError): def __init__(self, value): self.value = value @@ -255,7 +280,7 @@ class LDAPUpdate: entry[key] = '' elif len(value) == 1: entry[key] = value[0] - return entity.Entity(entry) + return Entity(entry) def _combine_updates(self, all_updates, update): 'Combine a new update with the list of total updates' @@ -483,7 +508,7 @@ class LDAPUpdate: def _create_default_entry(self, dn, default): """Create the default entry from the values provided. - The return type is entity.Entity + The return type is Entity """ assert isinstance(dn, DN) entry = ipaldap.Entry(dn) diff --git a/ipaserver/ipaldap.py b/ipaserver/ipaldap.py index f44c4842..c64cd92b 100644 --- a/ipaserver/ipaldap.py +++ b/ipaserver/ipaldap.py @@ -38,7 +38,6 @@ from ipapython import ipautil from ipalib import errors from ipapython.ipautil import format_netloc, wait_for_open_socket, wait_for_open_ports from ipapython.dn import DN -from ipapython.entity import Entity from ipaserver.plugins.ldap2 import IPASimpleLDAPObject, LDAPEntry # Global variable to define SASL auth @@ -113,6 +112,12 @@ class Entry: elif isinstance(entrydata, basestring): self.dn = DN(entrydata) self.data = ipautil.CIDict() + elif isinstance(entrydata, dict): + if hasattr(entrydata, 'dn'): + entrydata['dn'] = entrydata.dn + self.dn = entrydata['dn'] + del entrydata['dn'] + self.data = ipautil.CIDict(entrydata) else: raise TypeError("entrydata must be 2-tuple, DN, or basestring, got %s" % type(entrydata)) else: @@ -205,6 +210,7 @@ class Entry: ldif.LDIFWriter(sio,Entry.base64_attrs,1000).unparse(str(self.dn),newdata) return sio.getvalue() + class IPAdmin(IPAEntryLDAPObject): def __localinit(self): @@ -437,8 +443,8 @@ class IPAdmin(IPAEntryLDAPObject): """This wraps the add function. It assumes that the entry is already populated with all of the desired objectclasses and attributes""" - if not isinstance(entry, (Entry, Entity)): - raise TypeError('addEntry expected an Entry or Entity object, got %s instead' % entry.__class__) + if not isinstance(entry, Entry): + raise TypeError('addEntry expected an Entry object, got %s instead' % entry.__class__) sctrl = self.__get_server_controls() |