]> git.sur5r.net Git - openldap/blob - libraries/liblutil/sasl.c
Fix #include of sasl.h
[openldap] / libraries / liblutil / sasl.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 2000-2002 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 } lutilSASLdefaults;
33
34
35 void *
36 lutil_sasl_defaults(
37         LDAP *ld,
38         char *mech,
39         char *realm,
40         char *authcid,
41         char *passwd,
42         char *authzid )
43 {
44         lutilSASLdefaults *defaults;
45         
46         defaults = ber_memalloc( sizeof( lutilSASLdefaults ) );
47
48         if( defaults == NULL ) return NULL;
49
50         defaults->mech = mech;
51         defaults->realm = realm;
52         defaults->authcid = authcid;
53         defaults->passwd = passwd;
54         defaults->authzid = authzid;
55
56         if( defaults->mech == NULL ) {
57                 ldap_get_option( ld, LDAP_OPT_X_SASL_MECH, &defaults->mech );
58         }
59         if( defaults->realm == NULL ) {
60                 ldap_get_option( ld, LDAP_OPT_X_SASL_REALM, &defaults->realm );
61         }
62         if( defaults->authcid == NULL ) {
63                 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHCID, &defaults->authcid );
64         }
65         if( defaults->authzid == NULL ) {
66                 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid );
67         }
68
69         return defaults;
70 }
71
72 static int interaction(
73         unsigned flags,
74         sasl_interact_t *interact,
75         lutilSASLdefaults *defaults )
76 {
77         const char *dflt = interact->defresult;
78         char input[1024];
79
80         int noecho=0;
81         int challenge=0;
82
83         switch( interact->id ) {
84         case SASL_CB_GETREALM:
85                 if( defaults ) dflt = defaults->realm;
86                 break;
87         case SASL_CB_AUTHNAME:
88                 if( defaults ) dflt = defaults->authcid;
89                 break;
90         case SASL_CB_PASS:
91                 if( defaults ) dflt = defaults->passwd;
92                 noecho = 1;
93                 break;
94         case SASL_CB_USER:
95                 if( defaults ) dflt = defaults->authzid;
96                 break;
97         case SASL_CB_NOECHOPROMPT:
98                 noecho = 1;
99                 challenge = 1;
100                 break;
101         case SASL_CB_ECHOPROMPT:
102                 challenge = 1;
103                 break;
104         }
105
106         if( dflt && !*dflt ) dflt = NULL;
107
108         if( flags != LDAP_SASL_INTERACTIVE &&
109                 ( dflt || interact->id == SASL_CB_USER ) )
110         {
111                 goto use_default;
112         }
113
114         if( flags == LDAP_SASL_QUIET ) {
115                 /* don't prompt */
116                 return LDAP_OTHER;
117         }
118
119         if( challenge ) {
120                 if( interact->challenge ) {
121                         fprintf( stderr, "Challenge: %s\n", interact->challenge );
122                 }
123         }
124
125         if( dflt ) {
126                 fprintf( stderr, "Default: %s\n", dflt );
127         }
128
129         sprintf( input, "%s: ",
130                 interact->prompt ? interact->prompt : "Interact" );
131
132         if( noecho ) {
133                 interact->result = (char *) getpassphrase( input );
134                 interact->len = interact->result
135                         ? strlen( interact->result ) : 0;
136
137         } else {
138                 /* prompt user */
139                 fputs( input, stderr );
140
141                 /* get input */
142                 interact->result = fgets( input, sizeof(input), stdin );
143
144                 if( interact->result == NULL ) {
145                         interact->len = 0;
146                         return LDAP_UNAVAILABLE;
147                 }
148
149                 /* len of input */
150                 interact->len = strlen(input); 
151
152                 if( interact->len > 0 && input[interact->len - 1] == '\n' ) {
153                         /* input includes '\n', trim it */
154                         interact->len--;
155                         input[interact->len] = '\0';
156                 }
157         }
158
159
160         if( interact->len > 0 ) {
161                 /* duplicate */
162                 char *p = (char *)interact->result;
163                 interact->result = strdup( p );
164
165                 /* zap */
166                 memset( p, '\0', interact->len );
167
168         } else {
169 use_default:
170                 /* input must be empty */
171                 interact->result = strdup( (dflt && *dflt) ? dflt : "" );
172                 interact->len = interact->result
173                         ? strlen( interact->result ) : 0;
174         }
175
176         if( defaults && defaults->passwd && interact->id == SASL_CB_PASS ) {
177                 /* zap password after first use */
178                 memset( defaults->passwd, '\0', strlen(defaults->passwd) );
179                 defaults->passwd = NULL;
180         }
181
182         return LDAP_SUCCESS;
183 }
184
185 int lutil_sasl_interact(
186         LDAP *ld,
187         unsigned flags,
188         void *defaults,
189         void *in )
190 {
191         sasl_interact_t *interact = in;
192
193         if( flags == LDAP_SASL_INTERACTIVE ) {
194                 fputs( "SASL Interaction\n", stderr );
195         }
196
197         while( interact->id != SASL_CB_LIST_END ) {
198                 int rc = interaction( flags, interact, defaults );
199
200                 if( rc )  return rc;
201                 interact++;
202         }
203         
204         return LDAP_SUCCESS;
205 }
206 #endif