View | Details | Raw Unified | Return to bug 31494
Collapse All | Expand All

(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/computers/domaincontroller_master.py (-6 / +1 lines)
 Lines 659-670   def rewrite(filter, mapping): Link Here 
659
659
660
def lookup_filter(filter_s=None, lo=None):
660
def lookup_filter(filter_s=None, lo=None):
661
	filter_s = univention.admin.filter.replace_fqdn_filter(filter_s)
661
	filter_s = univention.admin.filter.replace_fqdn_filter(filter_s)
662
	if str(filter_s).find('(dnsAlias=') != -1:
662
	filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
663
		filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
664
		if filter_s:
665
			return lookup_filter(filter_s, lo)
666
		else:
667
			return None
668
	lookup_filter_obj = \
663
	lookup_filter_obj = \
669
		univention.admin.filter.conjunction('&', [
664
		univention.admin.filter.conjunction('&', [
670
			univention.admin.filter.expression('objectClass', 'univentionHost'),
665
			univention.admin.filter.expression('objectClass', 'univentionHost'),
(-)a/management/univention-directory-manager-modules/modules/univention/admin/handlers/dns/alias.py (-30 / +20 lines)
 Lines 134-141   def _ldap_post_remove(self): Link Here 
134
		self._updateZone()
134
		self._updateZone()
135
135
136
136
137
def lookup(co, lo, filter_s, base='', superordinate=None, scope="sub", unique=False, required=False, timeout=-1, sizelimit=0):
137
def _lookup_filter(filter_s=None, lo=None):  # don't expose as lookup_filter because the superordinate argument is missing!
138
139
	filter = univention.admin.filter.conjunction('&', [
138
	filter = univention.admin.filter.conjunction('&', [
140
		univention.admin.filter.expression('objectClass', 'dNSZone'),
139
		univention.admin.filter.expression('objectClass', 'dNSZone'),
141
		univention.admin.filter.conjunction('!', [univention.admin.filter.expression('relativeDomainName', '@')]),
140
		univention.admin.filter.conjunction('!', [univention.admin.filter.expression('relativeDomainName', '@')]),
 Lines 146-159   def lookup(co, lo, filter_s, base='', superordinate=None, scope="sub", unique=Fa Link Here 
146
		univention.admin.filter.expression('cNAMERecord', '*')
145
		univention.admin.filter.expression('cNAMERecord', '*')
147
	])
146
	])
148
147
149
	if superordinate:
150
		filter.expressions.append(univention.admin.filter.expression('zoneName', superordinate.mapping.mapValue('zone', superordinate['zone'])))
151
152
	if filter_s:
148
	if filter_s:
153
		filter_p = univention.admin.filter.parse(filter_s)
149
		filter_p = univention.admin.filter.parse(filter_s)
154
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
150
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
155
		filter.expressions.append(filter_p)
151
		filter.expressions.append(filter_p)
156
152
153
	return filter
154
155
156
def lookup(co, lo, filter_s, base='', superordinate=None, scope="sub", unique=False, required=False, timeout=-1, sizelimit=0):
157
	filter = _lookup_filter(filter_s)
158
	if superordinate:
159
		filter.expressions.append(univention.admin.filter.expression('zoneName', superordinate.mapping.mapValue('zone', superordinate['zone'])))
160
157
	res = []
161
	res = []
158
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
162
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
159
		res.append((object(co, lo, None, dn=dn, superordinate=superordinate, attributes=attrs)))
163
		res.append((object(co, lo, None, dn=dn, superordinate=superordinate, attributes=attrs)))
 Lines 166-194   def identify(dn, attr, canonical=0): Link Here 
166
170
167
171
168
def lookup_alias_filter(lo, filter_s):
172
def lookup_alias_filter(lo, filter_s):
169
	_re = re.compile('(.*)\(dnsAlias=([^=,]+)\)(.*)')
173
	alias_pattern = re.compile('(?:^|\()dnsAlias=([^)]+)($|\))', flags=re.I)
170
	match = _re.match(str(filter_s))
174
171
	filterlist = []
175
	def _replace_alias_filter(match):
172
	if match:
176
		alias_filter = _lookup_filter('name=%s' % match.group(1), lo)
173
		filter_p = univention.admin.filter.parse('name=%s' % match.group(2))
174
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)  # map property to ldap attribute
175
		alias_filter = univention.admin.filter.conjunction('&', [		# from dns/alias.lookup
176
			univention.admin.filter.expression('objectClass', 'dNSZone'),
177
			univention.admin.filter.conjunction('!', [univention.admin.filter.expression('relativeDomainName', '@')]),
178
			univention.admin.filter.conjunction('!', [univention.admin.filter.expression('zoneName', '*.in-addr.arpa')]),
179
			univention.admin.filter.expression('CNAMERecord', '*')
180
		])
181
		alias_filter.expressions.append(filter_p)
182
		alias_filter_s = unicode(alias_filter)
177
		alias_filter_s = unicode(alias_filter)
183
		alias_base = unicode(lo.base)					# std dns container might be a better choice
178
		alias_base = unicode(lo.base)  # standard dns container might be a better choice
184
		for dn, attrs in lo.search(base=alias_base, scope='sub', filter=alias_filter_s, attr=['cNAMERecord']):
179
185
			cname = attrs['cNAMERecord'][0]
180
		unmatchable_filter = '(&(cn=NOT)(!(cn=NOT)))'  # if no computers for aliases found, return an impossible filter!
186
			cn_filter = filter_format('(cn=%s)', [cname.split('.', 1)[0]])
181
		alias_replaced = ''.join(set(filter_format('(cn=%s)', [attrs['cNAMERecord'][0].split('.', 1)[0]]) for dn, attrs in lo.search(base=alias_base, scope='sub', filter=alias_filter_s, attr=['cNAMERecord'])))
187
			if cn_filter not in filterlist:
182
		return '(|%s)' % (alias_replaced,) if alias_replaced else unmatchable_filter
188
				filterlist.append(cn_filter)
183
189
		if len(filterlist) > 0:
184
	return alias_pattern.sub(_replace_alias_filter, str(filter_s))
190
			return match.group(1) + '(|' + string.join(filterlist, '') + ')' + match.group(3)
191
		else:
192
			return ''
193
	else:
194
		return filter_s

Return to bug 31494