3 * Copyright 2000-2003 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
12 #include <ac/stdlib.h>
13 #include <ac/string.h>
14 #include <ac/unistd.h>
16 #ifdef HAVE_SASL_SASL_H
17 #include <sasl/sasl.h>
23 #include "lutil_ldap.h"
26 typedef struct lutil_sasl_defaults_s {
41 lutilSASLdefaults *defs = defaults;
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);
62 lutilSASLdefaults *defaults;
64 defaults = ber_memalloc( sizeof( lutilSASLdefaults ) );
66 if( defaults == NULL ) return NULL;
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;
74 if( defaults->mech == NULL ) {
75 ldap_get_option( ld, LDAP_OPT_X_SASL_MECH, &defaults->mech );
77 if( defaults->realm == NULL ) {
78 ldap_get_option( ld, LDAP_OPT_X_SASL_REALM, &defaults->realm );
80 if( defaults->authcid == NULL ) {
81 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHCID, &defaults->authcid );
83 if( defaults->authzid == NULL ) {
84 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid );
86 defaults->resps = NULL;
92 static int interaction(
94 sasl_interact_t *interact,
95 lutilSASLdefaults *defaults )
97 const char *dflt = interact->defresult;
103 switch( interact->id ) {
104 case SASL_CB_GETREALM:
105 if( defaults ) dflt = defaults->realm;
107 case SASL_CB_AUTHNAME:
108 if( defaults ) dflt = defaults->authcid;
111 if( defaults ) dflt = defaults->passwd;
115 if( defaults ) dflt = defaults->authzid;
117 case SASL_CB_NOECHOPROMPT:
121 case SASL_CB_ECHOPROMPT:
126 if( dflt && !*dflt ) dflt = NULL;
128 if( flags != LDAP_SASL_INTERACTIVE &&
129 ( dflt || interact->id == SASL_CB_USER ) )
134 if( flags == LDAP_SASL_QUIET ) {
140 if( interact->challenge ) {
141 fprintf( stderr, _("Challenge: %s\n"), interact->challenge );
146 fprintf( stderr, _("Default: %s\n"), dflt );
149 snprintf( input, sizeof input, "%s: ",
150 interact->prompt ? interact->prompt : _("Interact") );
153 interact->result = (char *) getpassphrase( input );
154 interact->len = interact->result
155 ? strlen( interact->result ) : 0;
159 fputs( input, stderr );
162 interact->result = fgets( input, sizeof(input), stdin );
164 if( interact->result == NULL ) {
166 return LDAP_UNAVAILABLE;
170 interact->len = strlen(input);
172 if( interact->len > 0 && input[interact->len - 1] == '\n' ) {
173 /* input includes '\n', trim it */
175 input[interact->len] = '\0';
180 if( interact->len > 0 ) {
182 char *p = (char *)interact->result;
183 ldap_charray_add(&defaults->resps, interact->result);
184 interact->result = defaults->resps[defaults->nresps++];
187 memset( p, '\0', interact->len );
191 /* input must be empty */
192 interact->result = (dflt && *dflt) ? dflt : "";
193 interact->len = strlen( interact->result );
199 int lutil_sasl_interact(
205 sasl_interact_t *interact = in;
207 if( ld == NULL ) return LDAP_PARAM_ERROR;
209 if( flags == LDAP_SASL_INTERACTIVE ) {
210 fputs( _("SASL Interaction\n"), stderr );
213 while( interact->id != SASL_CB_LIST_END ) {
214 int rc = interaction( flags, interact, defaults );