]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_utils.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / servers / slapd / slapi / slapi_utils.c
index f676e5402dba970b98a91dfbd8dda3df69fc757d..763f30ea05c03a7820a850ea8fcbccb1e8187de6 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2002-2007 The OpenLDAP Foundation.
+ * Copyright 2002-2013 The OpenLDAP Foundation.
  * Portions Copyright 1997,2002-2003 IBM Corporation.
  * All rights reserved.
  *
@@ -26,6 +26,7 @@
 #include <ac/stdarg.h>
 #include <ac/ctype.h>
 #include <ac/unistd.h>
+#include <lutil.h>
 
 #include <slap.h>
 #include <slapi.h>
@@ -52,7 +53,7 @@ struct slapi_condvar {
 
 static int checkBVString(const struct berval *bv)
 {
-       int i;
+       ber_len_t i;
 
        for ( i = 0; i < bv->bv_len; i++ ) {
                if ( bv->bv_val[i] == '\0' )
@@ -72,7 +73,8 @@ static int checkBVString(const struct berval *bv)
 int
 bvptr2obj(
        struct berval   **bvptr, 
-       BerVarray       *bvobj )
+       BerVarray       *bvobj,
+       unsigned *num )
 {
        int             rc = LDAP_SUCCESS;
        int             i;
@@ -85,6 +87,8 @@ bvptr2obj(
        for ( i = 0; bvptr != NULL && bvptr[i] != NULL; i++ ) {
                ; /* EMPTY */
        }
+       if ( num )
+               *num = i;
 
        tmpberval = (BerVarray)slapi_ch_malloc( (i + 1)*sizeof(struct berval));
        if ( tmpberval == NULL ) {
@@ -231,12 +235,12 @@ slapi_entry_attr_merge(
                return -1;
        }
        
-       rc = bvptr2obj( vals, &bv );
+       rc = bvptr2obj( vals, &bv, NULL );
        if ( rc != LDAP_SUCCESS ) {
                return -1;
        }
        
-       rc = attr_merge_normalize_one( e, ad, bv, NULL );
+       rc = attr_merge_normalize( e, ad, bv, NULL );
        ch_free( bv );
 
        return rc;
@@ -471,21 +475,30 @@ int
 slapi_entry_has_children( const Slapi_Entry *e )
 {
        Slapi_PBlock *pb;
-       int hasSubordinates = 0;
+       Backend *be = select_backend( (struct berval *)&e->e_nname, 0 );
+       int rc, hasSubordinates = 0;
+
+       if ( be == NULL || be->be_has_subordinates == 0 ) {
+               return 0;
+       }
 
        pb = slapi_pblock_new();
+       if ( pb == NULL ) {
+               return 0;
+       }
        slapi_int_connection_init_pb( pb, LDAP_REQ_SEARCH );
 
-       slapi_pblock_set( pb, SLAPI_TARGET_DN, slapi_entry_get_dn( (Entry *)e ) );
-
-       pb->pb_op->o_bd = select_backend( (struct berval *)&e->e_nname, 0 );
-       if ( pb->pb_op->o_bd != NULL ) {
-               pb->pb_op->o_bd->be_has_subordinates( pb->pb_op, (Entry *)e, &hasSubordinates );
+       rc = slapi_pblock_set( pb, SLAPI_TARGET_DN, slapi_entry_get_dn(
+               (Entry *) e ));
+       if ( rc == LDAP_SUCCESS ) {
+               pb->pb_op->o_bd = be;
+               rc = be->be_has_subordinates( pb->pb_op, (Entry *) e,
+                       &hasSubordinates );
        }
 
        slapi_pblock_destroy( pb );
 
-       return ( hasSubordinates == LDAP_COMPARE_TRUE );
+       return ( rc == LDAP_SUCCESS && hasSubordinates == LDAP_COMPARE_TRUE );
 }
 
 /*
@@ -545,9 +558,10 @@ slapi_entry_add_values( Slapi_Entry *e, const char *type, struct berval **vals )
                 * FIXME: sm_values = NULL ? */
                mod.sm_values = (BerVarray)ch_malloc( sizeof(struct berval) );
                mod.sm_values->bv_val = NULL;
+               mod.sm_numvals = 0;
 
        } else {
-               rc = bvptr2obj( vals, &mod.sm_values );
+               rc = bvptr2obj( vals, &mod.sm_values, &mod.sm_numvals );
                if ( rc != LDAP_SUCCESS ) {
                        return LDAP_CONSTRAINT_VIOLATION;
                }
@@ -611,7 +625,7 @@ slapi_entry_delete_values( Slapi_Entry *e, const char *type, struct berval **val
                return attr_delete( &e->e_attrs, mod.sm_desc ) ? LDAP_OTHER : LDAP_SUCCESS;
        }
 
-       rc = bvptr2obj( vals, &mod.sm_values );
+       rc = bvptr2obj( vals, &mod.sm_values, &mod.sm_numvals );
        if ( rc != LDAP_SUCCESS ) {
                return LDAP_CONSTRAINT_VIOLATION;
        }
@@ -730,7 +744,7 @@ slapi_entry_attr_replace_sv( Slapi_Entry *e, const char *type, Slapi_Value **val
 
        attr_delete( &e->e_attrs, ad );
 
-       rc = bvptr2obj( vals, &bv );
+       rc = bvptr2obj( vals, &bv, NULL );
        if ( rc != LDAP_SUCCESS ) {
                return -1;
        }
@@ -1350,7 +1364,7 @@ slapi_send_ldap_result(
                if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
                        rs->sr_nentries = nentries;
                if ( urls != NULL )
-                       bvptr2obj( urls, &rs->sr_ref );
+                       bvptr2obj( urls, &rs->sr_ref, NULL );
 
                send_ldap_result( pb->pb_op, rs );
 
@@ -1429,7 +1443,7 @@ slapi_send_ldap_search_reference(
        rs.sr_matched = NULL;
        rs.sr_text = NULL;
 
-       rc = bvptr2obj( references, &rs.sr_ref );
+       rc = bvptr2obj( references, &rs.sr_ref, NULL );
        if ( rc != LDAP_SUCCESS ) {
                return rc;
        }
@@ -1440,7 +1454,7 @@ slapi_send_ldap_search_reference(
        rs.sr_entry = e;
 
        if ( v2refs != NULL ) {
-               rc = bvptr2obj( v2refs, &rs.sr_v2ref );
+               rc = bvptr2obj( v2refs, &rs.sr_v2ref, NULL );
                if ( rc != LDAP_SUCCESS ) {
                        slapi_ch_free( (void **)&rs.sr_ref );
                        return rc;
@@ -1816,12 +1830,55 @@ slapi_pw_find(
        struct berval   **vals, 
        struct berval   *v ) 
 {
-       /*
-        * FIXME: what's the point?
-        */
+       int i;
+
+       if( ( vals == NULL ) || ( v == NULL ) )
+               return 1;
+
+       for ( i = 0; vals[i] != NULL; i++ ) {
+               if ( !lutil_passwd( vals[i], v, NULL, NULL ) )
+                       return 0;
+       }
+
        return 1;
 }
 
+/* Get connected client IP address.
+ *
+ * The user must free the returned client IP after its use.
+ * Compatible with IBM Tivoli call.
+ *
+ * Errors:
+ * * LDAP_PARAM_ERROR - If the pb parameter is null.
+ * * LDAP_OPERATIONS_ERROR - If the API encounters error processing the request.
+ * * LDAP_NO_MEMORY - Failed to allocate required memory.
+ */
+int
+slapi_get_client_ip(Slapi_PBlock *pb, char **clientIP)
+{
+       char *s = NULL;
+
+       if(pb == NULL || pb->pb_conn == NULL) return(LDAP_PARAM_ERROR);
+       if((s = (char *) slapi_ch_malloc(pb->pb_conn->c_peer_name.bv_len + 1)) == NULL) {
+               return(LDAP_NO_MEMORY);
+       }
+
+       memcpy(s, pb->pb_conn->c_peer_name.bv_val, pb->pb_conn->c_peer_name.bv_len);
+
+       s[pb->pb_conn->c_peer_name.bv_len] = 0;
+
+       *clientIP = s;
+
+       return(LDAP_SUCCESS);
+}
+
+/* Free previously allocated client IP address. */
+void
+slapi_free_client_ip(char **clientIP)
+{
+       slapi_ch_free((void **) clientIP);
+}
+
 #define MAX_HOSTNAME 512
 
 char *
@@ -2087,12 +2144,7 @@ int slapi_attr_add_value( Slapi_Attr *a, const Slapi_Value *v )
                nvalp = NULL;
        }
 
-       rc = value_add_one( &a->a_vals, (Slapi_Value *)v );
-       if ( rc == 0 && nvalp != NULL ) {
-               rc = value_add_one( &a->a_nvals, nvalp );
-       } else {
-               a->a_nvals = a->a_vals;
-       }
+       rc = attr_valadd( a, (Slapi_Value *)v, nvalp, 1 );
 
        if ( nvalp != NULL ) {
                slapi_ch_free_string( &nval.bv_val );
@@ -2148,28 +2200,14 @@ int slapi_attr_value_cmp( const Slapi_Attr *a, const struct berval *v1, const st
 
 int slapi_attr_value_find( const Slapi_Attr *a, struct berval *v )
 {
-       MatchingRule *mr;
-       struct berval *bv;
-       int j;
-       const char *text;
        int rc;
-       int ret;
 
        if ( a ->a_vals == NULL ) {
                return -1;
        }
-       mr = a->a_desc->ad_type->sat_equality;
-       for ( bv = a->a_vals, j = 0; bv->bv_val != NULL; bv++, j++ ) {
-               rc = value_match( &ret, a->a_desc, mr,
-                       SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, bv, v, &text );
-               if ( rc != LDAP_SUCCESS ) {
-                       return -1;
-               }
-               if ( ret == 0 ) {
-                       return 0;
-               }
-       }
-       return -1;
+       rc = attr_valfind( (Attribute *)a, SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, v,
+               NULL, NULL );
+       return rc == 0 ? 0 : -1;
 }
 
 int slapi_attr_type_cmp( const char *t1, const char *t2, int opt )
@@ -3119,7 +3157,7 @@ int slapi_entry_schema_check( Slapi_PBlock *pb, Slapi_Entry *e )
 
        pb->pb_op->o_bd = select_backend( &e->e_nname, 0 );
        if ( pb->pb_op->o_bd != NULL ) {
-               rc = entry_schema_check( pb->pb_op, e, NULL, 0, 0,
+               rc = entry_schema_check( pb->pb_op, e, NULL, 0, 0, NULL,
                        &text, textbuf, textlen );
        }
        pb->pb_op->o_bd = be_orig;
@@ -3225,21 +3263,27 @@ LDAP *slapi_ldap_init( char *ldaphost, int ldapport, int secure, int shared )
        int rc;
 
        size = sizeof("ldap:///");
-       if ( secure )
+       if ( secure ) {
                size++;
+       }
        size += strlen( ldaphost );
-       if ( ldapport != 0 )
+       if ( ldapport != 0 ) {
                size += 32;
+       }
 
        url = slapi_ch_malloc( size );
 
        if ( ldapport != 0 ) {
-               sprintf( url, "ldap%s://%s:%d/", ( secure ? "s" : "" ), ldaphost, ldapport );
+               rc = snprintf( url, size, "ldap%s://%s:%d/", ( secure ? "s" : "" ), ldaphost, ldapport );
        } else {
-               sprintf( url, "ldap%s://%s/", ( secure ? "s" : "" ), ldaphost );
+               rc = snprintf( url, size, "ldap%s://%s/", ( secure ? "s" : "" ), ldaphost );
        }
 
-       rc = ldap_initialize( &ld, url );
+       if ( rc > 0 && (size_t) rc < size ) {
+               rc = ldap_initialize( &ld, url );
+       } else {
+               ld = NULL;
+       }
 
        slapi_ch_free_string( &url );