passdb-ldap.c revision 368fc39f2712bd2ff4db0219d85e63225132511f
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (C) 2003 Timo Sirainen */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenstatic const char *default_attr_map[] = {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen lookup_credentials_callback_t *lookup_credentials;
7242e1ce7803b83bc82e239ef111b47c1c72dd4bAndrey Paninstatic struct ldap_connection *passdb_ldap_conn;
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainenldap_query_save_result(struct ldap_connection *conn, LDAPMessage *entry,
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen unsigned int i;
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen attr = ldap_first_attribute(conn->ld, entry, &ber);
4051fa1f367553cac34f74c2e332a678390bcee5Timo Sirainen name = hash_lookup(passdb_ldap_conn->attr_map, attr);
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen vals = ldap_get_values(conn->ld, entry, attr);
1ddec6312bc6882aeb17d4d46d19cbca1723b68bTimo Sirainen attr = ldap_next_attribute(conn->ld, entry, ber);
1ddec6312bc6882aeb17d4d46d19cbca1723b68bTimo Sirainenstatic void handle_request(struct ldap_connection *conn,
59beb411159176b39e48a52d60dd3239732e67b4Timo Sirainen struct ldap_request *request, LDAPMessage *res)
1ddec6312bc6882aeb17d4d46d19cbca1723b68bTimo Sirainen struct auth_request *auth_request = request->context;
704fbadd78375da18dcaf2c5d93ac8cfe2c61358Timo Sirainen passdb_result = PASSDB_RESULT_INTERNAL_FAILURE;
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen "ldap_search() failed: %s",
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen entry = res == NULL ? NULL : ldap_first_entry(conn->ld, res);
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen "unknown user");
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen ldap_query_save_result(conn, entry, auth_request);
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen "No password in reply");
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen } else if (ldap_next_entry(conn->ld, entry) != NULL) {
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen "Multiple password replies");
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen /* LDAP result is freed now. we can check if auth_request is
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen even needed anymore */
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen /* auth_request_set_field() sets scheme */
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen /* verify plain */
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen ldap_request->callback.verify_plain(passdb_result,
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen ret = password_verify(ldap_request->password, password, scheme,
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen } else if (ret == 0) {
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen "password mismatch");
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainen ldap_request->callback.verify_plain(ret > 0 ? PASSDB_RESULT_OK :
21c317a20c4c3784b54fb3e90ee3751870afdcc3Timo Sirainenstatic void ldap_lookup_pass(struct auth_request *auth_request,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct ldap_connection *conn = passdb_ldap_conn;
97c339398f1aba6f315b55a9b6ee6b020e33bea4Timo Sirainen const char **attr_names = (const char **)conn->attr_names;
97c339398f1aba6f315b55a9b6ee6b020e33bea4Timo Sirainen vars = auth_request_get_var_expand_table(auth_request, ldap_escape);
f97cf1c086715db87094bc3d0a4fefdd80bd869cTimo Sirainen "base=%s scope=%s filter=%s fields=%s",
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen db_ldap_search(conn, base, conn->set.ldap_scope,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenldap_verify_plain(struct auth_request *request,
6e873f135368bcfdd1de4458dded791d0c4d00cdTimo Sirainen ldap_request = p_new(request->pool, struct passdb_ldap_request, 1);
6e873f135368bcfdd1de4458dded791d0c4d00cdTimo Sirainen ldap_request->callback.verify_plain = callback;
6e873f135368bcfdd1de4458dded791d0c4d00cdTimo Sirainen ldap_lookup_pass(request, &ldap_request->request);
e9e2d23e1ea5a149a7d8828d2a45b9f2313c3785Timo Sirainenstatic void ldap_lookup_credentials(struct auth_request *request,
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen ldap_request = p_new(request->pool, struct passdb_ldap_request, 1);
static void passdb_ldap_deinit(void)