diff --git a/patches.d/scribe-backend.patch b/patches.d/scribe-backend.patch index f69a6ab..863d8d6 100644 --- a/patches.d/scribe-backend.patch +++ b/patches.d/scribe-backend.patch @@ -71,6 +71,148 @@ index 0db4982..290d66e 100755 log.debuglog("Démarrage de LSC...", title=True) nscd_start() log.del_lock() +diff --git usr/lib/python3/dist-packages/scribe/eoleldap.py usr/lib/python3/dist-packages/scribe/eoleldap.py +index 45ec338..9b80f82 100644 +--- usr/lib/python3/dist-packages/scribe/eoleldap.py ++++ usr/lib/python3/dist-packages/scribe/eoleldap.py +@@ -8,21 +8,21 @@ + # eoleldap.py + # + # librairie pour la connexion à un serveur ldap + # + ########################################################################### + """ + Librairie Ldap pour Scribe + """ + import sys + from .ldapconf import SUFFIX, ROOT_DN, USER_FILTER, GROUP_FILTER, SHARE_FILTER, \ +- SUPPORT_ETAB, ldap_server, ldap_passwd, num_etab, BRANCHE_GROUP_ETAB, LDAP_MODE, acad ++ SUPPORT_ETAB, ldap_server, ldap_passwd, num_etab, BRANCHE_GROUP_ETAB, BRANCHE_ETAB, LDAP_MODE, acad + from scribe.errors import LdapExistingGroup, LdapExistingUser, \ + SystemExistingUser, NiveauNotFound + from .eoletools import to_list + import ldap + from ldap import SCOPE_ONELEVEL + + + def is_system_user(user): + """ + indique si le login proposé est déjà un utilisateur système +@@ -120,60 +120,68 @@ class _Ldap(object): + class _LdapEntry(object): + """ + classe de base pour gérer les entrées ldap + """ + def __init__(self, serveur=None, passwd=None): + self.serveur = serveur + self.passwd = passwd + self.ldap_admin = Ldap(serveur, passwd) + self.cache_etab = {'login': {}, 'group': {}} + +- def _is_group(self, name): ++ def _is_group(self, name, etab=None): + """ + test si le groupe existe dans l'annuaire + """ + cnfilter = "(&%s(cn=%s))" % (GROUP_FILTER, name) +- if self.ldap_admin._search_one(cnfilter): ++ if etab: ++ branche_etab = BRANCHE_ETAB % {'etab': etab} ++ else: ++ branche_etab = None ++ if self.ldap_admin._search_one(cnfilter, suffix=branche_etab): + return True + return False + +- def _is_user(self, name): ++ def _is_user(self, name, etab=None): + """ + test si l'utilisateur existe dans l'annuaire + """ + uidfilter = "(&%s(uid=%s))" % (USER_FILTER, name) +- if self.ldap_admin._search_one(uidfilter): ++ if etab: ++ branche_etab = BRANCHE_ETAB % {'etab': etab} ++ else: ++ branche_etab = None ++ if self.ldap_admin._search_one(uidfilter, suffix=branche_etab): + return True + return False + + def _is_share(self, name): + """ + test si le partage existe dans l'annuaire + """ + shfilter = "(&%s(sambaShareName=%s))" % (SHARE_FILTER, name) + if self.ldap_admin._search_one(shfilter): + return True + return False + + def is_available_name(self, name): + self.ldap_admin.connect() + res = self._is_available_name(name) + self.ldap_admin.close() + return res + +- def _is_available_name(self, name): ++ def _is_available_name(self, name, etab=None): + """ + teste la disponibilité d'un uid ou un cn + """ +- if self._is_group(name): ++ if self._is_group(name, etab=etab): + return False +- elif self._is_user(name): ++ elif self._is_user(name, etab=etab): + return False + elif is_system_user(name): + return False + return True + + def _test_available_name(self, name): + """ + Test la disponibilité d'un nom + raise une exception si pas disponible + """ +diff --git usr/lib/python3/dist-packages/scribe/eoleuser.py usr/lib/python3/dist-packages/scribe/eoleuser.py +index 05569fd..7a8d46c 100644 +--- usr/lib/python3/dist-packages/scribe/eoleuser.py ++++ usr/lib/python3/dist-packages/scribe/eoleuser.py +@@ -536,31 +536,32 @@ class User(LdapEntry): + data = [((MOD_REPLACE, attribut, value))] + self.ldap_admin._modify(user_dn, data) + + def delete(self, login, remove_data=False, delete_resp=False): + """ + supprime un utilisateur + """ + self._delete(login, remove_data=remove_data, need_connect=True, + delete_resp=delete_resp) + +- def _delete(self, login, remove_data=False, need_connect=False, delete_resp=False): ++ def _delete(self, login, remove_data=False, need_connect=False, delete_resp=False, etab=None): + """ + supprime un utilisateur + """ + if self.has_samba: + quota.set_quota(login, '0') + if remove_data: + cmd = ['/usr/sbin/smbldap-userdel', '-r', login] + else: + cmd = ['/usr/sbin/smbldap-userdel', login] +- etab = self.get_etab(login) ++ if etab is None: ++ etab = self.get_etab(login) + force_dn = {'groupsdn="ou=local,ou=Groupes,${etab},${suffix}"': + 'groupsdn="${suffix}"'} + tool.launch_smbldap_tool(cmd, num_etab, etab, force_dn=force_dn) + # gestion des données résiduelles + if remove_data: + ad_user_dir = join(AD_HOME_PATH, login) + rmtree(ad_user_dir, ignore_errors=True) + perso = join(HOME_PATH, login[0], login) + # code uniquement pour AmonEcole (#33013) + if islink(perso): diff --git usr/lib/python3/dist-packages/scribe/importation/preferences.py usr/lib/python3/dist-packages/scribe/importation/preferences.py index fdcb142..fe11e3b 100644 --- usr/lib/python3/dist-packages/scribe/importation/preferences.py @@ -123,9 +265,77 @@ index fdcb142..fe11e3b 100644 def get_administratifs_prefs(): diff --git usr/lib/python3/dist-packages/scribe/importation/writer.py usr/lib/python3/dist-packages/scribe/importation/writer.py -index 34ce0fb..40865d5 100644 +index 34ce0fb..08716e0 100644 --- usr/lib/python3/dist-packages/scribe/importation/writer.py +++ usr/lib/python3/dist-packages/scribe/importation/writer.py +@@ -58,37 +58,37 @@ def _gen_mail(pref, mail): + """ + if pref.startswith('perso') and '@' in mail: + return mail + elif 'internet' in pref: + return 'internet' + elif 'restreint' in pref: + return 'restreint' + else: + return '' + +-def _gen_new_login(user, pref, prenom='', nom='', force_login=''): ++def _gen_new_login(user, pref, prenom='', nom='', force_login='', etab=None): + """ + génération d'un login unique + @user : objet compatible LdapUser() + @pref : standard/pnom/nomp/p.nnn/prenom.n + @prenom : prénom de l'utilisateur + @nom : nom de l'utilisateur + @force_login : login forcé + """ + if force_login != '': + login = base_login = force_login + else: + login = base_login = gen_login(pref, prenom, nom) + num = 1 + # vérification de la disponibilité de l'identifiant + # si non disponible, il est suffixé d'un numéro +- while not user._is_available_name(login): ++ while not user._is_available_name(login, etab=etab): + login = "%s%d" % (base_login, num) + num += 1 + if login == '' or login.isdigit(): + raise BadLogin("""Login "%s" invalide""" % login) + return login + + def _sync_passwords(user, new_passwords, change_pwd=False): + """ + synchronisation des mots de passe + @user : objet compatible LdapUser() +@@ -769,25 +769,25 @@ def write_responsable(store, connexion, current_ead_user=config.DEFAULT_USER): + # -------------------- enseignants -------------------- # + + def _new_enseignant(enseignant, user, prefs, etab=None, new_passwords=[]): + """ + traitement d'un nouveau enseignant (création) + enseignant : store.Enseignant() + user : eoleuser.Enseignant() + """ + if enseignant.force_login: + login = _gen_new_login(user, prefs.get_default('login'), +- force_login=str(enseignant.force_login)) ++ force_login=str(enseignant.force_login), etab=etab) + else: + login = _gen_new_login(user, prefs.get_default('login'), + str(enseignant.prenom), +- str(enseignant.nom)) ++ str(enseignant.nom), etab=etab) + if enseignant.force_password: + password = str(enseignant.force_password) + else: + password = _gen_password(prefs.get_default('gen_pwd'), str(enseignant.date)) + log.log.debug("nouvel enseignant : %s" % login) + classe = [] + groups = [] + for joint in enseignant.get_classes(): + groups.append('profs-%s' % str(joint.classe.nom)) + if joint.profprincipal: @@ -834,23 +834,20 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): enseignant : store.Enseignant() user : eoleuser.Enseignant() @@ -150,7 +360,7 @@ index 34ce0fb..40865d5 100644 groups.append('profs-%s' % str(option.nom)) disciplines = eval(enseignant.disciplines) else: -@@ -874,64 +871,70 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): +@@ -874,64 +871,67 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): else: info = "%s;%s;%s;%s" % (str(enseignant.nom), str(enseignant.prenom), login, ATTRIB) @@ -207,9 +417,6 @@ index 34ce0fb..40865d5 100644 _sync_passwords(user, new_passwords, change_pwd=change_pwd) _create_dirs(user, quota, new_passwords) log.infolog("TOTAL : %d enseignants" % num) -+ # write unmodified users list -+ # filtrer les enseignants avec LastUpdate plus vieux que le début de l’import et vérifier qu’ils ne sont pas dans store.query(Enseignant) ? -+ #user.ldap_admin._search(PROF_FILTER, attrlist=['uid'], suffix=branche_etab % {'etab': etab}) if num != 0: log.copy_info(config.ENS_INFO, user=current_ead_user) + return logins @@ -223,7 +430,7 @@ index 34ce0fb..40865d5 100644 administratif : store.Administratif() user : eoleuser.Administratif() """ -@@ -1020,21 +1023,21 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF +@@ -1020,21 +1020,21 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF if user._is_administratif(str(administratif.force_login)): login = str(administratif.force_login) else: