Home | History | Annotate | Line # | Download | only in libldap
      1 /*	$NetBSD: assertion.c,v 1.4 2025/09/05 21:16:21 christos Exp $	*/
      2 
      3 /* $OpenLDAP$ */
      4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      5  *
      6  * Copyright 1998-2024 The OpenLDAP Foundation.
      7  * All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted only as authorized by the OpenLDAP
     11  * Public License.
     12  *
     13  * A copy of this license is available in the file LICENSE in the
     14  * top-level directory of the distribution or, alternatively, at
     15  * <http://www.OpenLDAP.org/license.html>.
     16  */
     17 
     18 #include <sys/cdefs.h>
     19 __RCSID("$NetBSD: assertion.c,v 1.4 2025/09/05 21:16:21 christos Exp $");
     20 
     21 #include "portable.h"
     22 
     23 #include <stdio.h>
     24 #include <ac/stdlib.h>
     25 #include <ac/string.h>
     26 #include <ac/time.h>
     27 
     28 #include "ldap-int.h"
     29 
     30 int
     31 ldap_create_assertion_control_value(
     32 	LDAP		*ld,
     33 	char		*assertion,
     34 	struct berval	*value )
     35 {
     36 	BerElement		*ber = NULL;
     37 	int			err;
     38 
     39 	ld->ld_errno = LDAP_SUCCESS;
     40 
     41 	if ( assertion == NULL || assertion[ 0 ] == '\0' ) {
     42 		ld->ld_errno = LDAP_PARAM_ERROR;
     43 		return ld->ld_errno;
     44 	}
     45 
     46 	if ( value == NULL ) {
     47 		ld->ld_errno = LDAP_PARAM_ERROR;
     48 		return ld->ld_errno;
     49 	}
     50 
     51 	BER_BVZERO( value );
     52 
     53 	ber = ldap_alloc_ber_with_options( ld );
     54 	if ( ber == NULL ) {
     55 		ld->ld_errno = LDAP_NO_MEMORY;
     56 		return ld->ld_errno;
     57 	}
     58 
     59 	err = ldap_pvt_put_filter( ber, assertion );
     60 	if ( err < 0 ) {
     61 		ld->ld_errno = LDAP_ENCODING_ERROR;
     62 		goto done;
     63 	}
     64 
     65 	err = ber_flatten2( ber, value, 1 );
     66 	if ( err < 0 ) {
     67 		ld->ld_errno = LDAP_NO_MEMORY;
     68 		goto done;
     69 	}
     70 
     71 done:;
     72 	if ( ber != NULL ) {
     73 		ber_free( ber, 1 );
     74 	}
     75 
     76 	return ld->ld_errno;
     77 }
     78 
     79 int
     80 ldap_create_assertion_control(
     81 	LDAP		*ld,
     82 	char		*assertion,
     83 	int		iscritical,
     84 	LDAPControl	**ctrlp )
     85 {
     86 	struct berval	value;
     87 
     88 	if ( ctrlp == NULL ) {
     89 		ld->ld_errno = LDAP_PARAM_ERROR;
     90 		return ld->ld_errno;
     91 	}
     92 
     93 	ld->ld_errno = ldap_create_assertion_control_value( ld,
     94 		assertion, &value );
     95 	if ( ld->ld_errno == LDAP_SUCCESS ) {
     96 		ld->ld_errno = ldap_control_create( LDAP_CONTROL_ASSERT,
     97 			iscritical, &value, 0, ctrlp );
     98 		if ( ld->ld_errno != LDAP_SUCCESS ) {
     99 			LDAP_FREE( value.bv_val );
    100 		}
    101 	}
    102 
    103 	return ld->ld_errno;
    104 }
    105 
    106