2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 1999-2003 The OpenLDAP Foundation.
5 * Portions Copyright 2003 IBM Corporation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
17 * This work was initially developed by the Apurva Kumar for inclusion
18 * in OpenLDAP Software.
25 #include <ac/socket.h>
26 #include <ac/string.h>
30 #include "../back-ldap/back-ldap.h"
31 #include "back-meta.h"
33 #undef ldap_debug /* silence a warning in ldap-int.h */
35 #include "../../../libraries/libldap/ldap-int.h"
38 #include "back-meta.h"
40 static char* invert_string(char* string);
41 static struct berval* merge_init_final(struct berval*, struct berval*, struct berval*);
42 static int strings_containment(struct berval* stored, struct berval* incoming);
44 /* find and remove string2 from string1
45 * from start if position = 1,
46 * from end if position = 3,
47 * from anywhere if position = 2
51 find_and_remove(struct berval* ber1, struct berval* ber2, int position)
58 char* string1=ber1->bv_val;
59 char* string2=ber2->bv_val;
67 arg1 = invert_string(string1);
68 arg2 = invert_string(string2);
74 temp = strstr(arg1, arg2);
94 temp = strstr(arg1, arg2);
98 string1 = invert_string(arg1+len);
109 temp = (char*) malloc( strlen( string1 ) + 1 );
110 strcpy( temp, string1 );
111 free( ber1->bv_val );
117 invert_string( char* string )
119 int len = strlen(string);
122 char* inverted = (char*)(malloc(len+1));
124 for (i=0; i<len; i++)
125 inverted[i] = string[len-i-1];
133 merge_init_final(struct berval* init, struct berval* any, struct berval* final)
135 struct berval* merged, *temp;
136 int i, any_count, count;
138 for (any_count=0; any && any[any_count].bv_val; any_count++)
148 merged = (struct berval*)(malloc((count+1)*sizeof(struct berval)));
152 ber_dupbv(temp, init);
156 for (i=0; i<any_count; i++) {
157 ber_dupbv(temp, any);
163 ber_dupbv(temp, final);
172 strings_containment(struct berval* stored, struct berval* incoming)
174 struct berval* element;
178 for ( element=stored; element->bv_val != NULL; element++ ) {
179 for (j = k; incoming[j].bv_val != NULL; j++) {
180 if (find_and_remove(&(incoming[j]), element, 2)) {
197 substr_containment_substr(Filter* stored, Filter* incoming)
204 struct berval* init_incoming = (struct berval*)(malloc(sizeof(struct berval)));
205 struct berval* final_incoming = (struct berval*)(malloc(sizeof(struct berval)));
206 struct berval* any_incoming = NULL;
207 struct berval* remaining_incoming;
208 struct berval* any_element;
210 if ((!(incoming->f_sub_initial.bv_val) && (stored->f_sub_initial.bv_val))
211 || (!(incoming->f_sub_final.bv_val) && (stored->f_sub_final.bv_val)))
215 ber_dupbv(init_incoming, &(incoming->f_sub_initial));
216 ber_dupbv(final_incoming, &(incoming->f_sub_final));
218 if (incoming->f_sub_any) {
219 for ( any_count=0; incoming->f_sub_any[any_count].bv_val != NULL;
223 any_incoming = (struct berval*)malloc((any_count+1) *
224 sizeof(struct berval));
226 for (i=0; i<any_count; i++) {
227 ber_dupbv(&(any_incoming[i]), &(incoming->f_sub_any[i]));
229 any_incoming[any_count].bv_val = NULL;
230 any_incoming[any_count].bv_len = 0;
233 if (find_and_remove(init_incoming,
234 &(stored->f_sub_initial), 1) && find_and_remove(final_incoming,
235 &(stored->f_sub_final), 3))
237 if (stored->f_sub_any == NULL) {
241 remaining_incoming = merge_init_final(init_incoming,
242 any_incoming, final_incoming);
243 rc = strings_containment(stored->f_sub_any, remaining_incoming);
249 ber_bvfree(init_incoming);
250 ber_bvfree(final_incoming);
252 for (i=0; i < any_count; i++)
253 free(any_incoming[i].bv_val);
262 substr_containment_equality(Filter* stored, Filter* incoming)
265 struct berval* incoming_val = (struct berval*)(malloc(2*sizeof(struct berval)));
268 ber_dupbv(incoming_val, &(incoming->f_av_value));
269 incoming_val[1].bv_val = NULL;
270 incoming_val[1].bv_len = 0;
272 if (find_and_remove(incoming_val,
273 &(stored->f_sub_initial), 1) && find_and_remove(incoming_val,
274 &(stored->f_sub_final), 3)) {
275 if (stored->f_sub_any == NULL){
279 rc = strings_containment(stored->f_sub_any, incoming_val);
285 if(incoming_val[0].bv_val)
286 free(incoming_val[0].bv_val);