]> git.sur5r.net Git - openldap/blob - clients/tools/ldapvc.c
Add basic client
[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         struct berval   *scookie = NULL;
125         struct berval   *scred = NULL;
126         struct berval   *authzid = NULL;
127         int             id, code = 0;
128         LDAPMessage     *res;
129         LDAPControl     **ctrls = NULL;
130
131         tool_init( TOOL_VC );
132         prog = lutil_progname( "ldapvc", argc, argv );
133
134         /* LDAPv3 only */
135         protocol = LDAP_VERSION3;
136
137         tool_args( argc, argv );
138
139         if (mech) {
140                 if (argc - optind > 0) {
141                         usage();
142                 }
143
144                 fprintf(stderr, "SASL credential verification not yet implemented!\n");
145                 rc = EXIT_FAILURE;
146                 goto skip;
147
148         } else {
149                 if (argc - optind > 0) {
150                         dn = argv[optind++];
151                 }
152                 if (argc - optind > 0) {
153                         cred.bv_val = argv[optind++];
154                         cred.bv_len = strlen(cred.bv_val);
155                 }
156
157                 if (argc - optind > 0) {
158                     usage();
159             }
160
161             if (!cred.bv_val) {
162                     cred.bv_val = strdup(getpassphrase(_("User's password: ")));
163             }
164                 cred.bv_len = strlen(cred.bv_val);
165         }
166
167         ld = tool_conn_setup( 0, 0 );
168
169         tool_bind( ld );
170
171         if ( dont ) {
172                 rc = LDAP_SUCCESS;
173                 goto skip;
174         }
175
176         tool_server_controls( ld, NULL, 0 );
177
178         rc = ldap_verify_credentials( ld,
179                 NULL,
180                 dn, mech, cred.bv_val ? &cred: NULL,
181                 NULL, NULL, &id ); 
182
183         if( rc != LDAP_SUCCESS ) {
184                 tool_perror( "ldap_verify_credentials", rc, NULL, NULL, NULL, NULL );
185                 rc = EXIT_FAILURE;
186                 goto skip;
187         }
188
189         for ( ; ; ) {
190                 struct timeval  tv;
191
192                 if ( tool_check_abandon( ld, id ) ) {
193                         return LDAP_CANCELLED;
194                 }
195
196                 tv.tv_sec = 0;
197                 tv.tv_usec = 100000;
198
199                 rc = ldap_result( ld, LDAP_RES_ANY, LDAP_MSG_ALL, &tv, &res );
200                 if ( rc < 0 ) {
201                         tool_perror( "ldap_result", rc, NULL, NULL, NULL, NULL );
202                         return rc;
203                 }
204
205                 if ( rc != 0 ) {
206                         break;
207                 }
208         }
209
210         rc = ldap_parse_result( ld, res,
211                 &code, &matcheddn, &text, &refs, &ctrls, 0 );
212
213         if ( rc == LDAP_SUCCESS ) {
214                 rc = code;
215         }
216
217         if ( rc != LDAP_SUCCESS ) {
218                 tool_perror( "ldap_parse_result", rc, NULL, matcheddn, text, refs );
219                 rc = EXIT_FAILURE;
220                 goto skip;
221         }
222
223         rc = ldap_parse_verify_credentials( ld, res, &scookie, &scred, &authzid );
224         ldap_msgfree(res);
225
226         if( rc != LDAP_SUCCESS ) {
227                 tool_perror( "ldap_parse_verify_credentials", rc, NULL, NULL, NULL, NULL );
228                 rc = EXIT_FAILURE;
229                 goto skip;
230         }
231
232         if( authzid != NULL ) {
233                 if( authzid->bv_len == 0 ) {
234                         printf(_("anonymous\n") );
235                 } else {
236                         printf("%s\n", authzid->bv_val );
237                 }
238         }
239
240 skip:
241         if ( verbose || ( code != LDAP_SUCCESS ) ||
242                 matcheddn || text || refs || ctrls )
243         {
244                 printf( _("Result: %s (%d)\n"), ldap_err2string( code ), code );
245
246                 if( text && *text ) {
247                         printf( _("Additional info: %s\n"), text );
248                 }
249
250                 if( matcheddn && *matcheddn ) {
251                         printf( _("Matched DN: %s\n"), matcheddn );
252                 }
253
254                 if( refs ) {
255                         int i;
256                         for( i=0; refs[i]; i++ ) {
257                                 printf(_("Referral: %s\n"), refs[i] );
258                         }
259                 }
260
261                 if (ctrls) {
262                         tool_print_ctrls( ld, ctrls );
263                         ldap_controls_free( ctrls );
264                 }
265         }
266
267         ber_memfree( text );
268         ber_memfree( matcheddn );
269         ber_memvfree( (void **) refs );
270         ber_bvfree( scookie );
271         ber_bvfree( scred );
272         ber_bvfree( authzid );
273
274         /* disconnect from server */
275         tool_unbind( ld );
276         tool_destroy();
277
278         return code == LDAP_SUCCESS ? EXIT_SUCCESS : EXIT_FAILURE;
279 }