[Rt-commit] rt branch, 4.0/customfieldlookupid-acl-regression, created. rt-4.0.9-16-gcc95623

Kevin Falcone falcone at bestpractical.com
Wed Jan 23 16:20:37 EST 2013


The branch, 4.0/customfieldlookupid-acl-regression has been created
        at  cc9562317aa87d0b3d31b0cdbebed1de9795cd3e (commit)

- Log -----------------------------------------------------------------
commit 6d5b035891caa7f42f9d434183c8843788b4e244
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Wed Jan 23 15:34:11 2013 -0500

    Ensure that Custom Fields submitted are saved to the database.
    
    There was a regression in 4.0.9 (a64a16d1c) which meant that even if you
    had SeeQueue, CreateTicket, ModifyCustomField and SeeCustomField and the
    custom field appeared for editing, it would be lost during the
    submission.  If you had ShowTicket, it worked fine.

diff --git a/t/web/ticket_display.t b/t/web/ticket_display.t
index a9cab0c..35e9217 100644
--- a/t/web/ticket_display.t
+++ b/t/web/ticket_display.t
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 18;
+use RT::Test tests => undef;
 
 my $queue = RT::Test->load_or_create_queue( Name => 'General' );
 
@@ -10,10 +10,15 @@ my $user = RT::Test->load_or_create_user(
     Password => 'password',
 );
 
+my $cf = RT::Test->load_or_create_custom_field( Name => 'test_cf', Queue => $queue->Name, Type => 'FreeformSingle' );
+my $cf_form_id = 'Object-RT::Ticket--CustomField-'.$cf->Id.'-Value';
+my $cf_test_value = "some string for test_cf $$";
+
 my ( $baseurl, $m ) = RT::Test->started_ok;
 ok(
     RT::Test->set_rights(
         { Principal => $user, Right => [qw(SeeQueue CreateTicket)] },
+        { Principal => $user, Object => $queue, Right => [qw(SeeCustomField ModifyCustomField)] }
     ),
     'set rights'
 );
@@ -26,7 +31,7 @@ diag "test ShowTicket right";
     $m->get_ok( '/Ticket/Create.html?Queue=' . $queue->id,
         'go to ticket create page' );
     my $form = $m->form_name('TicketCreate');
-    $m->submit_form( fields => { Subject => 'ticket foo' } );
+    $m->submit_form( fields => { Subject => 'ticket foo', $cf_form_id => $cf_test_value } );
 
     my $ticket = RT::Test->last_ticket;
     ok( $ticket->id, 'ticket is created' );
@@ -56,8 +61,9 @@ diag "test ShowTicket right";
 
     $m->content_lacks( "No permission to view ticket", 'no error msg' );
     $m->title_is( "#$id: ticket foo", 'we can it' );
+    $m->content_contains($cf_test_value, "Custom Field was submitted and saved");
 }
 
 
-# TODO more /Ticket/Display.html tests here
-
+undef $m;
+done_testing();

commit cc9562317aa87d0b3d31b0cdbebed1de9795cd3e
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Wed Jan 23 15:36:34 2013 -0500

    Check the id from the table and by loading the Object.
    
    An optimization was added in a64a16d1c so that if you were trying to
    find the "Custom Field Object" from a Ticket, it would shortcut and
    return $ticket->Queue rather than loading $ticket->QueueObj->Id.
    
    Unfortunately, $ticket->Queue is protected by ShowTicket while
    $ticket->QueueObj->Id is protected by SeeQueue.  It's not uncommon in RT
    for a user to be granted SeeQueue and CreateTicket but not be given
    ShowTicket (a dropbox queue where you create tickets but then don't see
    them anymore).
    
    In this setup on 4.0.9, any custom field values entered on
    Ticket/Create.html will be silently discarded because $ticket->Queue
    returns undef. This results in the Custom Field not being found and
    AddCustomFieldValue not saving it.
    
    This was revealed in the RTIR test suite which tests just such a
    scenario using Constituencies (you can submit a ticket that you then
    can't see because it belongs to a separate Constituency).

diff --git a/lib/RT/Record.pm b/lib/RT/Record.pm
index 8dcf4d1..0310475 100644
--- a/lib/RT/Record.pm
+++ b/lib/RT/Record.pm
@@ -1597,7 +1597,12 @@ sub CustomFieldLookupId {
 	$object = $object->$method;
     }
 
-    return $object->$final;
+    my $id = $object->$final;
+    unless (defined $id) {
+        my $method = "${final}Obj";
+        $id = $object->$method->Id;
+    }
+    return $id;
 }
 
 

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


More information about the Rt-commit mailing list