summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Viktorin <pviktori@redhat.com>2013-01-10 09:50:22 -0500
committerMartin Kosek <mkosek@redhat.com>2013-03-01 16:59:42 +0100
commit7e1495b404f6d7dd2a8c779736e62f28fc2311ea (patch)
tree54cde6c38e53e7dde1be3eeb56f2688664e5d928
parent83f99070d6a25785e872bbfa8026333fc3110624 (diff)
downloadfreeipa.git-7e1495b404f6d7dd2a8c779736e62f28fc2311ea.tar.gz
freeipa.git-7e1495b404f6d7dd2a8c779736e62f28fc2311ea.tar.xz
freeipa.git-7e1495b404f6d7dd2a8c779736e62f28fc2311ea.zip
Derive Entity class from Entry, and move it to ldapupdate
The two classes were nearly identical, and the updater is the only code that uses Entity. Part of the work for: https://fedorahosted.org/freeipa/ticket/2660
-rw-r--r--ipapython/entity.py131
-rw-r--r--ipaserver/install/ldapupdate.py31
-rw-r--r--ipaserver/ipaldap.py12
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()