1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-24 13:57:43 +03:00

python/samdb: fix group member removal by SID

Otherwise the removal of groupmembers by SID fails silently, because the
DN does not match the the DN in group member list.

Pair-programmed-with: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Björn Baumbach <bb@sernet.de>
Reviewed-by: Jule Anger <janger@samba.org>
This commit is contained in:
Björn Baumbach 2024-11-26 15:46:02 +01:00
parent a74bc62779
commit c9d8e96d2b

View File

@ -387,8 +387,11 @@ lockoutTime: 0
self.transaction_start() self.transaction_start()
try: try:
targetgroup = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE, targetgroup = self.search(base=self.domain_dn(),
expression=groupfilter, attrs=['member']) scope=ldb.SCOPE_SUBTREE,
expression=groupfilter,
controls=["extended_dn:1:1"],
attrs=['member'])
if len(targetgroup) == 0: if len(targetgroup) == 0:
raise Exception('Unable to find group "%s"' % groupname) raise Exception('Unable to find group "%s"' % groupname)
assert(len(targetgroup) == 1) assert(len(targetgroup) == 1)
@ -405,6 +408,7 @@ changetype: modify
if member_base_dn is None: if member_base_dn is None:
member_base_dn = self.domain_dn() member_base_dn = self.domain_dn()
membersid = None
try: try:
membersid = security.dom_sid(member) membersid = security.dom_sid(member)
targetmember_dn = "<SID=%s>" % str(membersid) targetmember_dn = "<SID=%s>" % str(membersid)
@ -439,13 +443,33 @@ changetype: modify
raise Exception('Unable to find "%s". Operation cancelled.' % member) raise Exception('Unable to find "%s". Operation cancelled.' % member)
targetmember_dn = targetmember[0].dn.extended_str(1) targetmember_dn = targetmember[0].dn.extended_str(1)
if add_members_operation is True and (targetgroup[0].get('member') is None or get_bytes(targetmember_dn) not in targetgroup[0]['member']): def _is_member(samdb, group, member_dn, member_sid):
if group.get('member') is None:
return False
for m in group.get('member'):
m_ext_dn = ldb.Dn(samdb, str(m))
m_binary_sid = m_ext_dn.get_extended_component("SID")
if m_binary_sid:
m_sid = ndr_unpack(security.dom_sid, m_binary_sid)
if member_sid == m_sid:
return True
if member_dn == str(m_ext_dn):
return True
return False
is_member = _is_member(self,
targetgroup[0],
targetmember_dn,
membersid)
if add_members_operation is True and not is_member:
modified = True modified = True
addtargettogroup += """add: member addtargettogroup += """add: member
member: %s member: %s
""" % (str(targetmember_dn)) """ % (str(targetmember_dn))
elif add_members_operation is False and (targetgroup[0].get('member') is not None and get_bytes(targetmember_dn) in targetgroup[0]['member']): elif add_members_operation is False and is_member:
modified = True modified = True
addtargettogroup += """delete: member addtargettogroup += """delete: member
member: %s member: %s