Discussion:
Problemas con libldap
(demasiado antiguo para responder)
Trauma
2005-10-15 22:36:01 UTC
Permalink
Holas

Estoy tonteando con libldap, y estoy atascado en la función ldap_bind_s
( LDAP, DN, PASS ). Siempre me responde con el error 2, error en
protocolo.

El DN está bién, y desde clientes gráficos no hay ningún problema para
entrar.

He probado con el password tal cual, "Pass", y anteponiendo el
indicador de cifrado, tal y como está en ldap.conf "{CLEARTEXT}Pass".
Ninguna me ha funcionado.

Mi inglés no está muy fuerte, pero, aparentemente, estoy siguiendo al
pié de la letra las instrucciones de las man, y en Google me han
aparecido muchos manuales completos en español de ldap bajo php, pero
nada en C.

¿ Alguna idea sobre donde estoy metiendo la pata ?

Gracias por adelantado.
Claudio
2005-10-15 23:53:03 UTC
Permalink
Post by Trauma
Holas
Estoy tonteando con libldap, y estoy atascado en la función ldap_bind_s
¿ Alguna idea sobre donde estoy metiendo la pata ?
Pues sin código es dificil. Muy dificil. No solo hay que saber C, hay
que saber ldap y ser adivino. Te cuento, a mi me funciona esto:

$ cat ml.c
#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>

main()
{
LDAP *p;
int i;
p = ldap_init("localhost",389);
if (p== NULL) { exit((int)3);};
i = ldap_bind_s(p,"cn=micommonname,dc=midominio,dc=tld","lapassquemeinvente",LDAP_AUTH_SIMPLE);
if (i!=LDAP_SUCCESS) ldap_perror(p,"ldap");
else puts("lo hice, lo hice!\n");
}
$ ./ml
lo hice, lo hice!
Post by Trauma
Gracias por adelantado.
Ya, gracias, gracias... con eso crees que lo arreglas todo... que sepas
que por haberlo puesto tan dificil, si te vale te cobraré el doble de lo
que es costumbre por estos lares.

Un saludo.
--claduio--
Trauma
2005-10-16 09:39:16 UTC
Permalink
Post by Claudio
Post by Trauma
Holas
Estoy tonteando con libldap, y estoy atascado en la función ldap_bind_s
¿ Alguna idea sobre donde estoy metiendo la pata ?
Pues sin código es dificil. Muy dificil. No solo hay que saber C, hay
Tienes razón. Sin el código es dificil, pero es que es para gestionar
autorizaciones de un programa externo, y hay que seguir sus
convenciones para el paso de argumentos a través de la entrada
estandar, por lo que está lleno de operaciones con cadenas, y la
llamada a ldap_bind no es tan directa. No obstante, ha sido comprobado
justo hasta la llamada, que se realizaba con los argumentos correctos.
Post by Claudio
$ cat ml.c
#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>
main()
{
LDAP *p;
int i;
p = ldap_init("localhost",389);
if (p== NULL) { exit((int)3);};
i = ldap_bind_s(p,"cn=micommonname,dc=midominio,dc=tld","lapassquemeinvente",LDAP_AUTH_SIMPLE);
if (i!=LDAP_SUCCESS) ldap_perror(p,"ldap");
else puts("lo hice, lo hice!\n");
}
No va. Me dice que estoy usando la versión 2 del protocolo, y me pide
la 3.

Mirando en el código fuente de libldap, he encontrado la forma, aunque
aparentemente no está documentada ( al menos en Debian Sarge ). Hay que
forzar la versión 3 del protocolo después de la llamada a ldap_init, y
antes de realizar el bind.

El código quedaría así:

#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>

main( ) {
LDAP *p;
int i;
int v = LDAP_VERSION_MAX;

if( ( p = ldap_init( "localhost", 389 ) ) == NULL ) exit( 3 );

if( ldap_set_option( p, LDAP_OPT_PROTOCOL_VERSION, &version ) !=
LDAP_OPT_SUCCESS )
exit( 3 );

i = ldap_bind_s( p,
"cn=micommonname,dc=midominio,dc=tld",
"lapassquemeinvente",
LDAP_AUTH_SIMPLE );

if( i != LDAP_SUCCESS )
ldap_perror( p, "ldap" );
else
puts( "lo hice, lo hice! \n" );
}

Esto no realiza ninguna comprobación de las versiones soportadas por el
servidor. Tan solo utiliza la máxima con soporte en libldap. De
momento, y para lo que yo lo utilizaré, servirá.

Bueno, muchas gracias. Ya volveré si me surge algo más.

Enga, nos leemos.
Zephryn Xirdal
2005-10-16 10:16:03 UTC
Permalink
Oye, quillo, ¿dónde está tu clave pgp, que no me sale por ningún lado?
Post by Trauma
Post by Claudio
Post by Trauma
Holas
Estoy tonteando con libldap, y estoy atascado en la función ldap_bind_s
¿ Alguna idea sobre donde estoy metiendo la pata ?
Pues sin código es dificil. Muy dificil. No solo hay que saber C, hay
Tienes razón. Sin el código es dificil, pero es que es para gestionar
autorizaciones de un programa externo, y hay que seguir sus
convenciones para el paso de argumentos a través de la entrada
estandar, por lo que está lleno de operaciones con cadenas, y la
llamada a ldap_bind no es tan directa. No obstante, ha sido comprobado
justo hasta la llamada, que se realizaba con los argumentos correctos.
Post by Claudio
$ cat ml.c
#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>
main()
{
LDAP *p;
int i;
p = ldap_init("localhost",389);
if (p== NULL) { exit((int)3);};
i = ldap_bind_s(p,"cn=micommonname,dc=midominio,dc=tld","lapassquemeinvente",LDAP_AUTH_SIMPLE);
if (i!=LDAP_SUCCESS) ldap_perror(p,"ldap");
else puts("lo hice, lo hice!\n");
}
No va. Me dice que estoy usando la versión 2 del protocolo, y me pide
la 3.
Mirando en el código fuente de libldap, he encontrado la forma, aunque
aparentemente no está documentada ( al menos en Debian Sarge ). Hay que
forzar la versión 3 del protocolo después de la llamada a ldap_init, y
antes de realizar el bind.
#include <stdio.h>
#include <stdlib.h>
#include <ldap.h>
main( ) {
LDAP *p;
int i;
int v = LDAP_VERSION_MAX;
if( ( p = ldap_init( "localhost", 389 ) ) == NULL ) exit( 3 );
if( ldap_set_option( p, LDAP_OPT_PROTOCOL_VERSION, &version ) !=
LDAP_OPT_SUCCESS )
exit( 3 );
i = ldap_bind_s( p,
"cn=micommonname,dc=midominio,dc=tld",
"lapassquemeinvente",
LDAP_AUTH_SIMPLE );
if( i != LDAP_SUCCESS )
ldap_perror( p, "ldap" );
else
puts( "lo hice, lo hice! \n" );
}
Esto no realiza ninguna comprobación de las versiones soportadas por el
servidor. Tan solo utiliza la máxima con soporte en libldap. De
momento, y para lo que yo lo utilizaré, servirá.
Bueno, muchas gracias. Ya volveré si me surge algo más.
Enga, nos leemos.
Loading...