Bug 23525 - mailPrimaryAddress nur mit gültiger Domäne
mailPrimaryAddress nur mit gültiger Domäne
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: UMC - Users
UCS 3.0
Other Linux
: P5 enhancement (vote)
: UCS 3.0-2
Assigned To: Sönke Schwardt-Krummrich
Felix Botner
: interim-3
: 24311 (view as bug list)
Depends on:
Blocks: 26813 27766 27891
  Show dependency treegraph
 
Reported: 2011-09-06 10:34 CEST by Sönke Schwardt-Krummrich
Modified: 2013-04-04 07:54 CEST (History)
6 users (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional):
Max CVSS v3 score:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Sönke Schwardt-Krummrich univentionstaff 2011-09-06 10:34:12 CEST
Die mailPrimaryAddress an Benutzern, Gruppen, Shared Folder und Mailinglisten sollte nur noch Mailadressen annehmen, die
a) einzigartig innerhalb der Domäne sind (war bisher auch schon so)
b) deren Domainpart mit einem der vorhandenen Mail-Domain-Objekten übereinstimmt
Comment 1 Sönke Schwardt-Krummrich univentionstaff 2011-11-02 12:20:05 CET
Siehe auch Bug 24311
Comment 2 Sönke Schwardt-Krummrich univentionstaff 2012-05-11 18:52:26 CEST
Siehe auch Bug 23525
Comment 3 Sönke Schwardt-Krummrich univentionstaff 2012-07-10 10:35:15 CEST
(In reply to comment #2)
> Siehe auch Bug 23525
Gemeint war natürlich Bug 26813.
Comment 4 Sönke Schwardt-Krummrich univentionstaff 2012-07-11 16:33:09 CEST
Um möglichst wenige Änderungen aber generische Änderungen am Code vorzunehmen, wurde nicht die parse() Methode angepasst, sondern eine neue optionale Methode checkLdap() für Syntax-Klassen eingeführt:

class MySyntax(ISyntax):
    @classmethod
	def checkLdap(self, lo, values):
	    if something:
            raise univention.admin.uexceptions.valueError, _('something happened!')

Die checkLdap()-Methode bekommt ein LDAP-Verbindungsobjekt und den "neuen" Wert (kann eine Liste sein!) der jeweiligen Property übergeben.
Der Rückgabewert der Methode wird nicht ausgewertet. Die Funktion kann nur im Fehlerfall eine Exception mit einer Meldung werfen.

In der Basis-Syntax ISyntax wurde bereits ein leerer Methoden-Körper als Klassenmethode integriert.

Die Klasse simpleLdap aus admin/handlers/__init__.py ruft jetzt die Methoden in folgender Reihenfolge auf:
ADD:
  _ldap_pre_create()
  _update_policies()
  hook_ldap_pre_create()
  <Setzen von Defaultvalues>
  <forEach property> checkLdap()
  _ldap_addlist()
  ....

MODIFY:
  _ldap_pre_modify()
  _update_policies()
  hook_ldap_pre_modify()
  <Setzen von Defaultvalues>
  <forEach property> checkLdap()
  _ldap_modlist()
  ....

In syntax.py wurden zwei neue Syntax-Klassen hinzugefügt, die von emailAddress erben:
emailAddressValidDomain und primaryEmailAddressValidDomain. 
Diese beiden Syntaxklassen prüfen, ob für die übergebenen Mailadressen ein entsprechendes Maildomänenobjekt vorhanden ist. Gesucht wird mit dem Filter '(&(objectClass=univentionMailDomainname)(cn=%s))'.

Im users/user Modul wurde an der Property die Syntax "emailAddress" durch "primaryEmailAddressValidDomain" ausgetauscht.
Weiterhin wurde in den folgenden Modulen die Syntax "emailAddress" durch "emailAddressValidDomain" getauscht:
Modul: users/user    Property: mailAlternativeAddress
Modul: groups/group  Property: mailAddress
Modul: mail/list     Property: mailAddress
Modul: mail/folder   Property: mailPrimaryAddress

Damit können über den UDM nur noch eMail-Adressen für das Mailrouting angegeben werden, für die bereits ein Mail-Domänenobjekt im LDAP existiert.
Die Property "mail" in users/user oder die Member eines mail/list-Objektes bleiben davon jedoch unberührt.

Um das alte Verhalten wieder herzustellen, kann die alte Syntax wieder der jeweiligen Property zugewiesen werden:
ucr set \
  directory/manager/web/modules/users/user/properties/mailPrimaryAddress/syntax=emailAddress \
  directory/manager/web/modules/users/user/properties/mailAlternativeAddress/syntax=emailAddress \
  directory/manager/web/modules/groups/group/properties/mailAddress/syntax=emailAddress \
  directory/manager/web/modules/mail/list/properties/mailAddress/syntax=emailAddress \
  directory/manager/web/modules/mail/folder/properties/mailPrimaryAddress/syntax=emailAddress

Changelogeintrag wurde erstellt
univention-directory-manager-modules (7.0.283-2) unstable; urgency=low
Comment 5 Sönke Schwardt-Krummrich univentionstaff 2012-07-11 17:36:15 CEST
Die Fehlermeldungen wurden noch einmal überarbeitet.
Comment 6 Stefan Gohmann univentionstaff 2012-07-11 20:20:49 CEST
Das führt jetzt dazu, dass auf einem 3.0-2 der Standard Import von UCS@school Benutzern nicht mehr funktioniert:


root@master451:~# /usr/share/ucs-school-import/scripts/import_user school1 
infile is: school1
Processing line 1: A    a1      a1      a1      school1 school1-1A              Anton1@deadlock45.local       0       1       0 univention
verify ou for school nr school1
creating object cn=dcschool1-01,cn=dc,cn=server,cn=computers,ou=school1,dc=deadlock45,dc=local
need to create server: cn=dcschool1-01,cn=dc,cn=server,cn=computers,ou=school1,dc=deadlock45,dc=local
need to create dhcp server: 
creating object cn=dcschool1-01,cn=school1,cn=dhcp,ou=school1,dc=deadlock45,dc=local
creating object cn=dcschool1v-01,cn=dc,cn=server,cn=computers,ou=school1,dc=deadlock45,dc=local
need to create server: cn=dcschool1v-01,cn=dc,cn=server,cn=computers,ou=school1,dc=deadlock45,dc=local
need to create dhcp server: 
creating object cn=dcschool1v-01,cn=school1,cn=dhcp,ou=school1,dc=deadlock45,dc=local
need to create group cn=Domain Users school1,cn=groups,ou=school1,dc=deadlock45,dc=local
creating object cn=Domain Users school1,cn=groups,ou=school1,dc=deadlock45,dc=local
need to create group cn=school1-1A,cn=klassen,cn=schueler,cn=groups,ou=school1,dc=deadlock45,dc=local
creating object cn=school1-1A,cn=klassen,cn=schueler,cn=groups,ou=school1,dc=deadlock45,dc=local
need to create groupshare cn=school1-1A,cn=klassen,cn=shares,ou=school1,dc=deadlock45,dc=local
creating object cn=school1-1A,cn=klassen,cn=shares,ou=school1,dc=deadlock45,dc=local
ERROR: <class 'univention.admin.uexceptions.valueError'> The domain part of the primary mail address is not in list of configured mail domains: anton1@deadlock45.local

 ERROR: create this user manually: uid=a1,cn=schueler,cn=users,ou=school1,dc=deadlock45,dc=local
Traceback (most recent call last):
  File "/usr/share/ucs-school-import/scripts/import_user", line 1446, in create_user
    exists, dn = create_object(object)
  File "/usr/share/ucs-school-import/scripts/import_user", line 939, in create_object
    dn=o.create()
  File "/usr/lib/pymodules/python2.6/univention/admin/handlers/__init__.py", line 332, in create
    return self._create()
  File "/usr/lib/pymodules/python2.6/univention/admin/handlers/__init__.py", line 627, in _create
    self._call_checkLdap_on_all_property_syntaxes()
  File "/usr/lib/pymodules/python2.6/univention/admin/handlers/__init__.py", line 1060, in _call_checkLdap_on_all_property_syntaxes
    prop.syntax.checkLdap(self.lo, self.info.get(pname))
  File "/usr/lib/pymodules/python2.6/univention/admin/syntax.py", line 977, in checkLdap
    raise univention.admin.uexceptions.valueError, self.errMsgDomain % (', '.join(faillist),)
valueError: The domain part of the primary mail address is not in list of configured mail domains: anton1@deadlock45.local

Es funktioniert, wenn die Mailadresse durch einen Tab ersetzt wird. Wir können es auch so belassen, ungünstig ist es aber trotzdem.
Comment 7 Sönke Schwardt-Krummrich univentionstaff 2012-07-12 13:43:51 CEST
(In reply to comment #6)
> Das führt jetzt dazu, dass auf einem 3.0-2 der Standard Import von UCS@school
> Benutzern nicht mehr funktioniert:

Wir sollten einen Pre-Import-Hook für Benutzer mitbringen, der die Maildomänen anlegt, falls diese noch fehlen → ausgelagert in Bug 27892
Comment 8 Felix Botner univentionstaff 2012-07-13 12:57:31 CEST
OK - Benutzer (mailPrimaryAddress, mailAlternativeAddress, mail nicht)
OK - Gruppen 
OK - Liste (mailPrimaryAddress,univentionMailMember nicht)
OK - Folder (mailPrimaryAddress)

OK
> In der Basis-Syntax ISyntax wurde bereits ein leerer Methoden-Körper als
> Klassenmethode integriert.

OK
> Die Klasse simpleLdap aus admin/handlers/__init__.py ruft jetzt die Methoden in
> folgender Reihenfolge auf:
> ADD:
>  _ldap_pre_create()
>  _update_policies()
>  hook_ldap_pre_create()
>  <Setzen von Defaultvalues>
>  <forEach property> checkLdap()
>  _ldap_addlist()
>  ....

OK
> MODIFY:
>  _ldap_pre_modify()
>  _update_policies()
>  hook_ldap_pre_modify()
>  <Setzen von Defaultvalues>
>  <forEach property> checkLdap()
>  _ldap_modlist()

OK
> In syntax.py wurden zwei neue Syntax-Klassen hinzugefügt, die von emailAddress
> erben:
> emailAddressValidDomain und primaryEmailAddressValidDomain. 
> Diese beiden Syntaxklassen prüfen, ob für die übergebenen Mailadressen ein
> entsprechendes Maildomänenobjekt vorhanden ist. Gesucht wird mit dem Filter
> '(&(objectClass=univentionMailDomainname)(cn=%s))'.

OK
> Im users/user Modul wurde an der Property die Syntax "emailAddress" durch
> "primaryEmailAddressValidDomain" ausgetauscht.
> Weiterhin wurde in den folgenden Modulen die Syntax "emailAddress" durch
>" emailAddressValidDomain" getauscht:
> Modul: users/user    Property: mailAlternativeAddress
> Modul: groups/group  Property: mailAddress
> Modul: mail/list     Property: mailAddress
> Modul: mail/folder   Property: mailPrimaryAddress

OK
> Um das alte Verhalten wieder herzustellen, kann die alte Syntax wieder der
> jeweiligen Property zugewiesen werden:

OK, das ganze kann auch von "extern" genutzt werden

-> ucr get \
 directory/manager/web/modules/users/user/properties/description/syntax 
mySyntax

-> more /usr/lib/pymodules/python2.6/univention/admin/syntax.d/new.py 
class mySyntax(string):
        name = 'mySyntax'
        errMsgDomain = "must be a existing uid %s"

        @classmethod
        def checkLdap(self, lo, description):
                # convert description to array if neccessary
                description = copy.deepcopy(description)
                if type(description) == str:
                        description = [ description ]
                if type(description) != list:
                        return

                description = description[0]
                ldapfilter = '(uid=%s)' % description
                result = lo.searchDn(filter=ldapfilter)
                if not result:
                        raise univention.admin.uexceptions.valueError,
                           self.errMsgDomain % description

-> udm users/user modify --dn uid=t2,cn=users,dc=amd64,dc=de --set description=dsafsaasdsa
must be a existing uid dsafsaasdsa:

Changelog Eintrag vorhanden.
Comment 9 Stefan Gohmann univentionstaff 2012-07-20 15:24:31 CEST
UCS 3.0-2 has been released: 
  http://forum.univention.de/viewtopic.php?f=54&t=1905

If this error occurs again, please use "Clone This Bug".
Comment 10 Stefan Gohmann univentionstaff 2013-04-04 07:54:10 CEST
*** Bug 24311 has been marked as a duplicate of this bug. ***