[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: supporting range retrieval (ITS#3193)



--19701020
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: inline


Comments noted, I'll keep it as a private patch (see attached FYI).

Note that in our implementation we don't actually impose any limits
on number of values returned - I agree that imposing an "optional"
extension on clients is bad.

However, we need to deal with clients, such as the Active Directory
Users & Computers snap-in, that request "member;range=0-*" instead
of just "member".

So, our implementation (which only works on linked attributes; it is
implemented within the LinkEngine presented at ODD Wien) will honor
client requests for a specific range but not return a range option
if the client did not ask for it.

-- Luke


--19701020
Content-Type: text/plain; name="2.2.14.diff"; x-unix-mode=0644
Content-Disposition: attachment; filename="2.2.14.diff"

Index: servers/slapd/ad.c
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/ad.c,v
retrieving revision 1.59.2.4
diff -u -r1.59.2.4 ad.c
--- servers/slapd/ad.c	1 Jan 2004 18:16:32 -0000	1.59.2.4
+++ servers/slapd/ad.c	21 Jun 2004 13:30:14 -0000
@@ -33,11 +33,13 @@
 	int           prefix;	/* NAME is a tag and range prefix */
 } Attr_option;
 
-static Attr_option lang_option = { { sizeof("lang-")-1, "lang-" }, 1 };
-
 /* Options sorted by name, and number of options */
-static Attr_option *options = &lang_option;
-static int option_count = 1;
+static Attr_option internal_options[] = {
+	{ { sizeof("lang-")-1, "lang-" }, 1 },
+	{ { sizeof("range=")-1, "range=" }, 1 } };
+
+static Attr_option *options = internal_options;
+static int option_count = 2;
 
 static Attr_option *ad_find_option_definition( const char *opt, int optlen );
 
@@ -844,7 +846,7 @@
 	int i;
 	unsigned int optlen;
 
-	if ( options == &lang_option ) {
+	if ( options == internal_options ) {
 		options = NULL;
 		option_count = 0;
 	}
Index: servers/slapd/slap.h
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/slap.h,v
retrieving revision 1.452.2.21
diff -u -r1.452.2.21 slap.h
--- servers/slapd/slap.h	16 Jun 2004 21:53:56 -0000	1.452.2.21
+++ servers/slapd/slap.h	21 Jun 2004 13:30:15 -0000
@@ -151,7 +151,7 @@
 #define ATTR_CHAR(c)	( DESC_CHAR((c)) || (c) == '.' )
 
 #define AD_LEADCHAR(c)	( ATTR_CHAR(c) )
-#define AD_CHAR(c)		( ATTR_CHAR(c) || (c) == ';' )
+#define AD_CHAR(c)		( ATTR_CHAR(c) || (c) == ';' || (c) == '=' || (c) == '*' )
 
 #define SLAP_NUMERIC(c) ( ASCII_DIGIT(c) || ASCII_SPACE(c) )
 
Index: servers/slapd/slapi/slapi_utils.c
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/slapi/slapi_utils.c,v
retrieving revision 1.86.2.12
diff -u -r1.86.2.12 slapi_utils.c
--- servers/slapd/slapi/slapi_utils.c	16 Jun 2004 22:45:33 -0000	1.86.2.12
+++ servers/slapd/slapi/slapi_utils.c	21 Jun 2004 13:30:17 -0000
@@ -3584,7 +3584,7 @@
 		return 1;
 	}
 
-	if ( !c->cac_attrsonly ) {
+	if ( !c->cac_attrsonly && a->a_vals != NULL ) {
 		for ( i = 0; a->a_vals[i].bv_val != NULL; i++ ) {
 			if ( !access_allowed( op, e,
 				desc, &a->a_vals[i], ACL_READ, &c->cac_acl_state)) {

--19701020--