2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 1998-2003 The OpenLDAP Foundation.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted only as authorized by the OpenLDAP
11 * A copy of this license is available in the file LICENSE in the
12 * top-level directory of the distribution or, alternatively, at
13 * <http://www.OpenLDAP.org/license.html>.
18 #ifdef HAVE_CYRUS_SASL
21 #include <ac/stdlib.h>
22 #include <ac/string.h>
23 #include <ac/unistd.h>
25 #ifdef HAVE_SASL_SASL_H
26 #include <sasl/sasl.h>
33 #include "lutil_ldap.h"
36 typedef struct lutil_sasl_defaults_s {
51 lutilSASLdefaults *defs = defaults;
53 if (defs->mech) ber_memfree(defs->mech);
54 if (defs->realm) ber_memfree(defs->realm);
55 if (defs->authcid) ber_memfree(defs->authcid);
56 if (defs->passwd) ber_memfree(defs->passwd);
57 if (defs->authzid) ber_memfree(defs->authzid);
58 if (defs->resps) ldap_charray_free(defs->resps);
72 lutilSASLdefaults *defaults;
74 defaults = ber_memalloc( sizeof( lutilSASLdefaults ) );
76 if( defaults == NULL ) return NULL;
78 defaults->mech = mech ? ber_strdup(mech) : NULL;
79 defaults->realm = realm ? ber_strdup(realm) : NULL;
80 defaults->authcid = authcid ? ber_strdup(authcid) : NULL;
81 defaults->passwd = passwd ? ber_strdup(passwd) : NULL;
82 defaults->authzid = authzid ? ber_strdup(authzid) : NULL;
84 if( defaults->mech == NULL ) {
85 ldap_get_option( ld, LDAP_OPT_X_SASL_MECH, &defaults->mech );
87 if( defaults->realm == NULL ) {
88 ldap_get_option( ld, LDAP_OPT_X_SASL_REALM, &defaults->realm );
90 if( defaults->authcid == NULL ) {
91 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHCID, &defaults->authcid );
93 if( defaults->authzid == NULL ) {
94 ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid );
96 defaults->resps = NULL;
102 static int interaction(
104 sasl_interact_t *interact,
105 lutilSASLdefaults *defaults )
107 const char *dflt = interact->defresult;
113 switch( interact->id ) {
114 case SASL_CB_GETREALM:
115 if( defaults ) dflt = defaults->realm;
117 case SASL_CB_AUTHNAME:
118 if( defaults ) dflt = defaults->authcid;
121 if( defaults ) dflt = defaults->passwd;
125 if( defaults ) dflt = defaults->authzid;
127 case SASL_CB_NOECHOPROMPT:
131 case SASL_CB_ECHOPROMPT:
136 if( dflt && !*dflt ) dflt = NULL;
138 if( flags != LDAP_SASL_INTERACTIVE &&
139 ( dflt || interact->id == SASL_CB_USER ) )
144 if( flags == LDAP_SASL_QUIET ) {
150 if( interact->challenge ) {
151 fprintf( stderr, _("Challenge: %s\n"), interact->challenge );
156 fprintf( stderr, _("Default: %s\n"), dflt );
159 snprintf( input, sizeof input, "%s: ",
160 interact->prompt ? interact->prompt : _("Interact") );
163 interact->result = (char *) getpassphrase( input );
164 interact->len = interact->result
165 ? strlen( interact->result ) : 0;
169 fputs( input, stderr );
172 interact->result = fgets( input, sizeof(input), stdin );
174 if( interact->result == NULL ) {
176 return LDAP_UNAVAILABLE;
180 interact->len = strlen(input);
182 if( interact->len > 0 && input[interact->len - 1] == '\n' ) {
183 /* input includes '\n', trim it */
185 input[interact->len] = '\0';
190 if( interact->len > 0 ) {
192 char *p = (char *)interact->result;
193 ldap_charray_add(&defaults->resps, interact->result);
194 interact->result = defaults->resps[defaults->nresps++];
197 memset( p, '\0', interact->len );
201 /* input must be empty */
202 interact->result = (dflt && *dflt) ? dflt : "";
203 interact->len = strlen( interact->result );
209 int lutil_sasl_interact(
215 sasl_interact_t *interact = in;
217 if( ld == NULL ) return LDAP_PARAM_ERROR;
219 if( flags == LDAP_SASL_INTERACTIVE ) {
220 fputs( _("SASL Interaction\n"), stderr );
223 while( interact->id != SASL_CB_LIST_END ) {
224 int rc = interaction( flags, interact, defaults );