]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Escape special chars in username if needed.
authorTimo Sirainen <tss@iki.fi>
Tue, 18 Feb 2003 17:18:31 +0000 (19:18 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 18 Feb 2003 17:18:31 +0000 (19:18 +0200)
--HG--
branch : HEAD

src/auth/db-ldap.c
src/auth/db-ldap.h
src/auth/passdb-ldap.c
src/auth/userdb-ldap.c

index 0c682536cfe5562b427cbd65f03f3682398b0ed2..fce89645901b4d9fba07dd716c5ac87756eb4884 100644 (file)
@@ -9,6 +9,7 @@
 #include "network.h"
 #include "ioloop.h"
 #include "hash.h"
+#include "str.h"
 #include "settings.h"
 #include "db-ldap.h"
 
@@ -261,6 +262,29 @@ void db_ldap_set_attrs(struct ldap_connection *conn, const char *value,
        }
 }
 
+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)
 {
index 92c18e0630e1247653bdecada79d41d8f49819ad..4f634ebb5f66bf485d40f8f486a71fc6b32cf53a 100644 (file)
@@ -59,4 +59,6 @@ void db_ldap_set_attrs(struct ldap_connection *conn, const char *value,
 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
index be606dadd1a3c0bb4abda46d6f1d11fd0b0e388f..56921228fcaf909f0b790e09086649009b0faaeb 100644 (file)
@@ -73,6 +73,7 @@ static void handle_request(struct ldap_connection *conn,
        } 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) {
@@ -160,6 +161,7 @@ static void ldap_lookup_pass(struct auth_request *auth_request,
                                   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);
index fd755717c5cf09e0aac563ab6260863843a3c4cd..7ec1b809fed59a52e16c314debaccf2829d534a1 100644 (file)
@@ -148,6 +148,7 @@ static void userdb_ldap_lookup(const char *user, const char *realm,
        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);