[Rt-commit] rt branch, 4.2/user-cf-simplesearch, created. rt-4.2.9-76-g56f0f84

Kevin Falcone falcone at bestpractical.com
Wed Feb 4 12:46:17 EST 2015


The branch, 4.2/user-cf-simplesearch has been created
        at  56f0f841f95ad6edd351e4bad1f300031d655d18 (commit)

- Log -----------------------------------------------------------------
commit 56f0f841f95ad6edd351e4bad1f300031d655d18
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Fri Jan 30 16:45:40 2015 -0500

    Load a Custom Field to improve searches
    
    Passing the name causes RT to generate a query that joins through
    CustomFields, ObjectCustomFields, ObjectCustomFieldValues and performs
    really poorly on anyone with real data in OCFVs.
    
    If you pass in an id, LimitCustomField will load as SystemUser and
    create better SQL (see a4c8bfa4 for more).  If you pass in a real
    object, there's even more optimizations the code can make.
    
    Loading as SystemUser is concerning, however the Fields to search by are
    pulled from the system configuration and are not tweakable by any of the
    User endpoints.  Someone could write code that calls
    RT::Users->SimpleSearch, but that's outside core.
    
    Code using this system CF object are just inspecting values, so should
    be safe.
    
    The code has always walked around ACLs on the User CF for searching
    becaues it joined to CustomFields by name, without loading the object
    and sanchecking if the currentuser can see it.  This maintains backwards
    compatibility with the behavior, since an admin saying "Search this CF"
    should continue to just work.
    
    If configured with a User CF it cannot load (or if someone calls this
    method on an RT::Users collection) we will not generate a poorly
    performant search and instead will warn and skip the CF.

diff --git a/lib/RT/Users.pm b/lib/RT/Users.pm
index f1ca663..a8e81eb 100644
--- a/lib/RT/Users.pm
+++ b/lib/RT/Users.pm
@@ -624,13 +624,19 @@ sub SimpleSearch {
 
         if ($name =~ /^CF\.(?:\{(.*)}|(.*))$/) {
             my $cfname = $1 || $2;
-            $self->LimitCustomField(
-                CUSTOMFIELD     => $cfname,
-                OPERATOR        => $op,
-                VALUE           => $args{Term},
-                ENTRYAGGREGATOR => 'OR',
-                SUBCLAUSE       => 'autocomplete',
-            );
+            my $cf = RT::CustomField->new(RT->SystemUser);
+            my ($ok, $msg) = $cf->LoadByName( Name => $cfname, LookupType => 'RT::User');
+            if ( $ok ) {
+                $self->LimitCustomField(
+                    CUSTOMFIELD     => $cf->Id,
+                    OPERATOR        => $op,
+                    VALUE           => $args{Term},
+                    ENTRYAGGREGATOR => 'OR',
+                    SUBCLAUSE       => 'autocomplete',
+                );
+            } else {
+                RT->Logger->warning("Asked to search custom field $name but unable to load a User CF with the name $cfname: $msg");
+            }
         } else {
             $self->Limit(
                 FIELD           => $name,

-----------------------------------------------------------------------


More information about the rt-commit mailing list