summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoriko Hosoi <nhosoi@redhat.com>2008-10-31 00:16:02 +0000
committerNoriko Hosoi <nhosoi@redhat.com>2008-10-31 00:16:02 +0000
commit6c1a7f34b435a5affff76759e36153b7df7c12ec (patch)
tree22a90fd8779df892cac12625b164ceca9d3f753a
parent77e2e8a93bd947d4c9957b4570f963a5508cd7b0 (diff)
Resolves: #469243
Summary: ACL: support group filter Description: extended userattr #GROUPDN value to support LDAPURL
-rw-r--r--ldap/servers/plugins/acl/acllas.c96
1 files changed, 83 insertions, 13 deletions
diff --git a/ldap/servers/plugins/acl/acllas.c b/ldap/servers/plugins/acl/acllas.c
index b38150c2..88beea15 100644
--- a/ldap/servers/plugins/acl/acllas.c
+++ b/ldap/servers/plugins/acl/acllas.c
@@ -2355,36 +2355,90 @@ acllas__eval_memberGroupDnAttr (char *attrName, Slapi_Entry *e,
Slapi_Attr *attr;
char *s, *p;
- char *str, *s_str, *base, *groupattr;
+ char *str, *s_str, *base, *groupattr = NULL;
int i,j,k,matched, enumerate_groups;
aclUserGroup *u_group;
char ebuf [ BUFSIZ ];
Slapi_Value *sval=NULL;
const struct berval *attrVal;
-
- /* Parse the URL -- We can't use the ldap_url_parse()
- ** we don't follow thw complete url naming scheme
- */
+ int qcnt = 0;
+ Slapi_PBlock *myPb = NULL;
+ Slapi_Entry **grpentries = NULL;
+
+ /* Parse the URL -- getting the group attr and counting up '?'s.
+ * If there is no group attr and there are 3 '?' marks,
+ * we parse the URL with ldap_url_parse to get base dn and filter.
+ */
s_str = str = slapi_ch_strdup(attrName);
while (str && ldap_utf8isspace(str)) LDAP_UTF8INC( str );
str +=8;
s = strchr (str, '?');
if (s) {
+ qcnt++;
p = s;
p++;
*s = '\0';
base = str;
s = strchr (p, '?');
- if (s) *s = '\0';
+ if (s) {
+ qcnt++;
+ *s = '\0';
+ if (NULL != strchr (++s, '?')) {
+ qcnt++;
+ }
+ }
groupattr = p;
} else {
slapi_ch_free ( (void **)&s_str );
return ACL_FALSE;
}
+
+ /* Full LDAPURL is given? */
+ if ((NULL == groupattr || 0 == strlen(groupattr)) && 3 == qcnt) {
+ LDAPURLDesc *ludp = NULL;
+ int rval;
+
+ if ( 0 != ldap_url_parse( attrName, &ludp) ) {
+ slapi_ch_free ( (void **)&s_str );
+ return ACL_FALSE;
+ }
+
+ /* Use new search internal API */
+ myPb = slapi_pblock_new ();
+ slapi_search_internal_set_pb(
+ myPb,
+ ludp->lud_dn,
+ ludp->lud_scope,
+ ludp->lud_filter,
+ NULL,
+ 0,
+ NULL /* controls */,
+ NULL /* uniqueid */,
+ aclplugin_get_identity (ACL_PLUGIN_IDENTITY),
+ 0 );
+ slapi_search_internal_pb(myPb);
+ ldap_free_urldesc( ludp );
+ slapi_pblock_get(myPb, SLAPI_PLUGIN_INTOP_RESULT, &rval);
+ if (rval != LDAP_SUCCESS) {
+ slapi_ch_free ( (void **)&s_str );
+ slapi_free_search_results_internal(myPb);
+ slapi_pblock_destroy (myPb);
+ return ACL_FALSE;
+ }
+
+ slapi_pblock_get(myPb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &grpentries);
+ if ((grpentries == NULL) || (grpentries[0] == NULL)) {
+ slapi_ch_free ( (void **)&s_str );
+ slapi_free_search_results_internal(myPb);
+ slapi_pblock_destroy (myPb);
+ return ACL_FALSE;
+ }
+ }
+
if ( (u_group = aclg_get_usersGroup ( aclpb , n_clientdn )) == NULL) {
- slapi_log_error( SLAPI_LOG_ACL, plugin_name,
+ slapi_log_error( SLAPI_LOG_ACL, plugin_name,
"Failed to find/allocate a usergroup--aborting evaluation\n", 0, 0);
slapi_ch_free ( (void **)&s_str );
return(ACL_DONT_KNOW);
@@ -2540,12 +2594,28 @@ acllas__eval_memberGroupDnAttr (char *attrName, Slapi_Entry *e,
j, ACL_ESCAPE_STRING_WITH_PUNCTUATION (u_group->aclug_member_groups[j], ebuf),0);
matched = ACL_FALSE;
- slapi_entry_attr_find( e, groupattr, &attr);
- if (attr == NULL) {
- slapi_ch_free ( (void **)&s_str );
- return ACL_FALSE;
- }
- {
+ if ((NULL == groupattr || 0 == strlen(groupattr)) && 3 == qcnt) {
+ /* Full LDAPURL case */
+ for (k = 0; u_group->aclug_member_groups[k]; k++) { /* groups the bind
+ user belong to */
+ Slapi_Entry **ep;
+ for (ep = grpentries; *ep; ep++) { /* groups having ACI */
+ char *n_edn = slapi_entry_get_ndn(*ep);
+ if (slapi_utf8casecmp((ACLUCHP)u_group->aclug_member_groups[k],
+ (ACLUCHP)n_edn) == 0) {
+ matched = ACL_TRUE;
+ break;
+ }
+ }
+ }
+ slapi_free_search_results_internal(myPb);
+ slapi_pblock_destroy(myPb);
+ } else {
+ slapi_entry_attr_find( e, groupattr, &attr);
+ if (attr == NULL) {
+ slapi_ch_free ( (void **)&s_str );
+ return ACL_FALSE;
+ }
k = slapi_attr_first_value ( attr,&sval );
while ( k != -1 ) {
char *n_attrval;