]> git.sur5r.net Git - openldap/blob - clients/tools/ldapvc.c
c6ca58578bc38a578b495de93ed5c3fd4a4991fb
[openldap] / clients / tools / ldapvc.c
1 /* ldapvc.c -- a tool for verifying credentials */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 1998-2010 The OpenLDAP Foundation.
6  * Portions Copyright 2010 Kurt D. Zeilenga.
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 the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* Portions Copyright (c) 1992-1996 Regents of the University of Michigan.
18  * All rights reserved.
19  *
20  * Redistribution and use in source and binary forms are permitted
21  * provided that this notice is preserved and that due credit is given
22  * to the University of Michigan at Ann Arbor.  The name of the
23  * University may not be used to endorse or promote products derived
24  * from this software without specific prior written permission.  This
25  * software is provided ``as is'' without express or implied warranty.
26  */
27 /* ACKNOWLEDGEMENTS:
28  * This work was originally developed by Kurt D. Zeilenga for inclusion
29  * in OpenLDAP Software based, in part, on other client tools.
30  */
31
32 #include "portable.h"
33
34 #include <stdio.h>
35
36 #include <ac/stdlib.h>
37
38 #include <ac/ctype.h>
39 #include <ac/socket.h>
40 #include <ac/string.h>
41 #include <ac/time.h>
42 #include <ac/unistd.h>
43
44 #include <ldap.h>
45 #include "lutil.h"
46 #include "lutil_ldap.h"
47 #include "ldap_defaults.h"
48
49 #include "common.h"
50
51 static char * mech = NULL;
52 static char * dn = NULL;
53 static struct berval cred = {0, NULL};
54
55 void
56 usage( void )
57 {
58         fprintf( stderr, _("Issue LDAP Verify Credentials operation to verify a user's credentials\n\n"));
59         fprintf( stderr, _("usage: %s [options] (-S mech|[DN [cred]])\n"), prog);
60         fprintf( stderr, _("where:\n"));
61         fprintf( stderr, _("    DN\tDistinguished Name\n"));
62         fprintf( stderr, _("    cred\tCredentials (prompt if not present)\n"));
63         fprintf( stderr, _("options:\n"));
64         fprintf( stderr, _("    -S mech\tSASL mechanism (default "" e.g. Simple)\n"));
65         tool_common_usage();
66         exit( EXIT_FAILURE );
67 }
68
69
70 const char options[] = "S"
71         "d:D:e:h:H:InNO:o:p:QR:U:vVw:WxX:y:Y:Z";
72
73 int
74 handle_private_option( int i )
75 {
76         switch ( i ) {
77 #if 0
78                 char    *control, *cvalue;
79                 int             crit;
80         case 'E': /* vc extension */
81                 if( protocol == LDAP_VERSION2 ) {
82                         fprintf( stderr, _("%s: -E incompatible with LDAPv%d\n"),
83                                 prog, protocol );
84                         exit( EXIT_FAILURE );
85                 }
86
87                 /* should be extended to support comma separated list of
88                  *      [!]key[=value] parameters, e.g.  -E !foo,bar=567
89                  */
90
91                 crit = 0;
92                 cvalue = NULL;
93                 if( optarg[0] == '!' ) {
94                         crit = 1;
95                         optarg++;
96                 }
97
98                 control = strdup( optarg );
99                 if ( (cvalue = strchr( control, '=' )) != NULL ) {
100                         *cvalue++ = '\0';
101                 }
102
103                 fprintf( stderr, _("Invalid Verify Credentials extension name: %s\n"), control );
104                 usage();
105 #endif
106
107         case 'S':  /* SASL mechanism */
108                 mech = optarg;
109                 break;
110
111         default:
112                 return 0;
113         }
114         return 1;
115 }
116
117
118 int
119 main( int argc, char *argv[] )
120 {
121         int             rc;
122         LDAP            *ld = NULL;
123         char            *matcheddn = NULL, *text = NULL, **refs = NULL;
124         int rcode;
125         char * diag = NULL;
126         struct berval   *scookie = NULL;
127         struct berval   *scred = NULL;
128         int             id, code = 0;
129         LDAPMessage     *res;
130         LDAPControl     **ctrls = NULL;
131
132         tool_init( TOOL_VC );
133         prog = lutil_progname( "ldapvc", argc, argv );
134
135         /* LDAPv3 only */
136         protocol = LDAP_VERSION3;
137
138         tool_args( argc, argv );
139
140         if (mech) {
141                 if (argc - optind > 0) {
142                         usage();
143                 }
144
145                 fprintf(stderr, "SASL credential verification not yet implemented!\n");
146                 rc = EXIT_FAILURE;
147                 goto skip;
148
149         } else {
150                 if (argc - optind > 0) {
151                         dn = argv[optind++];
152                 }
153                 if (argc - optind > 0) {
154                         cred.bv_val = argv[optind++];
155                         cred.bv_len = strlen(cred.bv_val);
156                 }
157
158                 if (argc - optind > 0) {
159                     usage();
160             }
161
162             if (!cred.bv_val) {
163                     cred.bv_val = strdup(getpassphrase(_("User's password: ")));
164             }
165                 cred.bv_len = strlen(cred.bv_val);
166         }
167
168         ld = tool_conn_setup( 0, 0 );
169
170         tool_bind( ld );
171
172         if ( dont ) {
173                 rc = LDAP_SUCCESS;
174                 goto skip;
175         }
176
177         tool_server_controls( ld, NULL, 0 );
178
179         rc = ldap_verify_credentials( ld,
180                 NULL,
181                 dn, mech, cred.bv_val ? &cred: NULL, NULL,
182                 NULL, NULL, &id ); 
183
184         if( rc != LDAP_SUCCESS ) {
185                 tool_perror( "ldap_verify_credentials", rc, NULL, NULL, NULL, NULL );
186                 rc = EXIT_FAILURE;
187                 goto skip;
188         }
189
190         for ( ; ; ) {
191                 struct timeval  tv;
192
193                 if ( tool_check_abandon( ld, id ) ) {
194                         return LDAP_CANCELLED;
195                 }
196
197                 tv.tv_sec = 0;
198                 tv.tv_usec = 100000;
199
200                 rc = ldap_result( ld, LDAP_RES_ANY, LDAP_MSG_ALL, &tv, &res );
201                 if ( rc < 0 ) {
202                         tool_perror( "ldap_result", rc, NULL, NULL, NULL, NULL );
203                         return rc;
204                 }
205
206                 if ( rc != 0 ) {
207                         break;
208                 }
209         }
210
211         rc = ldap_parse_result( ld, res,
212                 &code, &matcheddn, &text, &refs, &ctrls, 0 );
213
214         if ( rc == LDAP_SUCCESS ) {
215                 rc = code;
216         }
217
218         if ( rc != LDAP_SUCCESS ) {
219                 tool_perror( "ldap_parse_result", rc, NULL, matcheddn, text, refs );
220                 rc = EXIT_FAILURE;
221                 goto skip;
222         }
223
224         rc = ldap_parse_verify_credentials( ld, res, &rcode, &diag, &scookie, &scred, NULL );
225         ldap_msgfree(res);
226
227         if( rc != LDAP_SUCCESS ) {
228                 tool_perror( "ldap_parse_verify_credentials", rc, NULL, NULL, NULL, NULL );
229                 rc = EXIT_FAILURE;
230                 goto skip;
231         }
232
233         if (!rcode) {
234                 printf(_("Failed: %s (%d)\n"), ldap_err2string(rcode), rcode);
235         }
236
237         if (diag && *diag) {
238             printf(_("Diagnostic: %s\n"), diag);
239         }
240
241     /* print vc controls here (once added) */
242
243 skip:
244         if ( verbose || ( code != LDAP_SUCCESS ) ||
245                 matcheddn || text || refs || ctrls )
246         {
247                 printf( _("Result: %s (%d)\n"), ldap_err2string( code ), code );
248
249                 if( text && *text ) {
250                         printf( _("Additional info: %s\n"), text );
251                 }
252
253                 if( matcheddn && *matcheddn ) {
254                         printf( _("Matched DN: %s\n"), matcheddn );
255                 }
256
257                 if( refs ) {
258                         int i;
259                         for( i=0; refs[i]; i++ ) {
260                                 printf(_("Referral: %s\n"), refs[i] );
261                         }
262                 }
263
264                 if (ctrls) {
265                         tool_print_ctrls( ld, ctrls );
266                         ldap_controls_free( ctrls );
267                 }
268         }
269
270         ber_memfree( text );
271         ber_memfree( matcheddn );
272         ber_memvfree( (void **) refs );
273         ber_bvfree( scookie );
274         ber_bvfree( scred );
275         ber_memfree( diag );
276
277         /* disconnect from server */
278         tool_unbind( ld );
279         tool_destroy();
280
281         return code == LDAP_SUCCESS ? EXIT_SUCCESS : EXIT_FAILURE;
282 }