[Rt-commit] r9750 - in rt/branches/3.6-EXPERIMENTAL-CATEGORIES: . html/Admin/Elements html/REST/1.0/search html/Widgets lib/RT lib/t/regression

falcone at bestpractical.com falcone at bestpractical.com
Mon Nov 26 15:45:26 EST 2007


Author: falcone
Date: Mon Nov 26 15:45:24 2007
New Revision: 9750

Modified:
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/   (props changed)
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Admin/Elements/ConfigureMyRT
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/REST/1.0/search/ticket
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SavedSearch
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SelectionBox
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Principal_Overlay.pm
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Users_Overlay.pm
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/t/regression/26command_line.t
   rt/branches/3.6-EXPERIMENTAL-CATEGORIES/sbin/rt-test-dependencies.in

Log:
merge down 3.6-release into the cateogories branch

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Admin/Elements/ConfigureMyRT
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Admin/Elements/ConfigureMyRT	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Admin/Elements/ConfigureMyRT	Mon Nov 26 15:45:24 2007
@@ -64,35 +64,15 @@
         AutoSave  => 1,
         OnSubmit  => sub {
             my $sel = shift;
-
-            my @res;
-            foreach my $e ( @{ $sel->{Current} } ) {
-                my %row;
-                @row{qw(type name id)} = split /-/, $e, 3;
-                my $old = ( grep {
-                    ($_->{'type'}||'') eq ($row{'type'}||'')
-                    && ($_->{'name'}||'') eq ($row{'name'}||'')
-                    && ($_->{'id'}||'') eq ($row{'id'}||'')
-                } @{ $portlets->{$pane} || [] } )[0];
-                %row = %$old if $old;
-                push @res, \%row;
-            }
-
-            $portlets->{$pane} = \@res;
+            $portlets->{$pane} = [
+                map { m/(\w+)-(.*)$}/;
+                      { type => $1,
+                        name => $2 } } @{ $sel->{Current} }
+            ];
             $OnSave->( $portlets, $pane );
         },
-        Selected => [
-            map {
-                join( '-', grep $_, @{$_}{qw/type name id/} )
-            } @{ $portlets->{$pane} }
-        ],
-        Label => {
-            map {
-                join( '-', grep $_, @{$_}{qw/type name id/} ),
-                $_->{'label'}
-            }
-            grep $_->{'label'}, @{ $portlets->{$pane} }
-        },
+        Selected => [ map { join( '-', @{$_}{qw/type name/} ) }
+                      @{ $portlets->{$pane} } ]
     );
 }
 

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/REST/1.0/search/ticket
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/REST/1.0/search/ticket	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/REST/1.0/search/ticket	Mon Nov 26 15:45:24 2007
@@ -59,7 +59,7 @@
 my $tickets = new RT::Tickets $session{CurrentUser};
 
 # Parse and validate any field specifications.
-my $field  = '[a-zA-Z][a-zA-Z0-9_-]*';
+my $field  = '[a-zA-Z](?:[a-zA-Z0-9_-]|\s+)*';
 my (%fields, @fields);
 if ($fields) {
     $format ||= "l";

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SavedSearch
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SavedSearch	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SavedSearch	Mon Nov 26 15:45:24 2007
@@ -136,8 +136,16 @@
 <form method="post" action="<% $Action %>" name="SaveSearch">
 <& /Search/Elements/EditSearches, Name => 'Owner', SearchType => $self->{SearchType}, AllowCopy => 0,
    CurrentSearch => $self->{CurrentSearch}, SearchId => $self->{SearchId}, Title => $Title  &><br />
-% for my $field (@{$self->{SearchFields}}) {
-<input type="hidden" class="hidden" name="<%$field%>" value="<%$ARGS{$field} || ''%>" />
+<%PERL>
+foreach my $field ( @{$self->{SearchFields}} ) {
+    if ( ref($ARGS{$field}) && ref($ARGS{$field}) ne 'ARRAY' ) {
+        $RT::Logger->error("Couldn't store '$field'. it's reference to ". ref($ARGS{$field}) );
+        next;
+    }
+    foreach my $value ( grep defined, ref($ARGS{$field})? @{ $ARGS{$field} } : $ARGS{$field} ) {
+</%PERL>
+<input type="hidden" class="hidden" name="<% $field %>" value="<% $value %>" />
+%   }
 % }
 </form>
 <%ARGS>

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SelectionBox
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SelectionBox	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/html/Widgets/SelectionBox	Mon Nov 26 15:45:24 2007
@@ -84,9 +84,7 @@
 
 <%method new>
 <%init>
-$ARGS{_item_map} = { map { $_->[0] => $_->[1] } @{ $ARGS{Available} } };
-$ARGS{_item_map} = { %{ $ARGS{_item_map} }, %{ $ARGS{'Label'} } }
-    if $ARGS{'Label'};
+$ARGS{_item_map} = {map {$_->[0] => $_->[1]} @{$ARGS{Available}}};
 return \%ARGS;
 </%init>
 </%method>
@@ -200,7 +198,7 @@
 % if (exists $selected{$_}) {
 selected="selected"
 % }
-><% $self->{_item_map}{$_} || $_ %></option>
+><% $self->{_item_map}{$_} %></option>
 % }
 </select>
  <input name="moveup" type="submit" class="button" value=" &uarr; " />

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Principal_Overlay.pm
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Principal_Overlay.pm	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Principal_Overlay.pm	Mon Nov 26 15:45:24 2007
@@ -303,7 +303,8 @@
         return (undef);
     }
 
-    $args{EquivObjects} = [ @{ $args{EquivObjects} } ] if $args{EquivObjects};
+    $args{'EquivObjects'} = [ @{ $args{'EquivObjects'} } ]
+        if $args{'EquivObjects'};
 
     if ( $self->Disabled ) {
         $RT::Logger->error( "Disabled User #"
@@ -317,7 +318,7 @@
         && UNIVERSAL::can( $args{'Object'}, 'id' )
         && $args{'Object'}->id ) {
 
-        push( @{ $args{'EquivObjects'} }, $args{Object} );
+        push @{ $args{'EquivObjects'} }, $args{'Object'};
     }
     else {
         $RT::Logger->crit("HasRight called with no valid object");
@@ -330,47 +331,44 @@
         # this is a little bit hacky, but basically, now that we've done
         # the ticket roles magic, we load the queue object
         # and ask all the rest of our questions about the queue.
-        push( @{ $args{'EquivObjects'} }, $args{'Object'}->QueueObj );
+        unshift @{ $args{'EquivObjects'} }, $args{'Object'}->QueueObj;
 
     }
 
+    unshift @{ $args{'EquivObjects'} }, $RT::System
+        unless $self->can('_IsOverrideGlobalACL')
+               && $self->_IsOverrideGlobalACL( $args{'Object'} );
+
+
     # {{{ If we've cached a win or loss for this lookup say so
 
-    # {{{ Construct a hashkey to cache decisions in
-    my $hashkey = do {
-        no warnings 'uninitialized';
-
-        # We don't worry about the hash ordering, as this is only
-        # temporarily used; also if the key changes it would be
-        # invalidated anyway.
-        join(
-            ";:;",
-            $self->Id,
-            map {
-                $_,    # the key of each arguments
-                  ( $_ eq 'EquivObjects' )    # for object arrayref...
-                  ? map( _ReferenceId($_), @{ $args{$_} } )    # calculate each
-                  : _ReferenceId( $args{$_} )    # otherwise just the value
-              } keys %args
-        );
-    };
-
-    # }}}
-
-    # Returns undef on cache miss
-    my $cached_answer = $_ACL_CACHE->fetch($hashkey);
-    if ( defined $cached_answer ) {
-        if ( $cached_answer == 1 ) {
-            return (1);
-        }
-        elsif ( $cached_answer == -1 ) {
-            return (undef);
-        }
+    # Construct a hashkeys to cache decisions:
+    # 1) full_hashkey - key for any result and for full combination of uid, right and objects
+    # 2) short_hashkey - one key for each object to store positive results only, it applies
+    # only to direct group rights and partly to role rights
+    my $self_id = $self->id;
+    my $full_hashkey = join ";:;", $self_id, $args{'Right'};
+    foreach ( @{ $args{'EquivObjects'} } ) {
+        my $ref_id = _ReferenceId($_);
+        $full_hashkey .= ";:;$ref_id";
+
+        my $short_hashkey = join ";:;", $self_id, $args{'Right'}, $ref_id;
+        my $cached_answer = $_ACL_CACHE->fetch($short_hashkey);
+        return $cached_answer > 0 if defined $cached_answer;
+    }
+
+    {
+        my $cached_answer = $_ACL_CACHE->fetch($full_hashkey);
+        return $cached_answer > 0 if defined $cached_answer;
     }
 
-    my $hitcount = $self->_HasRight( %args );
 
-    $_ACL_CACHE->set( $hashkey => $hitcount? 1:-1 );
+    my ($hitcount, $via_obj) = $self->_HasRight( %args );
+
+    $_ACL_CACHE->set( $full_hashkey => $hitcount? 1: -1 );
+    $_ACL_CACHE->set( "$self_id;:;$args{'Right'};:;$via_obj" => 1 )
+        if $via_obj && $hitcount;
+
     return ($hitcount);
 }
 
@@ -383,54 +381,93 @@
 sub _HasRight
 {
     my $self = shift;
+    {
+        my ($hit, @other) = $self->_HasGroupRight( @_ );
+        return ($hit, @other) if $hit;
+    }
+    {
+        my ($hit, @other) = $self->_HasRoleRight( @_ );
+        return ($hit, @other) if $hit;
+    }
+    return (0);
+}
+
+# this method handles role rights partly in situations
+# where user plays role X on an object and as well the right is
+# assigned to this role X of the object, for example right CommentOnTicket
+# is granted to Cc role of a queue and user is in cc list of the queue
+sub _HasGroupRight
+{
+    my $self = shift;
     my %args = (
         Right        => undef,
-        Object       => undef,
         EquivObjects => [],
         @_
     );
-
     my $right = $args{'Right'};
-    my @objects = @{ $args{'EquivObjects'} };
 
-    # If an object is defined, we want to look at rights for that object
+    my $query =
+      "SELECT ACL.id, ACL.ObjectType, ACL.ObjectId " .
+      "FROM ACL, Principals, CachedGroupMembers WHERE " .
 
-    push( @objects, 'RT::System' )
-      unless $self->can('_IsOverrideGlobalACL')
-             && $self->_IsOverrideGlobalACL( $args{Object} );
-
-    my ($check_roles, $check_objects) = ('','');
-    if( @objects ) {
-        my @role_clauses;
-        my @object_clauses;
-        foreach my $obj ( @objects ) {
-            my $type = ref($obj)? ref($obj): $obj;
-            my $id;
-            $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
-
-            my $role_clause = "Groups.Domain = '$type-Role'";
-            # XXX: Groups.Instance is VARCHAR in DB, we should quote value
-            # if we want mysql 4.0 use indexes here. we MUST convert that
-            # field to integer and drop this quotes.
-            $role_clause   .= " AND Groups.Instance = '$id'" if $id;
-            push @role_clauses, "($role_clause)";
-
-            my $object_clause = "ACL.ObjectType = '$type'";
-            $object_clause   .= " AND ACL.ObjectId = $id" if $id;
-            push @object_clauses, "($object_clause)";
+      # Only find superuser or rights with the name $right
+      "(ACL.RightName = 'SuperUser' OR ACL.RightName = '$right') "
+
+      # Never find disabled groups.
+      . "AND Principals.id = ACL.PrincipalId "
+      . "AND Principals.PrincipalType = 'Group' "
+      . "AND Principals.Disabled = 0 "
+
+      # See if the principal is a member of the group recursively or _is the rightholder_
+      # never find recursively disabled group members
+      # also, check to see if the right is being granted _directly_ to this principal,
+      #  as is the case when we want to look up group rights
+      . "AND CachedGroupMembers.GroupId  = ACL.PrincipalId "
+      . "AND CachedGroupMembers.GroupId  = Principals.id "
+      . "AND CachedGroupMembers.MemberId = ". $self->Id ." "
+      . "AND CachedGroupMembers.Disabled = 0 ";
+
+    my @clauses;
+    foreach my $obj ( @{ $args{'EquivObjects'} } ) {
+        my $type = ref( $obj ) || $obj;
+        my $clause = "ACL.ObjectType = '$type'";
+
+        if ( ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id ) {
+            $clause .= " AND ACL.ObjectId = ". $obj->id;
         }
 
-        $check_roles .= join ' OR ', @role_clauses;
-        $check_objects = join ' OR ', @object_clauses;
+        push @clauses, "($clause)";
+    }
+    if ( @clauses ) {
+        $query .= " AND (". join( ' OR ', @clauses ) .")";
     }
 
-    my $query_base =
-      "SELECT ACL.id from ACL, Groups, Principals, CachedGroupMembers WHERE  " .
+    $self->_Handle->ApplyLimits( \$query, 1 );
+    my ($hit, $obj, $id) = $self->_Handle->FetchResult( $query );
+    return (0) unless $hit;
+
+    $obj .= "-$id" if $id;
+    return (1, $obj);
+}
+
+sub _HasRoleRight
+{
+    my $self = shift;
+    my %args = (
+        Right        => undef,
+        EquivObjects => [],
+        @_
+    );
+    my $right = $args{'Right'};
+
+    my $query =
+      "SELECT ACL.id " .
+      "FROM ACL, Groups, Principals, CachedGroupMembers WHERE " .
 
       # Only find superuser or rights with the name $right
-      "(ACL.RightName = 'SuperUser' OR  ACL.RightName = '$right') "
+      "(ACL.RightName = 'SuperUser' OR ACL.RightName = '$right') "
 
-      # Never find disabled groups.
+      # Never find disabled things
       . "AND Principals.Disabled = 0 "
       . "AND CachedGroupMembers.Disabled = 0 "
 
@@ -444,30 +481,39 @@
       #  as is the case when we want to look up group rights
       . "AND Principals.id = CachedGroupMembers.GroupId "
       . "AND CachedGroupMembers.MemberId = ". $self->Id ." "
+      . "AND ACL.PrincipalType = Groups.Type ";
 
-      # Make sure the rights apply to the entire system or to the object in question
-      . "AND ($check_objects) ";
-
-    # The groups query does the query based on group membership and individual user rights
-    my $groups_query = $query_base
-      # limit the result set to groups of types ACLEquivalence (user),
-      # UserDefined, SystemInternal and Personal. All this we do
-      # via (ACL.PrincipalType = 'Group') condition
-      . "AND ACL.PrincipalId = Principals.id "
-      . "AND ACL.PrincipalType = 'Group' ";
-
-    $self->_Handle->ApplyLimits( \$groups_query, 1 ); #only return one result
-    my $hitcount = $self->_Handle->FetchResult($groups_query);
-    return 1 if $hitcount; # get out of here if success
-
-    # The roles query does the query based on roles
-    my $roles_query = $query_base
-      . "AND ACL.PrincipalType = Groups.Type "
-      . "AND ($check_roles) ";
-    $self->_Handle->ApplyLimits( \$roles_query, 1 ); #only return one result
+    my (@object_clauses);
+    foreach my $obj ( @{ $args{'EquivObjects'} } ) {
+        my $type = ref($obj)? ref($obj): $obj;
+        my $id;
+        $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
+
+        my $object_clause = "ACL.ObjectType = '$type'";
+        $object_clause   .= " AND ACL.ObjectId = $id" if $id;
+        push @object_clauses, "($object_clause)";
+    }
+    # find ACLs that are related to our objects only
+    $query .= " AND (". join( ' OR ', @object_clauses ) .")";
 
-    $hitcount = $self->_Handle->FetchResult($roles_query);
-    return 1 if $hitcount; # get out of here if success
+    # because of mysql bug in versions up to 5.0.45 we do one query per object
+    # each query should be faster on any DB as it uses indexes more effective
+    foreach my $obj ( @{ $args{'EquivObjects'} } ) {
+        my $type = ref($obj)? ref($obj): $obj;
+        my $id;
+        $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
+
+        my $tmp = $query;
+        $tmp .= " AND Groups.Domain = '$type-Role'";
+        # XXX: Groups.Instance is VARCHAR in DB, we should quote value
+        # if we want mysql 4.0 use indexes here. we MUST convert that
+        # field to integer and drop this quotes.
+        $tmp .= " AND Groups.Instance = '$id'" if $id;
+
+        $self->_Handle->ApplyLimits( \$tmp, 1 );
+        my ($hit) = $self->_Handle->FetchResult( $tmp );
+        return (1) if $hit;
+    }
 
     return 0;
 }

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Users_Overlay.pm
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Users_Overlay.pm	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/RT/Users_Overlay.pm	Mon Nov 26 15:45:24 2007
@@ -434,8 +434,7 @@
         return (undef);
     }
 
-    my $from_role = $self->Clone;
-    $from_role->WhoHaveRoleRight( %args );
+    my @from_role = $self->Clone->_WhoHaveRoleRightSplitted( %args );
 
     my $from_group = $self->Clone;
     $from_group->WhoHaveGroupRight( %args );
@@ -443,8 +442,8 @@
     #XXX: DIRTY HACK
     use DBIx::SearchBuilder::Union;
     my $union = new DBIx::SearchBuilder::Union;
-    $union->add($from_role);
-    $union->add($from_group);
+    $union->add( $_ ) foreach @from_role;
+    $union->add( $from_group );
     %$self = %$union;
     bless $self, ref($union);
 
@@ -469,39 +468,48 @@
     my $groups = $self->_JoinGroups( %args );
     my $acl = $self->_JoinACL( %args );
 
-    my ($check_roles, $check_objects) = ('','');
-    
-    my @objects = $self->_GetEquivObjects( %args );
-    if ( @objects ) {
-        my @role_clauses;
-        my @object_clauses;
-        foreach my $obj ( @objects ) {
-            my $type = ref($obj)? ref($obj): $obj;
-            my $id;
-            $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
-
-            my $role_clause = "$groups.Domain = '$type-Role'";
-            # XXX: Groups.Instance is VARCHAR in DB, we should quote value
-            # if we want mysql 4.0 use indexes here. we MUST convert that
-            # field to integer and drop this quotes.
-            $role_clause   .= " AND $groups.Instance = '$id'" if $id;
-            push @role_clauses, "($role_clause)";
+    $self->Limit( ALIAS => $acl,
+                  FIELD => 'PrincipalType',
+                  VALUE => "$groups.Type",
+                  QUOTEVALUE => 0,
+                );
 
-            my $object_clause = "$acl.ObjectType = '$type'";
-            $object_clause   .= " AND $acl.ObjectId = $id" if $id;
-            push @object_clauses, "($object_clause)";
-        }
+    # no system user
+    $self->Limit( ALIAS => $self->PrincipalsAlias,
+                  FIELD => 'id',
+                  OPERATOR => '!=',
+                  VALUE => $RT::SystemUser->id
+                );
 
-        $check_roles .= join ' OR ', @role_clauses;
-        $check_objects = join ' OR ', @object_clauses;
-    } else {
-        if( !$args{'IncludeSystemRights'} ) {
-            $check_objects = "($acl.ObjectType != 'RT::System')";
+    my @objects = $self->_GetEquivObjects( %args );
+    unless ( @objects ) {
+        unless ( $args{'IncludeSystemRights'} ) {
+            $self->_AddSubClause( WhichObjects => "($acl.ObjectType != 'RT::System')" );
         }
+        return;
     }
 
-    $self->_AddSubClause( "WhichObject", "($check_objects)" );
-    $self->_AddSubClause( "WhichRole", "($check_roles)" );
+    my ($groups_clauses, $acl_clauses) = $self->_RoleClauses( $groups, $acl, @objects );
+    $self->_AddSubClause( "WhichObject", "(". join( ' OR ', @$groups_clauses ) .")" );
+    $self->_AddSubClause( "WhichRole", "(". join( ' OR ', @$acl_clauses ) .")" );
+
+    return;
+}
+
+sub _WhoHaveRoleRightSplitted {
+    my $self = shift;
+    my %args = (
+        Right                  => undef,
+        Object                 => undef,
+        IncludeSystemRights    => undef,
+        IncludeSuperusers      => undef,
+        IncludeSubgroupMembers => 1,
+        EquivObjects           => [ ],
+        @_
+    );
+
+    my $groups = $self->_JoinGroups( %args );
+    my $acl = $self->_JoinACL( %args );
 
     $self->Limit( ALIAS => $acl,
                   FIELD => 'PrincipalType',
@@ -515,7 +523,53 @@
                   OPERATOR => '!=',
                   VALUE => $RT::SystemUser->id
                 );
-    return;
+
+    my @objects = $self->_GetEquivObjects( %args );
+    unless ( @objects ) {
+        unless ( $args{'IncludeSystemRights'} ) {
+            $self->_AddSubClause( WhichObjects => "($acl.ObjectType != 'RT::System')" );
+        }
+        return $self;
+    }
+
+    my ($groups_clauses, $acl_clauses) = $self->_RoleClauses( $groups, $acl, @objects );
+    $self->_AddSubClause( "WhichRole", "(". join( ' OR ', @$acl_clauses ) .")" );
+    
+    my @res;
+    foreach ( @$groups_clauses ) {
+        my $tmp = $self->Clone;
+        $tmp->_AddSubClause( WhichObject => $_ );
+        push @res, $tmp;
+    }
+
+    return @res;
+}
+
+sub _RoleClauses {
+    my $self = shift;
+    my $groups = shift;
+    my $acl = shift;
+    my @objects = @_;
+
+    my @groups_clauses;
+    my @acl_clauses;
+    foreach my $obj ( @objects ) {
+        my $type = ref($obj)? ref($obj): $obj;
+        my $id;
+        $id = $obj->id if ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id;
+
+        my $role_clause = "$groups.Domain = '$type-Role'";
+        # XXX: Groups.Instance is VARCHAR in DB, we should quote value
+        # if we want mysql 4.0 use indexes here. we MUST convert that
+        # field to integer and drop this quotes.
+        $role_clause   .= " AND $groups.Instance = '$id'" if $id;
+        push @groups_clauses, "($role_clause)";
+
+        my $object_clause = "$acl.ObjectType = '$type'";
+        $object_clause   .= " AND $acl.ObjectId = $id" if $id;
+        push @acl_clauses, "($object_clause)";
+    }
+    return (\@groups_clauses, \@acl_clauses);
 }
 
 # XXX: should be generalized

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/t/regression/26command_line.t
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/t/regression/26command_line.t	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/lib/t/regression/26command_line.t	Mon Nov 26 15:45:24 2007
@@ -3,7 +3,7 @@
 use strict;
 use Test::Expect;
 #use Test::More qw/no_plan/;
-use Test::More tests => 216;
+use Test::More tests => 218;
 
 use RT;
 RT::LoadConfig();
@@ -162,6 +162,8 @@
 expect_like(qr/Ticket $ticket_id updated/, 'Changed cf');
 expect_send("show ticket/$ticket_id -f 'CF-my CF$$'", 'Checking new value');
 expect_like(qr/my CF$$: VALUE/i, 'Verified change');
+expect_send("ls 'id = $ticket_id' -f 'CF-my CF$$'", 'Checking new value');
+expect_like(qr/my CF$$: VALUE/i, 'Verified change');
 
 # ...
 # change a ticket's ...[other properties]...

Modified: rt/branches/3.6-EXPERIMENTAL-CATEGORIES/sbin/rt-test-dependencies.in
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-CATEGORIES/sbin/rt-test-dependencies.in	(original)
+++ rt/branches/3.6-EXPERIMENTAL-CATEGORIES/sbin/rt-test-dependencies.in	Mon Nov 26 15:45:24 2007
@@ -175,7 +175,7 @@
 DBI 1.37
 Class::ReturnValue 0.40
 Date::Format
-DBIx::SearchBuilder 1.48
+DBIx::SearchBuilder 1.50
 Text::Template
 File::Spec 0.8
 HTML::Entities 


More information about the Rt-commit mailing list