Bug 31494 - Unable to search for dnsAlias in computers/* modules
Unable to search for dnsAlias in computers/* modules
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: UMC - Computers
UCS 4.2
Other Linux
: P5 normal (vote)
: UCS 4.4-0-errata
Assigned To: Florian Best
Jannik Ahlers
:
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2013-05-24 12:01 CEST by Stefan Gohmann
Modified: 2019-04-17 14:07 CEST (History)
2 users (show)

See Also:
What kind of report is it?: Bug Report
What type of bug is this?: 3: Simply Wrong: The implementation doesn't match the docu
Who will be affected by this bug?: 1: Will affect a very few installed domains
How will those affected feel about the bug?: 2: A Pain – users won’t like this once they notice it
User Pain: 0.034
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number: 2017080421000372, 2017080421000381
Bug group (optional): Cleanup, Error handling, Usability
Max CVSS v3 score:
best: Patch_Available+


Attachments
patch (5.29 KB, patch)
2017-08-04 13:49 CEST, Florian Best
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Stefan Gohmann univentionstaff 2013-05-24 12:01:37 CEST
Searching for dnsAlias does not work if the ldap filter does not contain a bracket. I think that is the default while searching via UMC:

root@master511:~# udm computers/domaincontroller_slave list --filter 'dnsAlias=foo*'
dnsAlias=foo*
root@master511:~# udm computers/domaincontroller_slave list --filter '(dnsAlias=foo*)' | grep ^DN
DN: cn=slave513,cn=dc,cn=computers,dc=deadlock51,dc=local
root@master511:~# 


The error is in the lookup function:

    if str(filter_s).find('(dnsAlias=') != -1:
Comment 1 Florian Best univentionstaff 2017-08-04 13:49:07 CEST
Created attachment 9092 [details]
patch

Attached patch fixes this and some more errors:

A filter like "(dnsAlias=foo,bar)" caused the following Traceback in UMC:

Execution of command 'udm/query computers/computer' has failed:

Traceback (most recent call last):
  File "%PY2.7%/notifier/threads.py", line 82, in _run
    tmp = self._function()
  File "%PY2.7%/notifier/__init__.py", line 104, in __call__
    return self._function( *tmp, **self._kwargs )
  File "%PY2.7%/univention/management/console/modules/udm/__init__.py", line 563, in _thread
    result = module.search(container, objectProperty, objectPropertyValue, superordinate, scope=scope, hidden=hidden)
  File "%PY2.7%/univention/management/console/modules/udm/udm_ldap.py", line 82, in _decorated
    return method(*args, **kwargs)
  File "%PY2.7%/univention/management/console/ldap.py", line 143, in _decorated
    result = func(*args, **kwargs)
  File "%PY2.7%/univention/management/console/modules/udm/udm_ldap.py", line 484, in search
    result = self.module.lookup(None, ldap_connection, filter_s, base=container, superordinate=superordinate, scope=scope, sizelimit=sizelimit)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 682, in lookup
    filter = lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
…
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 665, in lookup_filter
    return lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 663, in lookup_filter
    filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
  File "%PY2.7%/univention/admin/handlers/dns/alias.py", line 169, in lookup_alias_filter
    _re = re.compile('(.*)\(dnsAlias=([^=,]+)\)(.*)')
  File "/usr/lib/python2.7/re.py", line 194, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 235, in _compile
    cachekey = (type(key[0]),) + key
RuntimeError: maximum recursion depth exceeded while calling a Python object

A filter like "(dnsAlias=)" caused the following Traceback in UMC:

Traceback (most recent call last):
  File "%PY2.7%/notifier/threads.py", line 82, in _run
    tmp = self._function()
  File "%PY2.7%/notifier/__init__.py", line 104, in __call__
    return self._function( *tmp, **self._kwargs )
  File "%PY2.7%/univention/management/console/modules/udm/__init__.py", line 563, in _thread
    result = module.search(container, objectProperty, objectPropertyValue, superordinate, scope=scope, hidden=hidden)
  File "%PY2.7%/univention/management/console/modules/udm/udm_ldap.py", line 84, in _decorated
    return method(*args, **kwargs)
  File "%PY2.7%/univention/management/console/ldap.py", line 143, in _decorated
    result = func(*args, **kwargs)
  File "%PY2.7%/univention/management/console/modules/udm/udm_ldap.py", line 484, in search
    result = self.module.lookup(None, ldap_connection, filter_s, base=container, superordinate=superordinate, scope=scope, sizelimit=sizelimit)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 682, in lookup
    filter = lookup_filter(filter_s, lo)
  File "%PY2.7%/univention/admin/handlers/computers/domaincontroller_master.py", line 663, in lookup_filter
    filter_s = univention.admin.handlers.dns.alias.lookup_alias_filter(lo, filter_s)
  File "%PY2.7%/univention/admin/handlers/dns/alias.py", line 184, in lookup_alias_filter
    for dn, attrs in lo.search(base=alias_base, scope='sub', filter=alias_filter_s, attr=['cNAMERecord']):
  File "%PY2.7%/univention/admin/uldap.py", line 433, in search
    raise univention.admin.uexceptions.ldapError('%s: %s' % (_err2str(msg), filter))
ldapError: Bad search filter: (&(objectClass=dNSZone)(!(relativeDomainName=@))(!(zoneName=*.in-addr.arpa))(CNAMERecord=*)(relativeDomainName=*)))
Comment 2 Florian Best univentionstaff 2019-04-11 09:42:07 CEST
Reproduce:
curl 'http://Administrator:univention@10.200.27.20/univention/command/udm/query' -H 'Content-Type: application/json' --data-binary '{"options":{"container":"all","hidden":false,"objectType":"computers/domaincontroller_master","objectProperty":"dnsAlias","objectPropertyValue":"*","fields":["name","description","labelObjectType","path"]},"flavor":"computers/computer"}' --compressed | python -m json.tool
Comment 3 Florian Best univentionstaff 2019-04-11 16:46:41 CEST
Search filters for every computer module has been repaired.

dnsAlias=foo
dnsAlias=foo,bar
dnsAlias=*

univention-directory-manager-modules (14.0.12-22)
c731a44f110c | Bug #31494: fix filtering for dnsAlias=foo

univention-directory-manager-modules.yaml
d095962ccced | YAML Bug #31494
Comment 4 Jannik Ahlers univentionstaff 2019-04-12 09:41:03 CEST
searching for dns aliases works for all computer modules: OK
installation: OK
yaml: OK
Comment 5 Florian Best univentionstaff 2019-04-12 11:50:41 CEST
One test case failed (60_umc/70_udm_network_functionality) and revealed a exception if instead of a string a univention.admin.filter.expression() is given to the function. this has been fixed:

univention-directory-manager-modules (14.0.12-24)
d375938de7d8 | Bug #31494: fix replacing of filter if it's not a string
Comment 6 Erik Damrose univentionstaff 2019-04-17 14:07:22 CEST
<http://errata.software-univention.de/ucs/4.4/50.html>