#include "network.h"
#include "ioloop.h"
#include "hash.h"
+#include "str.h"
#include "settings.h"
#include "db-ldap.h"
}
}
+const char *ldap_escape(const char *str)
+{
+ string_t *s;
+ const char *p;
+
+ for (p = str; *p != '\0'; p++) {
+ if (strchr("*()\\", *p) != NULL)
+ break;
+ }
+
+ if (*p == '\0')
+ return str;
+
+ s = t_str_new(64);
+ str_append_n(s, str, (size_t) (p-str));
+ for (; *p != '\0'; p++) {
+ if (strchr("*()\\", *p) != NULL)
+ str_append_c(s, '\\');
+ str_append_c(s, *p);
+ }
+ return str_c(s);
+}
+
static const char *parse_setting(const char *key, const char *value,
void *context)
{
struct ldap_connection *db_ldap_init(const char *config_path);
void db_ldap_unref(struct ldap_connection *conn);
+const char *ldap_escape(const char *str);
+
#endif
} else {
attr = ldap_first_attribute(conn->ld, entry, &ber);
while (attr != NULL) {
+ i_warning("attr: %s", attr);
vals = ldap_get_values(conn->ld, entry, attr);
if (vals != NULL && vals[0] != NULL &&
vals[1] == NULL) {
auth_request->realm, NULL);
}
+ user = ldap_escape(user);
if (conn->set.pass_filter == NULL) {
filter = t_strdup_printf("(&(objectClass=posixAccount)(%s=%s))",
passdb_ldap_conn->attr_names[ATTR_VIRTUAL_USER], user);
if (realm != NULL)
user = t_strconcat(user, "@", realm, NULL);
+ user = ldap_escape(user);
if (conn->set.user_filter == NULL) {
filter = t_strdup_printf("(&(objectClass=posixAccount)(%s=%s))",
userdb_ldap_conn->attr_names[ATTR_VIRTUAL_USER], user);