From 134667c81d645343178e23fedb33267a69006062 Mon Sep 17 00:00:00 2001
From: Martin Haase <martin.haase@daasi.de>
Date: Mon, 13 Jun 2011 10:10:57 +0000
Subject: [PATCH] markus' work on chunked sid filtering; fixed TG-1441

git-svn-id: https://textgridlab.org/svn/textgrid/trunk/middleware/tgauth@10112 7c539038-3410-0410-b1ec-0f2a7bf1c452
---
 .../rbacSoap/TgExtra.class.php                | 83 +++++++++++++++----
 .../rbacSoap/examples/createProject.php       |  8 --
 2 files changed, 65 insertions(+), 26 deletions(-)

diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php b/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php
index bc4e16d..dca027e 100755
--- a/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php
+++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/TgExtra.class.php
@@ -645,6 +645,9 @@ class TgExtra {
 
     $filterBySidResult = Array();    // The resources that pass the filter
     $arrRole = Array();
+    $arrResource = Array();
+    $arrFilter = Array();
+    $arrHandle = Array();
     $result = new filterResponse();  // The result
 
 
@@ -676,49 +679,93 @@ class TgExtra {
     }
 
 
+    $arrResTmp = Array();
 
-    // Construct a filter with all resources and
-    // all roles/permissions
-    $filter  = "(&(objectClass=rbacResource)(|";
+    for( $i = 0; $i < sizeof( $res ); $i++ ) {
 
+      $arrResTmp[] = $res[$i];
 
-    for( $i = 0; $i < sizeof( $res ); $i++ ) {
 
-      $filter .= "(" . $this->rbac->getConfiguration()->getValue( "resource", "aliasattribute" ) . "=" . $res[$i] . ")";
+      if( ($i > 0) && ($i % 400 === 0) ) {
+
+        $arrResource[] = $arrResTmp;
+        $arrResTmp = Array();
+
+      }
 
     }
 
 
-    $filter .= ")(|";
+    $arrResource[] = $arrResTmp;
+    unset( $res );
 
 
-    for( $i = 0; $i < sizeof( $arrRole ); $i++ ) {
+    for( $loParSearch = 0; $loParSearch < sizeof( $arrResource ); $loParSearch++ ) {
 
-      $filter .= "(rbacPermission=" . $arrRole[$i] . ":-:" . $inRequest->operation . ")";
+      // Construct a filter with all resources and
+      // all roles/permissions
+      $filter  = "(&(objectClass=rbacResource)(|";
 
-    }
 
+      for( $i = 0; $i < sizeof( $arrResource[$loParSearch] ); $i++ ) {
+
+        $filter .= "(" . $this->rbac->getConfiguration()->getValue( "resource", "aliasattribute" ) . "=" . $arrResource[$loParSearch][$i] . ")";
+
+      }
+
+
+      $filter .= ")(|";
+
+
+      for( $i = 0; $i < sizeof( $arrRole ); $i++ ) {
+
+        $filter .= "(rbacPermission=" . $arrRole[$i] . ":-:" . $inRequest->operation . ")";
+
+      }
 
-    $filter .= "(TgIsPublic=TRUE)(TgIsProjectFile=TRUE)))";
+
+      $filter .= "(TgIsPublic=TRUE)(TgIsProjectFile=TRUE)))";
+
+
+      $arrFilter[] = $filter;
+      $arrHandle[] = $this->connection['resource']->getConnection();
+
+    }
 
 
     // If we do not free some memory we might
     // consume enormous resources
+    unset( $filter );
     unset( $arrRole );
-    unset( $res );
+    unset( $arrResource );
 
 
-    $arrResult = $this->connection['resource']->search( $this->rbac->getConfiguration()->getValue( "resource", "base" ),
-                                                        $filter, "sub", Array( "tgResourceURI" ) );
+//    $arrResult = $this->connection['resource']->search( $this->rbac->getConfiguration()->getValue( "resource", "base" ),
+//                                                        $filter, "sub", Array( "tgResourceURI" ) );
 
+    $arrParSearchResult = ldap_search( $arrHandle, $this->rbac->getConfiguration()->getValue( "resource", "base" ), $arrFilter, Array( "tgResourceURI" ) );
+
+
+    unset( $arrFilter );
 
-    // We do not need the filter anymore
-    unset( $filter );
 
+    if( !is_array( $arrParSearchResult ) ) {
 
-    for( $i = 0; $i < sizeof( $arrResult ); $i++ ) {
+      $arrParSearchResult = Array( $arrParSearchResult );
 
-      $result->resource[] = $arrResult[$i]['tgresourceuri'][0];
+    }
+
+
+    for( $loParSearch = 0; $loParSearch < sizeof( $arrParSearchResult ); $loParSearch++ ) {
+
+      $arrResult = ldap_get_entries( $arrHandle[$loParSearch], $arrParSearchResult[$loParSearch] );
+
+
+      for( $i = 0; $i < $arrResult['count']; $i++ ) {
+
+        $result->resource[] = $arrResult[$i]['tgresourceuri'][0];
+
+      }
 
     }
 
@@ -2877,7 +2924,7 @@ class TgExtra {
 /* Old-style project IDs can be found this way but not IDs using a UUID
 	preg_match ( '/(TGPR\d+)/', $arrRole[$i]["dn"], $tgpr);
 */
-	preg_match ( '/(TGPR)/', $arrRole[$i]["dn"], $tgpr);
+	preg_match ( '/(TGPR[^,]+)/', $arrRole[$i]["dn"], $tgpr);
 
         $arrProject = $this->rbac->getConnection( "role" )->getEntry( 
 			"rbacName=" . $tgpr[1] .
diff --git a/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/createProject.php b/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/createProject.php
index 10441d1..8e5f261 100755
--- a/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/createProject.php
+++ b/info.textgrid.middleware.tgauth.rbac/rbacSoap/examples/createProject.php
@@ -66,14 +66,6 @@ if( isset( $_POST['auth'] ) ) {
 
 
 echo "<FORM action=\"createProject.php\" method=\"post\" enctype=\"multipart/form-data\">\n";
-echo "Target: ";
-echo "<SELECT name=\"wsdl\">\n";
-
-for( $i = 0; $i < sizeof( $arrExtraWsdl ); $i++ ) {
-
-  echo "<OPTION value=\"" . $i . "\">" . $arrExtraWsdl[$i]['name'] . "</OPTION>\n";
-
-}
 
 echo "</SELECT><BR>\n";
 echo "Auth: <INPUT type=\"text\" name=\"auth\" value=\"\"><BR>\n";
-- 
GitLab