]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldap/bind.c
84d8927e9ee6ae6e88d7fea7367a77a159644948
[openldap] / servers / slapd / back-ldap / bind.c
1 /* bind.c - ldap backend bind function */
2 /* $OpenLDAP$ */
3
4 /*
5  * Copyright 1999, Howard Chu, All rights reserved. <hyc@highlandsun.com>
6  * 
7  * Permission is granted to anyone to use this software for any purpose
8  * on any computer system, and to alter it and redistribute it, subject
9  * to the following restrictions:
10  * 
11  * 1. The author is not responsible for the consequences of use of this
12  *    software, no matter how awful, even if they arise from flaws in it.
13  * 
14  * 2. The origin of this software must not be misrepresented, either by
15  *    explicit claim or by omission.  Since few users ever read sources,
16  *    credits should appear in the documentation.
17  * 
18  * 3. Altered versions must be plainly marked as such, and must not be
19  *    misrepresented as being the original software.  Since few users
20  *    ever read sources, credits should appear in the documentation.
21  * 
22  * 4. This notice may not be removed or altered.
23  */
24
25 #include "portable.h"
26
27 #include <stdio.h>
28
29 #include <ac/socket.h>
30 #include <ac/string.h>
31
32 #include "slap.h"
33 #include "back-ldap.h"
34
35 int
36 ldap_back_bind(
37     Backend             *be,
38     Connection          *conn,
39     Operation           *op,
40     char                *dn,
41     char                *ndn,
42     int                 method,
43     struct berval       *cred,
44         char            **edn
45 )
46 {
47         struct ldapinfo *li = (struct ldapinfo *) be->be_private;
48         struct ldapconn *lc;
49
50         *edn = NULL;
51
52         lc = ldap_back_getconn(li, conn, op);
53         if (!lc)
54                 return( -1 );
55
56         if (ldap_bind_s(lc->ld, dn, cred->bv_val, method) != LDAP_SUCCESS)
57                 return( ldap_back_op_result(lc, op) );
58
59         lc->bound = 1;
60         return( 0 );
61 }
62
63 struct ldapconn *
64 ldap_back_getconn(struct ldapinfo *li, Connection *conn, Operation *op)
65 {
66         struct ldapconn *lc;
67         LDAP *ld;
68
69         ldap_pvt_thread_mutex_lock( &li->conn_mutex );
70         for (lc = li->lcs; lc; lc=lc->next)
71                 if (lc->conn == conn)
72                         break;
73         ldap_pvt_thread_mutex_unlock( &li->conn_mutex );
74
75         /* Looks like we didn't get a bind. Open a new session... */
76         if (!lc) {
77                 ld = ldap_init(li->host, li->port);
78                 if (!ld) {
79                         send_ldap_result( conn, op, LDAP_OTHER,
80                                 NULL, "ldap_init failed", NULL, NULL );
81                         return( NULL );
82                 }
83                 lc = (struct ldapconn *)ch_malloc(sizeof(struct ldapconn));
84                 lc->conn = conn;
85                 lc->ld = ld;
86                 lc->bound = 0;
87                 ldap_pvt_thread_mutex_lock( &li->conn_mutex );
88                 lc->next = li->lcs;
89                 li->lcs = lc;
90                 ldap_pvt_thread_mutex_unlock( &li->conn_mutex );
91         }
92         return( lc );
93 }
94
95 void
96 ldap_back_dobind(struct ldapconn *lc, Operation *op)
97 {
98         if (lc->bound)
99                 return;
100
101         if (ldap_bind_s(lc->ld, lc->conn->c_cdn, NULL, LDAP_AUTH_SIMPLE) !=
102                 LDAP_SUCCESS)
103                 ldap_back_op_result(lc, op);
104         else
105                 lc->bound = 1;
106 }
107
108 int
109 ldap_back_op_result(struct ldapconn *lc, Operation *op)
110 {
111         int err;
112         char *msg;
113         char *match;
114
115         ldap_get_option(lc->ld, LDAP_OPT_ERROR_NUMBER, &err);
116         ldap_get_option(lc->ld, LDAP_OPT_ERROR_STRING, &msg);
117         ldap_get_option(lc->ld, LDAP_OPT_MATCHED_DN, &match);
118         send_ldap_result( lc->conn, op, err, match, msg, NULL, NULL );
119         free(match);
120         free(msg);
121         return( (err==LDAP_SUCCESS) ? 0 : -1 );
122 }