diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index 0f2ab0f1..421c27cb 100644 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -1569,6 +1569,12 @@ def set_machine_alias(machine): machine.restore() return 1 +def set_machine_sshFingerprint(machine): + u"""Définit la liste des fingerprints d'une machine""" + if __prompt_input_menu(machine.sshFingerprint, 'SSHFingerprint machine', "Entrez ou modifier la fingerprint ssh de la machine.\nPour ajouter une fingerprint modifier le dernier de la liste.") or confirm(machine): + machine.restore() + return 1 + def del_machine(machine): u""" Destruction machine @@ -1671,6 +1677,7 @@ def modif_adher(adher): if payant: arg += u'"Mail" "Créer un compte ou changer l\'adresse mail de contact" ' arg += u'"Alias" "Créer ou supprimer un alias mail" ' + arg += u'"GPGFingerprint" "Ajouter ou supprimer une empreinte GPG" ' arg += u'"Remarque" "Ajouter ou modifer un commentaire" ' if isadm or isbureau: if 'cransAccount' in adher._data['objectClass']: @@ -1787,6 +1794,9 @@ def modif_adher(adher): elif res[0] == 'Alias': __prompt_input_menu(adher.alias, 'Alias mail', "Entrez ou modifier un alias mail.\nPour ajouter un alias modifier le dernier de la liste.") + elif res[0] == 'GPGFingerprint': + __prompt_input_menu(adher.gpgFingerprint, 'GPG Fingerprint', u"Entrez ou modifier une empreinte GPG que l'adhérent possède (tout abus sera sanctionné).\nPour ajouter une empreinte modifier le dernier de la liste.") + elif res[0] == 'Shell': while 1: arg = u'--title "Nouveau shell pour %s" ' % adher.Nom() @@ -1832,6 +1842,7 @@ def modif_machine(machine): arg += u'"Informations" "Modifier le nom de machine, l\'IP, adresse MAC" ' arg += u'"Blackliste" "Modifier la blacklist de la machine" ' arg += u'"Alias" "Créer ou supprimer un alias de la machine" ' + arg += u'"SSHFingerprint" "Ajouter ou enlever une empreinte ssh à la machine" ' arg += u'"Exemptions" "Modifier la liste d\'exemption d\'upload de la machine" ' arg += u'"Remarques" "Ajouter ou supprimer une remarque de la machine" ' if isinstance(machine, BorneWifi) and isadm: @@ -1851,6 +1862,8 @@ def modif_machine(machine): set_blackliste(machine) elif res[0] == 'Alias': set_machine_alias(machine) + elif res[0] == 'SSHFingerprint': + set_machine_sshFingerprint(machine) elif res[0] == 'Exemptions': set_machine_exemption(machine) elif res[0] == 'Remarques': diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 63e4b9b6..1cb5e473 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -190,7 +190,6 @@ def preattr(val): else: raise TypeError - def is_actif(sanction): """ Retourne True ou False suivant si la sanction fournie (chaîne @@ -234,6 +233,33 @@ def format_mac(mac): return mac +def format_gpg_fingerprint(fpr): + """ + Formatage de fingerpring GPG pour les avoir de la forme + XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX + """ + + # longueur + fpr sans espaces + l, fpr = preattr(fpr) + + fpr = fpr.replace(':', '').replace('-', '').replace(' ', '') + + if len(fpr) != 40: + raise ValueError(u"Longueur de la fingerprint GPG incorrecte, merci de respecter le format") + + for c in fpr: + if c not in string.hexdigits: + raise ValueError(u"Une fingerpring GPG est exclusivement composée de caractères hexadécimaux, donc il faut virer %s." % c) + + formattedfpr = "" + for i in range(0,10): + formattedfpr += fpr[i*4:(i+1)*4] + + if i != 10: + formattedfpr += " " + + return formattedfpr + def validate_mail(mail, crans_allowed=False): """Valide une adresse e-mail""" l, mail = preattr(mail) @@ -337,7 +363,8 @@ class CransLdap: # Champs de recherche pour la recherche manuelle (en plus de la recherche auto) non_auto_search_machines_champs = \ ['mid', 'historique', 'blacklist', 'info', 'exempt', 'mblacklist', - 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'dnsIpv6', 'machineAlias'] + 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'dnsIpv6', 'machineAlias', + 'sshFingerprint'] non_auto_search_champs = { \ 'adherent': \ @@ -345,7 +372,7 @@ class CransLdap: 'historique', 'blacklist', 'droits', 'uidNumber', 'info', 'solde', 'controle', 'contourneGreylist', 'rewriteMailHeaders', 'ablacklist', 'homepageAlias', 'charteMA', - 'adherentPayant'], \ + 'adherentPayant', 'gpgFingerprint'], \ 'club': \ ['cid', 'responsable', 'paiement', 'historique', 'blacklist', 'mailAlias', 'info', 'controle', 'ablacklist', 'imprimeurClub'], \ @@ -452,7 +479,8 @@ class CransLdap: peuvent être : aid $ chbre $ mail $ mailAlias $ canonicalAlias $ - mid $ macAddress $ host $ hostAlias $ ipHostNumber + mid $ macAddress $ host $ hostAlias $ ipHostNumber $ + gpgFingerprint Retourne le dn du lock """ @@ -1177,7 +1205,7 @@ class BaseClasseCrans(CransLdap): for champ in ['droits', 'controle', 'paiement', 'carteEtudiant', 'mailAlias', 'hostAlias', 'exempt', 'nvram', 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', - 'homepageAlias', 'imprimeurClub']: + 'homepageAlias', 'imprimeurClub', 'gpgFingerprint']: if champ in self.modifs: if champ == 'controle': # Ce n'est pas pareil que self._init_data.get('controle', ['']) @@ -1493,6 +1521,44 @@ class BaseProprietaire(BaseClasseCrans): self._set('mailAlias', liste) return liste + def gpgFingerprint(self, new=None): + """ + Fonction d'ajout d'empreinte GPG + """ + + liste = list(self._data.get('gpgFingerprint', [])) + + if new == None: + return liste + + else: + if type(new) == list: + # Modif + index = new[0] + new = new[1] + if new == '': + # Supression alias + liste.pop(index) + self._set('gpgFingerprint', liste) + return liste + else: + index = -1 + + new = format_gpg_fingerprint(new) + new = new.upper() + + #if gpgexists(new): + # raise ValueError(u"Alias existant ou correspondand à un compte.") + + if index != -1: + liste[index] = new + else: + liste = liste + [ new ] + + self.lock('gpgFingerprint', new) + self._set('gpgFingerprint', liste) + return liste + def homepageAlias(self, new=None): """ Creation ou visualisation des alias de page perso. @@ -2242,7 +2308,8 @@ class Adherent(BaseProprietaire): 'uidNumber', 'gidNumber', 'homeDirectory', 'gecos', 'droits', 'mailAlias', 'canonicalAlias', 'rewriteMailHeaders', 'contourneGreylist', - 'homepageAlias', 'derniereConnexion', 'solde' ]: + 'homepageAlias', 'derniereConnexion', 'solde', + 'gpgFingerprint']: try: self._data.pop(c) except: pass @@ -2934,6 +3001,41 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) self._set('hostAlias', liste) return liste + def sshFingerprint(self, new=None): + """ + Fonction d'ajout d'empreinte SSH + """ + + liste = list(self._data.get('sshFingerprint', [])) + + if new == None: + return liste + + else: + if type(new) == list: + # Modif + index = new[0] + new = new[1] + if new == '': + # Supression alias + liste.pop(index) + self._set('sshFingerprint', liste) + return liste + else: + index = -1 + + #if gpgexists(new): + # raise ValueError(u"FPR existant ou correspondand à un compte.") + + if index != -1: + liste[index] = new + else: + liste = liste + [ new ] + + self.lock('sshFingerprint', new) + self._set('sshFingerprint', liste) + return liste + def ip(self, ip=None): """ Défini ou retourne l'IP de la machine. @@ -3114,7 +3216,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) self.services_to_restart('mail_modif', ['ip=%s' % self.ip()]) # Reconfiguration DNS ? - if 'host' in self.modifs or 'ipHostNumber' in self.modifs or 'hostAlias' in self.modifs or 'dnsIpv6' in self.modifs: + if 'host' in self.modifs or 'ipHostNumber' in self.modifs or 'hostAlias' in self.modifs or 'dnsIpv6' in self.modifs or 'sshFingerprint' in self.modifs: self.services_to_restart('dns') # Reconfiguration bornes wifi ?