Add a custom LDAP filter for LDAP printer browsing. New config key BrowseLDAPFilter. -- Julien BLACHE diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' cups-1.4.4~/scheduler/conf.c cups-1.4.4/scheduler/conf.c --- cups-1.4.4~/scheduler/conf.c 2011-01-18 11:26:21.941284605 +0100 +++ cups-1.4.4/scheduler/conf.c 2011-01-18 11:26:22.225284372 +0100 @@ -95,6 +95,7 @@ { "BrowseLDAPDN", &BrowseLDAPDN, CUPSD_VARTYPE_STRING }, { "BrowseLDAPPassword", &BrowseLDAPPassword, CUPSD_VARTYPE_STRING }, { "BrowseLDAPServer", &BrowseLDAPServer, CUPSD_VARTYPE_STRING }, + { "BrowseLDAPFilter", &BrowseLDAPFilter, CUPSD_VARTYPE_STRING }, #endif /* HAVE_LDAP */ { "BrowseLocalOptions", &BrowseLocalOptions, CUPSD_VARTYPE_STRING }, { "BrowsePort", &BrowsePort, CUPSD_VARTYPE_INTEGER }, @@ -660,6 +661,7 @@ cupsdClearString(&BrowseLDAPDN); cupsdClearString(&BrowseLDAPPassword); cupsdClearString(&BrowseLDAPServer); + cupsdClearString(&BrowseLDAPFilter); # ifdef HAVE_LDAP_SSL cupsdClearString(&BrowseLDAPCACertFile); # endif /* HAVE_LDAP_SSL */ diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' cups-1.4.4~/scheduler/dirsvc.c cups-1.4.4/scheduler/dirsvc.c --- cups-1.4.4~/scheduler/dirsvc.c 2011-01-18 11:26:21.817318366 +0100 +++ cups-1.4.4/scheduler/dirsvc.c 2011-01-18 11:26:37.925362568 +0100 @@ -119,6 +119,7 @@ static void process_implicit_classes(void); static void send_cups_browse(cupsd_printer_t *p); #ifdef HAVE_LDAP +#define LDAP_BROWSE_FILTER "(objectclass=cupsPrinter)" static LDAP *ldap_connect(void); static LDAP *ldap_reconnect(void); static void ldap_disconnect(LDAP *ld); @@ -1422,7 +1423,10 @@ int val; /* Socket option value */ struct sockaddr_in addr; /* Broadcast address */ cupsd_printer_t *p; /* Current printer */ - +#ifdef HAVE_LDAP + char *tmpFilter; /* Query filter */ + int filterLen; +#endif BrowseNext = NULL; @@ -1651,6 +1655,36 @@ } else { + /* + * Query filter string + */ + if (BrowseLDAPFilter) + filterLen = snprintf(NULL, 0, "(&%s%s)", LDAP_BROWSE_FILTER, BrowseLDAPFilter); + else + filterLen = strlen(LDAP_BROWSE_FILTER); + + tmpFilter = (char *)malloc(filterLen + 1); + if (!tmpFilter) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Could not allocate memory for LDAP browse query filter!"); + BrowseLocalProtocols &= ~BROWSE_LDAP; + BrowseRemoteProtocols &= ~BROWSE_LDAP; + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + + if (BrowseLDAPFilter) + { + snprintf(tmpFilter, filterLen + 1, "(&%s%s)", LDAP_BROWSE_FILTER, BrowseLDAPFilter); + _cupsStrFree(BrowseLDAPFilter); + } + else + strcpy(tmpFilter, LDAP_BROWSE_FILTER); + + BrowseLDAPFilter = tmpFilter; + /* * Open LDAP handle... */ @@ -2100,7 +2134,7 @@ */ rc = ldap_search_rec(BrowseLDAPHandle, BrowseLDAPDN, LDAP_SCOPE_SUBTREE, - "(objectclass=cupsPrinter)", (char **)ldap_attrs, 0, &res); + BrowseLDAPFilter, (char **)ldap_attrs, 0, &res); /* * If ldap search was successfull then exit function diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' cups-1.4.4~/scheduler/dirsvc.h cups-1.4.4/scheduler/dirsvc.h --- cups-1.4.4~/scheduler/dirsvc.h 2009-05-14 19:54:37.000000000 +0200 +++ cups-1.4.4/scheduler/dirsvc.h 2011-01-18 11:26:22.225284372 +0100 @@ -169,8 +169,10 @@ /* LDAP search DN */ *BrowseLDAPPassword VALUE(NULL), /* LDAP login password */ - *BrowseLDAPServer VALUE(NULL); + *BrowseLDAPServer VALUE(NULL), /* LDAP server to use */ + *BrowseLDAPFilter VALUE(NULL); + /* LDAP query filter */ VAR int BrowseLDAPUpdate VALUE(TRUE); /* enables LDAP updates */ # ifdef HAVE_LDAP_SSL