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

Kevin Falcone falcone at bestpractical.com
Fri Jan 30 16:57:22 EST 2015


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

- Log -----------------------------------------------------------------
commit 24bea750e068f094ba0984326321f6d2c574e9af
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.

diff --git a/lib/RT/Users.pm b/lib/RT/Users.pm
index f1ca663..bbbca1c 100644
--- a/lib/RT/Users.pm
+++ b/lib/RT/Users.pm
@@ -624,8 +624,11 @@ sub SimpleSearch {
 
         if ($name =~ /^CF\.(?:\{(.*)}|(.*))$/) {
             my $cfname = $1 || $2;
+            my $cf = RT::CustomField->new($self->CurrentUser);
+            $cf->LoadByName( Name => $cfname, LookupType => 'RT::User');
+            my $cfsearch = $cf->Id ? $cf : $cfname;
             $self->LimitCustomField(
-                CUSTOMFIELD     => $cfname,
+                CUSTOMFIELD     => $cfsearch,
                 OPERATOR        => $op,
                 VALUE           => $args{Term},
                 ENTRYAGGREGATOR => 'OR',

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


More information about the rt-commit mailing list