# default is empty line
#LDAPBaseSearch ou=users,dc=mydomain,dc=local
-# TAG: LDAPFilterSearch uid=%s
+# TAG: LDAPFilterSearch (uid=%s)
# User search filter by user's logins in LDAP
# First founded record will be used
# %s - will be changed to userlogins from access.log file
-# filter string can have some tags '%s'
-# default value is 'uid=%s'
-#LDAPFilterSearch uid=%s
+# filter string can have up to 5 '%s' tags
+# default value is '(uid=%s)'
+#LDAPFilterSearch (uid=%s)
# TAG: LDAPTargetAttr attributename
# Name of the attribute containing a name of the user
static void get_ldap_name(const char *userlogin,char *mappedname,int namelen)
{
/* Start searching username in cache */
-
- char filtersearch[256], strictchars[] = " ~!@^&(){}|<>?:;\"\'\\[]`,\r\n\0", *strictptr = strictchars, *searched_in_cache;
+ // According to rfc2254 section 4, only *()\ and NUL must be escaped. This list is rather conservative !
+ const char strictchars[] = " ~!@^&(){}|<>?:;\"\'\\[]`,\r\n\0";
+ char filtersearch[256], *searched_in_cache;
+ char searchloginname[3*MAX_USER_LEN];
char *attr, **vals;
LDAPMessage *result, *e;
BerElement *ber;
+ int i;
- while (*strictptr) {
- char *foundchr;
- if ((foundchr = strchr(userlogin, *strictptr)))
- *foundchr = '\0';
- strictptr++;
+ for (i=0 ; i<sizeof(searchloginname)-1 && *userlogin ; userlogin++) {
+ if (strchr(strictchars,*userlogin)) {
+ // escape character according to rfc2254 section 4
+ if (i+3>=sizeof(searchloginname)-1) break;
+ i+=sprintf(searchloginname+i,"\\%02X",*userlogin);
+ } else {
+ searchloginname[i++]=*userlogin;
+ }
}
+ searchloginname[i]='\0';
- if (!(searched_in_cache = search_in_cache(userlogin))) {
- snprintf(filtersearch, sizeof(filtersearch), LDAPFilterSearch, userlogin, userlogin, userlogin, userlogin, userlogin);
+ if (!(searched_in_cache = search_in_cache(searchloginname))) {
+ snprintf(filtersearch, sizeof(filtersearch), LDAPFilterSearch, searchloginname, searchloginname, searchloginname, searchloginname, searchloginname);
/* Search record(s) in LDAP base */
int rc= ldap_search_s(ldap_handle, LDAPBaseSearch, LDAP_SCOPE_SUBTREE, filtersearch, NULL, 0, &result);
if ( rc != LDAP_SUCCESS ) {
debuga(_("LDAP search failed: %s\n"), ldap_err2string(rc));
- strcpy(mappedname,userlogin);
+ strncpy(mappedname,searchloginname,namelen-1);
+ mappedname[namelen-1]='\0';
return;
}
if (!(e = ldap_first_entry(ldap_handle, result)))
- insert_to_cache(userlogin, userlogin);
+ insert_to_cache(searchloginname, searchloginname);
else
for (attr = ldap_first_attribute(ldap_handle, e, &ber); attr != NULL; attr = ldap_next_attribute(ldap_handle, e, ber)) {
if (!strcasecmp(attr, LDAPTargetAttr)) {
if ((vals = (char **)ldap_get_values(ldap_handle, e, attr))!=NULL) {
- insert_to_cache(userlogin, vals[0]);
+ insert_to_cache(searchloginname, vals[0]);
strncpy(mappedname, vals[0],namelen-1);
mappedname[namelen-1]='\0';
ldap_memfree(vals);