From aaf712d49980985011a09a62e90b110c3f604a50 Mon Sep 17 00:00:00 2001 From: Frank Brehm Date: Mon, 20 Mar 2017 16:26:56 +0100 Subject: [PATCH] Rewriting of the modified numeric User Id --- pp_lib/ldap_app.py | 40 ++++++++++++++++++++++++++++++++++++++-- pp_lib/mk_home_app.py | 15 +++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/pp_lib/ldap_app.py b/pp_lib/ldap_app.py index 47b7c0c..cbdd70e 100644 --- a/pp_lib/ldap_app.py +++ b/pp_lib/ldap_app.py @@ -24,7 +24,7 @@ import six import ldap3 # ldap3 classes and objects -from ldap3 import Server, ServerPool, Connection, Reader, ObjectDef +from ldap3 import Server, ServerPool, Connection, Reader, Writer, ObjectDef # ldap3 constants from ldap3 import IP_V4_PREFERRED, ROUND_ROBIN, AUTO_BIND_NONE, ALL_ATTRIBUTES from ldap3 import SUBTREE @@ -42,7 +42,7 @@ from .merge import merge_structure from .cfg_app import PpCfgAppError, PpConfigApplication -__version__ = '0.4.3' +__version__ = '0.4.4' LOG = logging.getLogger(__name__) @@ -329,6 +329,42 @@ class PpLdapApplication(PpConfigApplication): uid = entry['uidNumber'][0] return uid + # ------------------------------------------------------------------------- + def set_numeric_uid(self, dn, new_uid, simulate=False, base=None): + + person = ObjectDef(['posixAccount', 'shadowAccount']) + person += ["uid", "uidNumber", "gidNumber", 'objectClass'] + + if base is None: + base = self.ldap_base_dn + + read_cursor = Reader( + self.ldap_connection, + object_def=person, base=base) + read_cursor.search_object(entry_dn=dn) + + if not read_cursor.entries: + msg = "Did not found Counter LDAP entry {!r}.".format(dn) + raise PpMkHomeError(msg) + + entry = read_cursor.entries[0] + if self.verbose: + LOG.debug("Found entry:\n{}".format(entry)) + + writer_cursor = Writer.from_cursor(read_cursor) + entry = writer_cursor.entries[0] + entry.uidNumber = new_uid + if self.verbose > 1: + LOG.debug("Writer entry before commit:\n{}".format(entry)) + + LOG.info("Setting numeric user Id of {d!r} to {u} ...".format( + d=dn, u=new_uid)) + + if not simulate: + entry.entry_commit_changes() + if self.verbose: + LOG.debug("Writer entry after commit:\n{}".format(entry)) + # ------------------------------------------------------------------------- def post_run(self): """ diff --git a/pp_lib/mk_home_app.py b/pp_lib/mk_home_app.py index ea8779a..48490f3 100644 --- a/pp_lib/mk_home_app.py +++ b/pp_lib/mk_home_app.py @@ -25,7 +25,7 @@ import six import ldap3 -from ldap3 import ObjectDef, AttrDef +from ldap3 import ObjectDef, AttrDef, Reader, Writer from ldap3.core.exceptions import LDAPKeyError @@ -40,7 +40,7 @@ from .merge import merge_structure from .ldap_app import PpLdapAppError, PpLdapApplication -__version__ = '0.4.1' +__version__ = '0.4.2' LOG = logging.getLogger(__name__) @@ -248,6 +248,11 @@ class PpMkHomeApp(PpLdapApplication): self.user_entries = self.ldap_search_subtree(person, query_filter) LOG.debug("Found {} LDAP entries.".format(len(self.user_entries))) + # ------------------------------------------------------------------------- + def set_new_counter(self, new_uid): + + return self.set_numeric_uid(self.dn_counter, new_uid, simulate=self.simulate) + # ------------------------------------------------------------------------- def check_numeric_uids(self): @@ -263,6 +268,7 @@ class PpMkHomeApp(PpLdapApplication): cur_uid = entry['uidNumber'][0] user_name = entry['uid'][0] + dn = entry.entry_dn if cur_uid == self.initial_uid: @@ -272,6 +278,11 @@ class PpMkHomeApp(PpLdapApplication): n=user_name, u=new_uid)) uid_counter = self.get_numeric_uid(self.dn_counter) + new_uid = uid_counter + 1 + # Setting uid of user itself + self.set_numeric_uid(dn, new_uid, simulate=self.simulate) + # Setting uid of the counter + self.set_new_counter(new_uid) if self.verbose: print('') -- 2.39.5