X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fsasl.c;h=50b5a29ddcfeae2b07c69e601e13cf1648702d5a;hb=10595e7e5877b224077ae388913f96dbf26e9138;hp=725daa7f35ab6f50371d610fce7045c3af82ea1e;hpb=0e2af54a3ffdeebe3901370683be56fcc53023b0;p=openldap diff --git a/libraries/liblutil/sasl.c b/libraries/liblutil/sasl.c index 725daa7f35..50b5a29ddc 100644 --- a/libraries/liblutil/sasl.c +++ b/libraries/liblutil/sasl.c @@ -1,7 +1,16 @@ /* $OpenLDAP$ */ -/* - * Copyright 2000-2002 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2007 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -13,9 +22,14 @@ #include #include +#ifdef HAVE_SASL_SASL_H +#include +#else #include +#endif #include +#include "ldap_pvt.h" #include "lutil_ldap.h" @@ -25,9 +39,29 @@ typedef struct lutil_sasl_defaults_s { char *authcid; char *passwd; char *authzid; + char **resps; + int nresps; } lutilSASLdefaults; +void +lutil_sasl_freedefs( + void *defaults ) +{ + lutilSASLdefaults *defs = defaults; + + assert( defs != NULL ); + + if (defs->mech) ber_memfree(defs->mech); + if (defs->realm) ber_memfree(defs->realm); + if (defs->authcid) ber_memfree(defs->authcid); + if (defs->passwd) ber_memfree(defs->passwd); + if (defs->authzid) ber_memfree(defs->authzid); + if (defs->resps) ldap_charray_free(defs->resps); + + ber_memfree(defs); +} + void * lutil_sasl_defaults( LDAP *ld, @@ -43,11 +77,11 @@ lutil_sasl_defaults( if( defaults == NULL ) return NULL; - defaults->mech = mech; - defaults->realm = realm; - defaults->authcid = authcid; - defaults->passwd = passwd; - defaults->authzid = authzid; + defaults->mech = mech ? ber_strdup(mech) : NULL; + defaults->realm = realm ? ber_strdup(realm) : NULL; + defaults->authcid = authcid ? ber_strdup(authcid) : NULL; + defaults->passwd = passwd ? ber_strdup(passwd) : NULL; + defaults->authzid = authzid ? ber_strdup(authzid) : NULL; if( defaults->mech == NULL ) { ldap_get_option( ld, LDAP_OPT_X_SASL_MECH, &defaults->mech ); @@ -61,6 +95,8 @@ lutil_sasl_defaults( if( defaults->authzid == NULL ) { ldap_get_option( ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid ); } + defaults->resps = NULL; + defaults->nresps = 0; return defaults; } @@ -114,16 +150,16 @@ static int interaction( if( challenge ) { if( interact->challenge ) { - fprintf( stderr, "Challenge: %s\n", interact->challenge ); + fprintf( stderr, _("Challenge: %s\n"), interact->challenge ); } } if( dflt ) { - fprintf( stderr, "Default: %s\n", dflt ); + fprintf( stderr, _("Default: %s\n"), dflt ); } - sprintf( input, "%s: ", - interact->prompt ? interact->prompt : "Interact" ); + snprintf( input, sizeof input, "%s: ", + interact->prompt ? interact->prompt : _("Interact") ); if( noecho ) { interact->result = (char *) getpassphrase( input ); @@ -155,8 +191,9 @@ static int interaction( if( interact->len > 0 ) { /* duplicate */ - char *p = interact->result; - interact->result = strdup( p ); + char *p = (char *)interact->result; + ldap_charray_add(&defaults->resps, interact->result); + interact->result = defaults->resps[defaults->nresps++]; /* zap */ memset( p, '\0', interact->len ); @@ -164,15 +201,8 @@ static int interaction( } else { use_default: /* input must be empty */ - interact->result = strdup( (dflt && *dflt) ? dflt : "" ); - interact->len = interact->result - ? strlen( interact->result ) : 0; - } - - if( defaults && defaults->passwd && interact->id == SASL_CB_PASS ) { - /* zap password after first use */ - memset( defaults->passwd, '\0', strlen(defaults->passwd) ); - defaults->passwd = NULL; + interact->result = (dflt && *dflt) ? dflt : ""; + interact->len = strlen( interact->result ); } return LDAP_SUCCESS; @@ -186,8 +216,10 @@ int lutil_sasl_interact( { sasl_interact_t *interact = in; + if( ld == NULL ) return LDAP_PARAM_ERROR; + if( flags == LDAP_SASL_INTERACTIVE ) { - fputs( "SASL Interaction\n", stderr ); + fputs( _("SASL Interaction\n"), stderr ); } while( interact->id != SASL_CB_LIST_END ) {