|
Lines 34-39
Link Here
|
| 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 |
|
Lines 401-407
Link Here
|
| 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) |
|
Lines 416-430
Link Here
|
| 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) |
| 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) |
|
Lines 454-469
Link Here
|
| 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) |
|
|
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 |
""" |
|
Lines 494-524
Link Here
|
| 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: |