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 |