diff --git a/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printer.py b/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printer.py index 254c926..68ad5ff 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printer.py +++ b/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printer.py @@ -31,6 +31,7 @@ # . import re +import ldap.filter from univention.admin.layout import Tab, Group import univention.admin.uldap @@ -324,9 +325,8 @@ def _ldap_pre_modify(self):# check for membership in a quota-printerclass # cut off '/' at the beginning of the destination if it exists and protocol is file:/ if self[ 'uri' ] and self[ 'uri' ][ 0 ] == 'file:/' and self[ 'uri' ][ 1 ][ 0 ] == '/': self[ 'uri' ][ 1 ] = re.sub( r'^/+', '', self[ 'uri' ][ 1 ] ) - if self.hasChanged('setQuota') and self.info['setQuota'] == '0': - printergroups=self.lo.searchDn(filter='(&(objectClass=univentionPrinterGroup)(univentionPrinterQuotaSupport=1)(univentionPrinterSpoolHost=%s))' - % self.info['spoolHost']) + if self.hasChanged('setQuota') and self.info['setQuota'] == '0' and self.info['spoolHost']: + printergroups = self.lo.searchDn(filter='(&(objectClass=univentionPrinterGroup)(univentionPrinterQuotaSupport=1)(|%s))' % (''.join(ldap.filter.filter_format('(univentionPrinterSpoolHost=%s)', [x]) for x in self.info['spoolHost']))) group_cn=[] for pg_dn in printergroups: member_list = self.lo.get(pg_dn, attr=['univentionPrinterGroupMember','cn']) @@ -338,7 +338,7 @@ def _ldap_pre_modify(self):# check for membership in a quota-printerclass def _ldap_pre_remove(self): # check for last member in printerclass - printergroups=self.lo.searchDn(filter='(&(objectClass=univentionPrinterGroup)(univentionPrinterSpoolHost=%s))'%self.info['spoolHost']) + printergroups = self.lo.searchDn(filter='(&(objectClass=univentionPrinterGroup)(|%s))' % (''.join(ldap.filter.filter_format('(univentionPrinterSpoolHost=%s)', [x]) for x in self.info['spoolHost']))) rm_attrib=[] for pg_dn in printergroups: member_list=self.lo.search( base=pg_dn, attr=['univentionPrinterGroupMember','cn']) diff --git a/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printergroup.py b/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printergroup.py index 1cc9b1d..2c0a728 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printergroup.py +++ b/management/univention-directory-manager-modules/modules/univention/admin/handlers/shares/printergroup.py @@ -30,6 +30,8 @@ # /usr/share/common-licenses/AGPL-3; if not, see # . +import ldap.filter + from univention.admin.layout import Tab, Group import univention.admin.uldap import univention.admin.syntax @@ -192,7 +194,7 @@ def _ldap_modlist(self):# check for membership in a quota-printerclass raise univention.admin.uexceptions.leavePrinterGroup(_('%(name)s is member of the following quota printer groups %(groups)s') % {'name': self.info['name'], 'groups': ', '.join(group_cn)}) elif self.info.get( 'setQuota', None ) == '1': for member_cn in self.info['groupMember']: - member_dn=self.lo.searchDn(filter='(&(objectClass=univentionPrinter)(univentionPrinterSpoolHost=%s)(cn=%s)(univentionPrinterQuotaSupport=1))' % (self.info['spoolHost'][0], member_cn)) + member_dn=self.lo.searchDn(filter='(&(objectClass=univentionPrinter)(|%s)(cn=%s)(univentionPrinterSpoolHost=%s)(cn=%s)(univentionPrinterQuotaSupport=1))' % (''.join(ldap.filter.filter_format('(univentionPrinterSpoolHost=%s)', [x]) for x in self.info['spoolHost']), ldap.filter.escape_filter_chars(member_cn))) if len(member_dn) < 1: raise univention.admin.uexceptions.leavePrinterGroup, _('%s is disabled for quota support. ') % member_cn if self.hasChanged('groupMember'): @@ -200,7 +202,7 @@ def _ldap_modlist(self):# check for membership in a quota-printerclass return univention.admin.handlers.simpleLdap._ldap_modlist(self) def _ldap_pre_remove(self): # check for last member in printerclass on same spoolhost - printergroups=self.lo.searchDn(filter='(&(objectClass=univentionPrinterGroup)(univentionPrinterSpoolHost=%s))' % self.info['spoolHost']) + printergroups=self.lo.searchDn(filter='(&(objectClass=univentionPrinterGroup)(|%s))' % ''.join(ldap.filter.filter_format('(univentionPrinterSpoolHost=%s)', [x]) for x in self.info['spoolHost'])) rm_attrib=[] for pg_dn in printergroups: member_list=self.lo.search( base=pg_dn, attr=['univentionPrinterGroupMember','cn']) @@ -218,12 +220,10 @@ def _ldap_pre_remove(self): # check for last member in printerclass on same spoo def isValidPrinterObject(self): # check printer on current spoolhost for member in self.info['groupMember']: - spoolhosts = '(|' - for host in self.info[ 'spoolHost' ]: - spoolhosts += "(univentionPrinterSpoolHost=%s)" % host - spoolhosts += ')' - test=self.lo.searchDn(filter='(&(objectClass=univentionPrinter)(cn=%s)%s)' % ( member, spoolhosts ) ) + spoolhosts = '(|%s)' % ''.join(ldap.filter.filter_format('(univentionPrinterSpoolHost=%s)', [x]) for x in self.info['spoolHost']) + + test=self.lo.searchDn(filter='(&(objectClass=univentionPrinter)(cn=%s)%s)' % (ldap.filter.escape_filter_chars(member), spoolhosts ) ) if len(test) < 1: raise univention.admin.uexceptions.notValidPrinter(_('%(name)s is not a valid printer on Spoolhost %(host)s.') % {'name': member, 'host': self.info['spoolHost']})