xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-ldap/pbind.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: pbind.c,v 1.3 2021/08/14 16:14:59 christos Exp $	*/
2 
3 /* pbind.c - passthru Bind overlay */
4 /* $OpenLDAP$ */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 2003-2021 The OpenLDAP Foundation.
8  * Portions Copyright 2003-2010 Howard Chu.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted only as authorized by the OpenLDAP
13  * Public License.
14  *
15  * A copy of this license is available in the file LICENSE in the
16  * top-level directory of the distribution or, alternatively, at
17  * <http://www.OpenLDAP.org/license.html>.
18  */
19 /* ACKNOWLEDGEMENTS:
20  * This work was initially developed by the Howard Chu for inclusion
21  * in OpenLDAP Software.
22  */
23 
24 #include <sys/cdefs.h>
25 __RCSID("$NetBSD: pbind.c,v 1.3 2021/08/14 16:14:59 christos Exp $");
26 
27 #include "portable.h"
28 
29 #include <stdio.h>
30 
31 #include <ac/string.h>
32 #include <ac/socket.h>
33 
34 #include "lutil.h"
35 #include "slap.h"
36 #include "back-ldap.h"
37 #include "slap-config.h"
38 
39 static BackendInfo	*lback;
40 
41 static slap_overinst ldappbind;
42 
43 static int
ldap_pbind_bind(Operation * op,SlapReply * rs)44 ldap_pbind_bind(
45 	Operation	*op,
46 	SlapReply	*rs )
47 {
48 	slap_overinst	*on = (slap_overinst *) op->o_bd->bd_info;
49 	void *private = op->o_bd->be_private;
50 	void *bi = op->o_bd->bd_info;
51 	int rc;
52 
53 	op->o_bd->bd_info = lback;
54 	op->o_bd->be_private = on->on_bi.bi_private;
55 	rc = lback->bi_op_bind( op, rs );
56 	op->o_bd->be_private = private;
57 	op->o_bd->bd_info = bi;
58 
59 	return rc;
60 }
61 
62 static int
ldap_pbind_db_init(BackendDB * be,ConfigReply * cr)63 ldap_pbind_db_init(
64 	BackendDB *be,
65 	ConfigReply *cr )
66 {
67 	slap_overinst	*on = (slap_overinst *)be->bd_info;
68 	ConfigOCs	*be_cf_ocs = be->be_cf_ocs;
69 	void		*private = be->be_private;
70 	int rc;
71 
72 	if ( lback == NULL ) {
73 		lback = backend_info( "ldap" );
74 
75 		if ( lback == NULL ) {
76 			return 1;
77 		}
78 	}
79 
80 	rc = lback->bi_db_init( be, cr );
81 	on->on_bi.bi_private = be->be_private;
82 	be->be_cf_ocs = be_cf_ocs;
83 	be->be_private = private;
84 
85 	return rc;
86 }
87 
88 static int
ldap_pbind_db_open(BackendDB * be,ConfigReply * cr)89 ldap_pbind_db_open(
90 	BackendDB	*be,
91 	ConfigReply	*cr )
92 {
93 	slap_overinst	*on = (slap_overinst *) be->bd_info;
94 	void	*private = be->be_private;
95 	int		rc;
96 	int		monitoring;
97 
98     be->be_private = on->on_bi.bi_private;
99 	monitoring = ( SLAP_DBFLAGS( be ) & SLAP_DBFLAG_MONITORING );
100 	SLAP_DBFLAGS( be ) &= ~SLAP_DBFLAG_MONITORING;
101 	rc = lback->bi_db_open( be, cr );
102 	SLAP_DBFLAGS( be ) |= monitoring;
103 	be->be_private = private;
104 
105 	return rc;
106 }
107 
108 static int
ldap_pbind_db_close(BackendDB * be,ConfigReply * cr)109 ldap_pbind_db_close(
110 	BackendDB	*be,
111 	ConfigReply	*cr )
112 {
113 	slap_overinst	*on = (slap_overinst *) be->bd_info;
114 	void	*private = be->be_private;
115 	int		rc;
116 
117     be->be_private = on->on_bi.bi_private;
118 	rc = lback->bi_db_close( be, cr );
119 	be->be_private = private;
120 
121 	return rc;
122 }
123 
124 static int
ldap_pbind_db_destroy(BackendDB * be,ConfigReply * cr)125 ldap_pbind_db_destroy(
126 	BackendDB	*be,
127 	ConfigReply	*cr )
128 {
129 	slap_overinst	*on = (slap_overinst *) be->bd_info;
130 	void	*private = be->be_private;
131 	int		rc;
132 
133     be->be_private = on->on_bi.bi_private;
134 	rc = lback->bi_db_close( be, cr );
135 	on->on_bi.bi_private = be->be_private;
136 	be->be_private = private;
137 
138 	return rc;
139 }
140 
141 static int
ldap_pbind_connection_destroy(BackendDB * be,Connection * conn)142 ldap_pbind_connection_destroy(
143 	BackendDB *be,
144 	Connection *conn
145 )
146 {
147 	slap_overinst	*on = (slap_overinst *) be->bd_info;
148 	void			*private = be->be_private;
149 	int				rc;
150 
151 	be->be_private = on->on_bi.bi_private;
152 	rc = lback->bi_connection_destroy( be, conn );
153 	be->be_private = private;
154 
155 	return rc;
156 }
157 
158 int
pbind_initialize(void)159 pbind_initialize( void )
160 {
161 	int rc;
162 
163 	ldappbind.on_bi.bi_type = "pbind";
164 	ldappbind.on_bi.bi_db_init = ldap_pbind_db_init;
165 	ldappbind.on_bi.bi_db_open = ldap_pbind_db_open;
166 	ldappbind.on_bi.bi_db_close = ldap_pbind_db_close;
167 	ldappbind.on_bi.bi_db_destroy = ldap_pbind_db_destroy;
168 
169 	ldappbind.on_bi.bi_op_bind = ldap_pbind_bind;
170 	ldappbind.on_bi.bi_connection_destroy = ldap_pbind_connection_destroy;
171 
172 	rc = ldap_pbind_init_cf( &ldappbind.on_bi );
173 	if ( rc ) {
174 		return rc;
175 	}
176 
177 	return overlay_register( &ldappbind );
178 }
179