View | Details | Raw Unified | Return to bug 43628 | Differences between
and this patch

Collapse All | Expand All

(-)conffiles/etc/univention/s4connector/s4/mapping.py (+3 lines)
 Lines 759-764    Link Here 
759
			post_ucs_modify_functions=[
759
			post_ucs_modify_functions=[
760
				univention.s4connector.s4.ntsecurity_descriptor.ntsd_to_ucs,
760
				univention.s4connector.s4.ntsecurity_descriptor.ntsd_to_ucs,
761
			],
761
			],
762
			pre_con_modify_functions=[
763
				univention.s4connector.s4.ntsecurity_descriptor.ntsd_is_unchanged_in_s4,
764
			],
762
			post_con_create_functions = [
765
			post_con_create_functions = [
763
				univention.s4connector.s4.ntsecurity_descriptor.ntsd_to_s4,
766
				univention.s4connector.s4.ntsecurity_descriptor.ntsd_to_s4,
764
			],
767
			],
(-)modules/univention/s4connector/__init__.py (-1 / +3 lines)
 Lines 378-383    Link Here 
378
		ucs_create_functions=[],
378
		ucs_create_functions=[],
379
		con_create_extenstions=[],
379
		con_create_extenstions=[],
380
		post_con_create_functions=[],
380
		post_con_create_functions=[],
381
		pre_con_modify_functions=[],
381
		post_con_modify_functions=[],
382
		post_con_modify_functions=[],
382
		post_ucs_modify_functions=[],
383
		post_ucs_modify_functions=[],
383
		post_attributes=None,
384
		post_attributes=None,
 Lines 417-422    Link Here 
417
		self.con_create_extenstions = con_create_extenstions
418
		self.con_create_extenstions = con_create_extenstions
418
419
419
		self.post_con_create_functions = post_con_create_functions
420
		self.post_con_create_functions = post_con_create_functions
421
		self.pre_con_modify_functions = pre_con_modify_functions
420
		self.post_con_modify_functions = post_con_modify_functions
422
		self.post_con_modify_functions = post_con_modify_functions
421
		self.post_ucs_modify_functions = post_ucs_modify_functions
423
		self.post_ucs_modify_functions = post_ucs_modify_functions
422
424
 Lines 1507-1513    Link Here 
1507
			except (ldap.SERVER_DOWN, SystemExit):
1509
			except (ldap.SERVER_DOWN, SystemExit):
1508
				raise
1510
				raise
1509
			except:  # FIXME: which exception is to be caught?
1511
			except:  # FIXME: which exception is to be caught?
1510
				self._debug_traceback(ud.ERROR, "failed in post_con_modify_functions")
1512
				self._debug_traceback(ud.ERROR, "failed in post_ucs_modify_functions")
1511
				result = False
1513
				result = False
1512
1514
1513
			if result:
1515
			if result:
(-)modules/univention/s4connector/s4/__init__.py (+16 lines)
 Lines 2595-2600    Link Here 
2595
				else:
2595
				else:
2596
					ud.debug(ud.LDAP, ud.INFO, "to modify: %s" % object['dn'])
2596
					ud.debug(ud.LDAP, ud.INFO, "to modify: %s" % object['dn'])
2597
					ud.debug(ud.LDAP, ud.ALL, "sync_from_ucs: modlist: %s" % modlist)
2597
					ud.debug(ud.LDAP, ud.ALL, "sync_from_ucs: modlist: %s" % modlist)
2598
2599
				if hasattr(self.property[property_type], "pre_con_modify_functions"):
2600
					for f in self.property[property_type].pre_con_modify_functions:
2601
						ud.debug(ud.LDAP, ud.INFO, "Call pre_con_modify_function: %s" % f)
2602
						if not f(self, property_type, object):
2603
							ud.debug(ud.LDAP, ud.INFO, "sync_from_ucs: Veto by pre_con_modify_function %s" % f)
2604
							ud.debug(ud.LDAP, ud.INFO, "sync_from_ucs: Skipping modify")
2605
2606
							ud.debug(ud.LDAP, ud.INFO, "sync_from_ucs: unlock UCS entryUUID: %s" % entryUUID)
2607
							self.lockingdb.unlock_ucs(entryUUID)
2608
2609
							self._check_dn_mapping(pre_mapped_ucs_dn, object['dn'])
2610
							return True
2611
						ud.debug(ud.LDAP, ud.INFO, "Call pre_con_modify_function: %s (ok)" % f)
2612
2613
				if modlist:
2598
					try:
2614
					try:
2599
						self.lo_s4.lo.modify_ext_s(compatible_modstring(object['dn']), compatible_modlist(modlist), serverctrls=self.serverctrls_for_add_and_modify)
2615
						self.lo_s4.lo.modify_ext_s(compatible_modstring(object['dn']), compatible_modlist(modlist), serverctrls=self.serverctrls_for_add_and_modify)
2600
					except:
2616
					except:
(-)modules/univention/s4connector/s4/ntsecurity_descriptor.py (-9 / +22 lines)
 Lines 72-77    Link Here 
72
	domain_sid = security.dom_sid(s4connector.s4_sid)
72
	domain_sid = security.dom_sid(s4connector.s4_sid)
73
	return decode_sd_in_ndr_to_sddl(domain_sid, ntsd_ndr)
73
	return decode_sd_in_ndr_to_sddl(domain_sid, ntsd_ndr)
74
74
75
# Pre-modify function
76
77
def ntsd_is_unchanged_in_s4(s4connector, key, object):
78
	(s4_dn, s4_attributes) = s4connector.lo_s4.lo.search_s(s4_dn, ldap.SCOPE_BASE, '(objectClass=*)', ['nTSecurityDescriptor', 'uSNChanged', 'objectGUID'])[0]
79
	ntsd_ndr = s4_attributes.get('nTSecurityDescriptor')
80
	if ntsd_ndr:
81
		domain_sid = security.dom_sid(s4connector.s4_sid)
82
		s4_ntsd_sddl = decode_sd_in_ndr_to_sddl(domain_sid, ntsd_ndr[0])
83
		if s4_ntsd_sddl == ucs_ntsd_sddl:
84
			ud.debug(ud.LDAP, ud.INFO, 'ntsd_to_s4: nTSecurityDescriptors are equal')
85
			return True
86
87
		guid_blob = s4_attributes.get('objectGUID')[0]
88
		objectGUID = str(ndr_unpack(misc.GUID, guid_blob))
89
		old_s4_object = s4connector.s4cache.get_entry(objectGUID)
90
		if old_s4_object:
91
			if old_s4_object.get('uSNChanged')[0] != s4_attributes.get('uSNChanged')[0]:
92
				ud.debug(ud.LDAP, ud.PROCESS, "ntsd_to_s4: skipping, S4-Object changed: %s" % object['dn'])
93
				return False
94
	return True
95
75
# Post-create/modify functions
96
# Post-create/modify functions
76
97
77
98
 Lines 88-94    Link Here 
88
		return
109
		return
89
110
90
	ucs_ntsd_sddl = object['attributes']['msNTSecurityDescriptor'][0]
111
	ucs_ntsd_sddl = object['attributes']['msNTSecurityDescriptor'][0]
91
	(s4_dn, s4_attributes) = s4connector.lo_s4.lo.search_s(s4_dn, ldap.SCOPE_BASE, '(objectClass=*)', ['nTSecurityDescriptor', 'uSNChanged' , 'objectGUID'])[0]
112
	(s4_dn, s4_attributes) = s4connector.lo_s4.lo.search_s(s4_dn, ldap.SCOPE_BASE, '(objectClass=*)', ['nTSecurityDescriptor', 'objectGUID'])[0]
92
	ntsd_ndr = s4_attributes.get('nTSecurityDescriptor')
113
	ntsd_ndr = s4_attributes.get('nTSecurityDescriptor')
93
	if ntsd_ndr:
114
	if ntsd_ndr:
94
		domain_sid = security.dom_sid(s4connector.s4_sid)
115
		domain_sid = security.dom_sid(s4connector.s4_sid)
 Lines 97-110    Link Here 
97
			ud.debug(ud.LDAP, ud.INFO, 'ntsd_to_s4: nTSecurityDescriptors are equal')
118
			ud.debug(ud.LDAP, ud.INFO, 'ntsd_to_s4: nTSecurityDescriptors are equal')
98
			return
119
			return
99
120
100
		guid_blob = s4_attributes.get('objectGUID')[0]
101
		objectGUID = str(ndr_unpack(misc.GUID, guid_blob))
102
		old_s4_object = s4connector.s4cache.get_entry(objectGUID)
103
		if old_s4_object:
104
			if old_s4_object.get('uSNChanged')[0] != s4_attributes.get('uSNChanged')[0]:
105
				ud.debug(ud.LDAP, ud.PROCESS, "ntsd_to_s4: skipping, S4-Object changed: %s" % object['dn'])
106
				return
107
108
		ud.debug(ud.LDAP, ud.INFO, 'ntsd_to_s4: changing nTSecurityDescriptor from %s to %s' % (s4_ntsd_sddl, ucs_ntsd_sddl))
121
		ud.debug(ud.LDAP, ud.INFO, 'ntsd_to_s4: changing nTSecurityDescriptor from %s to %s' % (s4_ntsd_sddl, ucs_ntsd_sddl))
109
122
110
		ucs_ntsd_ndr = encode_sddl_to_sd_in_ndr(domain_sid, ucs_ntsd_sddl)
123
		ucs_ntsd_ndr = encode_sddl_to_sd_in_ndr(domain_sid, ucs_ntsd_sddl)

Return to bug 43628