[rt-users] CustomField with "Link values to" doesn't link correctly

Kai Storbeck kai at xs4all.nl
Tue Jan 5 15:10:13 EST 2010


Hi Kevin,

Thanks for your initial answer in October. Other issues took my attention for a while, but I found interest again after someone contacted me describing exactly the same problem.

After a small learning curve with the perl debugger, I came to the conclusion that the 2 customfields aren't initialized the same way, so I dug around a little more, and found that most CustomFields get a call to SetContextObject() after initialize. In Ticket->CustomFields this happens, but called from the ObjectCustomFieldValue not:

# diff -ruN ~/rt-3.8.7/lib/RT/ObjectCustomFieldValue.pm /opt/rt3/lib/RT/ObjectCustomFieldValue.pm 
--- /usr/home/kai/rt-3.8.7/lib/RT/ObjectCustomFieldValue.pm	2009-12-11 18:27:20.000000000 +0100
+++ /opt/rt3/lib/RT/ObjectCustomFieldValue.pm	2010-01-05 20:49:32.000000000 +0100
@@ -173,6 +173,7 @@
 sub CustomFieldObj {
 	my $self = shift;
 	my $CustomField =  RT::CustomField->new($self->CurrentUser);
+	$CustomField->SetContextObject( $self->Object );
 	$CustomField->Load($self->__Value('CustomField'));
 	return($CustomField);
 }

This patch seems to work around _my_ problem, but... since you guys are the experts: Is this the correct way of resolving this issue? Are there large performance penalties or other side effects?

Regards,
Kai

On Oct 1, 2009, at 5:28 PM, Kevin Falcone wrote:

> On Thu, Oct 01, 2009 at 11:36:57AM +0200, Kai wrote:
>> Hi,
>> 
>> I'm using RT 3.8.4, patched to 3.8.5 to see if that fixed it (since
>> that was CF related) on a debian system.
>> 
>> One of my coworkers wasn't able to click on a customfield that had a
>> "Link values to" setting, while I am. The main difference: He has
>> the right to SeeCustomField, and I have the SuperUser right.
>> 
>> He gets an empty
>> 	<a href="" target="_new">512178</a>
>> Me:
>>        <a href="https://someurl/fubar?id=512178"
>> target="_new">512178</a>
>> 
>> Attached is a perlscript that immitate
>> html/Elements/ShowCustomFields. You need a ticket with a customfield
>> containing 1 value with a Link value To-setting, and a user thats
>> permitted the necessary rights (SeeQueue, ShowTicket,
>> SeeCustomField).
>> 
>> Somewhere after the calls from a $customfield's value back to its
>> CustomFieldObj() it loses its permission for the 'SeeCustomField'
>> right. I'm stupified after looking at this code too long; I can't
>> see where or why it fails for this user.
> 
> How is the marcelv user getting the SeeCustomField right?
> Is it from being in a group, direct user assignment, being a Requestor
> or AdminCc of the ticket?
> 
> Just making a test user in a copy of 3.8.5 that has SeeQueue,
> ShowTicket and SeeCustomField granted to privileged users lets a test
> user see the link as expected and runs your test script with:
> 
> Found ticket: 1
> customfield->LinkValueTo():
> http://foo.com/id=__id__&value=__CustomField__
> value->LinkValueTo(): http://foo.com/id=1&value=asdf
> value->Content(): asdf
> value->CustomFieldObj->CurrentUserHasRight(SeeCustomField): 1
> value->CustomFieldObj->id(): 1
> CustomField->CurrentUserHasRight(SeeCustomField): 1
> CustomField->id(): 1
> 
> If you have local lib mods, I suggest checking to make sure that
> they're up-to-date with 3.8.5, there are a lot of new calls to
> ContextObject and SetContextObject that could break CF permissions if
> they're lost.
> 
> -kevin
> 
>> Could someone assist me in solving this? I sincerely doubt it is a
>> missing right?
>> This user has: SeeQueue, SeeCustomField, ModifyCustomField,
>> AssignCustomField, ShowTicket, ShowTicketComments, CreateTicket,
>> ReplyToTicket, CommentOnTicket, OwnTicket, ModifyTicket,
>> DeleteTicket, TakeTicket, StealTicket.
>> 
>> 
>> My output:
>> 
>>> Found ticket: 2047497
>>> customfield->LinkValueTo(): http://someurl.com/search?id=__CustomField__
>>> value->LinkValueTo():
>>> value->Content(): 512178
>>> value->CustomFieldObj->CurrentUserHasRight(SeeCustomField):
>>> value->CustomFieldObj->id(): 40
>>> CustomField->CurrentUserHasRight(SeeCustomField): 1
>>> CustomField->id(): 40
>>> 
>> 
>> 
> 
>> #!/usr/bin/perl -w
>> 
>> use strict;
>> # debian locations:
>> use lib '/usr/share/request-tracker3.8/lib';
>> use lib '/etc/request-tracker3.8';
>> use RT;
>> use RT::User;
>> RT::LoadConfig();
>> RT::Init;
>> 
>> $| = 1;
>> my $username = shift || 'marcelv';
>> my $ticketno = shift || 2047497;
>> my $canonicalright = 'SeeCustomField';
>> 
>> my $user = RT::User->new($RT::SystemUser);
>> $user->Load($username);
>> my $ticket = RT::Ticket->new($user);
>> $ticket->Load($ticketno);
>> print "Found ticket: " . $ticket->Id . "\n";
>> 
>> my $allcustomfields = $ticket->CustomFields;
>> # These snippets are taken from html/Elements/ShowCustomFields
>> while (my $cf = $allcustomfields->Next ) {
>>    my $values = $ticket->CustomFieldValues( $cf->Id );
>> 
>>    # I'm assuming a single value customfield, with a template.
>>    my $linked = $cf->LinkValueTo;
>>    my $v = $values->First();
>> 
>>    if ( $linked ) {
>> 	print "customfield->LinkValueTo(): $linked\n";
>> 	print "value->LinkValueTo(): " , $v->LinkValueTo , "\n";
>> 	print "value->Content(): " , $v->Content , "\n";
>> 
>> 	print "value->CustomFieldObj->CurrentUserHasRight($canonicalright): ",
>> 		$v->CustomFieldObj->CurrentUserHasRight($canonicalright), "\n";
>> 	print "value->CustomFieldObj->id(): ", $v->CustomFieldObj->id, "\n";
>> 
>> 	print "CustomField->CurrentUserHasRight($canonicalright): ",
>> 		$cf->CurrentUserHasRight($canonicalright), "\n";
>> 	print "CustomField->id(): ", $cf->id, "\n";
>>    }
>> }
>> 
> 
>> 




More information about the rt-users mailing list