static int put_simple_filter( BerElement *ber, char *str ) { char *s; char *value, savechar; unsigned long ftype; int rc; Debug( LDAP_DEBUG_TRACE, "put_simple_filter \"%s\"\n", str, 0, 0 ); if ( (s = strchr( str, '=' )) == NULL ) return( -1 ); value = s + 1; *s-- = '\0'; savechar = *s; switch ( *s ) { case '<': ftype = LDAP_FILTER_LE; *s = '\0'; break; case '>': ftype = LDAP_FILTER_GE; *s = '\0'; break; case '~': ftype = LDAP_FILTER_APPROX; *s = '\0'; break; default: if ( strchr( value, '*' ) == NULL ) { ftype = LDAP_FILTER_EQUALITY; } else if ( strcmp( value, "*" ) == 0 ) { ftype = LDAP_FILTER_PRESENT; } else { rc = put_substring_filter( ber, str, value ); *(value-1) = '='; return( rc ); } break; } if ( ftype == LDAP_FILTER_PRESENT ) { rc = ber_printf( ber, "ts", ftype, str ); } else { rc = ber_printf( ber, "t{ss}", ftype, str, value ); } *s = savechar; *(value-1) = '='; return( rc == -1 ? rc : 0 ); }
static int put_simple_vrFilter( BerElement *ber, char *str ) { char *s; char *value; ber_tag_t ftype; int rc = -1; Debug( LDAP_DEBUG_TRACE, "put_simple_vrFilter: \"%s\"\n", str, 0, 0 ); str = LDAP_STRDUP( str ); if( str == NULL ) return -1; if ( (s = strchr( str, '=' )) == NULL ) { goto done; } value = s + 1; *s-- = '\0'; switch ( *s ) { case '<': ftype = LDAP_FILTER_LE; *s = '\0'; break; case '>': ftype = LDAP_FILTER_GE; *s = '\0'; break; case '~': ftype = LDAP_FILTER_APPROX; *s = '\0'; break; case ':': /* According to ValuesReturnFilter control definition * extensible filters are off the form: * type [:rule] := value * or :rule := value */ ftype = LDAP_FILTER_EXT; *s = '\0'; { char *rule = strchr( str, ':' ); if( rule == NULL ) { /* must have attribute */ if( !ldap_is_desc( str ) ) { goto done; } rule = ""; } else { *rule++ = '\0'; } if ( *str == '\0' && ( !rule || *rule == '\0' ) ) { /* must have either type or rule */ goto done; } if ( *str != '\0' && !ldap_is_desc( str ) ) { goto done; } if ( rule && *rule != '\0' && !ldap_is_oid( rule ) ) { goto done; } rc = ber_printf( ber, "t{" /*"}"*/, ftype ); if( rc != -1 && rule && *rule != '\0' ) { rc = ber_printf( ber, "ts", LDAP_FILTER_EXT_OID, rule ); } if( rc != -1 && *str != '\0' ) { rc = ber_printf( ber, "ts", LDAP_FILTER_EXT_TYPE, str ); } if( rc != -1 ) { ber_slen_t len = ldap_pvt_filter_value_unescape( value ); if( len >= 0 ) { rc = ber_printf( ber, "to", LDAP_FILTER_EXT_VALUE, value, len ); } else { rc = -1; } } if( rc != -1 ) { rc = ber_printf( ber, /*"{"*/ "N}" ); } } goto done; default: if( !ldap_is_desc( str ) ) { goto done; } else { char *nextstar = ldap_pvt_find_wildcard( value ); if ( nextstar == NULL ) { goto done; } else if ( *nextstar == '\0' ) { ftype = LDAP_FILTER_EQUALITY; } else if ( strcmp( value, "*" ) == 0 ) { ftype = LDAP_FILTER_PRESENT; } else { rc = put_substring_filter( ber, str, value, nextstar ); goto done; } } break; } if( !ldap_is_desc( str ) ) goto done; if ( ftype == LDAP_FILTER_PRESENT ) { rc = ber_printf( ber, "ts", ftype, str ); } else { ber_slen_t len = ldap_pvt_filter_value_unescape( value ); if( len >= 0 ) { rc = ber_printf( ber, "t{soN}", ftype, str, value, len ); } } done: if( rc != -1 ) rc = 0; LDAP_FREE( str ); return rc; }
static int put_simple_filter( BerElement *ber, char *str ) { char *s, *s2, *s3, filterop; char *value; unsigned long ftype; int rc, len; char *oid; /* for v3 extended filter */ int dnattr; /* for v3 extended filter */ LDAPDebug( LDAP_DEBUG_TRACE, "put_simple_filter \"%s\"\n", str, 0, 0 ); rc = -1; /* pessimistic */ if (( str = nsldapi_strdup( str )) == NULL ) { return( rc ); } if ( (s = strchr( str, '=' )) == NULL ) { goto free_and_return; } value = s + 1; *s-- = '\0'; filterop = *s; if ( filterop == '<' || filterop == '>' || filterop == '~' || filterop == ':' ) { *s = '\0'; } if ( ! is_valid_attr( str ) ) { goto free_and_return; } switch ( filterop ) { case '<': ftype = LDAP_FILTER_LE; break; case '>': ftype = LDAP_FILTER_GE; break; case '~': ftype = LDAP_FILTER_APPROX; break; case ':': /* extended filter - v3 only */ /* * extended filter looks like this: * * [type][':dn'][':'oid]':='value * * where one of type or :oid is required. * */ ftype = LDAP_FILTER_EXTENDED; s2 = s3 = NULL; if ( (s2 = strrchr( str, ':' )) == NULL ) { goto free_and_return; } if ( strcasecmp( s2, ":dn" ) == 0 ) { oid = NULL; dnattr = 1; *s2 = '\0'; } else { oid = s2 + 1; dnattr = 0; *s2 = '\0'; if ( (s3 = strrchr( str, ':' )) != NULL ) { if ( strcasecmp( s3, ":dn" ) == 0 ) { dnattr = 1; } else { goto free_and_return; } *s3 = '\0'; } } if ( (rc = ber_printf( ber, "t{", ftype )) == -1 ) { goto free_and_return; } if ( oid != NULL ) { if ( (rc = ber_printf( ber, "ts", LDAP_TAG_MRA_OID, oid )) == -1 ) { goto free_and_return; } } if ( *str != '\0' ) { if ( (rc = ber_printf( ber, "ts", LDAP_TAG_MRA_TYPE, str )) == -1 ) { goto free_and_return; } } if (( len = unescape_filterval( value )) < 0 || ( rc = ber_printf( ber, "totb}", LDAP_TAG_MRA_VALUE, value, len, LDAP_TAG_MRA_DNATTRS, dnattr )) == -1 ) { goto free_and_return; } rc = 0; goto free_and_return; break; default: if ( find_star( value ) == NULL ) { ftype = LDAP_FILTER_EQUALITY; } else if ( strcmp( value, "*" ) == 0 ) { ftype = LDAP_FILTER_PRESENT; } else { rc = put_substring_filter( ber, str, value ); goto free_and_return; } break; } if ( ftype == LDAP_FILTER_PRESENT ) { rc = ber_printf( ber, "ts", ftype, str ); } else if (( len = unescape_filterval( value )) >= 0 ) { rc = ber_printf( ber, "t{so}", ftype, str, value, len ); } if ( rc != -1 ) { rc = 0; } free_and_return: NSLDAPI_FREE( str ); return( rc ); }