xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-perl/bind.c (revision 404fbe5fb94ca1e054339640cabb2801ce52dd30)
1 /* $OpenLDAP: pkg/ldap/servers/slapd/back-perl/bind.c,v 1.24.2.4 2008/02/11 23:26:47 kurt Exp $ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1999-2008 The OpenLDAP Foundation.
5  * Portions Copyright 1999 John C. Quillan.
6  * Portions Copyright 2002 myinternet Limited.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 
18 #include "perl_back.h"
19 
20 
21 /**********************************************************
22  *
23  * Bind
24  *
25  **********************************************************/
26 int
27 perl_back_bind(
28 	Operation *op,
29 	SlapReply *rs )
30 {
31 	int count;
32 
33 	PerlBackend *perl_back = (PerlBackend *) op->o_bd->be_private;
34 
35 	/* allow rootdn as a means to auth without the need to actually
36  	 * contact the proxied DSA */
37 	switch ( be_rootdn_bind( op, rs ) ) {
38 	case SLAP_CB_CONTINUE:
39 		break;
40 
41 	default:
42 		return rs->sr_err;
43 	}
44 
45 #if defined(HAVE_WIN32_ASPERL) || defined(USE_ITHREADS)
46 	PERL_SET_CONTEXT( PERL_INTERPRETER );
47 #endif
48 
49 	ldap_pvt_thread_mutex_lock( &perl_interpreter_mutex );
50 
51 	{
52 		dSP; ENTER; SAVETMPS;
53 
54 		PUSHMARK(SP);
55 		XPUSHs( perl_back->pb_obj_ref );
56 		XPUSHs(sv_2mortal(newSVpv( op->o_req_dn.bv_val , 0)));
57 		XPUSHs(sv_2mortal(newSVpv( op->orb_cred.bv_val , op->orb_cred.bv_len)));
58 		PUTBACK;
59 
60 #ifdef PERL_IS_5_6
61 		count = call_method("bind", G_SCALAR);
62 #else
63 		count = perl_call_method("bind", G_SCALAR);
64 #endif
65 
66 		SPAGAIN;
67 
68 		if (count != 1) {
69 			croak("Big trouble in back_bind\n");
70 		}
71 
72 		rs->sr_err = POPi;
73 
74 
75 		PUTBACK; FREETMPS; LEAVE;
76 	}
77 
78 	ldap_pvt_thread_mutex_unlock( &perl_interpreter_mutex );
79 
80 	Debug( LDAP_DEBUG_ANY, "Perl BIND returned 0x%04x\n", rs->sr_err, 0, 0 );
81 
82 	/* frontend will send result on success (0) */
83 	if( rs->sr_err != LDAP_SUCCESS )
84 		send_ldap_result( op, rs );
85 
86 	return ( rs->sr_err );
87 }
88