[Python] Parsing di un file ldif invalido

Valerio Pachera sirio81 a gmail.com
Mer 14 Set 2022 14:55:45 CEST


Buongiorno a tutti, ho la seguente esigenza: parsare un file ldif prodotto
dall'esportazione di una rubrica di Thunderbird.

Prendiamo questo ldif come esempio:
---
dn: cn=Mario Rossi,mail=mario.rossi a domain.com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: mozillaAbPersonAlpha
givenName: Mario Rossi
cn: Mario Rossi
mail: mario.rossi a domain.com
modifytimestamp: 1632815299
---

E il codice necessario per fare il parsing:
---
#!/usr/bin/env python3

import sys
from ldif3 import LDIFParser

ldif_path = sys.argv[1]

with open(ldif_path, 'rb') as ldif_file:
    parser = LDIFParser(ldif_file)

    for dn, entry in parser.parse():
        print(dn, entry['cn'])
---

Funziona perfettamente fino a che non trovi un contatto che una virgola nel
CN.
Esempio di ldif problematico:
---
dn: cn=Mario, Rossi,mail=mario.rossi a domain.com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: mozillaAbPersonAlpha
givenName: Mario Rossi
cn: Mario, Rossi
mail: mario.rossi a domain.com
modifytimestamp: 1632815299
---

Errore che si ottiene:
---
Traceback (most recent call last):
  File "./simple.py", line 11, in <module>
    for dn, entry in parser.parse():
  File "/usr/local/lib/python3.8/dist-packages/ldif3.py", line 384, in parse
    yield self._parse_entry_record(block)
  File "/usr/local/lib/python3.8/dist-packages/ldif3.py", line 360, in
_parse_entry_record
    self._check_dn(dn, attr_value)
  File "/usr/local/lib/python3.8/dist-packages/ldif3.py", line 339, in
_check_dn
    self._error('No valid string-representation of '
  File "/usr/local/lib/python3.8/dist-packages/ldif3.py", line 330, in
_error
    raise ValueError(msg)
ValueError: No valid string-representation of distinguished name cn=Mario,
Rossi,mail=mario.rossi a domain.com.
---

Nota: il CN a volte è espresso come base64 e al suo interno ci può essere
una virgola che rompe la sintassi.

*E' possibile "ignorare" i valori errati con un try?* Come applicarlo al
ciclo?
https://stackoverflow.com/questions/39889811/python-ldif3-parser-and-exception-in-for-loop

Ogni suggerimento è ben accetto :-)
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20220914/1ff6da40/attachment.html>


Maggiori informazioni sulla lista Python