[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
SASL couldn't get local IP address (ITS#620)
Full_Name: Mark Adamson
Version: DEV Beta
OS: Solaris 2.7
URL: http://nil.andrew.cmu.edu/ldap/sasl_setip.gdiff
Submission from: (NULL) (128.2.122.223)
I'm running the BETA version of OpenLDAP, downloaded July 7th. I was
testing the SASL authentication implementation, using the KERBEROS_V4
mechanism. I was getting the following message from client programs:
ldap_negotiated_sasl_bind_s: Unknown error
additional info: couldn't get local IP address
I found that the server was returning this message to the client because
the sasl_bind() call was not setting the IP address properties using
sasl_setprop().
Appended to this message is a patch to servers/slapd/sasl.c that will set
the properties SASL_IP_LOCAL and SASL_IP_REMOTE when the new bind
connection context is being initialized.
-Mark Adamson
Carnegie Mellon
*** .old/sasl.c Thu Jul 6 11:13:01 2000
--- sasl.c Mon Jul 10 14:07:48 2000
***************
*** 93,100 ****
--- 93,103 ----
int sasl_init( void )
{
+ char hebuf[256];
int rc;
char *mechs;
+ struct hostent he;
+ struct sockaddr_in sin;
sasl_conn_t *server = NULL;
sasl_set_alloc( ch_malloc, ch_calloc, ch_realloc, ch_free );
***************
*** 244,249 ****
--- 247,257 ----
} else {
unsigned reslen;
+ char hebuf[256], namebuf[MAXHOSTNAMELEN];
+ int rc, fd;
+ struct hostent he;
+ struct sockaddr_in sin;
+
conn->c_authmech = ch_strdup( mech );
sc = sasl_server_start( conn->c_sasl_bind_context,
***************
*** 257,262 ****
--- 265,287 ----
send_ldap_result( conn, op, rc =
slap_sasl_err2ldap( sc ),
NULL, errstr, NULL, NULL );
}
+
+ gethostname( namebuf, sizeof(namebuf) );
+ namebuf[ sizeof( namebuf ) - 1 ] = '\0';
+ gethostbyname_r( namebuf, &he, hebuf, sizeof(hebuf), &rc
);
+ if (rc == 0) {
+ sin.sin_family = AF_INET;
+ memcpy( &sin.sin_addr.s_addr, he.h_addr_list[0],
4 );
+ sasl_setprop( conn->c_sasl_bind_context,
SASL_IP_LOCAL, &sin );
+ }
+
+ ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &fd
);
+ rc = sizeof( sin );
+ rc = getpeername( fd, (struct sockaddr *)&sin, &rc );
+ if (rc == 0) {
+ sasl_setprop( conn->c_sasl_bind_context,
SASL_IP_REMOTE, &sin );
+ }
+
}
} else {