diff --git a/lc_ldap.py b/lc_ldap.py index e5c2fb5..e8e3a42 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -99,26 +99,26 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): self.droits = self.search_s(dn, ldap.SCOPE_BASE, attrlist=['droits'])[0][1].get('droits', []) if dn == variables.admin_dn: self.droits += [attributs.nounou] - # On autorise root à se binder en cn=readonly ou cn=admin, les autres doivent exister dans la base. - if user != 'root' and dn in [variables.admin_dn, variables.readonly_dn]: + # Il faut peupler current_login, qui sera utilisé pour écrire dans l'historique qui fait des modifications + if dn in [variables.admin_dn, variables.readonly_dn]: + # À ce stade, l'utilsateur qui appelle le script a réussi à se binder en cn=admin ou cn=readonly, + # c'est donc qu'il a pu lire les secrets, (directement ou par un sudo idoine) + # on lui fait donc confiance sur l'username qu'il fournit à condition qu'il en ait fournit un, quand même + if user is None: + raise ValueError("Même root doit préciser qui il est pour se connecter à la base LDAP.") + self.current_login = user + else: current_user = self.search("uid=%s" % user) if len(current_user) != 1: raise ValueError("L'utilisateur %s n'est pas présent dans la base en *1* exemplaire." % user) else: - self.current_user = current_user[0] + self.current_login = current_user[0]["uid"][0].value else: self.conn = self.simple_bind_s() self.dn = None self.droits = [] self._username_given = user - def _get_login(self): - if self._username_given == 'root': - return 'root' - else: - return self.current_user["uid"][0].value - current_login = property(_get_login) - def ressuscite(self, ldif_file, login=None): if login is None: login = self.current_login diff --git a/shortcuts.py b/shortcuts.py index 33004f1..3d9c76a 100644 --- a/shortcuts.py +++ b/shortcuts.py @@ -12,7 +12,10 @@ import variables #: Pour enregistrer dans l'historique, on a besoin de savoir qui exécute le script #: Si le script a été exécuté via un sudo, la variable SUDO_USER (l'utilisateur qui a effectué le sudo) #: est plus pertinente que USER (qui sera root) -current_user = os.getenv("SUDO_USER") or os.getenv("USER") or os.getlogin() +#: À noter que Cron, par exemple, n'a ni USER ni SUDO_USER mais possède bien LOGNAME +current_user = os.getenv("SUDO_USER") or os.getenv("USER") or os.getenv("LOGNAME") +if isinstance(current_user, str): + current_user = current_user.decode("utf-8") # Quand on a besoin du fichier de secrets def import_secrets():