|
34 |
import ldap |
34 |
import ldap |
35 |
import ldap.schema |
35 |
import ldap.schema |
36 |
import ldap.sasl |
36 |
import ldap.sasl |
|
|
37 |
from ldap.controls.readentry import PostReadControl |
37 |
import univention.debug |
38 |
import univention.debug |
38 |
from univention.config_registry import ConfigRegistry |
39 |
from univention.config_registry import ConfigRegistry |
39 |
from ldapurl import LDAPUrl |
40 |
from ldapurl import LDAPUrl |
|
401 |
self.__schema = ldap.schema.SubSchema(self.lo.read_subschemasubentry_s(self.lo.search_subschemasubentry_s()), 0) |
402 |
self.__schema = ldap.schema.SubSchema(self.lo.read_subschemasubentry_s(self.lo.search_subschemasubentry_s()), 0) |
402 |
return self.__schema |
403 |
return self.__schema |
403 |
|
404 |
|
404 |
def add(self, dn, al): |
405 |
def add(self, dn, al, postread_attrs=None): |
405 |
"""Add LDAP entry with dn and attributes in add_list=(attribute-name, old-values. new-values) or (attribute-name, new-values).""" |
406 |
"""Add LDAP entry with dn and attributes in add_list=(attribute-name, old-values. new-values) or (attribute-name, new-values).""" |
406 |
|
407 |
|
407 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.add dn=%s' % dn) |
408 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.add dn=%s' % dn) |
|
416 |
nal[key] |= set(val) |
417 |
nal[key] |= set(val) |
417 |
|
418 |
|
418 |
nal = self.__encode_entry([(k, list(v)) for k, v in nal.items()]) |
419 |
nal = self.__encode_entry([(k, list(v)) for k, v in nal.items()]) |
|
|
420 |
|
421 |
if postread_attrs: |
422 |
serverctrls = [PostReadControl(True, postread_attrs),] |
423 |
return self.add_ext_s(dn, nal, serverctrls=serverctrls) |
424 |
else: |
425 |
return self.add_s(dn, nal) |
426 |
|
427 |
def add_s(self, dn, al): |
428 |
"""Redirect add_s directly to lo""" |
419 |
try: |
429 |
try: |
420 |
self.lo.add_ext_s(dn, nal) |
430 |
self.lo.add_ext_s(dn, al) |
421 |
except ldap.REFERRAL as exc: |
431 |
except ldap.REFERRAL as exc: |
422 |
if not self.follow_referral: |
432 |
if not self.follow_referral: |
423 |
raise |
433 |
raise |
424 |
lo_ref = self._handle_referral(exc) |
434 |
lo_ref = self._handle_referral(exc) |
425 |
lo_ref.add_ext_s(dn, nal) |
435 |
lo_ref.add_ext_s(dn, al) |
426 |
|
436 |
|
427 |
def modify(self, dn, changes): |
437 |
def add_ext_s(self, dn, al, serverctrls=None): |
|
|
438 |
"""Redirect add_ext_s directly to lo""" |
439 |
try: |
440 |
msgid = self.lo.add_ext(dn, al, serverctrls=serverctrls) |
441 |
rtype, rdata, rmsgid, resp_ctrls = self.lo.result3(msgid) |
442 |
except ldap.REFERRAL as exc: |
443 |
if not self.follow_referral: |
444 |
raise |
445 |
lo_ref = self._handle_referral(exc) |
446 |
msgid = lo_ref.add_ext(dn, al, serverctrls=serverctrls) |
447 |
rtype, rdata, rmsgid, resp_ctrls = lo_ref.result3(msgid) |
448 |
for c in resp_ctrls: |
449 |
if c.controlType == PostReadControl.controlType: |
450 |
return c.entry |
451 |
|
452 |
def modify(self, dn, changes, postread_attrs=None): |
428 |
"""Modify LDAP entry dn with attributes in changes=(attribute-name, old-values, new-values).""" |
453 |
"""Modify LDAP entry dn with attributes in changes=(attribute-name, old-values, new-values).""" |
429 |
|
454 |
|
430 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.modify %s' % dn) |
455 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.modify %s' % dn) |
|
454 |
ml.append((op, key, val)) |
479 |
ml.append((op, key, val)) |
455 |
ml = self.__encode_entry(ml) |
480 |
ml = self.__encode_entry(ml) |
456 |
|
481 |
|
|
|
482 |
if postread_attrs: |
483 |
serverctrls = [PostReadControl(True, postread_attrs),] |
484 |
else: |
485 |
serverctrls = [] |
486 |
|
487 |
resp_entry = {} |
457 |
# check if we need to rename the object |
488 |
# check if we need to rename the object |
458 |
new_dn, new_rdn = self.__get_new_dn(dn, ml) |
489 |
new_dn, new_rdn = self.__get_new_dn(dn, ml) |
459 |
if not self.compare_dn(dn, new_dn): |
490 |
if not self.compare_dn(dn, new_dn): |
460 |
univention.debug.debug(univention.debug.LDAP, univention.debug.WARN, 'rename %s' % (new_rdn,)) |
491 |
univention.debug.debug(univention.debug.LDAP, univention.debug.WARN, 'rename %s' % (new_rdn,)) |
461 |
self.lo.rename_s(dn, new_rdn, None, delold=1) |
492 |
if postread_attrs: |
|
|
493 |
resp_entry = self.rename_ext_s(dn, new_rdn, None, delold=1, serverctrls=serverctrls) |
494 |
else: |
495 |
self.lo.rename_s(dn, new_rdn, None, delold=1) |
462 |
dn = new_dn |
496 |
dn = new_dn |
463 |
if ml: |
497 |
if ml: |
464 |
self.modify_s(dn, ml) |
498 |
if postread_attrs: |
465 |
return dn |
499 |
resp_entry = self.modify_ext_s(dn, ml, serverctrls=serverctrls) |
|
|
500 |
else: |
501 |
self.modify_s(dn, ml) |
466 |
|
502 |
|
|
|
503 |
if postread_attrs: |
504 |
return (dn, resp_entry) |
505 |
else: |
506 |
return dn |
507 |
|
467 |
@classmethod |
508 |
@classmethod |
468 |
def __get_new_dn(self, dn, ml): |
509 |
def __get_new_dn(self, dn, ml): |
469 |
""" |
510 |
""" |
|
494 |
lo_ref = self._handle_referral(exc) |
535 |
lo_ref = self._handle_referral(exc) |
495 |
lo_ref.modify_ext_s(dn, ml) |
536 |
lo_ref.modify_ext_s(dn, ml) |
496 |
|
537 |
|
497 |
def rename(self, dn, newdn): |
538 |
def modify_ext_s(self, dn, ml, serverctrls=None): |
|
|
539 |
"""Redirect modify_ext_s directly to lo""" |
540 |
try: |
541 |
msgid = self.lo.modify_ext(dn, ml, serverctrls=serverctrls) |
542 |
rtype, rdata, rmsgid, resp_ctrls = self.lo.result3(msgid) |
543 |
except ldap.REFERRAL as exc: |
544 |
if not self.follow_referral: |
545 |
raise |
546 |
lo_ref = self._handle_referral(exc) |
547 |
msgid = lo_ref.modify_ext(dn, ml, serverctrls=serverctrls) |
548 |
rtype, rdata, rmsgid, resp_ctrls = lo_ref.result3(msgid) |
549 |
for c in resp_ctrls: |
550 |
if c.controlType == PostReadControl.controlType: |
551 |
return c.entry |
552 |
|
553 |
def rename(self, dn, newdn, postread_attrs=None): |
498 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.rename %s -> %s' % (dn, newdn)) |
554 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.rename %s -> %s' % (dn, newdn)) |
499 |
oldsdn = self.parentDn(dn) |
555 |
oldsdn = self.parentDn(dn) |
500 |
newrdn = ldap.dn.dn2str([ldap.dn.str2dn(newdn)[0]]) |
556 |
newrdn = ldap.dn.dn2str([ldap.dn.str2dn(newdn)[0]]) |
501 |
newsdn = ldap.dn.dn2str(ldap.dn.str2dn(newdn)[1:]) |
557 |
newsdn = ldap.dn.dn2str(ldap.dn.str2dn(newdn)[1:]) |
502 |
|
558 |
|
|
|
559 |
if postread_attrs: |
560 |
serverctrls = [PostReadControl(True, postread_attrs),] |
561 |
else: |
562 |
serverctrls = [] |
563 |
|
564 |
resp_entry = {} |
503 |
if not newsdn.lower() == oldsdn.lower(): |
565 |
if not newsdn.lower() == oldsdn.lower(): |
504 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.rename: move %s to %s in %s' % (dn, newrdn, newsdn)) |
566 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.rename: move %s to %s in %s' % (dn, newrdn, newsdn)) |
505 |
try: |
567 |
if postread_attrs: |
506 |
self.lo.rename_s(dn, newrdn, newsdn) |
568 |
resp_entry = self.rename_ext_s(dn, newrdn, newsdn, serverctrls=serverctrls) |
507 |
except ldap.REFERRAL as exc: |
569 |
else: |
508 |
if not self.follow_referral: |
570 |
self.rename_s(dn, newrdn, newsdn) |
509 |
raise |
|
|
510 |
lo_ref = self._handle_referral(exc) |
511 |
lo_ref.rename_s(dn, newrdn, newsdn) |
512 |
else: |
571 |
else: |
513 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.rename: modrdn %s to %s' % (dn, newrdn)) |
572 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.rename: modrdn %s to %s' % (dn, newrdn)) |
514 |
try: |
573 |
if postread_attrs: |
515 |
self.lo.rename_s(dn, newrdn) |
574 |
resp_entry = self.rename_ext_s(dn, newrdn, serverctrls=serverctrls) |
516 |
except ldap.REFERRAL as exc: |
575 |
else: |
517 |
if not self.follow_referral: |
576 |
self.rename_s(dn, newrdn) |
518 |
raise |
|
|
519 |
lo_ref = self._handle_referral(exc) |
520 |
lo_ref.rename_s(dn, newrdn) |
521 |
|
577 |
|
|
|
578 |
if postread_attrs: |
579 |
return resp_entry |
580 |
|
581 |
def rename_s(self, dn, newrdn, newsuperior=None): |
582 |
"""Redirect rename_s directly to lo""" |
583 |
try: |
584 |
self.lo.rename_s(dn, newrdn, newsuperior) |
585 |
except ldap.REFERRAL as exc: |
586 |
if not self.follow_referral: |
587 |
raise |
588 |
lo_ref = self._handle_referral(exc) |
589 |
lo_ref.rename_s(dn, newrdn, newsuperior) |
590 |
|
591 |
def rename_ext_s(self, dn, newrdn, newsuperior=None, serverctrls=None): |
592 |
"""Redirect rename_ext_s directly to lo""" |
593 |
try: |
594 |
msgid = self.lo.rename(dn, newrdn, newsuperior, serverctrls=serverctrls) |
595 |
rtype, rdata, rmsgid, resp_ctrls = self.lo.result3(msgid) |
596 |
except ldap.REFERRAL as exc: |
597 |
if not self.follow_referral: |
598 |
raise |
599 |
lo_ref = self._handle_referral(exc) |
600 |
lo_ref.rename(dn, newrdn, newsuperior, serverctrls=serverctrls) |
601 |
rtype, rdata, rmsgid, resp_ctrls = lo_ref.result3(msgid) |
602 |
for c in resp_ctrls: |
603 |
if c.controlType == PostReadControl.controlType: |
604 |
return c.entry |
605 |
|
522 |
def delete(self, dn): |
606 |
def delete(self, dn): |
523 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.delete %s' % dn) |
607 |
univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.delete %s' % dn) |
524 |
if dn: |
608 |
if dn: |