]> git.sur5r.net Git - openldap/blob - libraries/liblutil/sasl.c
Import some lint removal
[openldap] / libraries / liblutil / sasl.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 2000-2003 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6
7 #include "portable.h"
8
9 #ifdef HAVE_CYRUS_SASL
10
11 #include <stdio.h>
12 #include <ac/stdlib.h>
13 #include <ac/string.h>
14 #include <ac/unistd.h>
15
16 #ifdef HAVE_SASL_SASL_H
17 #include <sasl/sasl.h>
18 #else
19 #include <sasl.h>
20 #endif
21
22 #include <ldap.h>
23 #include "lutil_ldap.h"
24
25
26 typedef struct lutil_sasl_defaults_s {
27         char *mech;
28         char *realm;
29         char *authcid;
30         char *passwd;
31         char *authzid;
32         char **resps;
33         int nresps;
34 } lutilSASLdefaults;
35
36
37 void
38 lutil_sasl_freedefs(
39         void *defaults )
40 {
41         lutilSASLdefaults *defs = defaults;
42         
43         if (defs->mech) ber_memfree(defs->mech);
44         if (defs->realm) ber_memfree(defs->realm);
45         if (defs->authcid) ber_memfree(defs->authcid);
46         if (defs->passwd) ber_memfree(defs->passwd);
47         if (defs->authzid) ber_memfree(defs->authzid);
48         if (defs->resps) ldap_charray_free(defs->resps);
49
50         ber_memfree(defs);
51 }
52
53 void *
54 lutil_sasl_defaults(
55         LDAP *ld,
56         char *mech,
57         char *realm,
58         char *authcid,
59         char *passwd,
60         char *authzid )
61 {
62         lutilSASLdefaults *defaults;
63         
64         defaults = ber_memalloc( sizeof( lutilSASLdefaults ) );
65
66         if( defaults == NULL ) return NULL;
67
68         defaults->mech = mech ? ber_strdup(mech) : NULL;
69         defaults->realm = realm ? ber_strdup(realm) : NULL;
70         defaults->authcid = authcid ? ber_strdup(authcid) : NULL;
71         defaults->passwd = passwd ? ber_strdup(passwd) : NULL;
72         defaults->authzid = authzid ? ber_strdup(authzid) : NULL;
73
74         if( defaults->mech == NULL ) {
75                 ldap_get_option( ld, LDAP_OPT_X_SASL_MECH, &defaults->mech );
76         }
77         if( defaults->realm == NULL ) {
78                 ldap_get_option( ld, LDAP_OPT_X_SASL_REALM, &defaults->realm );
79         }
80         if( defaults->authcid == NULL ) {
81                 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHCID, &defaults->authcid );
82         }
83         if( defaults->authzid == NULL ) {
84                 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid );
85         }
86         defaults->resps = NULL;
87         defaults->nresps = 0;
88
89         return defaults;
90 }
91
92 static int interaction(
93         unsigned flags,
94         sasl_interact_t *interact,
95         lutilSASLdefaults *defaults )
96 {
97         const char *dflt = interact->defresult;
98         char input[1024];
99
100         int noecho=0;
101         int challenge=0;
102
103         switch( interact->id ) {
104         case SASL_CB_GETREALM:
105                 if( defaults ) dflt = defaults->realm;
106                 break;
107         case SASL_CB_AUTHNAME:
108                 if( defaults ) dflt = defaults->authcid;
109                 break;
110         case SASL_CB_PASS:
111                 if( defaults ) dflt = defaults->passwd;
112                 noecho = 1;
113                 break;
114         case SASL_CB_USER:
115                 if( defaults ) dflt = defaults->authzid;
116                 break;
117         case SASL_CB_NOECHOPROMPT:
118                 noecho = 1;
119                 challenge = 1;
120                 break;
121         case SASL_CB_ECHOPROMPT:
122                 challenge = 1;
123                 break;
124         }
125
126         if( dflt && !*dflt ) dflt = NULL;
127
128         if( flags != LDAP_SASL_INTERACTIVE &&
129                 ( dflt || interact->id == SASL_CB_USER ) )
130         {
131                 goto use_default;
132         }
133
134         if( flags == LDAP_SASL_QUIET ) {
135                 /* don't prompt */
136                 return LDAP_OTHER;
137         }
138
139         if( challenge ) {
140                 if( interact->challenge ) {
141                         fprintf( stderr, "Challenge: %s\n", interact->challenge );
142                 }
143         }
144
145         if( dflt ) {
146                 fprintf( stderr, "Default: %s\n", dflt );
147         }
148
149         snprintf( input, sizeof input, "%s: ",
150                 interact->prompt ? interact->prompt : "Interact" );
151
152         if( noecho ) {
153                 interact->result = (char *) getpassphrase( input );
154                 interact->len = interact->result
155                         ? strlen( interact->result ) : 0;
156
157         } else {
158                 /* prompt user */
159                 fputs( input, stderr );
160
161                 /* get input */
162                 interact->result = fgets( input, sizeof(input), stdin );
163
164                 if( interact->result == NULL ) {
165                         interact->len = 0;
166                         return LDAP_UNAVAILABLE;
167                 }
168
169                 /* len of input */
170                 interact->len = strlen(input); 
171
172                 if( interact->len > 0 && input[interact->len - 1] == '\n' ) {
173                         /* input includes '\n', trim it */
174                         interact->len--;
175                         input[interact->len] = '\0';
176                 }
177         }
178
179
180         if( interact->len > 0 ) {
181                 /* duplicate */
182                 char *p = (char *)interact->result;
183                 ldap_charray_add(&defaults->resps, interact->result);
184                 interact->result = defaults->resps[defaults->nresps++];
185
186                 /* zap */
187                 memset( p, '\0', interact->len );
188
189         } else {
190 use_default:
191                 /* input must be empty */
192                 interact->result = (dflt && *dflt) ? dflt : "";
193                 interact->len = strlen( interact->result );
194         }
195
196         return LDAP_SUCCESS;
197 }
198
199 int lutil_sasl_interact(
200         LDAP *ld,
201         unsigned flags,
202         void *defaults,
203         void *in )
204 {
205         sasl_interact_t *interact = in;
206
207         if( ld == NULL ) return LDAP_PARAM_ERROR;
208
209         if( flags == LDAP_SASL_INTERACTIVE ) {
210                 fputs( "SASL Interaction\n", stderr );
211         }
212
213         while( interact->id != SASL_CB_LIST_END ) {
214                 int rc = interaction( flags, interact, defaults );
215
216                 if( rc )  return rc;
217                 interact++;
218         }
219         
220         return LDAP_SUCCESS;
221 }
222 #endif