diff options
Diffstat (limited to 'rt/lib/RT')
58 files changed, 3220 insertions, 8842 deletions
| diff --git a/rt/lib/RT/ACE.pm b/rt/lib/RT/ACE.pm index 0cd12174d..1501a125e 100755 --- a/rt/lib/RT/ACE.pm +++ b/rt/lib/RT/ACE.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -128,7 +104,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -137,14 +113,14 @@ Returns the current value of id.  =cut -=head2 PrincipalType +=item PrincipalType  Returns the current value of PrincipalType.   (In the database, PrincipalType is stored as varchar(25).) -=head2 SetPrincipalType VALUE +=item SetPrincipalType VALUE  Set PrincipalType to VALUE.  @@ -155,14 +131,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 PrincipalId +=item PrincipalId  Returns the current value of PrincipalId.   (In the database, PrincipalId is stored as int(11).) -=head2 SetPrincipalId VALUE +=item SetPrincipalId VALUE  Set PrincipalId to VALUE.  @@ -173,14 +149,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 RightName +=item RightName  Returns the current value of RightName.   (In the database, RightName is stored as varchar(25).) -=head2 SetRightName VALUE +=item SetRightName VALUE  Set RightName to VALUE.  @@ -191,14 +167,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ObjectType +=item ObjectType  Returns the current value of ObjectType.   (In the database, ObjectType is stored as varchar(25).) -=head2 SetObjectType VALUE +=item SetObjectType VALUE  Set ObjectType to VALUE.  @@ -209,14 +185,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ObjectId +=item ObjectId  Returns the current value of ObjectId.   (In the database, ObjectId is stored as int(11).) -=head2 SetObjectId VALUE +=item SetObjectId VALUE  Set ObjectId to VALUE.  @@ -227,14 +203,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 DelegatedBy +=item DelegatedBy  Returns the current value of DelegatedBy.   (In the database, DelegatedBy is stored as int(11).) -=head2 SetDelegatedBy VALUE +=item SetDelegatedBy VALUE  Set DelegatedBy to VALUE.  @@ -245,14 +221,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 DelegatedFrom +=item DelegatedFrom  Returns the current value of DelegatedFrom.   (In the database, DelegatedFrom is stored as int(11).) -=head2 SetDelegatedFrom VALUE +=item SetDelegatedFrom VALUE  Set DelegatedFrom to VALUE.  @@ -264,25 +240,25 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          PrincipalType =>  -		{read => 1, write => 1, sql_type => 12, length => 25,  is_blob => 0,  is_numeric => 0,  type => 'varchar(25)', default => ''}, +		{read => 1, write => 1, type => 'varchar(25)', default => ''},          PrincipalId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          RightName =>  -		{read => 1, write => 1, sql_type => 12, length => 25,  is_blob => 0,  is_numeric => 0,  type => 'varchar(25)', default => ''}, +		{read => 1, write => 1, type => 'varchar(25)', default => ''},          ObjectType =>  -		{read => 1, write => 1, sql_type => 12, length => 25,  is_blob => 0,  is_numeric => 0,  type => 'varchar(25)', default => ''}, +		{read => 1, write => 1, type => 'varchar(25)', default => ''},          ObjectId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          DelegatedBy =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          DelegatedFrom =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},   }  }; @@ -314,7 +290,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/ACL.pm b/rt/lib/RT/ACL.pm index 9641292e6..81f59c6d0 100755 --- a/rt/lib/RT/ACL.pm +++ b/rt/lib/RT/ACL.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::ACE item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Action/Autoreply.pm b/rt/lib/RT/Action/Autoreply.pm index ea56b9f5b..81f7bddfa 100755 --- a/rt/lib/RT/Action/Autoreply.pm +++ b/rt/lib/RT/Action/Autoreply.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# CONTRIBUTION SUBMISSION POLICY:  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  package RT::Action::Autoreply;  require RT::Action::SendEmail; @@ -52,18 +28,6 @@ use strict;  use vars qw/@ISA/;  @ISA = qw(RT::Action::SendEmail); -=head2 Prepare - -Set up the relevant recipients, then call our parent. - -=cut - - -sub Prepare { -    my $self = shift; -    $self->SetRecipients(); -    $self->SUPER::Prepare(); -}  # {{{ sub SetRecipients @@ -110,18 +74,10 @@ sub SetReturnAddress {      }      unless ($self->TemplateObj->MIMEObj->head->get('From')) { -	if ($RT::UseFriendlyFromLine) { -	    my $friendly_name = $self->TicketObj->QueueObj->Description || -		    $self->TicketObj->QueueObj->Name; -	    $friendly_name =~ s/"/\\"/g; -	    $self->SetHeader( 'From', -		        sprintf($RT::FriendlyFromLineFormat,  -                $self->MIMEEncodeString( $friendly_name, $RT::EmailOutputEncoding ), $replyto), -	    ); -	} -	else { -	    $self->SetHeader( 'From', $replyto ); -	} +	my $friendly_name = $self->TicketObj->QueueObj->Description || +		$self->TicketObj->QueueObj->Name; +	$friendly_name =~ s/"/\\"/g; +	$self->SetHeader('From', "\"$friendly_name\" <$replyto>");      }      unless ($self->TemplateObj->MIMEObj->head->get('Reply-To')) { diff --git a/rt/lib/RT/Action/Generic.pm b/rt/lib/RT/Action/Generic.pm index 3232d4898..007d299c7 100755 --- a/rt/lib/RT/Action/Generic.pm +++ b/rt/lib/RT/Action/Generic.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.)  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  =head1 NAME    RT::Action::Generic - a generic baseclass for RT Actions @@ -68,9 +44,6 @@ ok (require RT::Action::Generic);  package RT::Action::Generic;  use strict; -use Scalar::Util; - -use base qw/RT::Base/;  # {{{ sub new   sub new  { @@ -83,35 +56,31 @@ sub new  {  }  # }}} +# {{{ sub new  +sub loc { +    my $self = shift; +    return $self->{'ScripObj'}->loc(@_); +} +# }}} +  # {{{ sub _Init   sub _Init  {    my $self = shift; -  my %args = ( Argument => undef, -               CurrentUser => undef, -               ScripActionObj => undef, -               ScripObj => undef, -               TemplateObj => undef, -               TicketObj => undef, -               TransactionObj => undef, -               Type => undef, - -               @_ ); - +  my %args = ( TransactionObj => undef, +	       TicketObj => undef, +	       ScripObj => undef, +	       TemplateObj => undef, +	       Argument => undef, +	       Type => undef, +	       @_ ); +   +      $self->{'Argument'} = $args{'Argument'}; -  $self->CurrentUser( $args{'CurrentUser'}); -  $self->{'ScripActionObj'} = $args{'ScripActionObj'};    $self->{'ScripObj'} = $args{'ScripObj'}; -  $self->{'TemplateObj'} = $args{'TemplateObj'};    $self->{'TicketObj'} = $args{'TicketObj'};    $self->{'TransactionObj'} = $args{'TransactionObj'}; +  $self->{'TemplateObj'} = $args{'TemplateObj'};    $self->{'Type'} = $args{'Type'}; - -  Scalar::Util::weaken($self->{'ScripActionObj'}); -  Scalar::Util::weaken($self->{'ScripObj'}); -  Scalar::Util::weaken($self->{'TemplateObj'}); -  Scalar::Util::weaken($self->{'TicketObj'}); -  Scalar::Util::weaken($self->{'TransactionObj'}); -  }  # }}} @@ -152,13 +121,6 @@ sub ScripObj  {  }  # }}} -# {{{ sub ScripActionObj -sub ScripActionObj  { -  my $self = shift; -  return($self->{'ScripActionObj'}); -} -# }}} -  # {{{ sub Type  sub Type  {    my $self = shift; @@ -214,11 +176,13 @@ sub DESTROY {      # We need to clean up all the references that might maybe get      # oddly circular -    $self->{'ScripActionObj'} = undef; -    $self->{'ScripObj'} = undef;      $self->{'TemplateObj'} =undef      $self->{'TicketObj'} = undef;      $self->{'TransactionObj'} = undef; +    $self->{'ScripObj'} = undef; + + +       }  # }}} diff --git a/rt/lib/RT/Action/Notify.pm b/rt/lib/RT/Action/Notify.pm index 82cad1e58..1e4e4c073 100755 --- a/rt/lib/RT/Action/Notify.pm +++ b/rt/lib/RT/Action/Notify.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,53 +14,20 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} -# +# END LICENSE BLOCK  package RT::Action::Notify;  require RT::Action::SendEmail; -use Mail::Address; +  use strict;  use vars qw/@ISA/;  @ISA = qw(RT::Action::SendEmail); - -=head2 Prepare - -Set up the relevant recipients, then call our parent. - -=cut - - -sub Prepare { -    my $self = shift; -    $self->SetRecipients(); -    $self->SUPER::Prepare(); -} -  # {{{ sub SetRecipients  =head2 SetRecipients @@ -86,18 +47,10 @@ sub SetRecipients {      my ( @To, @PseudoTo, @Cc, @Bcc ); -    if ( $arg =~ /\bOtherRecipients\b/ ) { -        if ( $self->TransactionObj->Attachments->First ) { -            my @cc_addresses = Mail::Address->parse($self->TransactionObj->Attachments->First->GetHeader('RT-Send-Cc')); -            foreach my $addr (@cc_addresses) { -                  push @Cc, $addr->address; -            } -            my @bcc_addresses = Mail::Address->parse($self->TransactionObj->Attachments->First->GetHeader('RT-Send-Bcc')); - -            foreach my $addr (@bcc_addresses) { -                  push @Bcc, $addr->address; -            } - +    if ($arg =~ /\bOtherRecipients\b/) { +        if ($self->TransactionObj->Attachments->First) { +            push (@Cc, $self->TransactionObj->Attachments->First->GetHeader('RT-Send-Cc')); +            push (@Bcc, $self->TransactionObj->Attachments->First->GetHeader('RT-Send-Bcc'));          }      } @@ -160,12 +113,12 @@ sub SetRecipients {          @{ $self->{'Bcc'} } = @Bcc;      }      else { -        @{ $self->{'To'} }  = grep ( lc $_ ne lc $creator, @To ); -        @{ $self->{'Cc'} }  = grep ( lc $_ ne lc $creator, @Cc ); -        @{ $self->{'Bcc'} } = grep ( lc $_ ne lc $creator, @Bcc ); +        @{ $self->{'To'} }  = grep ( !/^$creator$/, @To ); +        @{ $self->{'Cc'} }  = grep ( !/^$creator$/, @Cc ); +        @{ $self->{'Bcc'} } = grep ( !/^$creator$/, @Bcc );      }      @{ $self->{'PseudoTo'} } = @PseudoTo; - +    return (1);  } diff --git a/rt/lib/RT/Action/NotifyAsComment.pm b/rt/lib/RT/Action/NotifyAsComment.pm index 215f453d3..210e4ab15 100755 --- a/rt/lib/RT/Action/NotifyAsComment.pm +++ b/rt/lib/RT/Action/NotifyAsComment.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  package RT::Action::NotifyAsComment;  require RT::Action::Notify; diff --git a/rt/lib/RT/Action/ResolveMembers.pm b/rt/lib/RT/Action/ResolveMembers.pm index fab049b0a..02ff3a58c 100644 --- a/rt/lib/RT/Action/ResolveMembers.pm +++ b/rt/lib/RT/Action/ResolveMembers.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # This Action will resolve all members of a resolved group ticket  package RT::Action::ResolveMembers; diff --git a/rt/lib/RT/Action/SendEmail.pm b/rt/lib/RT/Action/SendEmail.pm index ed5ec4fd6..dac8fc8e7 100755 --- a/rt/lib/RT/Action/SendEmail.pm +++ b/rt/lib/RT/Action/SendEmail.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Portions Copyright 2000 Tobias Brox <tobix@cpan.org>  package RT::Action::SendEmail; @@ -57,8 +33,6 @@ use vars qw/@ISA/;  use MIME::Words qw(encode_mimeword);  use RT::EmailParser; -use Mail::Address; -use Date::Format qw(strftime);  =head1 NAME @@ -77,6 +51,13 @@ RT::Action::AutoReply is a good example subclass.  Basically, you create another module RT::Action::YourAction which ISA  RT::Action::SendEmail. +If you want to set the recipients of the mail to something other than +the addresses mentioned in the To, Cc, Bcc and headers in +the template, you should subclass RT::Action::SendEmail and override +either the SetRecipients method or the SetTo, SetCc, etc methods (see +the comments for the SetRecipients sub). + +  =begin testing  ok (require RT::Action::SendEmail); @@ -96,409 +77,236 @@ perl(1).  # {{{ Scrip methods (_Init, Commit, Prepare, IsApplicable) +# {{{ sub _Init +# We use _Init from RT::Action +# }}}  # {{{ sub Commit - +#Do what we need to do and send it out.  sub Commit { -    # DO NOT SHIFT @_ in this subroutine.  It breaks Hook::LexWrap's -    # ability to pass @_ to a 'post' routine. -    my $self = $_[0]; - -    my ($ret) = $self->SendMessage( $self->TemplateObj->MIMEObj ); -    if ( $ret > 0 ) { -        $self->RecordOutgoingMailTransaction( $self->TemplateObj->MIMEObj ) -            if ($RT::RecordOutgoingEmail); -    } -    return (abs $ret); -} - -# }}} - -# {{{ sub Prepare - -sub Prepare {      my $self = shift; -    my ( $result, $message ) = $self->TemplateObj->Parse( -        Argument       => $self->Argument, -        TicketObj      => $self->TicketObj, -        TransactionObj => $self->TransactionObj -    ); -    if ( !$result ) { -        return (undef); -    } -      my $MIMEObj = $self->TemplateObj->MIMEObj; +    my $msgid = $MIMEObj->head->get('Message-Id'); +    chomp $msgid; +    $RT::Logger->info($msgid." #".$self->TicketObj->id."/".$self->TransactionObj->id." - Scrip ". $self->ScripObj->id ." ".$self->ScripObj->Description); +    #send the email -    # Header -    $self->SetRTSpecialHeaders(); +        # Weed out any RT addresses. We really don't want to talk to ourselves! +        @{$self->{'To'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'To'}}); +        @{$self->{'Cc'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'Cc'}}); +        @{$self->{'Bcc'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'Bcc'}}); +    # If there are no recipients, don't try to send the message. +    # If the transaction has content and has the header RT-Squelch-Replies-To + +    if ( defined $self->TransactionObj->Attachments->First() ) { -    $self->RemoveInappropriateRecipients(); +        my $squelch = $self->TransactionObj->Attachments->First->GetHeader( 'RT-Squelch-Replies-To'); -    my %seen; -    foreach my $type qw(To Cc Bcc) { -        @{ $self->{ $type } } = -            grep defined && length && !$seen{ lc $_ }++, -                @{ $self->{ $type } }; +        if ($squelch) { +            my @blacklist = split ( /,/, $squelch ); + +            # Cycle through the people we're sending to and pull out anyone on the +            # system blacklist + +            foreach my $person_to_yank (@blacklist) { +                $person_to_yank =~ s/\s//g; +                @{ $self->{'To'} } = +                  grep ( !/^$person_to_yank$/, @{ $self->{'To'} } ); +                @{ $self->{'Cc'} } = +                  grep ( !/^$person_to_yank$/, @{ $self->{'Cc'} } ); +                @{ $self->{'Bcc'} } = +                  grep ( !/^$person_to_yank$/, @{ $self->{'Bcc'} } ); +            } +        }      }      # Go add all the Tos, Ccs and Bccs that we need to to the message to      # make it happy, but only if we actually have values in those arrays. -    # TODO: We should be pulling the recipients out of the template and shove them into To, Cc and Bcc +    $self->SetHeader( 'To', join ( ',', @{ $self->{'To'} } ) ) +      if ( $self->{'To'} && @{ $self->{'To'} } ); +    $self->SetHeader( 'Cc', join ( ',', @{ $self->{'Cc'} } ) ) +      if ( $self->{'Cc'} && @{ $self->{'Cc'} } ); +    $self->SetHeader( 'Bcc', join ( ',', @{ $self->{'Bcc'} } ) ) +      if ( $self->{'Cc'} && @{ $self->{'Bcc'} } ); -    $self->SetHeader( 'To', join ( ', ', @{ $self->{'To'} } ) ) -      if ( ! $MIMEObj->head->get('To') &&  $self->{'To'} && @{ $self->{'To'} } ); -    $self->SetHeader( 'Cc', join ( ', ', @{ $self->{'Cc'} } ) ) -      if ( !$MIMEObj->head->get('Cc') && $self->{'Cc'} && @{ $self->{'Cc'} } ); -    $self->SetHeader( 'Bcc', join ( ', ', @{ $self->{'Bcc'} } ) ) -      if ( !$MIMEObj->head->get('Bcc') && $self->{'Bcc'} && @{ $self->{'Bcc'} } ); -    # PseudoTo	(fake to headers) shouldn't get matched for message recipients. -    # If we don't have any 'To' header (but do have other recipients), drop in -    # the pseudo-to header. -    $self->SetHeader( 'To', join ( ', ', @{ $self->{'PseudoTo'} } ) ) -      if ( $self->{'PseudoTo'} && ( @{ $self->{'PseudoTo'} } ) -        and ( !$MIMEObj->head->get('To') ) ) and ( $MIMEObj->head->get('Cc') or $MIMEObj->head->get('Bcc')); +    $self->SetHeader('MIME-Version', '1.0'); -    # We should never have to set the MIME-Version header -    $self->SetHeader( 'MIME-Version', '1.0' ); +    # try to convert message body from utf-8 to $RT::EmailOutputEncoding +    $self->SetHeader( 'Content-Type', 'text/plain; charset="utf-8"' ); -    # fsck.com #5959: Since RT sends 8bit mail, we should say so. -    $self->SetHeader( 'Content-Transfer-Encoding','8bit'); +    RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, $RT::EmailOutputEncoding, 'mime_words_ok' ); +    $self->SetHeader( 'Content-Type', 'text/plain; charset="' . $RT::EmailOutputEncoding . '"' ); -    # For security reasons, we only send out textual mails. -    my @parts = $MIMEObj; -    while (my $part = shift @parts) { -        if ($part->is_multipart) { -            push @parts, $part->parts; -        } -        else { -            if ( RT::I18N::IsTextualContentType( $part->mime_type ) ) { -                $part->head->mime_attr( "Content-Type" => $part->mime_type ) -            } else { -                $part->head->mime_attr( "Content-Type" => 'text/plain' ); -            } -            $part->head->mime_attr( "Content-Type.charset" => 'utf-8' ); -        } -    } +    # Build up a MIME::Entity that looks like the original message. -    RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, $RT::EmailOutputEncoding, 'mime_words_ok' ); +    my $do_attach = $self->TemplateObj->MIMEObj->head->get('RT-Attach-Message'); -    # Build up a MIME::Entity that looks like the original message. -    $self->AddAttachments() if ( $MIMEObj->head->get('RT-Attach-Message') ); +    if ($do_attach) { +        $self->TemplateObj->MIMEObj->head->delete('RT-Attach-Message'); -    return $result; +        my $attachments = RT::Attachments->new($RT::SystemUser); +        $attachments->Limit( FIELD => 'TransactionId', +                             VALUE => $self->TransactionObj->Id ); +        $attachments->OrderBy('id'); -} +        my $transaction_content_obj = $self->TransactionObj->ContentObj; -# }}} +        # attach any of this transaction's attachments +        while ( my $attach = $attachments->Next ) { -# }}} +            # Don't attach anything blank +            next unless ( $attach->ContentLength ); +            # We want to make sure that we don't include the attachment that's being sued as the "Content" of this message" +            next +              if (    $transaction_content_obj +                   && $transaction_content_obj->Id == $attach->Id  +                   && $transaction_content_obj->ContentType =~ qr{text/plain}i +                ); +            $MIMEObj->make_multipart('mixed'); +            $MIMEObj->attach( Type => $attach->ContentType, +                              Charset => $attach->OriginalEncoding, +                              Data => $attach->OriginalContent, +                              Filename => $self->MIMEEncodeString( $attach->Filename, $RT::EmailOutputEncoding ), +                              Encoding    => '-SUGGEST'); +        } +    } -=head2 To -Returns an array of Mail::Address objects containing all the To: recipients for this notification +    my $retval = $self->SendMessage($MIMEObj); -=cut -sub To { -    my $self = shift; -    return ($self->_AddressesFromHeader('To')); +    return ($retval);  } -=head2 Cc - -Returns an array of Mail::Address objects containing all the Cc: recipients for this notification +# }}} -=cut +# {{{ sub Prepare -sub Cc {  +sub Prepare {      my $self = shift; -    return ($self->_AddressesFromHeader('Cc')); -} -=head2 Bcc +    # This actually populates the MIME::Entity fields in the Template Object -Returns an array of Mail::Address objects containing all the Bcc: recipients for this notification +    unless ( $self->TemplateObj ) { +        $RT::Logger->warning("No template object handed to $self\n"); +    } -=cut +    unless ( $self->TransactionObj ) { +        $RT::Logger->warning("No transaction object handed to $self\n"); +    } -sub Bcc { -    my $self = shift; -    return ($self->_AddressesFromHeader('Bcc')); +    unless ( $self->TicketObj ) { +        $RT::Logger->warning("No ticket object handed to $self\n"); -} +    } -sub _AddressesFromHeader  { -    my $self = shift; -    my $field = shift; -    my $header = $self->TemplateObj->MIMEObj->head->get($field); -    my @addresses = Mail::Address->parse($header); +    my ( $result, $message ) = $self->TemplateObj->Parse( +                                         Argument       => $self->Argument, +                                         TicketObj      => $self->TicketObj, +                                         TransactionObj => $self->TransactionObj +    ); +    if ($result) { + +        # Header +        $self->SetSubject(); +        $self->SetSubjectToken(); +        $self->SetRecipients(); +        $self->SetReturnAddress(); +        $self->SetRTSpecialHeaders(); +        if ($RT::EmailOutputEncoding) { + +            # l10n related header +            $self->SetHeaderAsEncoding( 'Subject', $RT::EmailOutputEncoding ); +        } +    } + +    return $result; -    return (@addresses);  } +# }}} -# {{{ SendMessage +# }}} +# {{{ SendMessage  =head2 SendMessage MIMEObj  sends the message using RT's preferred API. -TODO: Break this out to a separate module +TODO: Break this out to a seperate module  =cut  sub SendMessage { -    # DO NOT SHIFT @_ in this subroutine.  It breaks Hook::LexWrap's -    # ability to pass @_ to a 'post' routine. -    my ( $self, $MIMEObj ) = @_; +    my $self = shift; +    my $MIMEObj = shift; -    my $msgid = $MIMEObj->head->get('Message-ID'); -    chomp $msgid; +    my $msgid = $MIMEObj->head->get('Message-Id'); -    $self->ScripActionObj->{_Message_ID}++; -     -    $RT::Logger->info( $msgid . " #" -        . $self->TicketObj->id . "/" -        . $self->TransactionObj->id -        . " - Scrip " -        . $self->ScripObj->id . " " -        . $self->ScripObj->Description );      #If we don't have any recipients to send to, don't send a message; -    unless ( $MIMEObj->head->get('To') -        || $MIMEObj->head->get('Cc') -        || $MIMEObj->head->get('Bcc') ) -    { -        $RT::Logger->info( $msgid . " No recipients found. Not sending.\n" ); -        return (-1); -    } - -    unless ($MIMEObj->head->get('Date')) { -        # We coerce localtime into an array since strftime has a flawed prototype that only accepts -        # a list -      $MIMEObj->head->replace(Date => strftime('%a, %d %b %Y %H:%M:%S %z', @{[localtime()]})); -    } - -    return (0) unless ($self->OutputMIMEObject($MIMEObj)); - -    my $success = $msgid . " sent "; -    foreach( qw(To Cc Bcc) ) { -        my $recipients = $MIMEObj->head->get($_); -        $success .= " $_: ". $recipients if $recipients; -    } -    $success =~ s/\n//g; - -    $RT::Logger->info($success); - -    return (1); -} - - -=head2 OutputMIMEObject MIME::Entity - -Sends C<MIME::Entity> as an email message according to RT's mailer configuration. - -=cut  - - - -sub OutputMIMEObject { -    my $self = shift; -    my $MIMEObj = shift; -     -    my $msgid = $MIMEObj->head->get('Message-ID'); -    chomp $msgid; -     -    my $SendmailArguments = $RT::SendmailArguments; -    if (defined $RT::VERPPrefix && defined $RT::VERPDomain) { -      my $EnvelopeFrom = $self->TransactionObj->CreatorObj->EmailAddress; -      $EnvelopeFrom =~ s/@/=/g; -      $EnvelopeFrom =~ s/\s//g; -      $SendmailArguments .= " -f ${RT::VERPPrefix}${EnvelopeFrom}\@${RT::VERPDomain}"; +    unless (    $MIMEObj->head->get('To') +             || $MIMEObj->head->get('Cc') +             || $MIMEObj->head->get('Bcc') ) { +        $RT::Logger->info($msgid.  " No recipients found. Not sending.\n"); +        return (1);      } +    # PseudoTo	(fake to headers) shouldn't get matched for message recipients. +    # If we don't have any 'To' header, drop in the pseudo-to header. +    $self->SetHeader( 'To', join ( ',', @{ $self->{'PseudoTo'} } ) ) +      if ( $self->{'PseudoTo'} && ( @{ $self->{'PseudoTo'} } ) +           and ( !$MIMEObj->head->get('To') ) );      if ( $RT::MailCommand eq 'sendmailpipe' ) {          eval { -            # don't ignore CHLD signal to get proper exit code -            local $SIG{'CHLD'} = 'DEFAULT'; - -            my $mail; -            unless( open $mail, "|$RT::SendmailPath $SendmailArguments" ) { -                die "Couldn't run $RT::SendmailPath: $!"; -            } - -            # if something wrong with $mail->print we will get PIPE signal, handle it -            local $SIG{'PIPE'} = sub { die "$RT::SendmailPath closed pipe" }; -            $MIMEObj->print($mail); - -            unless ( close $mail ) { -                die "Close failed: $!" if $!; # system error -                # sendmail exit statuses mostly errors with data not software -                # TODO: status parsing: core dump, exit on signal or EX_* -                $RT::Logger->warning( "$RT::SendmailPath exitted with status $?" ); -            } -        }; -        if ($@) { -            $RT::Logger->crit( $msgid . "Could not send mail: " . $@ ); -            return 0; +            open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ); +            print MAIL $MIMEObj->as_string; +            close(MAIL); +          }; +          if ($@) { +            $RT::Logger->crit($msgid.  "Could not send mail. -".$@ );          }      }      else { -        my @mailer_args = ($RT::MailCommand); -        my $method = 'send'; - -        local $ENV{MAILADDRESS}; +	my @mailer_args = ($RT::MailCommand); +	local $ENV{MAILADDRESS};          if ( $RT::MailCommand eq 'sendmail' ) { -            push @mailer_args, split(/\s+/, $SendmailArguments); +	    push @mailer_args, $RT::SendmailArguments;          }          elsif ( $RT::MailCommand eq 'smtp' ) { -            $ENV{MAILADDRESS} = $RT::SMTPFrom || $MIMEObj->head->get('From'); -            push @mailer_args, ( Host  => $RT::SMTPServer ); -            push @mailer_args, ( Debug => $RT::SMTPDebug ); -            $method = 'smtpsend'; -        } -        else { -            push @mailer_args, $RT::MailParams; +	    $ENV{MAILADDRESS} = $RT::SMTPFrom || $MIMEObj->head->get('From'); +	    push @mailer_args, (Server => $RT::SMTPServer); +	    push @mailer_args, (Debug => $RT::SMTPDebug);          } +	else { +	    push @mailer_args, $RT::MailParams; +	} -        unless ( $MIMEObj->$method(@mailer_args) ) { -            $RT::Logger->crit( $msgid . "Could not send mail." ); +        unless ( $MIMEObj->send( @mailer_args ) ) { +            $RT::Logger->crit($msgid.  "Could not send mail." );              return (0);          }      } -    return 1; -} -# }}} - -# {{{ AddAttachments  - -=head2 AddAttachments - -Takes any attachments to this transaction and attaches them to the message -we're building. - -=cut - - -sub AddAttachments { -    my $self = shift; -    my $MIMEObj = $self->TemplateObj->MIMEObj; - -    $MIMEObj->head->delete('RT-Attach-Message'); - -    my $attachments = RT::Attachments->new($RT::SystemUser); -    $attachments->Limit( -        FIELD => 'TransactionId', -        VALUE => $self->TransactionObj->Id -    ); -    $attachments->OrderBy( FIELD => 'id'); - -    my $transaction_content_obj = $self->TransactionObj->ContentObj; - -    # attach any of this transaction's attachments -    while ( my $attach = $attachments->Next ) { - -        # Don't attach anything blank -        next unless ( $attach->ContentLength ); - -# We want to make sure that we don't include the attachment that's being used as the "Content" of this message. -        next -          if ( $transaction_content_obj -            && $transaction_content_obj->Id == $attach->Id -            && $transaction_content_obj->ContentType =~ qr{text/plain}i ); -        $MIMEObj->make_multipart('mixed'); -        $MIMEObj->attach( -            Type     => $attach->ContentType, -            Charset  => $attach->OriginalEncoding, -            Data     => $attach->OriginalContent, -            Filename => $self->MIMEEncodeString( $attach->Filename, -                $RT::EmailOutputEncoding ), -            'RT-Attachment:' => $self->TicketObj->Id."/".$self->TransactionObj->Id."/".$attach->id, -            Encoding => '-SUGGEST' -        ); -    } +     my $success = ($msgid. " sent To: ".$MIMEObj->head->get('To') . " Cc: ".$MIMEObj->head->get('Cc') . " Bcc: ".$MIMEObj->head->get('Bcc')); +    $success =~ s/\n//gi; +    $RT::Logger->info($success); +    return (1);  }  # }}} -# {{{ RecordOutgoingMailTransaction - -=head2 RecordOutgoingMailTransaction MIMEObj - -Record a transaction in RT with this outgoing message for future record-keeping purposes - -=cut - - - -sub RecordOutgoingMailTransaction { -    my $self = shift; -    my $MIMEObj = shift; -            - -    my @parts = $MIMEObj->parts; -    my @attachments; -    my @keep; -    foreach my $part (@parts) { -        my $attach = $part->head->get('RT-Attachment'); -        if ($attach) { -            $RT::Logger->debug("We found an attachment. we want to not record it."); -            push @attachments, $attach; -        } else { -            $RT::Logger->debug("We found a part. we want to record it."); -            push @keep, $part; -        } -    } -    $MIMEObj->parts(\@keep); -    foreach my $attachment (@attachments) { -        $MIMEObj->head->add('RT-Attachment', $attachment); -    } - -    RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, 'utf-8', 'mime_words_ok' ); - -    my $transaction = RT::Transaction->new($self->TransactionObj->CurrentUser); - -    # XXX: TODO -> Record attachments as references to things in the attachments table, maybe. - -    my $type; -    if ($self->TransactionObj->Type eq 'Comment') { -        $type = 'CommentEmailRecord'; -    } else { -        $type = 'EmailRecord'; -    } - -    my $msgid = $MIMEObj->head->get('Message-ID'); -    chomp $msgid; - -    my ( $id, $msg ) = $transaction->Create( -        Ticket         => $self->TicketObj->Id, -        Type           => $type, -        Data           => $msgid, -        MIMEObj        => $MIMEObj, -        ActivateScrips => 0 -    ); - -    if( $id ) { -	$self->{'OutgoingMailTransaction'} = $id; -    } else { -        $RT::Logger->warning( "Could not record outgoing message transaction: $msg" ); -    } -    return $id; -} - -# }}} -# +# {{{ Deal with message headers (Set* subs, designed for  easy overriding)  # {{{ sub SetRTSpecialHeaders @@ -512,161 +320,84 @@ that don't matter much to anybody else.  sub SetRTSpecialHeaders {      my $self = shift; -    $self->SetSubject(); -    $self->SetSubjectToken(); -    $self->SetHeaderAsEncoding( 'Subject', $RT::EmailOutputEncoding ) -      if ($RT::EmailOutputEncoding); -    $self->SetReturnAddress(); -    $self->SetReferencesHeaders(); - -    unless ($self->TemplateObj->MIMEObj->head->get('Message-ID')) { -      # Get Message-ID for this txn -      my $msgid = ""; -      $msgid = $self->TransactionObj->Message->First->GetHeader("RT-Message-ID") -        || $self->TransactionObj->Message->First->GetHeader("Message-ID") -        if $self->TransactionObj->Message && $self->TransactionObj->Message->First; - -      # If there is one, and we can parse it, then base our Message-ID on it -      if ($msgid  -          and $msgid =~ s/<(rt-.*?-\d+-\d+)\.(\d+)-\d+-\d+\@\Q$RT::Organization\E>$/ -                         "<$1." . $self->TicketObj->id -                          . "-" . $self->ScripObj->id -                          . "-" . $self->ScripActionObj->{_Message_ID} -                          . "@" . $RT::Organization . ">"/eg -          and $2 == $self->TicketObj->id) { -        $self->SetHeader( "Message-ID" => $msgid ); -      } else { -        $self->SetHeader( 'Message-ID', -            "<rt-" -            . $RT::VERSION . "-" -            . $$ . "-" -            . CORE::time() . "-" -            . int(rand(2000)) . '.' -            . $self->TicketObj->id . "-" -            . $self->ScripObj->id . "-"  # Scrip -            . $self->ScripActionObj->{_Message_ID} . "@"  # Email sent -            . $RT::Organization -            . ">" ); -      } -    } +    $self->SetReferences(); + +    $self->SetMessageID(); -    $self->SetHeader( 'Precedence', "bulk" ) -      unless ( $self->TemplateObj->MIMEObj->head->get("Precedence") ); +    $self->SetPrecedence();      $self->SetHeader( 'X-RT-Loop-Prevention', $RT::rtname );      $self->SetHeader( 'RT-Ticket', -        $RT::rtname . " #" . $self->TicketObj->id() ); +                      $RT::rtname . " #" . $self->TicketObj->id() );      $self->SetHeader( 'Managed-by', -        "RT $RT::VERSION (http://www.bestpractical.com/rt/)" ); +                      "RT $RT::VERSION (http://www.bestpractical.com/rt/)" );      $self->SetHeader( 'RT-Originator', -        $self->TransactionObj->CreatorObj->EmailAddress ); +                      $self->TransactionObj->CreatorObj->EmailAddress ); +    return ();  } -# }}} - - -# }}} - -# {{{ RemoveInappropriateRecipients +# {{{ sub SetReferences -=head2 RemoveInappropriateRecipients - -Remove addresses that are RT addresses or that are on this transaction's blacklist +=head2 SetReferences  +   +  # This routine will set the References: and In-Reply-To headers, +# autopopulating it with all the correspondence on this ticket so +# far. This should make RT responses threadable.  =cut -sub RemoveInappropriateRecipients { +sub SetReferences {      my $self = shift; -    my $msgid = $self->TemplateObj->MIMEObj->head->get  ('Message-Id'); - - - -    my @blacklist; +    # TODO: this one is broken.  What is this email really a reply to? +    # If it's a reply to an incoming message, we'll need to use the +    # actual message-id from the appropriate Attachment object.  For +    # incoming mails, we would like to preserve the In-Reply-To and/or +    # References. -    my @types = qw/To Cc Bcc/; +    $self->SetHeader( 'In-Reply-To', +                   "<rt-" . $self->TicketObj->id() . "\@" . $RT::rtname . ">" ); -    # Weed out any RT addresses. We really don't want to talk to ourselves! -    foreach my $type (@types) { -        @{ $self->{$type} } = -          RT::EmailParser::CullRTAddresses( "", @{ $self->{$type} } ); -    } - -    # If there are no recipients, don't try to send the message. -    # If the transaction has content and has the header RT-Squelch-Replies-To - -    if ( $self->TransactionObj->Attachments->First() ) { -        if ( -            $self->TransactionObj->Attachments->First->GetHeader( -                'RT-DetectedAutoGenerated') -          ) -        { - -            # What do we want to do with this? It's probably (?) a bounce -            # caused by one of the watcher addresses being broken. -            # Default ("true") is to redistribute, for historical reasons. - -            if ( !$RT::RedistributeAutoGeneratedMessages ) { - -                # Don't send to any watchers. -                @{ $self->{'To'} }  = (); -                @{ $self->{'Cc'} }  = (); -                @{ $self->{'Bcc'} } = (); - -                $RT::Logger->info( $msgid . " The incoming message was autogenerated. Not redistributing this message based on site configuration.\n"); -            } -            elsif ( $RT::RedistributeAutoGeneratedMessages eq 'privileged' ) { - -                # Only send to "privileged" watchers. -                # - -                foreach my $type (@types) { - -                    foreach my $addr ( @{ $self->{$type} } ) { -                        my $user = RT::User->new($RT::SystemUser); -                        $user->LoadByEmail($addr); -                        @{ $self->{$type} } = -                          grep ( !/^\Q$addr\E$/, @{ $self->{$type} } ) -                          if ( !$user->Privileged ); +    # TODO We should always add References headers for all message-ids +    # of previous messages related to this ticket. +} -                    } -                } -                $RT::Logger->info( $msgid . " The incoming message was autogenerated. Not redistributing this message to unprivileged users based on site configuration.\n"); +# }}} -            } +# {{{ sub SetMessageID -        } +=head2 SetMessageID  -        my $squelch = -          $self->TransactionObj->Attachments->First->GetHeader( -            'RT-Squelch-Replies-To'); +Without this one, threading won't work very nice in email agents. +Anyway, I'm not really sure it's that healthy if we need to send +several separate/different emails about the same transaction. -        if ($squelch) { -            @blacklist = split( /,/, $squelch ); -        } -    } - -    # Let's grab the SquelchMailTo attribue and push those entries into the @blacklist -    my @non_recipients = $self->TicketObj->SquelchMailTo; -    foreach my $attribute (@non_recipients) { -        push @blacklist, $attribute->Content; -    } +=cut -    # Cycle through the people we're sending to and pull out anyone on the -    # system blacklist +sub SetMessageID { +    my $self = shift; -    foreach my $person_to_yank (@blacklist) { -        $person_to_yank =~ s/\s//g; -        foreach my $type (@types) { -            @{ $self->{$type} } = -              grep ( !/^\Q$person_to_yank\E$/, @{ $self->{$type} } ); -        } -    } +    # TODO this one might be sort of broken.  If we have several scrips +++ +    # sending several emails to several different persons, we need to +    # pull out different message-ids.  I'd suggest message ids like +    # "rt-ticket#-transaction#-scrip#-receipient#" + +    $self->SetHeader( 'Message-ID', +                      "<rt-" +                        . $RT::VERSION ."-" +                        . $self->TicketObj->id() . "-" +                        . $self->TransactionObj->id() . "." +                        . rand(20) . "\@" +                        . $RT::Organization . ">" ) +      unless $self->TemplateObj->MIMEObj->head->get('Message-ID');  }  # }}} + +# }}} +  # {{{ sub SetReturnAddress  =head2 SetReturnAddress is_comment => BOOLEAN @@ -678,10 +409,8 @@ Calculate and set From and Reply-To headers based on the is_comment flag.  sub SetReturnAddress {      my $self = shift; -    my %args = ( -        is_comment => 0, -        @_ -    ); +    my %args = ( is_comment => 0, +                 @_ );      # From and Reply-To      # $args{is_comment} should be set if the comment address is to be used. @@ -697,27 +426,21 @@ sub SetReturnAddress {      }      unless ( $self->TemplateObj->MIMEObj->head->get('From') ) { -        if ($RT::UseFriendlyFromLine) { -            my $friendly_name = $self->TransactionObj->CreatorObj->RealName -                || $self->TransactionObj->CreatorObj->Name; -            if ( $friendly_name =~ /^"(.*)"$/ ) {    # a quoted string -                $friendly_name = $1; -            } - -            $friendly_name =~ s/"/\\"/g; -            $self->SetHeader( -                'From', -                sprintf( -                    $RT::FriendlyFromLineFormat, -                    $self->MIMEEncodeString( $friendly_name, -                        $RT::EmailOutputEncoding ), -                    $replyto -                ), -            ); -        } -        else { -            $self->SetHeader( 'From', $replyto ); -        } +	if ($RT::UseFriendlyFromLine) { +	    my $friendly_name = $self->TransactionObj->CreatorObj->RealName; +	    if ( $friendly_name =~ /^"(.*)"$/ ) {    # a quoted string +		$friendly_name = $1; +	    } + +	    $friendly_name =~ s/"/\\"/g; +	    $self->SetHeader( 'From', +		        sprintf($RT::FriendlyFromLineFormat,  +                $self->MIMEEncodeString( $friendly_name, $RT::EmailOutputEncoding ), $replyto), +	    ); +	} +	else { +	    $self->SetHeader( 'From', $replyto ); +	}      }      unless ( $self->TemplateObj->MIMEObj->head->get('Reply-To') ) { @@ -750,166 +473,155 @@ sub SetHeader {  # }}} +# {{{ sub SetRecipients -# {{{ sub SetSubject +=head2 SetRecipients -=head2 SetSubject - -This routine sets the subject. it does not add the rt tag. that gets done elsewhere -If $self->{'Subject'} is already defined, it uses that. otherwise, it tries to get -the transaction's subject. +Dummy method to be overriden by subclasses which want to set the recipients. -=cut  +=cut -sub SetSubject { +sub SetRecipients {      my $self = shift; -    my $subject; +    return (); +} -    my $message = $self->TransactionObj->Attachments; -    if ( $self->TemplateObj->MIMEObj->head->get('Subject') ) { -        return (); -    } -    if ( $self->{'Subject'} ) { -        $subject = $self->{'Subject'}; -    } -    elsif ( ( $message->First() ) && ( $message->First->Headers ) ) { -        my $header = $message->First->Headers(); -        $header =~ s/\n\s+/ /g; -        if ( $header =~ /^Subject: (.*?)$/m ) { -            $subject = $1; -        } -        else { -            $subject = $self->TicketObj->Subject(); -        } +# }}} -    } -    else { -        $subject = $self->TicketObj->Subject(); -    } +# {{{ sub SetTo -    $subject =~ s/(\r\n|\n|\s)/ /gi; +=head2 SetTo -    chomp $subject; -    $self->SetHeader( 'Subject', $subject ); +Takes a string that is the addresses you want to send mail to + +=cut +sub SetTo { +    my $self      = shift; +    my $addresses = shift; +    return $self->SetHeader( 'To', $addresses );  }  # }}} -# {{{ sub SetSubjectToken +# {{{ sub SetCc -=head2 SetSubjectToken +=head2 SetCc -This routine fixes the RT tag in the subject. It's unlikely that you want to overwrite this. +Takes a string that is the addresses you want to Cc  =cut -sub SetSubjectToken { -    my $self = shift; -    my $sub  = $self->TemplateObj->MIMEObj->head->get('Subject'); -    my $id   = $self->TicketObj->id; - -    my $token_re = $RT::EmailSubjectTagRegex; -    $token_re = qr/\Q$RT::rtname\E/o unless $token_re; -    return if $sub =~ /\[$token_re\s+#$id\]/; +sub SetCc { +    my $self      = shift; +    my $addresses = shift; -    $sub =~ s/(\r\n|\n|\s)/ /gi; -    chomp $sub; -    $self->TemplateObj->MIMEObj->head->replace( -        Subject => "[$RT::rtname #$id] $sub", -    ); +    return $self->SetHeader( 'Cc', $addresses );  }  # }}} -=head2 SetReferencesHeaders +# {{{ sub SetBcc + +=head2 SetBcc -Set References and In-Reply-To headers for this message. +Takes a string that is the addresses you want to Bcc  =cut -sub SetReferencesHeaders { +sub SetBcc { +    my $self      = shift; +    my $addresses = shift; -    my $self = shift; -    my ( @in_reply_to, @references, @msgid ); +    return $self->SetHeader( 'Bcc', $addresses ); +} -    my $attachments = $self->TransactionObj->Message; +# }}} -    if ( my $top = $attachments->First() ) { -        @in_reply_to = split(/\s+/m, $top->GetHeader('In-Reply-To') || '');   -        @references = split(/\s+/m, $top->GetHeader('References') || '' );   -        @msgid = split(/\s+/m, $top->GetHeader('Message-ID') || '');  -    } -    else { -        return (undef); -    } +# {{{ sub SetPrecedence -    # There are two main cases -- this transaction was created with -    # the RT Web UI, and hence we want to *not* append its Message-ID -    # to the References and In-Reply-To.  OR it came from an outside -    # source, and we should treat it as per the RFC -    if ( "@msgid" =~ /<(rt-.*?-\d+-\d+)\.(\d+-0-0)\@$RT::Organization>/) { - -      # Make all references which are internal be to version which we -      # have sent out -      for (@references, @in_reply_to) { -        s/<(rt-.*?-\d+-\d+)\.(\d+-0-0)\@$RT::Organization>$/ -          "<$1." . $self->TicketObj->id . -             "-" . $self->ScripObj->id . -             "-" . $self->ScripActionObj->{_Message_ID} . -             "@" . $RT::Organization . ">"/eg -      } - -      # In reply to whatever the internal message was in reply to -      $self->SetHeader( 'In-Reply-To', join( " ",  ( @in_reply_to ))); - -      # Default the references to whatever we're in reply to -      @references = @in_reply_to unless @references; - -      # References are unchanged from internal -    } else { -      # In reply to that message -      $self->SetHeader( 'In-Reply-To', join( " ",  ( @msgid ))); - -      # Default the references to whatever we're in reply to -      @references = @in_reply_to unless @references; - -      # Push that message onto the end of the references -      push @references, @msgid; +sub SetPrecedence { +    my $self = shift; + +    unless ( $self->TemplateObj->MIMEObj->head->get("Precedence") ) { +        $self->SetHeader( 'Precedence', "bulk" );      } +} + +# }}} + +# {{{ sub SetSubject + +=head2 SetSubject + +This routine sets the subject. it does not add the rt tag. that gets done elsewhere +If $self->{'Subject'} is already defined, it uses that. otherwise, it tries to get +the transaction's subject. + +=cut  -    # Push pseudo-ref to the front -    my $pseudo_ref = $self->PseudoReference; -    @references = ($pseudo_ref, grep { $_ ne $pseudo_ref } @references); +sub SetSubject { +    my $self = shift; +    my $subject; + +    unless ( $self->TemplateObj->MIMEObj->head->get('Subject') ) { +        my $message = $self->TransactionObj->Attachments; +        my $ticket  = $self->TicketObj->Id; + +        if ( $self->{'Subject'} ) { +            $subject = $self->{'Subject'}; +        } +        elsif (    ( $message->First() ) +                && ( $message->First->Headers ) ) { +            my $header = $message->First->Headers(); +            $header =~ s/\n\s+/ /g; +            if ( $header =~ /^Subject: (.*?)$/m ) { +                $subject = $1; +            } +            else { +                $subject = $self->TicketObj->Subject(); +            } + +        } +        else { +            $subject = $self->TicketObj->Subject(); +        } -    # If there are more than 10 references headers, remove all but the -    # first four and the last six (Gotta keep this from growing -    # forever) -    splice(@references, 4, -6) if ($#references >= 10); +        $subject =~ s/(\r\n|\n|\s)/ /gi; -    # Add on the references -    $self->SetHeader( 'References', join( " ",   @references) ); -    $self->TemplateObj->MIMEObj->head->fold_length( 'References', 80 ); +        chomp $subject; +        $self->SetHeader( 'Subject', $subject ); +    } +    return ($subject);  }  # }}} -=head2 PseudoReference +# {{{ sub SetSubjectToken -Returns a fake Message-ID: header for the ticket to allow a base level of threading +=head2 SetSubjectToken -=cut +This routine fixes the RT tag in the subject. It's unlikely that you want to overwrite this. -sub PseudoReference { +=cut +sub SetSubjectToken {      my $self = shift; -    my $pseudo_ref =  '<RT-Ticket-'.$self->TicketObj->id .'@'.$RT::Organization .'>'; -    return $pseudo_ref; +    my $tag  = "[$RT::rtname #" . $self->TicketObj->id . "]"; +    my $sub  = $self->TemplateObj->MIMEObj->head->get('Subject'); +    unless ( $sub =~ /\Q$tag\E/ ) { +        $sub =~ s/(\r\n|\n|\s)/ /gi; +        chomp $sub; +        $self->TemplateObj->MIMEObj->head->replace( 'Subject', "$tag $sub" ); +    }  } +# }}} -# {{{ SetHeadingAsEncoding +# }}} + +# {{{  =head2 SetHeaderAsEncoding($field_name, $charset_encoding) @@ -928,6 +640,10 @@ sub SetHeaderAsEncoding {      my $value = $self->TemplateObj->MIMEObj->head->get($field); +    # don't bother if it's us-ascii + +    # See RT::I18N, 'NOTES:  Why Encode::_utf8_off before Encode::from_to' +      $value =  $self->MIMEEncodeString($value, $enc);      $self->TemplateObj->MIMEObj->head->replace( $field, $value ); @@ -936,7 +652,7 @@ sub SetHeaderAsEncoding {  }   # }}} -# {{{ MIMEEncodeString +# {{{ MIMENcodeString  =head2 MIMEEncodeString STRING ENCODING @@ -947,52 +663,15 @@ Takes a string and a possible encoding and returns the string wrapped in MIME go  sub MIMEEncodeString {      my  $self = shift;      my $value = shift; -    # using RFC2047 notation, sec 2. -    # encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" -    my $charset = shift; -    my $encoding = 'B'; -    # An 'encoded-word' may not be more than 75 characters long -    # -    # MIME encoding increases 4/3*(number of bytes), and always in multiples -    # of 4. Thus we have to find the best available value of bytes available -    # for each chunk. -    # -    # First we get the integer max which max*4/3 would fit on space. -    # Then we find the greater multiple of 3 lower or equal than $max. -    my $max = int(((75-length('=?'.$charset.'?'.$encoding.'?'.'?='))*3)/4); -    $max = int($max/3)*3; +    my $enc = shift;      chomp $value; - -    if ( $max <= 0 ) { -      # gives an error... -      $RT::Logger->crit("Can't encode! Charset or encoding too big.\n"); -      return ($value); -    } -      return ($value) unless $value =~ /[^\x20-\x7e]/;      $value =~ s/\s*$//; - -    # we need perl string to split thing char by char -    Encode::_utf8_on($value) unless Encode::is_utf8( $value ); - -    my ($tmp, @chunks) = ('', ()); -    while ( length $value ) { -        my $char = substr($value, 0, 1, ''); -        my $octets = Encode::encode( $charset, $char ); -        if ( length($tmp) + length($octets) > $max ) { -            push @chunks, $tmp; -            $tmp = ''; -        } -        $tmp .= $octets; -    } -    push @chunks, $tmp if length $tmp; - -    # encode an join chuncks -    $value = join "\n ", -               map encode_mimeword( $_, $encoding, $charset ), @chunks ; -    return($value);  +    Encode::_utf8_off($value); +    my $res = Encode::from_to( $value, "utf-8", $enc ); +    $value = encode_mimeword( $value,  'B', $enc );  }  # }}} diff --git a/rt/lib/RT/Attachment.pm b/rt/lib/RT/Attachment.pm index f0a19874c..2ed520162 100755 --- a/rt/lib/RT/Attachment.pm +++ b/rt/lib/RT/Attachment.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -134,7 +110,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -143,14 +119,14 @@ Returns the current value of id.  =cut -=head2 TransactionId +=item TransactionId  Returns the current value of TransactionId.   (In the database, TransactionId is stored as int(11).) -=head2 SetTransactionId VALUE +=item SetTransactionId VALUE  Set TransactionId to VALUE.  @@ -161,14 +137,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Parent +=item Parent  Returns the current value of Parent.   (In the database, Parent is stored as int(11).) -=head2 SetParent VALUE +=item SetParent VALUE  Set Parent to VALUE.  @@ -179,14 +155,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 MessageId +=item MessageId  Returns the current value of MessageId.   (In the database, MessageId is stored as varchar(160).) -=head2 SetMessageId VALUE +=item SetMessageId VALUE  Set MessageId to VALUE.  @@ -197,14 +173,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Subject +=item Subject  Returns the current value of Subject.   (In the database, Subject is stored as varchar(255).) -=head2 SetSubject VALUE +=item SetSubject VALUE  Set Subject to VALUE.  @@ -215,14 +191,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Filename +=item Filename  Returns the current value of Filename.   (In the database, Filename is stored as varchar(255).) -=head2 SetFilename VALUE +=item SetFilename VALUE  Set Filename to VALUE.  @@ -233,14 +209,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ContentType +=item ContentType  Returns the current value of ContentType.   (In the database, ContentType is stored as varchar(80).) -=head2 SetContentType VALUE +=item SetContentType VALUE  Set ContentType to VALUE.  @@ -251,14 +227,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ContentEncoding +=item ContentEncoding  Returns the current value of ContentEncoding.   (In the database, ContentEncoding is stored as varchar(80).) -=head2 SetContentEncoding VALUE +=item SetContentEncoding VALUE  Set ContentEncoding to VALUE.  @@ -269,14 +245,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Content +=item Content  Returns the current value of Content.   (In the database, Content is stored as longtext.) -=head2 SetContent VALUE +=item SetContent VALUE  Set Content to VALUE.  @@ -287,14 +263,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Headers +=item Headers  Returns the current value of Headers.   (In the database, Headers is stored as longtext.) -=head2 SetHeaders VALUE +=item SetHeaders VALUE  Set Headers to VALUE.  @@ -305,7 +281,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -314,7 +290,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -324,33 +300,33 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          TransactionId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Parent =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          MessageId =>  -		{read => 1, write => 1, sql_type => 12, length => 160,  is_blob => 0,  is_numeric => 0,  type => 'varchar(160)', default => ''}, +		{read => 1, write => 1, type => 'varchar(160)', default => ''},          Subject =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          Filename =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          ContentType =>  -		{read => 1, write => 1, sql_type => 12, length => 80,  is_blob => 0,  is_numeric => 0,  type => 'varchar(80)', default => ''}, +		{read => 1, write => 1, type => 'varchar(80)', default => ''},          ContentEncoding =>  -		{read => 1, write => 1, sql_type => 12, length => 80,  is_blob => 0,  is_numeric => 0,  type => 'varchar(80)', default => ''}, +		{read => 1, write => 1, type => 'varchar(80)', default => ''},          Content =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'longtext', default => ''}, +		{read => 1, write => 1, type => 'longtext', default => ''},          Headers =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'longtext', default => ''}, +		{read => 1, write => 1, type => 'longtext', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -382,7 +358,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Attachments.pm b/rt/lib/RT/Attachments.pm index 44115492f..177cdd094 100755 --- a/rt/lib/RT/Attachments.pm +++ b/rt/lib/RT/Attachments.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Attachment item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Condition/AnyTransaction.pm b/rt/lib/RT/Condition/AnyTransaction.pm index 9b1bb8cfb..4519fcf5a 100644 --- a/rt/lib/RT/Condition/AnyTransaction.pm +++ b/rt/lib/RT/Condition/AnyTransaction.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  package RT::Condition::AnyTransaction; diff --git a/rt/lib/RT/Condition/Generic.pm b/rt/lib/RT/Condition/Generic.pm index da6ec476c..bd269315e 100755 --- a/rt/lib/RT/Condition/Generic.pm +++ b/rt/lib/RT/Condition/Generic.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  =head1 NAME    RT::Condition::Generic - ; @@ -52,7 +28,7 @@  =head1 SYNOPSIS      use RT::Condition::Generic; -    my $foo = RT::Condition::Generic->new(  +    my $foo = new RT::Condition::IsApplicable(   		TransactionObj => $tr,   		TicketObj => $ti,   		ScripObj => $scr,  @@ -81,8 +57,10 @@ ok (require RT::Condition::Generic);  package RT::Condition::Generic; +use RT::Base;  use strict; -use base qw/RT::Base/; +use vars qw/@ISA/; +@ISA = qw(RT::Base);  # {{{ sub new   sub new  { @@ -104,7 +82,6 @@ sub _Init  {  	       TemplateObj => undef,  	       Argument => undef,  	       ApplicableTransTypes => undef, -           CurrentUser => undef,  	       @_ );    $self->{'Argument'} = $args{'Argument'}; @@ -112,7 +89,6 @@ sub _Init  {    $self->{'TicketObj'} = $args{'TicketObj'};    $self->{'TransactionObj'} = $args{'TransactionObj'};    $self->{'ApplicableTransTypes'} = $args{'ApplicableTransTypes'}; -  $self->CurrentUser($args{'CurrentUser'});  }  # }}} diff --git a/rt/lib/RT/Condition/StatusChange.pm b/rt/lib/RT/Condition/StatusChange.pm index 20da9e728..8afabcda0 100644 --- a/rt/lib/RT/Condition/StatusChange.pm +++ b/rt/lib/RT/Condition/StatusChange.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK diff --git a/rt/lib/RT/CurrentUser.pm b/rt/lib/RT/CurrentUser.pm index 3193034a5..4ca2f9891 100755 --- a/rt/lib/RT/CurrentUser.pm +++ b/rt/lib/RT/CurrentUser.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.)  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  =head1 NAME    RT::CurrentUser - an RT object representing the current user @@ -75,7 +51,8 @@ use RT::Record;  use RT::I18N;  use strict; -use base qw/RT::Record/; +use vars qw/@ISA/; +@ISA= qw(RT::Record);  # {{{ sub _Init  @@ -83,30 +60,17 @@ use base qw/RT::Record/;  # to be a CurrentUser object. but that's hard to do when we're trying to load  # the CurrentUser object -sub _Init { -    my $self = shift; -    my $User = shift; - -    $self->{'table'} = "Users"; - -    if ( defined($User) ) { - -        if (   UNIVERSAL::isa( $User, 'RT::User' ) -            || UNIVERSAL::isa( $User, 'RT::CurrentUser' ) ) -        { -            $self->Load( $User->id ); +sub _Init  { +  my $self = shift; +  my $Name = shift; -        } -        elsif ( ref($User) ) { -            $RT::Logger->crit( -                "RT::CurrentUser->new() called with a bogus argument: $User"); -        } -        else { -            $self->Load($User); -        } -    } +  $self->{'table'} = "Users"; -    $self->_BuildTableAttributes(); +  if (defined($Name)) { +    $self->Load($Name); +  } +   +  $self->CurrentUser($self);  }  # }}} @@ -140,13 +104,15 @@ sub Delete {  sub UserObj {      my $self = shift; +    unless ($self->{'UserObj'}) {  	use RT::User; -	my $user = RT::User->new($self); - -	unless ($user->Load($self->Id)) { +	$self->{'UserObj'} = RT::User->new($self); +	unless ($self->{'UserObj'}->Load($self->Id)) {  	    $RT::Logger->err($self->loc("Couldn't load [_1] from the users database.\n", $self->Id));  	} -    return ($user); +	 +    } +    return ($self->{'UserObj'});  }  # }}} @@ -187,18 +153,18 @@ sub PrincipalId {  # {{{ sub _Accessible  - - - sub _CoreAccessible  { -     { -         Name           => { 'read' => 1 }, -           Gecos        => { 'read' => 1 }, -           RealName     => { 'read' => 1 }, -           Lang     => { 'read' => 1 }, -           Password     => { 'read' => 0, 'write' => 0 }, -          EmailAddress => { 'read' => 1, 'write' => 0 } -     }; -   +sub _Accessible  { +  my $self = shift; +  my %Cols = ( +	      Name => 'read', +	      Gecos => 'read', +	      RealName => 'read', +	      Password => 'neither', +	      EmailAddress => 'read', +	      Privileged => 'read', +	      IsAdministrator => 'read' +	     ); +  return($self->SUPER::_Accessible(@_, %Cols));  }  # }}} @@ -246,7 +212,6 @@ sub LoadByGecos  {  Loads a User into this CurrentUser object.  Takes a Name. -  =cut  sub LoadByName { @@ -276,11 +241,6 @@ sub Load  {    if ($identifier !~ /\D/) {      $self->SUPER::LoadById($identifier);    } - -  elsif (UNIVERSAL::isa($identifier,"RT::User")) { -         # DWIM if they pass a user in -         $self->SUPER::LoadById($identifier->Id); -  }     else {        # This is a bit dangerous, we might get false authen if somebody        # uses ambigous userids or real names: @@ -353,15 +313,12 @@ specification. but currently doesn't  =begin testing  ok (my $cu = RT::CurrentUser->new('root')); -ok (my $lh = $cu->LanguageHandle('en-us')); -ok (defined $lh); +ok (my $lh = $cu->LanguageHandle); +ok ($lh != undef);  ok ($lh->isa('Locale::Maketext')); -is ($cu->loc('TEST_STRING'), "Concrete Mixer", "Localized TEST_STRING into English"); +ok ($cu->loc('TEST_STRING') eq "Concrete Mixer", "Localized TEST_STRING into English");  ok ($lh = $cu->LanguageHandle('fr')); -SKIP: { -    skip "fr locale is not loaded", 1 unless grep $_ eq 'fr', @RT::LexiconLanguages; -    is ($cu->loc('Before'), "Avant", "Localized TEST_STRING into Frenc"); -} +ok ($cu->loc('Before') eq "Avant", "Localized TEST_STRING into Frenc");  =end testing @@ -369,24 +326,16 @@ SKIP: {  sub LanguageHandle {      my $self = shift; -    if (   ( !defined $self->{'LangHandle'} ) -        || ( !UNIVERSAL::can( $self->{'LangHandle'}, 'maketext' ) ) -        || (@_) ) { -        if ( !$RT::SystemUser or ($self->id || 0) == $RT::SystemUser->id() ) { -            @_ = qw(en-US); -        } - -        elsif ( $self->Lang ) { -            push @_, $self->Lang; -        } +    if  ((!defined $self->{'LangHandle'}) ||  +         (!UNIVERSAL::can($self->{'LangHandle'}, 'maketext')) ||  +         (@_))  {          $self->{'LangHandle'} = RT::I18N->get_handle(@_);      } -      # Fall back to english. -    unless ( $self->{'LangHandle'} ) { +    unless ($self->{'LangHandle'}) {          die "We couldn't get a dictionary. Nye mogu naidti slovar. No puedo encontrar dictionario.";      } -    return ( $self->{'LangHandle'} ); +    return ($self->{'LangHandle'});  }  sub loc { @@ -406,7 +355,7 @@ sub loc {  sub loc_fuzzy {      my $self = shift; -    return '' if (!$_[0] ||  $_[0] eq ''); +    return '' if $_[0] eq '';      # XXX: work around perl's deficiency when matching utf8 data      return $_[0] if Encode::is_utf8($_[0]); @@ -416,62 +365,6 @@ sub loc_fuzzy {  }  # }}} - -=head2 CurrentUser - -Return  the current currentuser object - -=cut - -sub CurrentUser { -    my $self = shift; -    return($self); - -} - -=head2 Authenticate - -Takes $password, $created and $nonce, and returns a boolean value -representing whether the authentication succeeded. - -If both $nonce and $created are specified, validate $password against: - -    encode_base64(sha1( -	$nonce . -	$created . -	sha1_hex( "$username:$realm:$server_pass" ) -    )) - -where $server_pass is the md5_hex(password) digest stored in the -database, $created is in ISO time format, and $nonce is a random -string no longer than 32 bytes. - -=cut - -sub Authenticate {  -    my ($self, $password, $created, $nonce, $realm) = @_; - -    require Digest::MD5; -    require Digest::SHA1; -    require MIME::Base64; - -    my $username = $self->UserObj->Name or return; -    my $server_pass = $self->UserObj->__Value('Password') or return; -    my $auth_digest = MIME::Base64::encode_base64(Digest::SHA1::sha1( -	$nonce . -	$created . -	Digest::MD5::md5_hex("$username:$realm:$server_pass") -    )); - -    chomp($password); -    chomp($auth_digest); - -    return ($password eq $auth_digest); -} - -# }}} - -  eval "require RT::CurrentUser_Vendor";  die $@ if ($@ && $@ !~ qr{^Can't locate RT/CurrentUser_Vendor.pm});  eval "require RT::CurrentUser_Local"; diff --git a/rt/lib/RT/Date.pm b/rt/lib/RT/Date.pm index 8e9383fd7..355370ada 100644 --- a/rt/lib/RT/Date.pm +++ b/rt/lib/RT/Date.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.)  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  =head1 NAME    RT::Date - a simple Object Oriented date. @@ -227,28 +203,23 @@ sub Set {  # {{{ sub SetToMidnight  -=head2 SetToMidnight [Timezone => 'utc'] +=head2 SetToMidnight -Sets the date to midnight (at the beginning of the day). +Sets the date to midnight (at the beginning of the day) GMT  Returns the unixtime at midnight. -Arguments: - -=over 4 - -=item Timezone - Timezone context C<server> or C<UTC> -  =cut  sub SetToMidnight {      my $self = shift; -    my %args = ( Timezone => 'UTC', @_ ); -    if ( lc $args{'Timezone'} eq 'server' ) { -        $self->Unix( Time::Local::timelocal( 0,0,0,(localtime $self->Unix)[3..7] ) ); -    } else { -        $self->Unix( Time::Local::timegm( 0,0,0,(gmtime $self->Unix)[3..7] ) ); -    } +     +    use Time::Local; +    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($self->Unix); +    $self->Unix(timegm (0,0,0,$mday,$mon,$year,$wday,$yday)); +          return ($self->Unix); +     +      } @@ -359,8 +330,7 @@ sub DurationAsString {          $s         = int( $duration / $YEAR );          $time_unit = $self->loc("years");      } - -    if ($negative) { +    if (0) { # For now, never display the "AGO" # $negative) {          return $self->loc( "[_1] [_2] ago", $s, $time_unit );      }      else { @@ -405,7 +375,6 @@ sub AsString {  # }}}  # {{{ GetWeekday -  =head2 GetWeekday DAY  Takes an integer day of week and returns a localized string for that day of week @@ -428,7 +397,6 @@ sub GetWeekday {  # }}}  # {{{ GetMonth -  =head2 GetMonth DAY  Takes an integer month and returns a localized string for that month  @@ -561,65 +529,8 @@ sub ISO {  # }}} -# {{{ sub Date - -=head2 Date - -Takes nothing - -Returns the object's date in yyyy-mm-dd format; this is the same as -the ISO format without the time - -=cut - -sub Date { -    my $self = shift; -    my ($date, $time) = split ' ', $self->ISO; -    return $date; -} - -# }}}} - -# {{{ sub Time - -=head2 Time - -Takes nothing - -Returns the object's time in hh:mm:ss format; this is the same as -the ISO format without the date - -=cut - -sub Time { -    my $self = shift; -    my ($date, $time) = split ' ', $self->ISO; -    return $time; -} - -# }}}} - -# {{{ sub W3CDTF - -=head2 W3CDTF - -Takes nothing - -Returns the object's date in W3C DTF format - -=cut - -sub W3CDTF { -    my $self = shift; -    my $date = $self->ISO . 'Z'; -    $date =~ s/ /T/; -    return $date; -}; - -# }}}  # {{{ sub LocalTimezone  -  =head2 LocalTimezone    Returns the current timezone. For now, draws off a system timezone, RT::Timezone. Eventually, this may diff --git a/rt/lib/RT/Extension/ActivityReports.pm b/rt/lib/RT/Extension/ActivityReports.pm new file mode 100644 index 000000000..52d8ba6ab --- /dev/null +++ b/rt/lib/RT/Extension/ActivityReports.pm @@ -0,0 +1,3 @@ +package RT::Extension::ActivityReports; + +our $VERSION = '0.2'; diff --git a/rt/lib/RT/Group.pm b/rt/lib/RT/Group.pm index 53aa326ff..4dcef3f07 100755 --- a/rt/lib/RT/Group.pm +++ b/rt/lib/RT/Group.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -93,7 +69,7 @@ Create takes a hash of values and creates a row in the database:    varchar(255) 'Description'.    varchar(64) 'Domain'.    varchar(64) 'Type'. -  int(11) 'Instance'. +  varchar(64) 'Instance'.  =cut @@ -122,7 +98,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -131,14 +107,14 @@ Returns the current value of id.  =cut -=head2 Name +=item Name  Returns the current value of Name.   (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE  Set Name to VALUE.  @@ -149,14 +125,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Description +=item Description  Returns the current value of Description.   (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE  Set Description to VALUE.  @@ -167,14 +143,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Domain +=item Domain  Returns the current value of Domain.   (In the database, Domain is stored as varchar(64).) -=head2 SetDomain VALUE +=item SetDomain VALUE  Set Domain to VALUE.  @@ -185,14 +161,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Type +=item Type  Returns the current value of Type.   (In the database, Type is stored as varchar(64).) -=head2 SetType VALUE +=item SetType VALUE  Set Type to VALUE.  @@ -203,40 +179,40 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Instance +=item Instance  Returns the current value of Instance.  -(In the database, Instance is stored as int(11).) +(In the database, Instance is stored as varchar(64).) -=head2 SetInstance VALUE +=item SetInstance VALUE  Set Instance to VALUE.   Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Instance will be stored as a int(11).) +(In the database, Instance will be stored as a varchar(64).)  =cut -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Name =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Description =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          Domain =>  -		{read => 1, write => 1, sql_type => 12, length => 64,  is_blob => 0,  is_numeric => 0,  type => 'varchar(64)', default => ''}, +		{read => 1, write => 1, type => 'varchar(64)', default => ''},          Type =>  -		{read => 1, write => 1, sql_type => 12, length => 64,  is_blob => 0,  is_numeric => 0,  type => 'varchar(64)', default => ''}, +		{read => 1, write => 1, type => 'varchar(64)', default => ''},          Instance =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, write => 1, type => 'varchar(64)', default => ''},   }  }; @@ -268,7 +244,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/GroupMember.pm b/rt/lib/RT/GroupMember.pm index f943bd927..8de1a73fe 100755 --- a/rt/lib/RT/GroupMember.pm +++ b/rt/lib/RT/GroupMember.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -113,7 +89,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -122,14 +98,14 @@ Returns the current value of id.  =cut -=head2 GroupId +=item GroupId  Returns the current value of GroupId.   (In the database, GroupId is stored as int(11).) -=head2 SetGroupId VALUE +=item SetGroupId VALUE  Set GroupId to VALUE.  @@ -140,14 +116,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 MemberId +=item MemberId  Returns the current value of MemberId.   (In the database, MemberId is stored as int(11).) -=head2 SetMemberId VALUE +=item SetMemberId VALUE  Set MemberId to VALUE.  @@ -159,15 +135,15 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          GroupId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          MemberId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},   }  }; @@ -199,7 +175,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/GroupMembers.pm b/rt/lib/RT/GroupMembers.pm index 8c4313383..31cb9536f 100755 --- a/rt/lib/RT/GroupMembers.pm +++ b/rt/lib/RT/GroupMembers.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::GroupMember item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Groups.pm b/rt/lib/RT/Groups.pm index 8522aa57c..29f12a5a0 100755 --- a/rt/lib/RT/Groups.pm +++ b/rt/lib/RT/Groups.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Group item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Groups_Overlay.pm b/rt/lib/RT/Groups_Overlay.pm index 0cbebec04..82e021c16 100644 --- a/rt/lib/RT/Groups_Overlay.pm +++ b/rt/lib/RT/Groups_Overlay.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -415,6 +415,7 @@ sub WithRight {      $from_group->WithGroupRight( %args );      #XXX: DIRTY HACK +    use DBIx::SearchBuilder 1.50; #no version on ::Union :(      use DBIx::SearchBuilder::Union;      my $union = new DBIx::SearchBuilder::Union;      $union->add($from_role); diff --git a/rt/lib/RT/Handle.pm b/rt/lib/RT/Handle.pm index b5f94d814..5cdb65e5b 100644 --- a/rt/lib/RT/Handle.pm +++ b/rt/lib/RT/Handle.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# CONTRIBUTION SUBMISSION POLICY:  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  =head1 NAME    RT::Handle - RT's database handle @@ -72,13 +48,7 @@ use vars qw/@ISA/;  eval "use DBIx::SearchBuilder::Handle::$RT::DatabaseType;  \@ISA= qw(DBIx::SearchBuilder::Handle::$RT::DatabaseType);"; - -if ($@) { -    die "Unable to load DBIx::SearchBuilder database handle for '$RT::DatabaseType'.". -        "\n". -        "Perhaps you've picked an invalid database type or spelled it incorrectly.". -        "\n". $@; -} +#TODO check for errors here.  =head2 Connect @@ -88,41 +58,29 @@ Takes nothing. Calls SUPER::Connect with the needed args  =cut  sub Connect { -    my $self = shift; +my $self=shift; -    if ($RT::DatabaseType eq 'Oracle') { -        $ENV{'NLS_LANG'} = "AMERICAN_AMERICA.AL32UTF8"; -        $ENV{'NLS_NCHAR'} = "AL32UTF8"; -         -    } +# Unless the database port is a positive integer, we really don't want to pass it. -    $self->SUPER::Connect( +$self->SUPER::Connect(  			 User => $RT::DatabaseUser,  			 Password => $RT::DatabasePassword,  			); - -    $self->dbh->{LongReadLen} = $RT::MaxAttachmentSize;  } -=head2 BuildDSN +=item BuildDSN  Build the DSN for the RT database. doesn't take any parameters, draws all that  from the config file.  =cut -use File::Spec;  sub BuildDSN {      my $self = shift; -# Unless the database port is a positive integer, we really don't want to pass it.  $RT::DatabasePort = undef unless (defined $RT::DatabasePort && $RT::DatabasePort =~ /^(\d+)$/);  $RT::DatabaseHost = undef unless (defined $RT::DatabaseHost && $RT::DatabaseHost ne ''); -$RT::DatabaseName = File::Spec->catfile($RT::VarPath, $RT::DatabaseName) -    if ($RT::DatabaseType eq 'SQLite') and -	not File::Spec->file_name_is_absolute($RT::DatabaseName); -      $self->SUPER::BuildDSN(Host => $RT::DatabaseHost,   			 Database => $RT::DatabaseName,  diff --git a/rt/lib/RT/I18N/en_malkovich.po b/rt/lib/RT/I18N/en_malkovich.po deleted file mode 100644 index 74769f1a3..000000000 --- a/rt/lib/RT/I18N/en_malkovich.po +++ /dev/null @@ -1,3973 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: html/Approvals/Elements/Approve:26 html/Approvals/Elements/ShowDependency:49 html/SelfService/Display.html:24 html/Ticket/Display.html:25 html/Ticket/Display.html:29 -#. ($TicketObj->Id, $TicketObj->Subject) -#. ($Ticket->id, $Ticket->Subject) -#. ($ticket->Id, $ticket->Subject) -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "#%1: %2" -msgstr "#%1: %2" - -#: html/Search/Elements/SelectPersonType:30 lib/RT/Date.pm:337 -#. ($s, $time_unit) -#. ($option, $subtype) -msgid "%1 %2" -msgstr "%1 %2" - -#: lib/RT/Tickets_Overlay.pm:828 -#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}) -msgid "%1 %2 %3" -msgstr "%1 %2 %3" - -#: lib/RT/Date.pm:373 -#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900)) -msgid "%1 %2 %3 %4:%5:%6 %7" -msgstr "%1 %2 %3 %4:%5:%6 %7" - -#: lib/RT/Ticket_Overlay.pm:3451 lib/RT/Transaction_Overlay.pm:550 lib/RT/Transaction_Overlay.pm:593 -#. ($cf->Name, $new_value->Content) -#. ($field, $self->NewValue) -#. ($self->Field, $principal->Object->Name) -msgid "%1 %2 added" -msgstr "%1 %2 Malkovich" - -#: lib/RT/Date.pm:334 -#. ($s, $time_unit) -msgid "%1 %2 ago" -msgstr "%1 %2 ago" - -#: lib/RT/Ticket_Overlay.pm:3457 lib/RT/Transaction_Overlay.pm:557 -#. ($cf->Name, $old_value, $new_value->Content) -#. ($field, $self->OldValue, $self->NewValue) -msgid "%1 %2 changed to %3" -msgstr "%1 %2 Malkovich to %3" - -#: lib/RT/Ticket_Overlay.pm:3454 lib/RT/Transaction_Overlay.pm:553 lib/RT/Transaction_Overlay.pm:599 -#. ($cf->Name, $old_value) -#. ($field, $self->OldValue) -#. ($self->Field, $principal->Object->Name) -msgid "%1 %2 deleted" -msgstr "%1 %2 Malkovich" - -#: html/Admin/Elements/EditScrips:43 html/Admin/Elements/ListGlobalScrips:27 html/Ticket/Elements/PreviewScrips:53 -#. ($scrip->ConditionObj->Name, $scrip->ActionObj->Name, $scrip->TemplateObj->Name) -#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name)) -msgid "%1 %2 with template %3" -msgstr "%1 %2 Malkovich %3" - -#: bin/rt-crontool:165 bin/rt-crontool:172 bin/rt-crontool:178 -#. ("--search-argument", "--search") -#. ("--condition-argument", "--condition") -#. ("--action-argument", "--action") -msgid "%1 - An argument to pass to %2" -msgstr "%1 - A Malkovich to pass to %2" - -#: bin/rt-crontool:181 -#. ("--verbose") -msgid "%1 - Output status updates to STDOUT" -msgstr "%1 - Malkovich Malkovich to MALKOVICH" - -#: bin/rt-crontool:175 -#. ("--action") -msgid "%1 - Specify the action module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: bin/rt-crontool:169 -#. ("--condition") -msgid "%1 - Specify the condition module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: bin/rt-crontool:162 -#. ("--search") -msgid "%1 - Specify the search module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: lib/RT/ScripAction_Overlay.pm:114 -#. ($self->Id) -msgid "%1 ScripAction loaded" -msgstr "%1 Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3484 -#. ($args{'Value'}, $cf->Name) -msgid "%1 added as a value for %2" -msgstr "%1 Malkovich as a Malkovich %2" - -#: lib/RT/Link_Overlay.pm:111 lib/RT/Link_Overlay.pm:118 -#. ($args{'Base'}) -#. ($args{'Target'}) -msgid "%1 appears to be a local object, but can't be found in the database" -msgstr "%1 Malkovich to be a Malkovich, but can't be Malkovich in the Malkovich" - -#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:458 -#. ($self->BriefDescription , $self->CreatorObj->Name) -#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) -msgid "%1 by %2" -msgstr "%1 by %2" - -#: lib/RT/Transaction_Overlay.pm:512 lib/RT/Transaction_Overlay.pm:688 lib/RT/Transaction_Overlay.pm:697 lib/RT/Transaction_Overlay.pm:700 -#. ($self->Field , ( $self->OldValue || $no_value ) ,  $self->NewValue) -#. ($self->Field , $q1->Name , $q2->Name) -#. ($self->Field, $t2->AsString, $t1->AsString) -#. ($self->Field, $self->OldValue, $self->NewValue) -msgid "%1 changed from %2 to %3" -msgstr "%1 Malkovich %2 to %3" - -#: lib/RT/Record.pm:739 -msgid "%1 could not be set to %2." -msgstr "%1 Malkovich be set to %2." - -#: lib/RT/Ticket_Overlay.pm:2739 -#. ($self) -msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent." -msgstr "%1 couldn't Malkovich to Malkovich. RT's Malkovich be Malkovich." - -#: NOT FOUND IN SOURCE -msgid "%1 highest priority tickets I own..." -msgstr "%1 Malkovich Malkovich I Malkovich..." - -#: html/Elements/MyTickets:26 -#. ($rows) -msgid "%1 highest priority tickets I requested..." -msgstr "%1 Malkovich Malkovich I Malkovich..." - -#: bin/rt-crontool:157 -#. ($0) -msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron." -msgstr "%1 is a tool to act on Malkovich a Malkovich Malkovich, such as cron." - -#: lib/RT/Queue_Overlay.pm:784 -#. ($principal->Object->Name, $args{'Type'}) -msgid "%1 is no longer a %2 for this queue." -msgstr "%1 is no Malkovich a %2 Malkovich." - -#: lib/RT/Ticket_Overlay.pm:3540 -#. ($args{'Value'}, $cf->Name) -msgid "%1 is no longer a value for custom field %2" -msgstr "%1 is no Malkovich a Malkovich Malkovich %2" - -#: html/Ticket/Create.html:155 html/Ticket/Create.html:156 html/Ticket/Elements/ShowBasics:36 html/Ticket/Elements/ShowBasics:42 html/Ticket/Elements/ShowBasics:47 -#. ('<input size=3 name="TimeWorked" value="'.$ARGS{TimeWorked}.'">') -#. ('<input size=3 name="TimeLeft" value="'.$ARGS{TimeLeft}.'">') -#. ($Ticket->TimeEstimated) -#. ($Ticket->TimeWorked) -#. ($Ticket->TimeLeft) -msgid "%1 min" -msgstr "%1 min" - -#: html/User/Elements/DelegateRights:75 -#. (loc($ObjectType =~ /^RT::(.*)$/)) -msgid "%1 rights" -msgstr "%1 Malkovich" - -#: lib/RT/Action/ResolveMembers.pm:41 -#. (ref $self) -msgid "%1 will resolve all members of a resolved group ticket." -msgstr "%1 Malkovich Malkovich of a Malkovich Malkovich." - -#: lib/RT/Transaction_Overlay.pm:408 -#. ($self) -msgid "%1: no attachment specified" -msgstr "%1: no Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransactionAttachments:56 -#. ($size) -msgid "%1b" -msgstr "%1b" - -#: html/Ticket/Elements/ShowTransactionAttachments:53 -#. (int( $size / 102.4 ) / 10) -msgid "%1k" -msgstr "%1k" - -#: lib/RT/Ticket_Overlay.pm:1252 -#. ($args{'Status'}) -msgid "'%1' is an invalid value for status" -msgstr "'%1' is a Malkovich Malkovich" - -#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Groups/Members.html:51 html/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 -msgid "(Check box to delete)" -msgstr "(Malkovich to Malkovich)" - -#: html/Ticket/Elements/PreviewScrips:49 -msgid "(Check boxes to disable notifications to the listed recipients)" -msgstr "(Malkovich to Malkovich Malkovich to the Malkovich Malkovich)" - -#: html/Ticket/Elements/PreviewScrips:71 -msgid "(Check boxes to enable notifications to the listed recipients)" -msgstr "(Malkovich to Malkovich Malkovich to the Malkovich Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "(Enter ticket ids or URLs, seperated with spaces)" -msgstr "(Malkovich Malkovich or URLs, Malkovich Malkovich)" - -#: html/Admin/Queues/Modify.html:53 html/Admin/Queues/Modify.html:59 -#. ($RT::CorrespondAddress) -#. ($RT::CommentAddress) -msgid "(If left blank, will default to %1" -msgstr "(If Malkovich, Malkovich to %1" - -#: html/Admin/Elements/EditCustomFields:32 html/Admin/Elements/ListGlobalCustomFields:31 -msgid "(No custom fields)" -msgstr "(No Malkovich)" - -#: html/Admin/Groups/Members.html:49 html/User/Groups/Members.html:52 -msgid "(No members)" -msgstr "(No Malkovich)" - -#: html/Admin/Elements/EditScrips:31 html/Admin/Elements/ListGlobalScrips:31 -msgid "(No scrips)" -msgstr "(No Malkovich)" - -#: html/Admin/Elements/EditTemplates:30 -msgid "(No templates)" -msgstr "(No Malkovich)" - -#: html/Ticket/Update.html:66 -msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Does <b>not</b> Malkovich Malkovich Malkovich Malkovich.)" - -#: html/Ticket/Create.html:78 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich Malkovich Malkovich. Malkovich <b>will</b> Malkovich Malkovich.)" - -#: html/Ticket/Update.html:62 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Does <b>not</b> Malkovich Malkovich Malkovich Malkovich.)" - -#: html/Ticket/Create.html:68 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Malkovich <b>will</b> Malkovich Malkovich.)" - -#: html/Admin/Groups/index.html:32 html/User/Groups/index.html:32 -msgid "(empty)" -msgstr "(Malkovich)" - -#: html/Admin/Users/index.html:38 -msgid "(no name listed)" -msgstr "(no Malkovich)" - -#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:64 html/Ticket/Elements/ShowCustomFields:35 lib/RT/Transaction_Overlay.pm:511 -msgid "(no value)" -msgstr "(no Malkovich)" - -#: html/Elements/EditLinks:105 html/Ticket/Elements/BulkLinks:27 -msgid "(only one ticket)" -msgstr "(Malkovich)" - -#: html/Elements/TicketList:167 -msgid "(pending approval)" -msgstr "(Malkovich Malkovich)" - -#: html/Elements/TicketList:170 -msgid "(pending other Collection)" -msgstr "(Malkovich Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "(pending other tickets)" -msgstr "(Malkovich Malkovich)" - -#: html/Admin/Users/Modify.html:49 -msgid "(required)" -msgstr "(Malkovich)" - -#: html/Ticket/Elements/ShowTransactionAttachments:60 -msgid "(untitled)" -msgstr "(Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "..." -msgstr "..." - -#: html/Ticket/Elements/ShowBasics:31 -msgid "<% $Ticket->Status%>" -msgstr "<% $Ticket->Status %>" - -#: html/Elements/SelectTicketTypes:26 -msgid "<% $_ %>" -msgstr "<% $_ %>" - -#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 lib/RT/StyleGuide.pod:767 -#. ($m->scomp('/Elements/SelectNewTicketQueue')) -msgid "<input type=\"submit\" value=\"New ticket in\"> %1" -msgstr "<input type=\"submit\" value=\"Malkovich in\"> %1" - -#: etc/initialdata:218 -msgid "A blank template" -msgstr "A Malkovich" - -#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:180 -msgid "ACE not found" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:830 -msgid "ACEs can only be created and deleted." -msgstr "Malkovich be Malkovich and Malkovich." - -#: NOT FOUND IN SOURCE -msgid "Aborting to avoid unintended ticket modifications.\\n" -msgstr "Malkovich to Malkovich Malkovich Malkovich Malkovich.\\n" - -#: html/User/Elements/Tabs:31 -msgid "About me" -msgstr "Malkovich me" - -#: html/Admin/Users/Modify.html:79 -msgid "Access control" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:49 -msgid "Action" -msgstr "Malkovich" - -#: lib/RT/Scrip_Overlay.pm:148 -#. ($args{'ScripAction'}) -msgid "Action %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: bin/rt-crontool:119 -msgid "Action committed." -msgstr "Malkovich Malkovich." - -#: bin/rt-crontool:115 -msgid "Action prepared..." -msgstr "Malkovich..." - -#: html/Search/Bulk.html:93 -msgid "Add AdminCc" -msgstr "Malkovich" - -#: html/Search/Bulk.html:89 -msgid "Add Cc" -msgstr "Add Cc" - -#: html/Ticket/Create.html:113 html/Ticket/Update.html:81 -msgid "Add More Files" -msgstr "Malkovich" - -#: html/Search/Bulk.html:85 -msgid "Add Requestor" -msgstr "Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:24 -msgid "Add Value" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:54 -msgid "Add a scrip which will apply to all queues" -msgstr "Add a Malkovich Malkovich to Malkovich" - -#: html/Search/Bulk.html:125 -msgid "Add comments or replies to selected tickets" -msgstr "Malkovich or Malkovich to Malkovich Malkovich" - -#: html/Admin/Groups/Members.html:41 html/User/Groups/Members.html:38 -msgid "Add members" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:65 html/Ticket/Elements/AddWatchers:27 -msgid "Add new watchers" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:684 -#. ($args{'Type'}) -msgid "Added principal as a %1 for this queue" -msgstr "Malkovich as a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1547 -#. ($self->loc($args{'Type'})) -msgid "Added principal as a %1 for this ticket" -msgstr "Malkovich as a %1 Malkovich" - -#: html/Admin/Users/Modify.html:119 html/User/Prefs.html:111 -msgid "Address1" -msgstr "Malkovich1" - -#: html/Admin/Users/Modify.html:124 html/User/Prefs.html:115 -msgid "Address2" -msgstr "Malkovich2" - -#: html/Ticket/Create.html:73 -msgid "Admin Cc" -msgstr "Malkovich Cc" - -#: etc/initialdata:295 -msgid "Admin Comment" -msgstr "Malkovich" - -#: etc/initialdata:274 -msgid "Admin Correspondence" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:24 html/Admin/Queues/index.html:27 -msgid "Admin queues" -msgstr "Malkovich" - -#: html/Admin/Global/index.html:25 html/Admin/Global/index.html:27 -msgid "Admin/Global configuration" -msgstr "Malkovich/Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Admin/Queue/Basics" -msgstr "Malkovich/Malkovich/Malkovich" - -#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:38 lib/RT/ACE_Overlay.pm:88 -msgid "AdminCc" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:73 -msgid "AdminCustomFields" -msgstr "Malkovich Malkovich" - -#: lib/RT/Group_Overlay.pm:146 -msgid "AdminGroup" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:148 -msgid "AdminGroupMembership" -msgstr "Malkovich Malkovich" - -#: lib/RT/System.pm:58 -msgid "AdminOwnPersonalGroups" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:69 -msgid "AdminQueue" -msgstr "Malkovich" - -#: lib/RT/System.pm:59 -msgid "AdminUsers" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 -msgid "Administrative Cc" -msgstr "Malkovich Cc" - -#: html/Elements/SelectDateRelation:35 -msgid "After" -msgstr "Malkovich" - -#: etc/initialdata:363 -msgid "All Approvals Passed" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/EditCustomFields:94 -msgid "All Custom Fields" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:52 -msgid "All Queues" -msgstr "Malkovich" - -#: html/Elements/Tabs:58 -msgid "Approval" -msgstr "Malkovich" - -#: html/Approvals/Display.html:45 html/Approvals/Elements/ShowDependency:41 html/Approvals/index.html:64 -#. ($Ticket->Id, $Ticket->Subject) -#. ($ticket->id, $msg) -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "Approval #%1: %2" -msgstr "Malkovich #%1: %2" - -#: html/Approvals/index.html:53 -#. ($ticket->Id) -msgid "Approval #%1: Notes not recorded due to a system error" -msgstr "Malkovich #%1: Malkovich Malkovich to a Malkovich" - -#: html/Approvals/index.html:51 -#. ($ticket->Id) -msgid "Approval #%1: Notes recorded" -msgstr "Malkovich #%1: Malkovich" - -#: etc/initialdata:351 -msgid "Approval Passed" -msgstr "Malkovich" - -#: etc/initialdata:374 -msgid "Approval Rejected" -msgstr "Malkovich Malkovich" - -#: html/Approvals/Elements/Approve:43 -msgid "Approve" -msgstr "Malkovich" - -#: etc/initialdata:504 -msgid "Approver's notes: %1" -msgstr "Malkovich's Malkovich: %1" - -#: lib/RT/Date.pm:414 -msgid "Apr." -msgstr "Apr." - -#: html/Elements/SelectSortOrder:34 html/Search/Elements/DisplayOptions:52 -msgid "Ascending" -msgstr "Malkovich" - -#: html/Search/Bulk.html:134 html/SelfService/Update.html:47 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:81 -msgid "Attach" -msgstr "Malkovich" - -#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 -msgid "Attach file" -msgstr "Malkovich" - -#: html/SelfService/Update.html:36 html/Ticket/Create.html:97 html/Ticket/Update.html:70 -msgid "Attached file" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:416 -msgid "Attachment created" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1251 -msgid "Attachment filename" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/ShowAttachments:25 -msgid "Attachments" -msgstr "Malkovich" - -#: lib/RT/Attributes_Overlay.pm:158 -msgid "Attribute Deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Date.pm:418 -msgid "Aug." -msgstr "Aug." - -#: NOT FOUND IN SOURCE -msgid "AuthSystem" -msgstr "Malkovich" - -#: etc/initialdata:221 -msgid "Autoreply" -msgstr "Malkovich" - -#: etc/initialdata:72 -msgid "Autoreply To Requestors" -msgstr "Malkovich To Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Bad data in %1" -msgstr "Malkovich in %1" - -#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Ticket/Elements/Tabs:91 html/User/Elements/GroupTabs:37 -msgid "Basics" -msgstr "Malkovich" - -#: html/Ticket/Update.html:64 -msgid "Bcc" -msgstr "Bcc" - -#: html/Admin/Elements/EditScrip:73 -msgid "Be sure to save your changes" -msgstr "Be sure to Malkovich Malkovich" - -#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:336 -msgid "Before" -msgstr "Malkovich" - -#: etc/initialdata:217 -msgid "Blank" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowHistory:38 html/Ticket/Elements/ShowHistory:44 -msgid "Brief headers" -msgstr "Malkovich" - -#: html/Search/Bulk.html:24 html/Search/Bulk.html:25 -msgid "Bulk ticket update" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:1533 -msgid "Can not modify system users" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:68 -msgid "Can this principal see this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:211 -msgid "Can't add a custom field value without a name" -msgstr "Can't add a Malkovich Malkovich Malkovich a name" - -#: lib/RT/Link_Overlay.pm:126 -msgid "Can't link a ticket to itself" -msgstr "Can't link a Malkovich to Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2716 -msgid "Can't merge into a merged ticket. You should never get this error" -msgstr "Can't Malkovich a Malkovich. Malkovich Malkovich Malkovich" - -#: lib/RT/Record.pm:1060 lib/RT/Record.pm:1138 -msgid "Can't specifiy both base and target" -msgstr "Can't Malkovich Malkovich and Malkovich" - -#: html/autohandler:132 -#. ($msg) -msgid "Cannot create user: %1" -msgstr "Malkovich Malkovich: %1" - -#: etc/initialdata:50 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:59 lib/RT/ACE_Overlay.pm:87 -msgid "Cc" -msgstr "Cc" - -#: html/SelfService/Prefs.html:30 -msgid "Change password" -msgstr "Malkovich" - -#: html/SelfService/Update.html:39 html/Ticket/Create.html:100 html/Ticket/Update.html:73 -msgid "Check box to delete" -msgstr "Malkovich to Malkovich" - -#: html/Admin/Elements/SelectRights:30 -msgid "Check box to revoke right" -msgstr "Malkovich to Malkovich" - -#: html/Elements/EditLinks:121 html/Elements/EditLinks:63 html/Elements/ShowLinks:56 html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:42 -msgid "Children" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:129 html/User/Prefs.html:119 -msgid "City" -msgstr "City" - -#: html/Ticket/Elements/ShowDates:47 -msgid "Closed" -msgstr "Malkovich" - -#: html/SelfService/Closed.html:24 -msgid "Closed Tickets" -msgstr "Malkovich" - -#: html/SelfService/Elements/Tabs:44 -msgid "Closed tickets" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowTransaction:152 html/Ticket/Elements/Tabs:154 -msgid "Comment" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:57 -msgid "Comment Address" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:88 -msgid "Comment on tickets" -msgstr "Malkovich on Malkovich" - -#: lib/RT/Queue_Overlay.pm:88 -msgid "CommentOnTicket" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Comments" -msgstr "Malkovich" - -#: html/Ticket/ModifyAll.html:69 html/Ticket/Update.html:51 -msgid "Comments (Not sent to requestors)" -msgstr "Malkovich (Malkovich to Malkovich)" - -#: html/Search/Bulk.html:129 -msgid "Comments (not sent to requestors)" -msgstr "Malkovich (Malkovich to Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "Comments about %1" -msgstr "Malkovich %1" - -#: html/Admin/Users/Modify.html:182 html/Ticket/Elements/ShowRequestor:45 -msgid "Comments about this user" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:537 -msgid "Comments added" -msgstr "Malkovich" - -#: lib/RT/Action/Generic.pm:149 -msgid "Commit Stubbed" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:41 -msgid "Condition" -msgstr "Malkovich" - -#: bin/rt-crontool:105 -msgid "Condition matches..." -msgstr "Malkovich Malkovich..." - -#: lib/RT/Scrip_Overlay.pm:164 -msgid "Condition not found" -msgstr "Malkovich Malkovich" - -#: html/Elements/Tabs:52 -msgid "Configuration" -msgstr "Malkovich" - -#: html/SelfService/Prefs.html:32 -msgid "Confirm" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ContactInfoSystem" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/ModifyTemplate:43 html/Elements/SelectAttachmentField:26 html/Ticket/ModifyAll.html:86 -msgid "Content" -msgstr "Malkovich" - -#: etc/initialdata:286 -msgid "Correspondence" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Correspondence Address" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:533 -msgid "Correspondence added" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3471 -msgid "Could not add new custom field value for ticket. " -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich. " - -#: lib/RT/Ticket_Overlay.pm:2967 lib/RT/Ticket_Overlay.pm:2975 lib/RT/Ticket_Overlay.pm:2992 -msgid "Could not change owner. " -msgstr "Malkovich Malkovich. " - -#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:164 -#. ($msg) -msgid "Could not create CustomField" -msgstr "Malkovich Malkovich Malkovich" - -#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481 -msgid "Could not create group" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/Template.html:74 html/Admin/Queues/Template.html:71 -#. ($msg) -msgid "Could not create template: %1" -msgstr "Malkovich Malkovich: %1" - -#: lib/RT/Ticket_Overlay.pm:1185 lib/RT/Ticket_Overlay.pm:364 -msgid "Could not create ticket. Queue not set" -msgstr "Malkovich Malkovich. Malkovich" - -#: lib/RT/User_Overlay.pm:226 lib/RT/User_Overlay.pm:240 lib/RT/User_Overlay.pm:249 lib/RT/User_Overlay.pm:258 lib/RT/User_Overlay.pm:267 lib/RT/User_Overlay.pm:281 lib/RT/User_Overlay.pm:291 lib/RT/User_Overlay.pm:462 -msgid "Could not create user" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:662 lib/RT/Ticket_Overlay.pm:1515 -msgid "Could not find or create that user" -msgstr "Malkovich or Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:723 lib/RT/Ticket_Overlay.pm:1596 -msgid "Could not find that principal" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Groups/Members.html:87 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 -msgid "Could not load group" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:682 -#. ($args{'Type'}) -msgid "Could not make that principal a %1 for this queue" -msgstr "Malkovich Malkovich Malkovich a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1536 -#. ($self->loc($args{'Type'})) -msgid "Could not make that principal a %1 for this ticket" -msgstr "Malkovich Malkovich Malkovich a %1 Malkovich" - -#: lib/RT/Queue_Overlay.pm:781 -#. ($args{'Type'}) -msgid "Could not remove that principal as a %1 for this queue" -msgstr "Malkovich Malkovich Malkovich as a %1 Malkovich" - -#: lib/RT/Group_Overlay.pm:977 -msgid "Couldn't add member to group" -msgstr "Couldn't Malkovich to Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3481 lib/RT/Ticket_Overlay.pm:3537 -#. ($Msg) -msgid "Couldn't create a transaction: %1" -msgstr "Couldn't Malkovich a Malkovich: %1" - -#: lib/RT/Record.pm:748 -msgid "Couldn't find row" -msgstr "Couldn't Malkovich" - -#: lib/RT/Group_Overlay.pm:951 -msgid "Couldn't find that principal" -msgstr "Couldn't Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:245 -msgid "Couldn't find that value" -msgstr "Couldn't Malkovich" - -#: lib/RT/CurrentUser.pm:123 -#. ($self->Id) -msgid "Couldn't load %1 from the users database.\\n" -msgstr "Couldn't load %1 from the Malkovich.\\n" - -#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 -#. ($id) -msgid "Couldn't load group %1" -msgstr "Couldn't Malkovich %1" - -#: lib/RT/Link_Overlay.pm:169 lib/RT/Link_Overlay.pm:178 lib/RT/Link_Overlay.pm:205 -msgid "Couldn't load link" -msgstr "Couldn't Malkovich" - -#: html/Admin/Elements/EditCustomFields:145 html/Admin/Queues/CustomFields.html:35 html/Admin/Queues/People.html:120 -#. ($id) -msgid "Couldn't load queue" -msgstr "Couldn't Malkovich" - -#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 -#. ($id) -msgid "Couldn't load queue %1" -msgstr "Couldn't Malkovich %1" - -#: NOT FOUND IN SOURCE -msgid "Couldn't load that user (%1)" -msgstr "Couldn't Malkovich (%1)" - -#: html/SelfService/Display.html:116 -#. ($id) -msgid "Couldn't load ticket '%1'" -msgstr "Couldn't Malkovich '%1'" - -#: html/Admin/Users/Modify.html:146 html/User/Prefs.html:131 -msgid "Country" -msgstr "Malkovich" - -#: html/Admin/Elements/CreateUserCalled:25 html/Admin/Elements/EditCustomField:62 html/Admin/Elements/EditScrip:110 html/Admin/Groups/Modify.html:55 html/Admin/Queues/Template.html:44 html/Elements/QuickCreate:23 html/Ticket/Create.html:134 html/Ticket/Create.html:195 html/User/Groups/Modify.html:55 -msgid "Create" -msgstr "Malkovich" - -#: etc/initialdata:135 -msgid "Create Tickets" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:74 -msgid "Create a CustomField" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/CustomField.html:47 -#. ($QueueObj->Name()) -msgid "Create a CustomField for queue %1" -msgstr "Malkovich a Malkovich Malkovich %1" - -#: html/Admin/Global/CustomField.html:47 -msgid "Create a CustomField which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Admin/Groups/Modify.html:66 html/Admin/Groups/Modify.html:92 -msgid "Create a new group" -msgstr "Malkovich a Malkovich" - -#: html/User/Groups/Modify.html:66 html/User/Groups/Modify.html:91 -msgid "Create a new personal group" -msgstr "Malkovich a Malkovich Malkovich" - -#: html/Ticket/Create.html:24 html/Ticket/Create.html:27 html/Ticket/Create.html:35 -msgid "Create a new ticket" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Users/Modify.html:211 html/Admin/Users/Modify.html:268 -msgid "Create a new user" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/Modify.html:103 -msgid "Create a queue" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/Scrip.html:58 -#. ($QueueObj->Name) -msgid "Create a scrip for queue %1" -msgstr "Malkovich a Malkovich %1" - -#: html/Admin/Global/Template.html:68 html/Admin/Queues/Template.html:64 -msgid "Create a template" -msgstr "Malkovich a Malkovich" - -#: html/SelfService/Create.html:24 -msgid "Create a ticket" -msgstr "Malkovich a Malkovich" - -#: etc/initialdata:137 -msgid "Create new tickets based on this scrip's template" -msgstr "Malkovich Malkovich on Malkovich's Malkovich" - -#: html/SelfService/Create.html:77 -msgid "Create ticket" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:86 -msgid "Create tickets in this queue" -msgstr "Malkovich in Malkovich" - -#: lib/RT/Queue_Overlay.pm:73 -msgid "Create, delete and modify custom fields" -msgstr "Malkovich, Malkovich and Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:69 -msgid "Create, delete and modify queues" -msgstr "Malkovich, Malkovich and Malkovich" - -#: lib/RT/System.pm:58 -msgid "Create, delete and modify the members of personal groups" -msgstr "Malkovich, Malkovich and Malkovich the Malkovich of Malkovich" - -#: lib/RT/System.pm:59 -msgid "Create, delete and modify users" -msgstr "Malkovich, Malkovich and Malkovich" - -#: lib/RT/Queue_Overlay.pm:86 -msgid "CreateTicket" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1279 -msgid "Created" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:87 -#. ($CustomFieldObj->Name()) -msgid "Created CustomField %1" -msgstr "Malkovich Malkovich %1" - -#: html/Elements/EditLinks:27 -msgid "Current Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/EditScrips:29 -msgid "Current Scrips" -msgstr "Malkovich" - -#: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41 -msgid "Current members" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:28 -msgid "Current rights" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Current search criteria" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 -msgid "Current watchers" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/CustomField.html:54 -#. ($CustomField) -msgid "Custom Field #%1" -msgstr "Malkovich #%1" - -#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Ticket/Elements/ShowSummary:35 -msgid "Custom Fields" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:101 -msgid "Custom action cleanup code" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:93 -msgid "Custom action preparation code" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:85 -msgid "Custom condition" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1693 -#. ($CF->Name , $args{OPERATOR} , $args{VALUE}) -msgid "Custom field %1 %2 %3" -msgstr "Malkovich %1 %2 %3" - -#: lib/RT/Tickets_Overlay.pm:1688 -#. ($CF->Name) -msgid "Custom field %1 has a value." -msgstr "Malkovich %1 has a Malkovich." - -#: lib/RT/Tickets_Overlay.pm:1685 -#. ($CF->Name) -msgid "Custom field %1 has no value." -msgstr "Malkovich %1 has no Malkovich." - -#: lib/RT/Ticket_Overlay.pm:3373 -#. ($args{'Field'}) -msgid "Custom field %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: html/Admin/Elements/EditCustomFields:195 -msgid "Custom field deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3523 -msgid "Custom field not found" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:355 -#. ($args{'Content'}, $self->Name) -msgid "Custom field value %1 could not be found for custom field %2" -msgstr "Malkovich Malkovich %1 Malkovich be Malkovich Malkovich %2" - -#: lib/RT/CustomField_Overlay.pm:255 -msgid "Custom field value could not be deleted" -msgstr "Malkovich Malkovich Malkovich be Malkovich" - -#: lib/RT/CustomField_Overlay.pm:361 -msgid "Custom field value could not be found" -msgstr "Malkovich Malkovich Malkovich be Malkovich" - -#: lib/RT/CustomField_Overlay.pm:253 lib/RT/CustomField_Overlay.pm:363 -msgid "Custom field value deleted" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:541 -msgid "CustomField" -msgstr "Malkovich" - -#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:94 html/Ticket/ModifyAll.html:43 -msgid "Dates" -msgstr "Malkovich" - -#: lib/RT/Date.pm:422 -msgid "Dec." -msgstr "Dec." - -#: etc/initialdata:222 -msgid "Default Autoresponse template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:296 -msgid "Default admin comment template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:287 -msgid "Default correspondence template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:253 -msgid "Default transaction template" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:519 -#. ($type, $self->Field, $self->OldValue, $self->NewValue) -msgid "Default: %1/%2 changed from %3 to %4" -msgstr "Malkovich: %1/%2 Malkovich %3 to %4" - -#: html/User/Delegation.html:24 html/User/Delegation.html:27 -msgid "Delegate rights" -msgstr "Malkovich" - -#: lib/RT/System.pm:62 -msgid "Delegate specific rights which have been granted to you." -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich to you." - -#: lib/RT/System.pm:62 -msgid "DelegateRights" -msgstr "Malkovich" - -#: html/User/Elements/Tabs:37 -msgid "Delegation" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:53 html/Search/Elements/EditFormat:66 html/Search/Elements/EditSearches:15 -msgid "Delete" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:52 -msgid "Delete selected scrips" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:91 -msgid "Delete tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:91 -msgid "DeleteTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:162 -msgid "Deleting this object could break referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:329 -msgid "Deleting this object would break referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:478 -msgid "Deleting this object would violate referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: html/Approvals/Elements/Approve:44 -msgid "Deny" -msgstr "Deny" - -#: html/Elements/EditLinks:113 html/Elements/EditLinks:44 html/Elements/ShowLinks:36 html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/ShowDependencies:31 -msgid "Depended on by" -msgstr "Malkovich on by" - -#: lib/RT/Transaction_Overlay.pm:621 -#. ($value) -msgid "Dependency by %1 added" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:661 -#. ($value) -msgid "Dependency by %1 deleted" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:618 -#. ($value) -msgid "Dependency on %1 added" -msgstr "Malkovich on %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:658 -#. ($value) -msgid "Dependency on %1 deleted" -msgstr "Malkovich on %1 Malkovich" - -#: html/Elements/EditLinks:109 html/Elements/EditLinks:35 html/Elements/SelectLinkType:26 html/Elements/ShowLinks:26 html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/ShowDependencies:24 -msgid "Depends on" -msgstr "Malkovich on" - -#: html/Elements/SelectSortOrder:34 html/Search/Elements/DisplayOptions:57 -msgid "Descending" -msgstr "Malkovich" - -#: html/SelfService/Create.html:72 html/Ticket/Create.html:118 -msgid "Describe the issue below" -msgstr "Malkovich the Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyTemplate:35 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Elements/SelectGroups:26 html/Search/Elements/EditSearches:8 html/User/Groups/Modify.html:48 -msgid "Description" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:86 -msgid "Display" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:70 -msgid "Display Access Control List" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:76 -msgid "Display Scrip templates for this queue" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:79 -msgid "Display Scrips for this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Ticket/Elements/ShowHistory:34 -msgid "Display mode" -msgstr "Malkovich" - -#: lib/RT/System.pm:53 -msgid "Do anything and everything" -msgstr "Do Malkovich and Malkovich" - -#: html/Elements/Refresh:29 -msgid "Don't refresh this page." -msgstr "Don't Malkovich Malkovich." - -#: NOT FOUND IN SOURCE -msgid "Don't show search results" -msgstr "Don't Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransactionAttachments:60 -msgid "Download" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Download all the tickets as a tab delimited file" -msgstr "Malkovich the Malkovich as a Malkovich Malkovich" - -#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1283 -msgid "Due" -msgstr "Due" - -#: NOT FOUND IN SOURCE -msgid "ERROR: Couldn't load ticket '%1': %2.\\n" -msgstr "MALKOVICH: Couldn't Malkovich '%1': %2.\\n" - -#: html/Admin/Queues/CustomFields.html:45 -#. ($Queue->Name) -msgid "Edit Custom Fields for %1" -msgstr "Malkovich Malkovich %1" - -#: html/Search/Bulk.html:141 html/Ticket/ModifyLinks.html:35 -msgid "Edit Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/Templates.html:41 -#. ($QueueObj->Name) -msgid "Edit Templates for queue %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Global/index.html:45 -msgid "Edit system templates" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/Modify.html:118 -#. ($QueueObj->Name) -msgid "Editing Configuration for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: NOT FOUND IN SOURCE -msgid "Editing Configuration for user %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Elements/EditCustomField:90 -#. ($CustomFieldObj->Name()) -msgid "Editing CustomField %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Groups/Members.html:31 -#. ($Group->Name) -msgid "Editing membership for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/User/Groups/Members.html:128 -#. ($Group->Name) -msgid "Editing membership for personal group %1" -msgstr "Malkovich Malkovich Malkovich Malkovich %1" - -#: lib/RT/Record.pm:1075 lib/RT/Record.pm:1152 -msgid "Either base or target must be specified" -msgstr "Malkovich or Malkovich be Malkovich" - -#: html/Admin/Users/Modify.html:52 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:43 -msgid "Email" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:206 -msgid "Email address in use" -msgstr "Malkovich in use" - -#: NOT FOUND IN SOURCE -msgid "EmailAddress" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "EmailEncoding" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:50 -msgid "Enabled (Unchecking this box disables this custom field)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Groups/Modify.html:52 html/User/Groups/Modify.html:52 -msgid "Enabled (Unchecking this box disables this group)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Queues/Modify.html:83 -msgid "Enabled (Unchecking this box disables this queue)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Elements/EditCustomFields:97 -msgid "Enabled Custom Fields" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:55 -msgid "Enabled Queues" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:308 html/User/Groups/Modify.html:116 -#. (loc_fuzzy($msg)) -msgid "Enabled status %1" -msgstr "Malkovich %1" - -#: lib/RT/CustomField_Overlay.pm:433 -msgid "Enter multiple values" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:430 -msgid "Enter one value" -msgstr "Malkovich" - -#: html/Search/Bulk.html:142 -msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." -msgstr "Malkovich or URIs to Malkovich to. Malkovich Malkovich Malkovich Malkovich." - -#: html/Elements/Login:39 html/SelfService/Error.html:24 html/SelfService/Error.html:25 -msgid "Error" -msgstr "Error" - -#: lib/RT/Queue_Overlay.pm:593 -msgid "Error in parameters to Queue->AddWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Error in parameters to Queue->DelWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1468 -msgid "Error in parameters to Ticket->AddWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Error in parameters to Ticket->DelWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: etc/initialdata:20 -msgid "Everyone" -msgstr "Malkovich" - -#: bin/rt-crontool:190 -msgid "Example:" -msgstr "Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "ExternalAuthId" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ExternalContactInfoId" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:72 -msgid "Extra info" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:342 -msgid "Failed to find 'Privileged' users pseudogroup." -msgstr "Malkovich to find 'Malkovich' Malkovich Malkovich." - -#: lib/RT/User_Overlay.pm:349 -msgid "Failed to find 'Unprivileged' users pseudogroup" -msgstr "Malkovich to find 'Malkovich' Malkovich Malkovich" - -#: bin/rt-crontool:134 -#. ($modname, $@) -msgid "Failed to load module %1. (%2)" -msgstr "Malkovich to Malkovich %1. (%2)" - -#: lib/RT/Date.pm:412 -msgid "Feb." -msgstr "Feb." - -#: html/Search/Elements/PickBasics:60 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:57 lib/RT/Tickets_Overlay.pm:1153 -msgid "Final Priority" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1274 -msgid "FinalPriority" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 -msgid "Find group whose" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29 -msgid "Find people whose" -msgstr "Malkovich Malkovich" - -#: html/Search/Results.html:72 -msgid "Find tickets" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:59 -msgid "First" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:33 lib/RT/StyleGuide.pod:746 -msgid "Foo Bar Baz" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:24 lib/RT/StyleGuide.pod:737 -msgid "Foo!" -msgstr "Foo!" - -#: html/Search/Bulk.html:84 -msgid "Force change" -msgstr "Malkovich" - -#: html/Search/Results.html:70 -#. ($ticketcount) -msgid "Found %quant(%1,ticket)" -msgstr "Malkovich %quant(%1,Malkovich)" - -#: lib/RT/Record.pm:750 -msgid "Found Object" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "FreeformContactInfo" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:37 -msgid "FreeformMultiple" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:36 -msgid "FreeformSingle" -msgstr "Malkovich" - -#: lib/RT/Date.pm:392 -msgid "Fri." -msgstr "Fri." - -#: html/Ticket/Elements/ShowHistory:40 html/Ticket/Elements/ShowHistory:50 -msgid "Full headers" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:587 -#. ($New->Name) -msgid "Given to %1" -msgstr "Malkovich to %1" - -#: html/Admin/Elements/Tabs:40 html/Admin/index.html:37 -msgid "Global" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectTemplate:37 -#. (loc($Template->Name)) -msgid "Global template: %1" -msgstr "Malkovich: %1" - -#: html/Tools/Offline.html:69 -msgid "Go" -msgstr "Go" - -#: html/Admin/Elements/EditCustomFields:73 html/Admin/Groups/index.html:39 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/index.html:69 -msgid "Go!" -msgstr "Go!" - -#: html/Elements/GotoTicket:24 html/SelfService/Elements/GotoTicket:24 -msgid "Goto ticket" -msgstr "Malkovich" - -#: html/Ticket/Elements/AddWatchers:45 html/Ticket/Elements/ShowGroupMembers:33 html/User/Elements/DelegateRights:77 -msgid "Group" -msgstr "Malkovich" - -#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 -msgid "Group Rights" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:957 -msgid "Group already has member" -msgstr "Malkovich Malkovich" - -#: html/Admin/Groups/Modify.html:76 -#. ($create_msg) -msgid "Group could not be created: %1" -msgstr "Malkovich be Malkovich: %1" - -#: lib/RT/Group_Overlay.pm:497 -msgid "Group created" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1129 -msgid "Group has no such member" -msgstr "Malkovich no Malkovich" - -#: lib/RT/Group_Overlay.pm:937 lib/RT/Queue_Overlay.pm:669 lib/RT/Queue_Overlay.pm:729 lib/RT/Ticket_Overlay.pm:1522 lib/RT/Ticket_Overlay.pm:1602 -msgid "Group not found" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/User/Groups/Members.html:66 -msgid "Groups" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:963 -msgid "Groups can't be members of their members" -msgstr "Malkovich can't be Malkovich of Malkovich" - -#: lib/RT/Interface/CLI.pm:72 lib/RT/Interface/CLI.pm:72 -msgid "Hello!" -msgstr "Malkovich!" - -#: docs/design_docs/string-extraction-guide.txt:40 lib/RT/StyleGuide.pod:753 -#. ($name) -msgid "Hello, %1" -msgstr "Malkovich, %1" - -#: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:89 -msgid "History" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "HomePhone" -msgstr "Malkovich" - -#: html/Elements/Tabs:43 -msgid "Homepage" -msgstr "Malkovich" - -#: lib/RT/Base.pm:86 -#. (6) -msgid "I have %quant(%1,concrete mixer)." -msgstr "I have %quant(%1,Malkovich)." - -#: html/Search/Elements/PickBasics:104 html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1080 -msgid "Id" -msgstr "Id" - -#: html/Admin/Users/Modify.html:43 html/User/Prefs.html:38 -msgid "Identity" -msgstr "Malkovich" - -#: etc/initialdata:429 -msgid "If an approval is rejected, reject the original and delete pending approvals" -msgstr "If a Malkovich is Malkovich, Malkovich the Malkovich and Malkovich Malkovich" - -#: bin/rt-crontool:186 -msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT." -msgstr "If Malkovich Malkovich, a Malkovich Malkovich Malkovich Malkovich to Malkovich Malkovich Malkovich to RT." - -#: html/Admin/Queues/People.html:104 html/Ticket/Modify.html:38 html/Ticket/ModifyAll.html:93 html/Ticket/ModifyPeople.html:37 -msgid "If you've updated anything above, be sure to" -msgstr "If you've Malkovich Malkovich, be sure to" - -#: lib/RT/Record.pm:742 -msgid "Illegal value for %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Record.pm:745 -msgid "Immutable field" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomFields:72 -msgid "Include disabled custom fields in listing." -msgstr "Malkovich Malkovich Malkovich in Malkovich." - -#: html/Admin/Queues/index.html:42 -msgid "Include disabled queues in listing." -msgstr "Malkovich Malkovich in Malkovich." - -#: html/Admin/Users/index.html:46 -msgid "Include disabled users in search." -msgstr "Malkovich Malkovich in Malkovich." - -#: html/Search/Elements/PickBasics:59 lib/RT/Tickets_Overlay.pm:1129 -msgid "Initial Priority" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1273 lib/RT/Ticket_Overlay.pm:1275 -msgid "InitialPriority" -msgstr "Malkovich" - -#: lib/RT/ScripAction_Overlay.pm:97 -msgid "Input error" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3797 -msgid "Internal Error" -msgstr "Malkovich" - -#: lib/RT/Record.pm:186 -#. ($id->{error_message}) -msgid "Internal Error: %1" -msgstr "Malkovich: %1" - -#: lib/RT/Group_Overlay.pm:644 -msgid "Invalid Group Type" -msgstr "Malkovich Malkovich" - -#: lib/RT/Principal_Overlay.pm:127 -msgid "Invalid Right" -msgstr "Malkovich" - -#: lib/RT/Record.pm:747 -msgid "Invalid data" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Invalid owner. Defaulting to 'nobody'." -msgstr "Malkovich. Malkovich to 'Malkovich'." - -#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:251 -msgid "Invalid queue" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:243 lib/RT/ACE_Overlay.pm:252 lib/RT/ACE_Overlay.pm:258 lib/RT/ACE_Overlay.pm:269 lib/RT/ACE_Overlay.pm:274 -msgid "Invalid right" -msgstr "Malkovich" - -#: lib/RT/Record.pm:161 -#. ($key) -msgid "Invalid value for %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Ticket_Overlay.pm:3380 -msgid "Invalid value for custom field" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:385 -msgid "Invalid value for status" -msgstr "Malkovich Malkovich" - -#: bin/rt-crontool:187 -msgid "It is incredibly important that nonprivileged users not be allowed to run this tool." -msgstr "It is Malkovich Malkovich Malkovich Malkovich Malkovich be Malkovich to Malkovich." - -#: bin/rt-crontool:188 -msgid "It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool." -msgstr "It is Malkovich Malkovich a non-Malkovich Malkovich the Malkovich Malkovich and RT Malkovich to Malkovich." - -#: bin/rt-crontool:159 -msgid "It takes several arguments:" -msgstr "It Malkovich Malkovich:" - -#: lib/RT/Date.pm:411 -msgid "Jan." -msgstr "Jan." - -#: lib/RT/Group_Overlay.pm:149 -msgid "Join or leave this group" -msgstr "Join or Malkovich Malkovich" - -#: lib/RT/Date.pm:417 -msgid "Jul." -msgstr "Jul." - -#: html/Ticket/Elements/Tabs:100 -msgid "Jumbo" -msgstr "Malkovich" - -#: lib/RT/Date.pm:416 -msgid "Jun." -msgstr "Jun." - -#: NOT FOUND IN SOURCE -msgid "Lang" -msgstr "Lang" - -#: html/User/Prefs.html:54 -msgid "Language" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:74 -msgid "Last" -msgstr "Last" - -#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:39 -msgid "Last Contact" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Last Contact</a>" -msgstr "Malkovich</a>" - -#: html/Elements/SelectDateType:28 -msgid "Last Contacted" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Last Notified" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:29 -msgid "Last Updated" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:82 -msgid "Let this user access RT" -msgstr "Malkovich Malkovich RT" - -#: html/Admin/Users/Modify.html:86 -msgid "Let this user be granted rights" -msgstr "Malkovich be Malkovich" - -#: lib/RT/Record.pm:1086 -msgid "Link already exists" -msgstr "Malkovich Malkovich" - -#: lib/RT/Record.pm:1100 -msgid "Link could not be created" -msgstr "Malkovich be Malkovich" - -#: lib/RT/Record.pm:1106 -#. ($TransString) -msgid "Link created (%1)" -msgstr "Malkovich (%1)" - -#: lib/RT/Record.pm:1167 -#. ($TransString) -msgid "Link deleted (%1)" -msgstr "Malkovich (%1)" - -#: lib/RT/Record.pm:1173 -msgid "Link not found" -msgstr "Malkovich" - -#: html/Ticket/ModifyLinks.html:24 html/Ticket/ModifyLinks.html:28 -#. ($Ticket->Id) -msgid "Link ticket #%1" -msgstr "Malkovich #%1" - -#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:61 html/Ticket/Elements/Tabs:98 html/Ticket/ModifyAll.html:56 -msgid "Links" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:111 html/User/Prefs.html:104 -msgid "Location" -msgstr "Malkovich" - -#: lib/RT.pm:184 -#. ($RT::LogDir) -msgid "Log directory %1 not found or couldn't be written.\\n RT can't run." -msgstr "Malkovich %1 Malkovich or couldn't be Malkovich.\\n RT can't run." - -#: html/Elements/Header:69 -#. ("<b>".$session{'CurrentUser'}->Name."</b>") -msgid "Logged in as %1" -msgstr "Malkovich in as %1" - -#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 lib/RT/StyleGuide.pod:777 -msgid "Login" -msgstr "Malkovich" - -#: html/Elements/Header:66 -msgid "Logout" -msgstr "Malkovich" - -#: html/Search/Bulk.html:83 -msgid "Make Owner" -msgstr "Malkovich" - -#: html/Search/Bulk.html:107 -msgid "Make Status" -msgstr "Malkovich" - -#: html/Search/Bulk.html:115 -msgid "Make date Due" -msgstr "Malkovich" - -#: html/Search/Bulk.html:117 -msgid "Make date Resolved" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:111 -msgid "Make date Started" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:109 -msgid "Make date Starts" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:113 -msgid "Make date Told" -msgstr "Malkovich" - -#: html/Search/Bulk.html:103 -msgid "Make priority" -msgstr "Malkovich" - -#: html/Search/Bulk.html:105 -msgid "Make queue" -msgstr "Malkovich" - -#: html/Search/Bulk.html:101 -msgid "Make subject" -msgstr "Malkovich" - -#: html/Admin/index.html:32 -msgid "Manage groups and group membership" -msgstr "Malkovich and Malkovich Malkovich" - -#: html/Admin/index.html:38 -msgid "Manage properties and configuration which apply to all queues" -msgstr "Malkovich Malkovich and Malkovich Malkovich to Malkovich" - -#: html/Admin/index.html:35 -msgid "Manage queues and queue-specific properties" -msgstr "Malkovich and Malkovich-Malkovich Malkovich" - -#: html/Admin/index.html:29 -msgid "Manage users and passwords" -msgstr "Malkovich and Malkovich" - -#: lib/RT/Date.pm:413 -msgid "Mar." -msgstr "Mar." - -#: lib/RT/Date.pm:415 -msgid "May." -msgstr "May." - -#: lib/RT/Transaction_Overlay.pm:634 -#. ($value) -msgid "Member %1 added" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:674 -#. ($value) -msgid "Member %1 deleted" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Group_Overlay.pm:974 -msgid "Member added" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1136 -msgid "Member deleted" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1140 -msgid "Member not deleted" -msgstr "Malkovich Malkovich" - -#: html/Elements/SelectLinkType:25 -msgid "Member of" -msgstr "Malkovich of" - -#: html/Admin/Elements/GroupTabs:41 html/User/Elements/GroupTabs:41 -msgid "Members" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:631 -#. ($value) -msgid "Membership in %1 added" -msgstr "Malkovich in %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:671 -#. ($value) -msgid "Membership in %1 deleted" -msgstr "Malkovich in %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2813 -msgid "Merge Successful" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2733 -msgid "Merge failed. Couldn't set EffectiveId" -msgstr "Malkovich. Couldn't Malkovich" - -#: html/Elements/EditLinks:104 html/Ticket/Elements/BulkLinks:26 -msgid "Merge into" -msgstr "Malkovich" - -#: html/Search/Bulk.html:135 html/Ticket/Update.html:83 -msgid "Message" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Message body not shown because it is too large or is not plain text." -msgstr "Malkovich Malkovich Malkovich it is Malkovich or is Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2514 -msgid "Message could not be recorded" -msgstr "Malkovich Malkovich be Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Message recipients" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2517 -msgid "Message recorded" -msgstr "Malkovich Malkovich" - -#: lib/RT/Record.pm:749 -msgid "Missing a primary key?: %1" -msgstr "Malkovich a Malkovich?: %1" - -#: html/Admin/Users/Modify.html:166 html/User/Prefs.html:71 -msgid "Mobile" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "MobilePhone" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:71 -msgid "Modify Access Control List" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Global/CustomFields.html:43 html/Admin/Global/index.html:50 -msgid "Modify Custom Fields which apply to all queues" -msgstr "Malkovich Malkovich Malkovich to Malkovich" - -#: lib/RT/Queue_Overlay.pm:74 -msgid "Modify Scrip templates for this queue" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:77 -msgid "Modify Scrips for this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Queues/CustomField.html:44 -#. ($QueueObj->Name()) -msgid "Modify a CustomField for queue %1" -msgstr "Malkovich a Malkovich Malkovich %1" - -#: html/Admin/Global/CustomField.html:52 -msgid "Modify a CustomField which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Admin/Queues/Scrip.html:53 -#. ($QueueObj->Name) -msgid "Modify a scrip for queue %1" -msgstr "Malkovich a Malkovich %1" - -#: html/Admin/Global/Scrip.html:47 -msgid "Modify a scrip which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Ticket/ModifyDates.html:24 html/Ticket/ModifyDates.html:28 -#. ($TicketObj->Id) -msgid "Modify dates for #%1" -msgstr "Malkovich Malkovich #%1" - -#: html/Ticket/ModifyDates.html:34 -#. ($TicketObj->Id) -msgid "Modify dates for ticket # %1" -msgstr "Malkovich Malkovich # %1" - -#: html/Admin/Global/GroupRights.html:24 html/Admin/Global/GroupRights.html:27 html/Admin/Global/index.html:55 -msgid "Modify global group rights" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Global/GroupRights.html:32 -msgid "Modify global group rights." -msgstr "Malkovich Malkovich Malkovich." - -#: html/Admin/Global/UserRights.html:24 html/Admin/Global/UserRights.html:27 html/Admin/Global/index.html:59 -msgid "Modify global user rights" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/UserRights.html:32 -msgid "Modify global user rights." -msgstr "Malkovich Malkovich." - -#: lib/RT/Group_Overlay.pm:146 -msgid "Modify group metadata or delete group" -msgstr "Malkovich Malkovich or Malkovich" - -#: html/Admin/Groups/GroupRights.html:24 html/Admin/Groups/GroupRights.html:28 html/Admin/Groups/GroupRights.html:34 -#. ($GroupObj->Name) -msgid "Modify group rights for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Queues/GroupRights.html:24 html/Admin/Queues/GroupRights.html:28 -#. ($QueueObj->Name) -msgid "Modify group rights for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: lib/RT/Group_Overlay.pm:148 -msgid "Modify membership roster for this group" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/System.pm:60 -msgid "Modify one's own RT account" -msgstr "Malkovich's own RT Malkovich" - -#: html/Admin/Queues/People.html:24 html/Admin/Queues/People.html:28 -#. ($QueueObj->Name) -msgid "Modify people related to queue %1" -msgstr "Malkovich Malkovich to Malkovich %1" - -#: html/Ticket/ModifyPeople.html:24 html/Ticket/ModifyPeople.html:28 html/Ticket/ModifyPeople.html:34 -#. ($Ticket->id) -#. ($Ticket->Id) -msgid "Modify people related to ticket #%1" -msgstr "Malkovich Malkovich to Malkovich #%1" - -#: html/Admin/Queues/Scrips.html:45 -#. ($QueueObj->Name) -msgid "Modify scrips for queue %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Global/Scrips.html:43 html/Admin/Global/index.html:41 -msgid "Modify scrips which apply to all queues" -msgstr "Malkovich Malkovich to Malkovich" - -#: html/Admin/Global/Template.html:24 html/Admin/Global/Template.html:29 html/Admin/Global/Template.html:80 html/Admin/Queues/Template.html:77 -#. (loc($TemplateObj->Name())) -#. ($TemplateObj->id) -msgid "Modify template %1" -msgstr "Malkovich %1" - -#: html/Admin/Global/Templates.html:43 -msgid "Modify templates which apply to all queues" -msgstr "Malkovich Malkovich Malkovich to Malkovich" - -#: html/Admin/Groups/Modify.html:86 html/User/Groups/Modify.html:85 -#. ($Group->Name) -msgid "Modify the group %1" -msgstr "Malkovich the Malkovich %1" - -#: lib/RT/Queue_Overlay.pm:72 -msgid "Modify the queue watchers" -msgstr "Malkovich the Malkovich" - -#: html/Admin/Users/Modify.html:263 -#. ($UserObj->Name) -msgid "Modify the user %1" -msgstr "Malkovich the user %1" - -#: html/Ticket/ModifyAll.html:36 -#. ($Ticket->Id) -msgid "Modify ticket # %1" -msgstr "Malkovich # %1" - -#: html/Ticket/Modify.html:24 html/Ticket/Modify.html:27 html/Ticket/Modify.html:33 -#. ($TicketObj->Id) -msgid "Modify ticket #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Queue_Overlay.pm:90 -msgid "Modify tickets" -msgstr "Malkovich" - -#: html/Admin/Groups/UserRights.html:24 html/Admin/Groups/UserRights.html:28 html/Admin/Groups/UserRights.html:34 -#. ($GroupObj->Name) -msgid "Modify user rights for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Queues/UserRights.html:24 html/Admin/Queues/UserRights.html:28 -#. ($QueueObj->Name) -msgid "Modify user rights for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: lib/RT/Queue_Overlay.pm:71 -msgid "ModifyACL" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:149 -msgid "ModifyOwnMembership" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:72 -msgid "ModifyQueueWatchers" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:77 -msgid "ModifyScrips" -msgstr "Malkovich" - -#: lib/RT/System.pm:60 -msgid "ModifySelf" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:74 -msgid "ModifyTemplate" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:90 -msgid "ModifyTicket" -msgstr "Malkovich" - -#: lib/RT/Date.pm:388 -msgid "Mon." -msgstr "Mon." - -#: html/Ticket/Elements/ShowRequestor:40 -#. ($name) -msgid "More about %1" -msgstr "Malkovich %1" - -#: html/Admin/Elements/EditCustomFields:60 -msgid "Move down" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectSingleOrMultiple:26 -msgid "Multiple" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:197 -msgid "Must specify 'Name' attribute" -msgstr "Malkovich 'Name' Malkovich" - -#: html/SelfService/Elements/MyRequests:48 -#. ($friendly_status) -msgid "My %1 tickets" -msgstr "My %1 Malkovich" - -#: html/Approvals/index.html:24 html/Approvals/index.html:25 -msgid "My approvals" -msgstr "My Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Groups/Modify.html:43 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 -msgid "Name" -msgstr "Name" - -#: lib/RT/User_Overlay.pm:204 -msgid "Name in use" -msgstr "Name in use" - -#: html/Ticket/Elements/ShowDates:52 -msgid "Never" -msgstr "Malkovich" - -#: html/Elements/Quicksearch:29 -msgid "New" -msgstr "New" - -#: html/Elements/EditLinks:93 -msgid "New Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:92 html/User/Prefs.html:87 -msgid "New Password" -msgstr "Malkovich" - -#: etc/initialdata:332 -msgid "New Pending Approval" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "New Search" -msgstr "Malkovich" - -#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:40 -msgid "New custom field" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/GroupTabs:53 html/User/Elements/GroupTabs:51 -msgid "New group" -msgstr "Malkovich" - -#: html/SelfService/Prefs.html:31 -msgid "New password" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:773 -msgid "New password notification sent" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/QueueTabs:69 -msgid "New queue" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:41 -msgid "New rights" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:39 html/Admin/Global/Scrips.html:38 html/Admin/Queues/Scrip.html:42 html/Admin/Queues/Scrips.html:54 -msgid "New scrip" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:59 html/Admin/Global/Templates.html:38 html/Admin/Queues/Template.html:57 html/Admin/Queues/Templates.html:49 -msgid "New template" -msgstr "Malkovich" - -#: html/SelfService/Elements/Tabs:47 -msgid "New ticket" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2700 -msgid "New ticket doesn't exist" -msgstr "Malkovich doesn't Malkovich" - -#: html/Admin/Elements/UserTabs:50 -msgid "New user" -msgstr "Malkovich" - -#: html/Admin/Elements/CreateUserCalled:25 -msgid "New user called" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:54 html/Ticket/Elements/EditPeople:28 -msgid "New watchers" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "New window setting" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/Tabs:70 -msgid "Next" -msgstr "Next" - -#: NOT FOUND IN SOURCE -msgid "NickName" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:50 -msgid "Nickname" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:103 -msgid "No CustomField" -msgstr "No Malkovich" - -#: html/Admin/Groups/GroupRights.html:83 html/Admin/Groups/UserRights.html:70 -msgid "No Group defined" -msgstr "No Malkovich" - -#: lib/RT/Tickets_Overlay_SQL.pm:452 -msgid "No Query" -msgstr "No Malkovich" - -#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:67 -msgid "No Queue defined" -msgstr "No Malkovich" - -#: bin/rt-crontool:52 -msgid "No RT user found. Please consult your RT administrator.\\n" -msgstr "No RT Malkovich. Malkovich Malkovich RT Malkovich.\\n" - -#: html/Admin/Global/Template.html:78 html/Admin/Queues/Template.html:75 -msgid "No Template" -msgstr "No Malkovich" - -#: NOT FOUND IN SOURCE -msgid "No Ticket specified. Aborting ticket " -msgstr "No Malkovich Malkovich. Malkovich " - -#: html/Approvals/Elements/Approve:45 -msgid "No action" -msgstr "No Malkovich" - -#: lib/RT/Record.pm:744 -msgid "No column specified" -msgstr "No Malkovich Malkovich" - -#: html/Ticket/Elements/ShowRequestor:46 -msgid "No comment entered about this user" -msgstr "No Malkovich Malkovich Malkovich" - -#: lib/RT/Action/Generic.pm:159 lib/RT/Condition/Generic.pm:175 lib/RT/Search/ActiveTicketsInQueue.pm:55 lib/RT/Search/Generic.pm:112 -#. (ref $self) -msgid "No description for %1" -msgstr "No Malkovich %1" - -#: lib/RT/Users_Overlay.pm:159 -msgid "No group specified" -msgstr "No Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2475 -msgid "No message attached" -msgstr "No Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:991 -msgid "No password set" -msgstr "No Malkovich" - -#: lib/RT/Queue_Overlay.pm:296 -msgid "No permission to create queues" -msgstr "No Malkovich to Malkovich" - -#: NOT FOUND IN SOURCE -msgid "No permission to create tickets in the queue '%1'" -msgstr "No Malkovich to Malkovich in the Malkovich '%1'" - -#: lib/RT/User_Overlay.pm:157 -msgid "No permission to create users" -msgstr "No Malkovich to Malkovich" - -#: html/SelfService/Display.html:125 -msgid "No permission to display that ticket" -msgstr "No Malkovich to Malkovich Malkovich" - -#: html/SelfService/Update.html:68 -msgid "No permission to view update ticket" -msgstr "No Malkovich to Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:716 lib/RT/Ticket_Overlay.pm:1581 -msgid "No principal specified" -msgstr "No Malkovich Malkovich" - -#: html/Admin/Queues/People.html:153 html/Admin/Queues/People.html:163 -msgid "No principals selected." -msgstr "No Malkovich Malkovich." - -#: html/Admin/Queues/index.html:34 -msgid "No queues matching search criteria found." -msgstr "No Malkovich Malkovich Malkovich Malkovich." - -#: html/Admin/Elements/SelectRights:81 -msgid "No rights found" -msgstr "No Malkovich" - -#: html/Admin/Elements/SelectRights:32 -msgid "No rights granted." -msgstr "No Malkovich." - -#: html/Search/Bulk.html:162 -msgid "No search to operate on." -msgstr "No Malkovich to Malkovich on." - -#: lib/RT/Transaction_Overlay.pm:455 lib/RT/Transaction_Overlay.pm:493 -msgid "No transaction type specified" -msgstr "No Malkovich Malkovich Malkovich" - -#: html/Admin/Users/index.html:35 -msgid "No users matching search criteria found." -msgstr "No Malkovich Malkovich Malkovich Malkovich." - -#: NOT FOUND IN SOURCE -msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" -msgstr "No Malkovich RT Malkovich. RT Malkovich Malkovich. Malkovich Malkovich RT Malkovich.\\n" - -#: lib/RT/Record.pm:741 -msgid "No value sent to _Set!\\n" -msgstr "No Malkovich to _Set!\\n" - -#: lib/RT/Record.pm:746 -msgid "Nonexistant field?" -msgstr "Malkovich Malkovich?" - -#: html/Elements/Header:71 -msgid "Not logged in." -msgstr "Malkovich in." - -#: lib/RT/Date.pm:369 -msgid "Not set" -msgstr "Malkovich" - -#: html/NoAuth/Reminder.html:26 -msgid "Not yet implemented." -msgstr "Malkovich Malkovich." - -#: html/Approvals/Elements/Approve:48 -msgid "Notes" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:776 -msgid "Notification could not be sent" -msgstr "Malkovich Malkovich be sent" - -#: etc/initialdata:101 -msgid "Notify AdminCcs" -msgstr "Malkovich" - -#: etc/initialdata:97 -msgid "Notify AdminCcs as Comment" -msgstr "Malkovich as Malkovich" - -#: etc/initialdata:128 -msgid "Notify Other Recipients" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:124 -msgid "Notify Other Recipients as Comment" -msgstr "Malkovich Malkovich as Malkovich" - -#: etc/initialdata:85 -msgid "Notify Owner" -msgstr "Malkovich" - -#: etc/initialdata:81 -msgid "Notify Owner as Comment" -msgstr "Malkovich as Malkovich" - -#: etc/initialdata:376 -msgid "Notify Owner of their rejected ticket" -msgstr "Malkovich of Malkovich Malkovich" - -#: etc/initialdata:365 -msgid "Notify Owner of their ticket has been approved by all approvers" -msgstr "Malkovich of Malkovich Malkovich Malkovich by Malkovich" - -#: etc/initialdata:353 -msgid "Notify Owner of their ticket has been approved by some approver" -msgstr "Malkovich of Malkovich Malkovich Malkovich by Malkovich" - -#: etc/initialdata:334 -msgid "Notify Owners and AdminCcs of new items pending their approval" -msgstr "Malkovich and Malkovich of Malkovich Malkovich Malkovich" - -#: etc/initialdata:77 -msgid "Notify Requestors" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:111 -msgid "Notify Requestors and Ccs" -msgstr "Malkovich Malkovich and Ccs" - -#: etc/initialdata:106 -msgid "Notify Requestors and Ccs as Comment" -msgstr "Malkovich Malkovich and Ccs as Malkovich" - -#: etc/initialdata:120 -msgid "Notify Requestors, Ccs and AdminCcs" -msgstr "Malkovich Malkovich, Ccs and Malkovich" - -#: etc/initialdata:116 -msgid "Notify Requestors, Ccs and AdminCcs as Comment" -msgstr "Malkovich Malkovich, Ccs and Malkovich as Malkovich" - -#: lib/RT/Date.pm:421 -msgid "Nov." -msgstr "Nov." - -#: lib/RT/Record.pm:200 -msgid "Object could not be created" -msgstr "Malkovich Malkovich be Malkovich" - -#: lib/RT/Record.pm:219 -msgid "Object created" -msgstr "Malkovich" - -#: lib/RT/Date.pm:420 -msgid "Oct." -msgstr "Oct." - -#: html/Elements/SelectDateRelation:34 -msgid "On" -msgstr "On" - -#: etc/initialdata:163 -msgid "On Comment" -msgstr "On Malkovich" - -#: etc/initialdata:156 -msgid "On Correspond" -msgstr "On Malkovich" - -#: etc/initialdata:145 -msgid "On Create" -msgstr "On Malkovich" - -#: etc/initialdata:184 -msgid "On Owner Change" -msgstr "On Malkovich" - -#: etc/initialdata:192 -msgid "On Queue Change" -msgstr "On Malkovich" - -#: etc/initialdata:198 -msgid "On Resolve" -msgstr "On Malkovich" - -#: etc/initialdata:169 -msgid "On Status Change" -msgstr "On Malkovich" - -#: etc/initialdata:150 -msgid "On Transaction" -msgstr "On Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:49 -#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>") -msgid "Only show approvals for requests created after %1" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich %1" - -#: html/Approvals/Elements/PendingMyApproval:47 -#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>") -msgid "Only show approvals for requests created before %1" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich %1" - -#: html/Elements/Quicksearch:30 -msgid "Open" -msgstr "Open" - -#: html/Ticket/Elements/Tabs:137 -msgid "Open it" -msgstr "Open it" - -#: html/SelfService/Elements/Tabs:41 -msgid "Open tickets" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Open tickets (from listing) in a new window" -msgstr "Malkovich (Malkovich) in a Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Open tickets (from listing) in another window" -msgstr "Malkovich (Malkovich) in Malkovich" - -#: etc/initialdata:140 -msgid "Open tickets on correspondence" -msgstr "Malkovich on Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Ordering and sorting" -msgstr "Malkovich and Malkovich" - -#: html/Admin/Users/Modify.html:114 html/Elements/SelectUsers:28 html/User/Prefs.html:107 -msgid "Organization" -msgstr "Malkovich" - -#: html/Approvals/Elements/Approve:32 -#. ($approving->Id, $approving->Subject) -msgid "Originating ticket: #%1" -msgstr "Malkovich Malkovich: #%1" - -#: html/Admin/Queues/Modify.html:68 -msgid "Over time, priority moves toward" -msgstr "Malkovich, Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:89 -msgid "Own tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:89 -msgid "OwnTicket" -msgstr "Malkovich" - -#: etc/initialdata:38 html/Elements/QuickCreate:13 html/Search/Elements/PickBasics:114 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1306 -msgid "Owner" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:575 -#. ($Old->Name , $New->Name) -msgid "Owner forcibly changed from %1 to %2" -msgstr "Malkovich Malkovich Malkovich %1 to %2" - -#: NOT FOUND IN SOURCE -msgid "Owner is" -msgstr "Malkovich is" - -#: html/Admin/Users/Modify.html:171 html/User/Prefs.html:75 -msgid "Pager" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "PagerPhone" -msgstr "Malkovich" - -#: html/Elements/EditLinks:117 html/Elements/EditLinks:54 html/Elements/ShowLinks:46 html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:38 -msgid "Parents" -msgstr "Malkovich" - -#: html/Elements/Login:52 html/User/Prefs.html:83 -msgid "Password" -msgstr "Malkovich" - -#: html/NoAuth/Reminder.html:24 -msgid "Password Reminder" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:185 lib/RT/User_Overlay.pm:994 -msgid "Password too short" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:316 html/User/Prefs.html:209 -#. (loc_fuzzy($msg)) -msgid "Password: %1" -msgstr "Malkovich: %1" - -#: html/Admin/Users/Modify.html:318 -msgid "Passwords do not match." -msgstr "Malkovich do Malkovich." - -#: html/User/Prefs.html:211 -msgid "Passwords do not match. Your password has not been changed" -msgstr "Malkovich do Malkovich. Malkovich Malkovich Malkovich" - -#: html/Ticket/Elements/ShowSummary:44 html/Ticket/Elements/Tabs:97 html/Ticket/ModifyAll.html:50 -msgid "People" -msgstr "Malkovich" - -#: etc/initialdata:133 -msgid "Perform a user-defined action" -msgstr "Malkovich a user-Malkovich" - -#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/Attribute_Overlay.pm:135 lib/RT/Attribute_Overlay.pm:141 lib/RT/Attribute_Overlay.pm:379 lib/RT/Attribute_Overlay.pm:388 lib/RT/Attribute_Overlay.pm:401 lib/RT/CurrentUser.pm:103 lib/RT/CurrentUser.pm:94 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:207 lib/RT/CustomField_Overlay.pm:239 lib/RT/CustomField_Overlay.pm:517 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1091 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1104 lib/RT/Group_Overlay.pm:1155 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1165 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:896 lib/RT/Group_Overlay.pm:900 lib/RT/Group_Overlay.pm:913 lib/RT/Queue_Overlay.pm:117 lib/RT/Queue_Overlay.pm:135 lib/RT/Queue_Overlay.pm:578 lib/RT/Queue_Overlay.pm:588 lib/RT/Queue_Overlay.pm:602 lib/RT/Queue_Overlay.pm:740 lib/RT/Queue_Overlay.pm:749 lib/RT/Queue_Overlay.pm:762 lib/RT/Queue_Overlay.pm:975 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:201 lib/RT/Scrip_Overlay.pm:473 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1453 lib/RT/Ticket_Overlay.pm:1463 lib/RT/Ticket_Overlay.pm:1477 lib/RT/Ticket_Overlay.pm:1614 lib/RT/Ticket_Overlay.pm:1624 lib/RT/Ticket_Overlay.pm:1638 lib/RT/Ticket_Overlay.pm:1755 lib/RT/Ticket_Overlay.pm:2075 lib/RT/Ticket_Overlay.pm:2213 lib/RT/Ticket_Overlay.pm:2381 lib/RT/Ticket_Overlay.pm:2428 lib/RT/Ticket_Overlay.pm:2582 lib/RT/Ticket_Overlay.pm:2640 lib/RT/Ticket_Overlay.pm:2691 lib/RT/Ticket_Overlay.pm:2706 lib/RT/Ticket_Overlay.pm:2905 lib/RT/Ticket_Overlay.pm:2915 lib/RT/Ticket_Overlay.pm:2920 lib/RT/Ticket_Overlay.pm:3143 lib/RT/Ticket_Overlay.pm:3147 lib/RT/Ticket_Overlay.pm:3350 lib/RT/Ticket_Overlay.pm:3512 lib/RT/Ticket_Overlay.pm:3564 lib/RT/Ticket_Overlay.pm:3791 lib/RT/Transaction_Overlay.pm:443 lib/RT/Transaction_Overlay.pm:450 lib/RT/Transaction_Overlay.pm:479 lib/RT/Transaction_Overlay.pm:486 lib/RT/User_Overlay.pm:1088 lib/RT/User_Overlay.pm:1536 lib/RT/User_Overlay.pm:335 lib/RT/User_Overlay.pm:696 lib/RT/User_Overlay.pm:731 lib/RT/User_Overlay.pm:987 -msgid "Permission Denied" -msgstr "Malkovich Malkovich" - -#: html/User/Elements/Tabs:34 -msgid "Personal Groups" -msgstr "Malkovich" - -#: html/User/Groups/index.html:29 html/User/Groups/index.html:39 -msgid "Personal groups" -msgstr "Malkovich" - -#: html/User/Elements/DelegateRights:36 -msgid "Personal groups:" -msgstr "Malkovich:" - -#: html/Admin/Users/Modify.html:153 html/User/Prefs.html:60 -msgid "Phone numbers" -msgstr "Malkovich" - -#: html/Elements/Header:63 html/Elements/Tabs:55 html/SelfService/Elements/Tabs:50 html/SelfService/Prefs.html:24 html/User/Prefs.html:24 html/User/Prefs.html:27 -msgid "Preferences" -msgstr "Malkovich" - -#: lib/RT/Action/Generic.pm:169 -msgid "Prepare Stubbed" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:62 -msgid "Prev" -msgstr "Prev" - -#: lib/RT/ACE_Overlay.pm:132 lib/RT/ACE_Overlay.pm:207 lib/RT/ACE_Overlay.pm:551 -#. ($args{'PrincipalId'}) -msgid "Principal %1 not found." -msgstr "Malkovich %1 Malkovich." - -#: html/Search/Elements/PickBasics:58 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:52 html/Ticket/Elements/ShowBasics:50 lib/RT/Tickets_Overlay.pm:1104 -msgid "Priority" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:64 -msgid "Priority starts at" -msgstr "Malkovich at" - -#: etc/initialdata:25 -msgid "Privileged" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:296 html/User/Prefs.html:200 -#. (loc_fuzzy($msg)) -msgid "Privileged status: %1" -msgstr "Malkovich Malkovich: %1" - -#: html/Admin/Users/index.html:61 -msgid "Privileged users" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Projects" -msgstr "Malkovich" - -#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59 -msgid "Pseudogroup for internal use" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Elements/QuickCreate:10 html/Elements/Quicksearch:28 html/Search/Elements/PickBasics:94 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:35 html/Ticket/Elements/ShowBasics:54 html/User/Elements/DelegateRights:79 lib/RT/Tickets_Overlay.pm:945 -msgid "Queue" -msgstr "Malkovich" - -#: html/Admin/Queues/CustomField.html:41 html/Admin/Queues/Scrip.html:49 html/Admin/Queues/Scrips.html:47 html/Admin/Queues/Templates.html:43 -#. ($Queue) -#. ($id) -msgid "Queue %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: html/Admin/Queues/Modify.html:42 -msgid "Queue Name" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:300 -msgid "Queue already exists" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:309 lib/RT/Queue_Overlay.pm:315 -msgid "Queue could not be created" -msgstr "Malkovich not be Malkovich" - -#: html/Ticket/Create.html:208 -msgid "Queue could not be loaded." -msgstr "Malkovich be Malkovich." - -#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:319 lib/RT/StyleGuide.pod:789 -msgid "Queue created" -msgstr "Malkovich" - -#: html/SelfService/Display.html:72 lib/RT/CustomField_Overlay.pm:97 -msgid "Queue not found" -msgstr "Malkovich" - -#: html/Admin/Elements/Tabs:37 html/Admin/index.html:34 -msgid "Queues" -msgstr "Malkovich" - -#: html/Elements/Quicksearch:24 -msgid "Quick search" -msgstr "Malkovich" - -#: html/Elements/Login:44 -#. ($RT::VERSION) -msgid "RT %1" -msgstr "RT %1" - -#: docs/design_docs/string-extraction-guide.txt:70 lib/RT/StyleGuide.pod:776 -#. ($RT::VERSION, $RT::rtname) -msgid "RT %1 for %2" -msgstr "RT %1 for %2" - -#: NOT FOUND IN SOURCE -msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>." -msgstr "RT %1 from <a href=\"http://Malkovich.com\">Malkovich Malkovich, LLC</a>." - -#: html/Admin/index.html:24 html/Admin/index.html:25 -msgid "RT Administration" -msgstr "RT Malkovich" - -#: html/Elements/Error:41 html/SelfService/Error.html:40 -msgid "RT Error" -msgstr "RT Malkovich" - -#: html/index.html:50 html/index.html:53 -msgid "RT at a glance" -msgstr "RT at a Malkovich" - -#: html/Elements/PageLayout:85 -#. ($RT::rtname) -msgid "RT for %1" -msgstr "RT for %1" - -#: NOT FOUND IN SOURCE -msgid "RT is © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>.  It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>" -msgstr "RT is © Malkovich 1996-%1 Malkovich <Malkovich@Malkovich.com>.  It is Malkovich Malkovich <a href=\"http://www.gnu.org/copyleft/gpl.html\">Malkovich 2 of the Malkovich Malkovich Malkovich.</a>" - -#: html/Admin/Users/Modify.html:57 html/User/Prefs.html:47 -msgid "Real Name" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "RealName" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:628 -#. ($value) -msgid "Reference by %1 added" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:668 -#. ($value) -msgid "Reference by %1 deleted" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:625 -#. ($value) -msgid "Reference to %1 added" -msgstr "Malkovich to %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:665 -#. ($value) -msgid "Reference to %1 deleted" -msgstr "Malkovich to %1 Malkovich" - -#: html/Elements/EditLinks:129 html/Elements/EditLinks:81 html/Elements/ShowLinks:70 html/Ticket/Create.html:185 html/Ticket/Elements/BulkLinks:50 -msgid "Referred to by" -msgstr "Malkovich to by" - -#: html/Elements/EditLinks:125 html/Elements/EditLinks:72 html/Elements/SelectLinkType:27 html/Elements/ShowLinks:60 html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:46 -msgid "Refers to" -msgstr "Malkovich to" - -#: NOT FOUND IN SOURCE -msgid "Refine search" -msgstr "Malkovich" - -#: html/Elements/Refresh:35 -#. ($value/60) -msgid "Refresh this page every %1 minutes." -msgstr "Malkovich Malkovich %1 Malkovich." - -#: html/Search/Bulk.html:95 -msgid "Remove AdminCc" -msgstr "Malkovich" - -#: html/Search/Bulk.html:91 -msgid "Remove Cc" -msgstr "Malkovich Cc" - -#: html/Search/Bulk.html:87 -msgid "Remove Requestor" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransaction:142 html/Ticket/Elements/Tabs:123 -msgid "Reply" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:87 -msgid "Reply to tickets" -msgstr "Malkovich to Malkovich" - -#: lib/RT/Queue_Overlay.pm:87 -msgid "ReplyToTicket" -msgstr "Malkovich" - -#: etc/initialdata:44 lib/RT/ACE_Overlay.pm:86 -msgid "Requestor" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Requestor email address" -msgstr "Malkovich Malkovich" - -#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 -msgid "Requestors" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:74 -msgid "Requests should be due in" -msgstr "Malkovich be due in" - -#: html/Elements/Submit:61 -msgid "Reset" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:63 -msgid "Residence" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:133 -msgid "Resolve" -msgstr "Malkovich" - -#: html/Ticket/Update.html:119 -#. ($TicketObj->id, $TicketObj->Subject) -msgid "Resolve ticket #%1 (%2)" -msgstr "Malkovich #%1 (%2)" - -#: etc/initialdata:323 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1282 -msgid "Resolved" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Response to requestors" -msgstr "Malkovich to Malkovich" - -#: html/Elements/ListActions:25 html/Search/Elements/NewListActions:25 -msgid "Results" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Results per page" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:99 html/User/Prefs.html:94 -msgid "Retype Password" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:612 -msgid "Right Delegated" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:302 -msgid "Right Granted" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:160 -msgid "Right Loaded" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:677 lib/RT/ACE_Overlay.pm:692 -msgid "Right could not be revoked" -msgstr "Malkovich be Malkovich" - -#: html/User/Delegation.html:63 -msgid "Right not found" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:542 lib/RT/ACE_Overlay.pm:637 -msgid "Right not loaded." -msgstr "Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:688 -msgid "Right revoked" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Rights" -msgstr "Malkovich" - -#: lib/RT/Interface/Web.pm:869 -#. ($object_type) -msgid "Rights could not be granted for %1" -msgstr "Malkovich Malkovich be Malkovich %1" - -#: lib/RT/Interface/Web.pm:899 -#. ($object_type) -msgid "Rights could not be revoked for %1" -msgstr "Malkovich Malkovich be Malkovich %1" - -#: html/Admin/Global/GroupRights.html:50 html/Admin/Queues/GroupRights.html:52 -msgid "Roles" -msgstr "Malkovich" - -#: lib/RT/Date.pm:393 -msgid "Sat." -msgstr "Sat." - -#: html/Admin/Global/Template.html:45 html/Admin/Queues/Modify.html:89 html/Admin/Queues/People.html:104 html/Admin/Users/Modify.html:198 html/SelfService/Prefs.html:36 html/Ticket/Modify.html:38 html/Ticket/ModifyAll.html:93 html/Ticket/ModifyDates.html:38 html/Ticket/ModifyLinks.html:38 html/Ticket/ModifyPeople.html:37 -msgid "Save Changes" -msgstr "Malkovich" - -#: html/Ticket/Elements/PreviewScrips:79 -msgid "Save changes" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:48 html/Admin/Queues/Scrip.html:54 -#. ($id) -#. ($ARGS{'id'}) -msgid "Scrip #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Scrip_Overlay.pm:180 -msgid "Scrip Created" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:85 -msgid "Scrip deleted" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:45 html/Admin/Elements/SystemTabs:32 html/Admin/Global/index.html:40 -msgid "Scrips" -msgstr "Malkovich" - -#: html/Admin/Queues/Scrips.html:33 -msgid "Scrips which apply to all queues" -msgstr "Malkovich Malkovich to Malkovich" - -#: html/Elements/SimpleSearch:26 html/Search/Elements/DisplayOptions:73 -msgid "Search" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:38 -msgid "Search for approvals" -msgstr "Malkovich Malkovich" - -#: bin/rt-crontool:184 -msgid "Security:" -msgstr "Malkovich:" - -#: lib/RT/Queue_Overlay.pm:68 -msgid "SeeQueue" -msgstr "Malkovich" - -#: html/Admin/Groups/index.html:50 -msgid "Select a group" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Users/index.html:24 html/Admin/Users/index.html:27 -msgid "Select a user" -msgstr "Malkovich a user" - -#: html/Admin/Global/CustomField.html:37 html/Admin/Global/CustomFields.html:35 -msgid "Select custom field" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/GroupTabs:51 html/User/Elements/GroupTabs:49 -msgid "Select group" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:427 -msgid "Select multiple values" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:424 -msgid "Select one value" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/QueueTabs:66 -msgid "Select queue" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:36 html/Admin/Global/Scrips.html:35 html/Admin/Queues/Scrip.html:39 html/Admin/Queues/Scrips.html:51 -msgid "Select scrip" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:56 html/Admin/Global/Templates.html:35 html/Admin/Queues/Template.html:54 html/Admin/Queues/Templates.html:46 -msgid "Select template" -msgstr "Malkovich" - -#: html/Admin/Elements/UserTabs:46 -msgid "Select user" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:35 -msgid "SelectMultiple" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:34 -msgid "SelectSingle" -msgstr "Malkovich" - -#: etc/initialdata:121 -msgid "Send mail to all watchers" -msgstr "Malkovich to Malkovich" - -#: etc/initialdata:117 -msgid "Send mail to all watchers as a \"comment\"" -msgstr "Malkovich to Malkovich as a \"Malkovich\"" - -#: etc/initialdata:112 -msgid "Send mail to requestors and Ccs" -msgstr "Malkovich to Malkovich and Ccs" - -#: etc/initialdata:107 -msgid "Send mail to requestors and Ccs as a comment" -msgstr "Malkovich to Malkovich and Ccs as a Malkovich" - -#: etc/initialdata:78 -msgid "Sends a message to the requestors" -msgstr "Malkovich a Malkovich to the Malkovich" - -#: etc/initialdata:125 etc/initialdata:129 -msgid "Sends mail to explicitly listed Ccs and Bccs" -msgstr "Malkovich to Malkovich Malkovich and Bccs" - -#: etc/initialdata:102 -msgid "Sends mail to the administrative Ccs" -msgstr "Malkovich to the Malkovich Malkovich" - -#: etc/initialdata:98 -msgid "Sends mail to the administrative Ccs as a comment" -msgstr "Malkovich to the Malkovich Malkovich as a Malkovich" - -#: etc/initialdata:82 etc/initialdata:86 -msgid "Sends mail to the owner" -msgstr "Malkovich to the Malkovich" - -#: lib/RT/Date.pm:419 -msgid "Sep." -msgstr "Sep." - -#: html/Approvals/Elements/PendingMyApproval:43 -msgid "Show approved requests" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Create.html:143 html/Ticket/Create.html:33 -msgid "Show basics" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:44 -msgid "Show denied requests" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Create.html:143 html/Ticket/Create.html:33 -msgid "Show details" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:42 -msgid "Show pending requests" -msgstr "Malkovich Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:45 -msgid "Show requests awaiting other approvals" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Show ticket private commentary" -msgstr "Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Show ticket summaries" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:70 -msgid "ShowACL" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:79 -msgid "ShowScrips" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:76 -msgid "ShowTemplate" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:80 -msgid "ShowTicket" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:81 -msgid "ShowTicketComments" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:84 -msgid "Sign up as a ticket Requestor or ticket or queue Cc" -msgstr "Sign up as a Malkovich Malkovich or Malkovich or Malkovich Cc" - -#: lib/RT/Queue_Overlay.pm:85 -msgid "Sign up as a ticket or queue AdminCc" -msgstr "Sign up as a Malkovich or Malkovich" - -#: html/Admin/Users/Modify.html:188 html/User/Prefs.html:145 -msgid "Signature" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectSingleOrMultiple:25 -msgid "Single" -msgstr "Malkovich" - -#: html/Elements/Header:62 -msgid "Skip Menu" -msgstr "Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:27 -msgid "Sort" -msgstr "Sort" - -#: NOT FOUND IN SOURCE -msgid "Sort results by" -msgstr "Malkovich by" - -#: NOT FOUND IN SOURCE -msgid "Squelched message recipients" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:65 -msgid "Stage" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:35 -msgid "Started" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:31 -msgid "Starts" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:135 html/User/Prefs.html:123 -msgid "State" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:77 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:31 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:37 lib/RT/Ticket_Overlay.pm:1276 lib/RT/Tickets_Overlay.pm:970 -msgid "Status" -msgstr "Malkovich" - -#: etc/initialdata:309 -msgid "Status Change" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:505 -#. ($self->loc($self->OldValue), $self->loc($self->NewValue)) -msgid "Status changed from %1 to %2" -msgstr "Malkovich Malkovich %1 to %2" - -#: html/Ticket/Elements/Tabs:148 -msgid "Steal" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:94 -msgid "Steal tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:94 -msgid "StealTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:581 -#. ($Old->Name) -msgid "Stolen from %1 " -msgstr "Malkovich %1 " - -#: html/Elements/QuickCreate:7 html/Elements/SelectAttachmentField:25 html/Search/Bulk.html:133 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:26 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:58 lib/RT/Ticket_Overlay.pm:1272 lib/RT/Tickets_Overlay.pm:1049 -msgid "Subject" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:795 lib/RT/Transaction_Overlay.pm:603 -#. ($self->Data) -msgid "Subject changed to %1" -msgstr "Malkovich to %1" - -#: html/Elements/Submit:58 -msgid "Submit" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:749 -msgid "Succeeded" -msgstr "Malkovich" - -#: lib/RT/Date.pm:394 -msgid "Sun." -msgstr "Sun." - -#: lib/RT/System.pm:53 -msgid "SuperUser" -msgstr "Malkovich" - -#: html/User/Elements/DelegateRights:76 -msgid "System" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:868 lib/RT/Interface/Web.pm:898 -msgid "System Error" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:615 -msgid "System error. Right not delegated." -msgstr "Malkovich. Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:145 lib/RT/ACE_Overlay.pm:222 lib/RT/ACE_Overlay.pm:305 lib/RT/ACE_Overlay.pm:897 -msgid "System error. Right not granted." -msgstr "Malkovich. Malkovich Malkovich." - -#: html/Admin/Global/GroupRights.html:34 html/Admin/Groups/GroupRights.html:36 html/Admin/Queues/GroupRights.html:35 -msgid "System groups" -msgstr "Malkovich" - -#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 -msgid "SystemRolegroup for internal use" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/CurrentUser.pm:334 -msgid "TEST_STRING" -msgstr "TEST_MALKOVICH" - -#: html/Elements/MyRequests:27 html/Ticket/Elements/Tabs:144 -msgid "Take" -msgstr "Take" - -#: lib/RT/Queue_Overlay.pm:92 -msgid "Take tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:92 -msgid "TakeTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:566 -msgid "Taken" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:57 html/Tools/Offline.html:56 -msgid "Template" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:90 html/Admin/Queues/Template.html:89 -#. ($TemplateObj->Id()) -msgid "Template #%1" -msgstr "Malkovich #%1" - -#: html/Admin/Elements/EditTemplates:88 -msgid "Template deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Scrip_Overlay.pm:156 -msgid "Template not found" -msgstr "Malkovich Malkovich" - -#: lib/RT/Template_Overlay.pm:348 -msgid "Template parsed" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:48 html/Admin/Elements/SystemTabs:35 html/Admin/Global/index.html:44 -msgid "Templates" -msgstr "Malkovich" - -#: lib/RT/Record.pm:740 -msgid "That is already the current value" -msgstr "That is Malkovich the Malkovich" - -#: lib/RT/CustomField_Overlay.pm:248 -msgid "That is not a value for this custom field" -msgstr "That is not a Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2086 -msgid "That is the same value" -msgstr "That is the Malkovich" - -#: lib/RT/ACE_Overlay.pm:287 lib/RT/ACE_Overlay.pm:596 -msgid "That principal already has that right" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:674 -#. ($args{'Type'}) -msgid "That principal is already a %1 for this queue" -msgstr "Malkovich is Malkovich a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1527 -#. ($self->loc($args{'Type'})) -msgid "That principal is already a %1 for this ticket" -msgstr "Malkovich is Malkovich a %1 Malkovich" - -#: lib/RT/Queue_Overlay.pm:773 -#. ($args{'Type'}) -msgid "That principal is not a %1 for this queue" -msgstr "That Malkovich is not a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2082 -msgid "That queue does not exist" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3152 -msgid "That ticket has unresolved dependencies" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2956 -msgid "That user already owns that ticket" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2928 -msgid "That user does not exist" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:355 -msgid "That user is already privileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:376 -msgid "That user is already unprivileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:368 -msgid "That user is now privileged" -msgstr "Malkovich is Malkovich" - -#: lib/RT/User_Overlay.pm:389 -msgid "That user is now unprivileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2949 -msgid "That user may not own tickets in that queue" -msgstr "Malkovich Malkovich Malkovich in Malkovich" - -#: lib/RT/Link_Overlay.pm:200 -msgid "That's not a numerical id" -msgstr "That's not a Malkovich id" - -#: html/SelfService/Display.html:31 html/Ticket/Create.html:149 html/Ticket/Elements/ShowSummary:27 -msgid "The Basics" -msgstr "The Malkovich" - -#: lib/RT/ACE_Overlay.pm:87 -msgid "The CC of a ticket" -msgstr "The CC of a Malkovich" - -#: lib/RT/ACE_Overlay.pm:88 -msgid "The administrative CC of a ticket" -msgstr "The Malkovich CC of a Malkovich" - -#: bin/rt-crontool:194 -msgid "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:" -msgstr "The Malkovich Malkovich Malkovich Malkovich Malkovich in the Malkovich 'Malkovich' and Malkovich Malkovich to 99 if they haven't Malkovich in 4 Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "The following commands were not proccessed:\\n\\n" -msgstr "The Malkovich Malkovich Malkovich Malkovich:\\n\\n" - -#: lib/RT/Record.pm:743 -msgid "The new value has been set." -msgstr "The Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:85 -msgid "The owner of a ticket" -msgstr "The Malkovich of a Malkovich" - -#: lib/RT/ACE_Overlay.pm:86 -msgid "The requestor of a ticket" -msgstr "The Malkovich of a Malkovich" - -#: html/Admin/Elements/EditUserComments:25 -msgid "These comments aren't generally visible to the user" -msgstr "Malkovich aren't Malkovich Malkovich to the user" - -#: bin/rt-crontool:185 -msgid "This tool allows the user to run arbitrary perl modules from within RT." -msgstr "Malkovich Malkovich the user to Malkovich Malkovich Malkovich Malkovich RT." - -#: lib/RT/Transaction_Overlay.pm:226 -msgid "This transaction appears to have no content" -msgstr "Malkovich Malkovich to have no Malkovich" - -#: html/Ticket/Elements/ShowRequestor:48 -#. ($rows) -msgid "This user's %1 highest priority tickets" -msgstr "Malkovich's %1 Malkovich Malkovich" - -#: lib/RT/Date.pm:391 -msgid "Thu." -msgstr "Thu." - -#: html/Ticket/ModifyAll.html:24 html/Ticket/ModifyAll.html:28 -#. ($Ticket->Id, $Ticket->Subject) -msgid "Ticket #%1 Jumbo update: %2" -msgstr "Malkovich #%1 Malkovich: %2" - -#: html/Approvals/Elements/ShowDependency:45 -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "Ticket #%1: %2" -msgstr "Malkovich #%1: %2" - -#: lib/RT/Ticket_Overlay.pm:696 lib/RT/Ticket_Overlay.pm:720 -#. ($self->Id, $QueueObj->Name) -msgid "Ticket %1 created in queue '%2'" -msgstr "Malkovich %1 Malkovich in Malkovich '%2'" - -#: NOT FOUND IN SOURCE -msgid "Ticket %1 loaded\\n" -msgstr "Malkovich %1 Malkovich\\n" - -#: html/Search/Bulk.html:216 -#. ($Ticket->Id,$_) -msgid "Ticket %1: %2" -msgstr "Malkovich %1: %2" - -#: html/Ticket/History.html:24 html/Ticket/History.html:27 -#. ($Ticket->Id, $Ticket->Subject) -msgid "Ticket History # %1 %2" -msgstr "Malkovich # %1 %2" - -#: etc/initialdata:324 -msgid "Ticket Resolved" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Ticket attachment" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1228 -msgid "Ticket content" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1274 -msgid "Ticket content type" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:565 lib/RT/Ticket_Overlay.pm:579 lib/RT/Ticket_Overlay.pm:590 lib/RT/Ticket_Overlay.pm:707 -msgid "Ticket could not be created due to an internal error" -msgstr "Malkovich Malkovich be Malkovich to a Malkovich" - -#: lib/RT/Transaction_Overlay.pm:497 -msgid "Ticket created" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:502 -msgid "Ticket deleted" -msgstr "Malkovich" - -#: etc/initialdata:310 -msgid "Ticket status changed" -msgstr "Malkovich Malkovich" - -#: html/Elements/Tabs:46 -msgid "Tickets" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1452 -#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) -msgid "Tickets %1 %2" -msgstr "Malkovich %1 %2" - -#: lib/RT/Tickets_Overlay.pm:1410 -#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})) -msgid "Tickets %1 by %2" -msgstr "Malkovich %1 by %2" - -#: NOT FOUND IN SOURCE -msgid "Tickets from %1" -msgstr "Malkovich %1" - -#: html/Approvals/Elements/ShowDependency:26 -msgid "Tickets which depend on this approval:" -msgstr "Malkovich Malkovich on Malkovich:" - -#: html/Search/Elements/PickBasics:70 html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 -msgid "Time Left" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:68 html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:43 -msgid "Time Worked" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1201 -msgid "Time left" -msgstr "Malkovich" - -#: html/Elements/Footer:44 -msgid "Time to display" -msgstr "Time to Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1177 -msgid "Time worked" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1277 -msgid "TimeWorked" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "To generate a diff of this commit:" -msgstr "To Malkovich a diff of Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "To generate a diff of this commit:\\n" -msgstr "To Malkovich a diff of Malkovich:\\n" - -#: lib/RT/Ticket_Overlay.pm:1280 -msgid "Told" -msgstr "Told" - -#: etc/initialdata:252 -msgid "Transaction" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:705 -#. ($self->Data) -msgid "Transaction %1 purged" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:136 -msgid "Transaction Created" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:92 -msgid "Transaction->Create couldn't, as you didn't specify a ticket id" -msgstr "Malkovich->Malkovich couldn't, as you didn't Malkovich a Malkovich id" - -#: lib/RT/Transaction_Overlay.pm:760 -msgid "Transactions are immutable" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Date.pm:389 -msgid "Tue." -msgstr "Tue." - -#: html/Admin/Elements/EditCustomField:43 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1278 lib/RT/Tickets_Overlay.pm:1021 -msgid "Type" -msgstr "Type" - -#: lib/RT/ScripCondition_Overlay.pm:103 -msgid "Unimplemented" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:67 -msgid "Unix login" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "UnixUsername" -msgstr "Malkovich" - -#: lib/RT/Attachment_Overlay.pm:233 lib/RT/Attachment_Overlay.pm:265 -#. ($self->ContentEncoding) -msgid "Unknown ContentEncoding %1" -msgstr "Malkovich Malkovich %1" - -#: html/Elements/SelectResultsPerPage:36 -msgid "Unlimited" -msgstr "Malkovich" - -#: etc/initialdata:32 -msgid "Unprivileged" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:562 -msgid "Untaken" -msgstr "Malkovich" - -#: html/Search/Bulk.html:32 -msgid "Update" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update ID" -msgstr "Malkovich ID" - -#: html/Search/Bulk.html:127 html/Ticket/ModifyAll.html:65 html/Ticket/Update.html:48 -msgid "Update Type" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update all these tickets at once" -msgstr "Malkovich Malkovich at once" - -#: NOT FOUND IN SOURCE -msgid "Update email" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update name" -msgstr "Malkovich" - -#: lib/RT/Action/CreateTickets.pm:655 lib/RT/Interface/Web.pm:479 -msgid "Update not recorded." -msgstr "Malkovich Malkovich." - -#: html/Search/Bulk.html:78 -msgid "Update selected tickets" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update signature" -msgstr "Malkovich Malkovich" - -#: html/Ticket/ModifyAll.html:62 -msgid "Update ticket" -msgstr "Malkovich" - -#: html/SelfService/Update.html:24 html/SelfService/Update.html:63 -#. ($Ticket->id) -msgid "Update ticket #%1" -msgstr "Malkovich #%1" - -#: html/Ticket/Update.html:121 -#. ($TicketObj->id, $TicketObj->Subject) -msgid "Update ticket #%1 (%2)" -msgstr "Malkovich #%1 (%2)" - -#: lib/RT/Action/CreateTickets.pm:653 lib/RT/Interface/Web.pm:477 -msgid "Update type was neither correspondence nor comment." -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich." - -#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1281 -msgid "Updated" -msgstr "Malkovich" - -#: etc/initialdata:132 etc/initialdata:206 -msgid "User Defined" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "User ID" -msgstr "User ID" - -#: html/Elements/SelectUsers:25 -msgid "User Id" -msgstr "User Id" - -#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 -msgid "User Rights" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:252 -#. ($msg) -msgid "User could not be created: %1" -msgstr "Malkovich be Malkovich: %1" - -#: lib/RT/User_Overlay.pm:296 -msgid "User created" -msgstr "Malkovich" - -#: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68 -msgid "User defined groups" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:558 lib/RT/User_Overlay.pm:575 -msgid "User loaded" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "User view" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:47 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:34 -msgid "Username" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/User/Groups/Members.html:57 -msgid "Users" -msgstr "Malkovich" - -#: html/Admin/Users/index.html:64 -msgid "Users matching search criteria" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay_SQL.pm:494 -msgid "Valid Query" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:56 -msgid "Values" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:84 -msgid "Watch" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:85 -msgid "WatchAsAdminCc" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:41 -msgid "Watchers" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "WebEncoding" -msgstr "Malkovich" - -#: lib/RT/Date.pm:390 -msgid "Wed." -msgstr "Wed." - -#: etc/initialdata:521 -msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket" -msgstr "When a Malkovich Malkovich by Malkovich, Malkovich Malkovich to the Malkovich" - -#: etc/initialdata:485 -msgid "When a ticket has been approved by any approver, add correspondence to the original ticket" -msgstr "When a Malkovich Malkovich by Malkovich, Malkovich Malkovich to the Malkovich" - -#: etc/initialdata:146 -msgid "When a ticket is created" -msgstr "When a Malkovich is Malkovich" - -#: etc/initialdata:418 -msgid "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" -msgstr "When a Malkovich is Malkovich, Malkovich the Malkovich and Malkovich of the Malkovich Malkovich Malkovich" - -#: etc/initialdata:151 -msgid "When anything happens" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:199 -msgid "Whenever a ticket is resolved" -msgstr "Malkovich a Malkovich is Malkovich" - -#: etc/initialdata:185 -msgid "Whenever a ticket's owner changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:193 -msgid "Whenever a ticket's queue changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:170 -msgid "Whenever a ticket's status changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:207 -msgid "Whenever a user-defined condition occurs" -msgstr "Malkovich a user-Malkovich Malkovich" - -#: etc/initialdata:164 -msgid "Whenever comments come in" -msgstr "Malkovich Malkovich in" - -#: etc/initialdata:157 -msgid "Whenever correspondence comes in" -msgstr "Malkovich Malkovich Malkovich in" - -#: html/Admin/Users/Modify.html:161 html/User/Prefs.html:67 -msgid "Work" -msgstr "Work" - -#: NOT FOUND IN SOURCE -msgid "WorkPhone" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowBasics:41 html/Ticket/Update.html:42 -msgid "Worked" -msgstr "Malkovich" - -#: html/autohandler:150 -msgid "XXX CHANGEME You are not an authorized user" -msgstr "MALKOVICH Malkovich a Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3059 -msgid "You already own this ticket" -msgstr "Malkovich Malkovich Malkovich" - -#: html/autohandler:142 -msgid "You are not an authorized user" -msgstr "Malkovich a Malkovich" - -#: NOT FOUND IN SOURCE -msgid "You can access it with the Download button on the right." -msgstr "Malkovich it with the Malkovich on the Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2941 -msgid "You can only reassign tickets that you own or that are unowned" -msgstr "Malkovich Malkovich Malkovich Malkovich or Malkovich Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:47 lib/RT/StyleGuide.pod:760 -#. ($num, $queue) -msgid "You found %1 tickets in queue %2" -msgstr "Malkovich %1 Malkovich in Malkovich %2" - -#: html/NoAuth/Logout.html:30 -msgid "You have been logged out of RT." -msgstr "Malkovich Malkovich of RT." - -#: html/SelfService/Display.html:79 -msgid "You have no permission to create tickets in that queue." -msgstr "Malkovich no Malkovich to Malkovich in that Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2095 -msgid "You may not create requests in that queue." -msgstr "Malkovich Malkovich Malkovich in Malkovich." - -#: html/NoAuth/Logout.html:34 -msgid "You're welcome to login again" -msgstr "You're Malkovich to Malkovich" - -#: etc/initialdata:502 -msgid "Your request has been approved by %1. Other approvals may still be pending." -msgstr "Malkovich Malkovich Malkovich by %1. Malkovich Malkovich be Malkovich." - -#: etc/initialdata:540 -msgid "Your request has been approved." -msgstr "Malkovich Malkovich Malkovich." - -#: etc/initialdata:445 -msgid "Your request was rejected." -msgstr "Malkovich Malkovich." - -#: html/autohandler:177 -msgid "Your username or password is incorrect" -msgstr "Malkovich or Malkovich is Malkovich" - -#: html/Admin/Users/Modify.html:141 html/User/Prefs.html:127 -msgid "Zip" -msgstr "Zip" - -#: html/User/Elements/DelegateRights:58 -#. ($right->PrincipalObj->Object->SelfDescription) -msgid "as granted to %1" -msgstr "as Malkovich to %1" - -#: html/SelfService/Closed.html:27 -msgid "closed" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:33 -msgid "contains" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "content" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "content-type" -msgstr "Malkovich-type" - -#: html/Admin/Queues/Modify.html:76 lib/RT/Date.pm:319 -msgid "days" -msgstr "days" - -#: lib/RT/Queue_Overlay.pm:64 -msgid "deleted" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:33 -msgid "does not match" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:34 -msgid "doesn't contain" -msgstr "doesn't Malkovich" - -#: html/Elements/SelectEqualityOperator:37 -msgid "equal to" -msgstr "Malkovich to" - -#: NOT FOUND IN SOURCE -msgid "filename" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37 -msgid "greater than" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:196 -#. ($self->Name) -msgid "group '%1'" -msgstr "Malkovich '%1'" - -#: lib/RT/Date.pm:315 -msgid "hours" -msgstr "Malkovich" - -#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickBasics:49 html/Search/Elements/PickBasics:80 html/Search/Elements/PickBasics:97 html/Search/Elements/PickCFs:37 -msgid "is" -msgstr "is" - -#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickBasics:50 html/Search/Elements/PickBasics:81 html/Search/Elements/PickBasics:98 html/Search/Elements/PickCFs:38 -msgid "isn't" -msgstr "isn't" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37 -msgid "less than" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:32 -msgid "matches" -msgstr "Malkovich" - -#: lib/RT/Date.pm:311 -msgid "min" -msgstr "min" - -#: html/Ticket/Update.html:42 -msgid "minutes" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "modifications\\n\\n" -msgstr "Malkovich\\n\\n" - -#: lib/RT/Date.pm:327 -msgid "months" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:59 -msgid "new" -msgstr "new" - -#: html/Admin/Elements/EditCustomFields:42 -msgid "no name" -msgstr "no name" - -#: html/Admin/Elements/EditScrips:42 -msgid "no value" -msgstr "no Malkovich" - -#: html/Admin/Elements/EditQueueWatchers:26 html/Ticket/Elements/EditWatchers:27 -msgid "none" -msgstr "none" - -#: html/Elements/SelectEqualityOperator:37 -msgid "not equal to" -msgstr "Malkovich to" - -#: html/SelfService/Elements/MyRequests:61 lib/RT/Queue_Overlay.pm:60 -msgid "open" -msgstr "open" - -#: lib/RT/Group_Overlay.pm:201 -#. ($self->Name, $user->Name) -msgid "personal group '%1' for user '%2'" -msgstr "Malkovich '%1' Malkovich '%2'" - -#: lib/RT/Group_Overlay.pm:209 -#. ($queue->Name, $self->Type) -msgid "queue %1 %2" -msgstr "Malkovich %1 %2" - -#: lib/RT/Queue_Overlay.pm:63 -msgid "rejected" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:62 -msgid "resolved" -msgstr "Malkovich" - -#: lib/RT/Date.pm:307 -msgid "sec" -msgstr "sec" - -#: lib/RT/Queue_Overlay.pm:61 -msgid "stalled" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:204 -#. ($self->Type) -msgid "system %1" -msgstr "Malkovich %1" - -#: lib/RT/Group_Overlay.pm:215 -#. ($self->Type) -msgid "system group '%1'" -msgstr "Malkovich '%1'" - -#: html/Elements/Error:42 html/SelfService/Error.html:41 -msgid "the calling component did not specify why" -msgstr "the Malkovich Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ticket #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Group_Overlay.pm:212 -#. ($self->Instance, $self->Type) -msgid "ticket #%1 %2" -msgstr "Malkovich #%1 %2" - -#: lib/RT/Group_Overlay.pm:218 -#. ($self->Id) -msgid "undescribed group %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Group_Overlay.pm:193 -#. ($user->Object->Name) -msgid "user %1" -msgstr "user %1" - -#: lib/RT/Date.pm:323 -msgid "weeks" -msgstr "Malkovich" - -#: lib/RT/Date.pm:331 -msgid "years" -msgstr "Malkovich" - diff --git a/rt/lib/RT/Interface/CLI.pm b/rt/lib/RT/Interface/CLI.pm index 533150415..ec0e877b4 100644 --- a/rt/lib/RT/Interface/CLI.pm +++ b/rt/lib/RT/Interface/CLI.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  use strict;  use RT; @@ -57,7 +33,7 @@ BEGIN {      use vars qw ($VERSION  @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);      # set the version for version checking -    $VERSION = do { my @r = (q$Revision: 1.1.1.7 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker +    $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker      @ISA         = qw(Exporter); diff --git a/rt/lib/RT/Interface/Email.pm b/rt/lib/RT/Interface/Email.pm index 14ae2a058..7eec0502f 100755 --- a/rt/lib/RT/Interface/Email.pm +++ b/rt/lib/RT/Interface/Email.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,70 +14,50 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.)  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  package RT::Interface::Email;  use strict;  use Mail::Address;  use MIME::Entity;  use RT::EmailParser; -use File::Temp; -use UNIVERSAL::require; +  BEGIN {      use Exporter (); -    use vars qw ( @ISA @EXPORT_OK); - +    use vars qw ($VERSION  @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); +          # set the version for version checking -    our $VERSION = 2.0; - -    @ISA = qw(Exporter); - +    $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker +     +    @ISA         = qw(Exporter); +          # your exported package globals go here,      # as well as any optionally exported functions -    @EXPORT_OK = qw( -        &CreateUser -        &GetMessageContent -        &CheckForLoops -        &CheckForSuspiciousSender -        &CheckForAutoGenerated -        &CheckForBounce -        &MailError -        &ParseCcAddressesFromHead -        &ParseSenderAddressFromHead -        &ParseErrorsToAddressFromHead -        &ParseAddressFromHeader -        &Gateway); +    @EXPORT_OK   = qw( +              &CreateUser +		      &GetMessageContent +		      &CheckForLoops  +		      &CheckForSuspiciousSender +		      &CheckForAutoGenerated  +		      &MailError  +		      &ParseCcAddressesFromHead +		      &ParseSenderAddressFromHead  +		      &ParseErrorsToAddressFromHead +                      &ParseAddressFromHeader +              &Gateway);  }  =head1 NAME -  RT::Interface::Email - helper functions for parsing email sent to RT +  RT::Interface::CLI - helper functions for creating a commandline RT interface  =head1 SYNOPSIS @@ -106,18 +80,19 @@ ok(require RT::Interface::Email);  =cut -# {{{ sub CheckForLoops -sub CheckForLoops { -    my $head = shift; +# {{{ sub CheckForLoops  +sub CheckForLoops  { +    my $head = shift; +          #If this instance of RT sent it our, we don't want to take it in      my $RTLoop = $head->get("X-RT-Loop-Prevention") || ""; -    chomp($RTLoop);    #remove that newline -    if ( $RTLoop eq "$RT::rtname" ) { -        return (1); +    chomp ($RTLoop); #remove that newline +    if ($RTLoop eq "$RT::rtname") { +	return (1);      } - +          # TODO: We might not trap the case where RT instance A sends a mail      # to RT instance B which sends a mail to ...      return (undef); @@ -131,24 +106,23 @@ sub CheckForSuspiciousSender {      my $head = shift;      #if it's from a postmaster or mailer daemon, it's likely a bounce. - +          #TODO: better algorithms needed here - there is no standards for      #bounces, so it's very difficult to separate them from anything      #else.  At the other hand, the Return-To address is only ment to be      #used as an error channel, we might want to put up a separate      #Return-To address which is treated differently. - +          #TODO: search through the whole email and find the right Ticket ID. -    my ( $From, $junk ) = ParseSenderAddressFromHead($head); - -    if (   ( $From =~ /^mailer-daemon\@/i ) -        or ( $From =~ /^postmaster\@/i ) ) -    { -        return (1); - +    my ($From, $junk) = ParseSenderAddressFromHead($head); +     +    if (($From =~ /^mailer-daemon/i) or +	($From =~ /^postmaster/i)){ +	return (1); +	      } - +          return (undef);  } @@ -158,126 +132,57 @@ sub CheckForSuspiciousSender {  # {{{ sub CheckForAutoGenerated  sub CheckForAutoGenerated {      my $head = shift; - -    my $Precedence = $head->get("Precedence") || ""; -    if ( $Precedence =~ /^(bulk|junk)/i ) { -        return (1); -    } - -    # First Class mailer uses this as a clue. -    my $FCJunk = $head->get("X-FC-Machinegenerated") || ""; -    if ( $FCJunk =~ /^true/i ) { -        return (1); +     +    my $Precedence = $head->get("Precedence") || "" ; +    if ($Precedence =~ /^(bulk|junk)/i) { +	return (1);      } - -    return (0); -} - -# }}} - -# {{{ sub CheckForBounce -sub CheckForBounce { -    my $head = shift; - -    my $ReturnPath = $head->get("Return-path") || ""; -    return ( $ReturnPath =~ /<>/ ); -} - -# }}} - -# {{{ IsRTAddress - -=head2 IsRTAddress ADDRESS - -Takes a single parameter, an email address.  -Returns true if that address matches the $RTAddressRegexp.   -Returns false, otherwise. - -=cut - -sub IsRTAddress { -    my $address = shift || ''; - -    # Example: the following rule would tell RT not to Cc -    #   "tickets@noc.example.com" -    if ( defined($RT::RTAddressRegexp) -        && $address =~ /$RT::RTAddressRegexp/i ) -    { -        return (1); -    } else { -        return (undef); +    else { +	return (0);      }  }  # }}} -# {{{ CullRTAddresses - -=head2 CullRTAddresses ARRAY - -Takes a single argument, an array of email addresses. -Returns the same array with any IsRTAddress()es weeded out. -=cut - -sub CullRTAddresses { -    return grep !IsRTAddress($_), @_; -} - -# }}} - -# {{{ sub MailError +# {{{ sub MailError   sub MailError { -    my %args = ( -        To          => $RT::OwnerEmail, -        Bcc         => undef, -        From        => $RT::CorrespondAddress, -        Subject     => 'There has been an error', -        Explanation => 'Unexplained error', -        MIMEObj     => undef, -        Attach      => undef, -        LogLevel    => 'crit', -        @_ -    ); - -    $RT::Logger->log( -        level   => $args{'LogLevel'}, -        message => $args{'Explanation'} -    ); -    # the colons are necessary to make ->build include non-standard headers -    my $entity = MIME::Entity->build( -        Type                   => "multipart/mixed", -        From                   => $args{'From'}, -        Bcc                    => $args{'Bcc'}, -        To                     => $args{'To'}, -        Subject                => $args{'Subject'}, -        'Precedence:'             => 'bulk', -        'X-RT-Loop-Prevention:' => $RT::rtname, -        'In-Reply-To:'          => $args{'MIMEObj'} ? $args{'MIMEObj'}->head->get('Message-Id') : undef -    ); - -    $entity->attach( Data => $args{'Explanation'} . "\n" ); - +    my %args = (To => $RT::OwnerEmail, +		Bcc => undef, +		From => $RT::CorrespondAddress, +		Subject => 'There has been an error', +		Explanation => 'Unexplained error', +		MIMEObj => undef, +		LogLevel => 'crit', +		@_); + + +    $RT::Logger->log(level => $args{'LogLevel'},  +		     message => $args{'Explanation'} +		    ); +    my $entity = MIME::Entity->build( Type  =>"multipart/mixed", +				      From => $args{'From'}, +				      Bcc => $args{'Bcc'}, +				      To => $args{'To'}, +				      Subject => $args{'Subject'}, +				      'X-RT-Loop-Prevention' => $RT::rtname, +				    ); + +    $entity->attach(  Data => $args{'Explanation'}."\n"); +          my $mimeobj = $args{'MIMEObj'};      if ($mimeobj) {          $mimeobj->sync_headers();          $entity->add_part($mimeobj);      } - -    if ( $args{'Attach'} ) { -        $entity->attach( Data => $args{'Attach'}, Type => 'message/rfc822' ); - -    } - -    if ( $RT::MailCommand eq 'sendmailpipe' ) { -        open( MAIL, -            "|$RT::SendmailPath $RT::SendmailBounceArguments $RT::SendmailArguments" -            ) -            || return (0); +     +    if ($RT::MailCommand eq 'sendmailpipe') { +        open (MAIL, "|$RT::SendmailPath $RT::SendmailArguments") || return(0);          print MAIL $entity->as_string;          close(MAIL); -    } else { -        $entity->send( $RT::MailCommand, $RT::MailParams ); +    } +    else { +	$entity->send($RT::MailCommand, $RT::MailParams);      }  } @@ -286,38 +191,43 @@ sub MailError {  # {{{ Create User  sub CreateUser { -    my ( $Username, $Address, $Name, $ErrorsTo, $entity ) = @_; +    my ($Username, $Address, $Name, $ErrorsTo, $entity) = @_;      my $NewUser = RT::User->new($RT::SystemUser); -    my ( $Val, $Message ) = $NewUser->Create( -        Name => ( $Username || $Address ), -        EmailAddress => $Address, -        RealName     => $Name, -        Password     => undef, -        Privileged   => 0, -        Comments     => 'Autocreated on ticket submission' -    ); - +    # This data is tainted by some Very Broken mailers. +    # (Sometimes they send raw ISO 8859-1 data here. fear that. +    require Encode; +    $Username = Encode::encode(utf8 => $Username, Encode::FB_PERLQQ()) if defined $Username; +    $Name = Encode::encode(utf8 => $Name, Encode::FB_PERLQQ()) if defined $Name; +     +    my ($Val, $Message) =  +      $NewUser->Create(Name => ($Username || $Address), +                       EmailAddress => $Address, +                       RealName => $Name, +                       Password => undef, +                       Privileged => 0, +                       Comments => 'Autocreated on ticket submission' +                      ); +          unless ($Val) { - +                  # Deal with the race condition of two account creations at once +        #          if ($Username) {              $NewUser->LoadByName($Username);          } - -        unless ( $NewUser->Id ) { +         +        unless ($NewUser->Id) {              $NewUser->LoadByEmail($Address);          } - -        unless ( $NewUser->Id ) { -            MailError( -                To          => $ErrorsTo, -                Subject     => "User could not be created", -                Explanation => -                    "User creation failed in mailgateway: $Message", -                MIMEObj  => $entity, -                LogLevel => 'crit' -            ); +         +        unless ($NewUser->Id) {   +            MailError( To => $ErrorsTo, +                       Subject => "User could not be created", +                       Explanation => "User creation failed in mailgateway: $Message", +                       MIMEObj => $entity, +                       LogLevel => 'crit' +                     );          }      } @@ -325,25 +235,20 @@ sub CreateUser {      my $CurrentUser = RT::CurrentUser->new();      $CurrentUser->LoadByEmail($Address); -    unless ( $CurrentUser->id ) { -        $RT::Logger->warning( -            "Couldn't load user '$Address'." . "giving up" ); -        MailError( -            To          => $ErrorsTo, -            Subject     => "User could not be loaded", -            Explanation => -                "User  '$Address' could not be loaded in the mail gateway", -            MIMEObj  => $entity, -            LogLevel => 'crit' -        ); +    unless ($CurrentUser->id) { +            $RT::Logger->warning("Couldn't load user '$Address'.".  "giving up"); +                MailError( To => $ErrorsTo, +                           Subject => "User could not be loaded", +                           Explanation => "User  '$Address' could not be loaded in the mail gateway", +                           MIMEObj => $entity, +                           LogLevel => 'crit' +                     );      }      return $CurrentUser;  } - -# }}} - -# {{{ ParseCcAddressesFromHead +# }}}	     +# {{{ ParseCcAddressesFromHead   =head2 ParseCcAddressesFromHead HASHREF @@ -353,34 +258,32 @@ headers b<except> the current Queue\'s email addresses, the CurrentUser\'s  email address  and anything that the configuration sub RT::IsRTAddress matches.  =cut - +    sub ParseCcAddressesFromHead { -    my %args = ( -        Head        => undef, -        QueueObj    => undef, -        CurrentUser => undef, -        @_ -    ); - +    my %args = ( Head => undef, +		 QueueObj => undef, +		 CurrentUser => undef, +		 @_ ); +          my (@Addresses); - -    my @ToObjs = Mail::Address->parse( $args{'Head'}->get('To') ); -    my @CcObjs = Mail::Address->parse( $args{'Head'}->get('Cc') ); - -    foreach my $AddrObj ( @ToObjs, @CcObjs ) { -        my $Address = $AddrObj->address; -        $Address = $args{'CurrentUser'} -            ->UserObj->CanonicalizeEmailAddress($Address); -        next if ( $args{'CurrentUser'}->EmailAddress   =~ /^\Q$Address\E$/i ); -        next if ( $args{'QueueObj'}->CorrespondAddress =~ /^\Q$Address\E$/i ); -        next if ( $args{'QueueObj'}->CommentAddress    =~ /^\Q$Address\E$/i ); -        next if ( RT::EmailParser->IsRTAddress($Address) ); - -        push( @Addresses, $Address ); +         +    my @ToObjs = Mail::Address->parse($args{'Head'}->get('To')); +    my @CcObjs = Mail::Address->parse($args{'Head'}->get('Cc')); +     +    foreach my $AddrObj (@ToObjs, @CcObjs) { +	my $Address = $AddrObj->address; +	$Address = $args{'CurrentUser'}->UserObj->CanonicalizeEmailAddress($Address); + 	next if ($args{'CurrentUser'}->EmailAddress =~ /^$Address$/i); +	next if ($args{'QueueObj'}->CorrespondAddress =~ /^$Address$/i); +	next if ($args{'QueueObj'}->CommentAddress =~ /^$Address$/i); +	next if (RT::EmailParser::IsRTAddress(undef, $Address)); +	 +	push (@Addresses, $Address);      }      return (@Addresses);  } +  # }}}  # {{{ ParseSenderAdddressFromHead @@ -394,16 +297,11 @@ of the From (evaluated in order of Reply-To:, From:, Sender)  sub ParseSenderAddressFromHead {      my $head = shift; -      #Figure out who's sending this message. -    foreach my $header ('Reply-To', 'From', 'Sender') { -        my $From = $head->get($header); -        my ($addr, $name) = ParseAddressFromHeader($From); -        # only return if the address is not empty -        return ($addr, $name) if $addr; -    } - -    return (undef, undef); +    my $From = $head->get('Reply-To') ||  +      $head->get('From') ||  +	$head->get('Sender'); +    return (ParseAddressFromHeader($From));  }  # }}} @@ -412,29 +310,24 @@ sub ParseSenderAddressFromHead {  =head2 ParseErrorsToAddressFromHead  Takes a MIME::Header object. Return a single value : user@host -of the From (evaluated in order of Return-path:,Errors-To:,Reply-To:, -From:, Sender) +of the From (evaluated in order of Errors-To:,Reply-To:, From:, Sender)  =cut  sub ParseErrorsToAddressFromHead {      my $head = shift; -      #Figure out who's sending this message. -    foreach my $header ( 'Errors-To', 'Reply-To', 'From', 'Sender' ) { - -        # If there's a header of that name -        my $headerobj = $head->get($header); -        if ($headerobj) { -            my ( $addr, $name ) = ParseAddressFromHeader($headerobj); - -            # If it's got actual useful content... -            return ($addr) if ($addr); -        } +    foreach my $header ('Errors-To' , 'Reply-To', 'From', 'Sender' ) { +	# If there's a header of that name +	my $headerobj = $head->get($header); +	if ($headerobj) { +		my ($addr, $name ) = ParseAddressFromHeader($headerobj); +		# If it's got actual useful content... +		return ($addr) if ($addr); +	}      }  } -  # }}}  # {{{ ParseAddressFromHeader @@ -445,547 +338,311 @@ Takes an address from $head->get('Line') and returns a tuple: user@host, friendl  =cut -sub ParseAddressFromHeader { -    my $Addr = shift; -    # Some broken mailers send:  ""Vincent, Jesse"" <jesse@fsck.com>. Hate -    $Addr =~ s/\"\"(.*?)\"\"/\"$1\"/g;                                                                                                                                                   +sub ParseAddressFromHeader{ +    my $Addr = shift; +          my @Addresses = Mail::Address->parse($Addr); +     +    my $AddrObj = $Addresses[0]; -    my ($AddrObj) = grep ref $_, @Addresses; -    unless ( $AddrObj ) { -        return ( undef, undef ); +    unless (ref($AddrObj)) { +	return(undef,undef);      } - -    my $Name = ( $AddrObj->phrase || $AddrObj->comment || $AddrObj->address ); - +  +    my $Name =  ($AddrObj->phrase || $AddrObj->comment || $AddrObj->address); +          #Lets take the from and load a user object.      my $Address = $AddrObj->address; -    return ( $Address, $Name ); +    return ($Address, $Name);  } -  # }}} -# {{{ sub ParseTicketId -sub ParseTicketId { -    my $Subject = shift; -    my $id; - -    my $test_name = $RT::EmailSubjectTagRegex || qr/\Q$RT::rtname\E/i; - -    if ( $Subject =~ s/\[$test_name\s+\#(\d+)\s*\]//i ) { -        my $id = $1; -        $RT::Logger->debug("Found a ticket ID. It's $id"); -        return ($id); -    } else { -        return (undef); -    } -} - -# }}} - -=head2 Gateway ARGSREF - - -Takes parameters: - -    action -    queue -    message +=head2 Gateway  This performs all the "guts" of the mail rt-mailgate program, and is  designed to be called from the web interface with a message, user  object, and so on. -Can also take an optional 'ticket' parameter; this ticket id overrides -any ticket id found in the subject. - -Returns: - -    An array of: -     -    (status code, message, optional ticket object) - -    status code is a numeric value. - -      for temporary failures, the status code should be -75 - -      for permanent failures which are handled by RT, the status code  -      should be 0 -     -      for succces, the status code should be 1 - - -  =cut  sub Gateway { -    my $argsref = shift; -    my %args    = ( -        action  => 'correspond', -        queue   => '1', -        ticket  => undef, -        message => undef, -        %$argsref -    ); - -    my $SystemTicket; -    my $Right; +    my %args = ( message => undef, +                 queue   => 1, +                 action  => 'correspond', +                 ticket  => undef, +                 @_ );      # Validate the action -    my ( $status, @actions ) = IsCorrectAction( $args{'action'} ); -    unless ($status) { -        return ( -            -75, -            "Invalid 'action' parameter " -                . $actions[0] -                . " for queue " -                . $args{'queue'}, -            undef -        ); +    unless ( $args{'action'} =~ /^(comment|correspond|action)$/ ) { + +        # Can't safely loc this. What object do we loc around? +        return ( 0, "Invalid 'action' parameter", undef );      }      my $parser = RT::EmailParser->new(); -    $parser->SmartParseMIMEEntityFromScalar( Message => $args{'message'} ); -    my $Message = $parser->Entity(); - -    unless ($Message) { -        MailError( -            To          => $RT::OwnerEmail, -            Subject     => "RT Bounce: Unparseable message", -            Explanation => "RT couldn't process the message below", -            Attach      => $args{'message'} -        ); - -        return ( 0, -            "Failed to parse this message. Something is likely badly wrong with the message" -        ); -    } +    $parser->ParseMIMEEntityFromScalar( $args{'message'} ); +    my $Message = $parser->Entity();      my $head = $Message->head; +    my ( $CurrentUser, $AuthStat, $status, $error ); +      my $ErrorsTo = ParseErrorsToAddressFromHead($head); -    my $MessageId = $head->get('Message-ID') -        || "<no-message-id-" . time . rand(2000) . "\@.$RT::Organization>"; +    my $MessageId = $head->get('Message-Id') +      || "<no-message-id-" . time . rand(2000) . "\@.$RT::Organization>";      #Pull apart the subject line      my $Subject = $head->get('Subject') || '';      chomp $Subject; -     -    # {{{ Lets check for mail loops of various sorts. -    my ($should_store_machine_generated_message, $IsALoop, $result); -    ( $should_store_machine_generated_message, $ErrorsTo, $result, $IsALoop ) = -      _HandleMachineGeneratedMail( -        Message  => $Message, -        ErrorsTo => $ErrorsTo, -        Subject  => $Subject, -        MessageId => $MessageId -    ); - -    # Do not pass loop messages to MailPlugins, to make sure the loop -    # is broken, unless $RT::StoreLoops is set. -    if ($IsALoop && !$should_store_machine_generated_message) { -        return ( 0, $result, undef ); -    } -    $args{'ticket'} ||= ParseTicketId($Subject); -    $SystemTicket = RT::Ticket->new($RT::SystemUser); -    $SystemTicket->Load( $args{'ticket'} ) if ( $args{'ticket'} ) ; -    if ( $SystemTicket->id ) { -        $Right = 'ReplyToTicket'; -    } else { -        $Right = 'CreateTicket'; +    $args{'ticket'} ||= $parser->ParseTicketId($Subject); + +    my $SystemTicket; +    if ($args{'ticket'} ) { +        $SystemTicket = RT::Ticket->new($RT::SystemUser); +        $SystemTicket->Load($args{'ticket'});      }      #Set up a queue object      my $SystemQueueObj = RT::Queue->new($RT::SystemUser);      $SystemQueueObj->Load( $args{'queue'} ); +      # We can safely have no queue of we have a known-good ticket -    unless ( $SystemTicket->id || $SystemQueueObj->id ) { -        return ( -75, "RT couldn't find the queue: " . $args{'queue'}, undef ); +    unless ( $args{'ticket'} || $SystemQueueObj->id ) { +        MailError( +                 To          => $RT::OwnerEmail, +                 Subject     => "RT Bounce: $Subject", +                 Explanation => "RT couldn't find the queue: " . $args{'queue'}, +                 MIMEObj     => $Message ); +        return ( 0, "RT couldn't find the queue: " . $args{'queue'}, undef );      } -    # Authentication Level ($AuthStat) -    # -1 - Get out.  this user has been explicitly declined +    # Authentication Level +    # -1 - Get out.  this user has been explicitly declined       # 0 - User may not do anything (Not used at the moment)      # 1 - Normal user      # 2 - User is allowed to specify status updates etc. a la enhanced-mailgate -    my ( $CurrentUser, $AuthStat, $error ); - -    # Initalize AuthStat so comparisons work correctly -    $AuthStat = -9999999; - -    push @RT::MailPlugins, "Auth::MailFrom" unless @RT::MailPlugins; - -    # if plugin returns AuthStat -2 we skip action -    # NOTE: this is experimental API and it would be changed -    my %skip_action = (); +    push @RT::MailPlugins, "Auth::MailFrom"   unless @RT::MailPlugins;      # Since this needs loading, no matter what -    foreach (@RT::MailPlugins) { -        my ($Code, $NewAuthStat); + +    for (@RT::MailPlugins) { +        my $Code; +        my $NewAuthStat;          if ( ref($_) eq "CODE" ) {              $Code = $_; -        } else { -            my $Class = $_; -            $Class = "RT::Interface::Email::" . $Class -                unless $Class =~ /^RT::Interface::Email::/; -            $Class->require or -                do { $RT::Logger->error("Couldn't load $Class: $@"); next }; - +        } +        else { +            $_ = "RT::Interface::Email::$_" unless /^RT::Interface::Email::/; +            eval "require $_;"; +            if ($@) { +                die ("Couldn't load module $_: $@"); +                next; +            }              no strict 'refs'; -            unless ( defined( $Code = *{ $Class . "::GetCurrentUser" }{CODE} ) ) { -                $RT::Logger->crit( "No 'GetCurrentUser' function found in '$Class' module"); +            if ( !defined( $Code = *{ $_ . "::GetCurrentUser" }{CODE} ) ) { +                die ("No GetCurrentUser code found in $_ module");                  next;              }          } -        foreach my $action (@actions) { -            ( $CurrentUser, $NewAuthStat ) = $Code->( -                Message       => $Message, -                RawMessageRef => \$args{'message'}, -                CurrentUser   => $CurrentUser, -                AuthLevel     => $AuthStat, -                Action        => $action, -                Ticket        => $SystemTicket, -                Queue         => $SystemQueueObj -            ); - -# You get the highest level of authentication you were assigned, unless you get the magic -1 -# If a module returns a "-1" then we discard the ticket, so. -            $AuthStat = $NewAuthStat -                if ( $NewAuthStat > $AuthStat or $NewAuthStat == -1 or $NewAuthStat == -2 ); - -            last if $AuthStat == -1; -            $skip_action{$action}++ if $AuthStat == -2; -        } - -        # strip actions we should skip -        @actions = grep !$skip_action{$_}, @actions if $AuthStat == -2; -        last unless @actions; +        ( $CurrentUser, $NewAuthStat ) = $Code->( Message     => $Message, +                                                  CurrentUser => $CurrentUser, +                                                  AuthLevel   => $AuthStat, +                                                  Action => $args{'action'}, +                                                  Ticket => $SystemTicket, +                                                  Queue  => $SystemQueueObj ); +        # You get the highest level of authentication you were assigned.          last if $AuthStat == -1; +        $AuthStat = $NewAuthStat if $NewAuthStat > $AuthStat;      } +      # {{{ If authentication fails and no new user was created, get out. -    if ( !$CurrentUser || !$CurrentUser->id || $AuthStat == -1 ) { +    if ( !$CurrentUser or !$CurrentUser->Id or $AuthStat == -1 ) {          # If the plugins refused to create one, they lose. -        unless ( $AuthStat == -1 ) { -            _NoAuthorizedUserFound( -                Right     => $Right, -                Message   => $Message, -                Requestor => $ErrorsTo, -                Queue     => $args{'queue'} -            ); - -        } -        return ( 0, "Could not load a valid user", undef ); -    } - -    # If we got a user, but they don't have the right to say things -    if ( $AuthStat == 0 ) {          MailError( -            To          => $ErrorsTo, -            Subject     => "Permission Denied", -            Explanation => -                "You do not have permission to communicate with RT", -            MIMEObj => $Message -        ); -        return ( -            0, -            "$ErrorsTo tried to submit a message to " -                . $args{'Queue'} -                . " without permission.", -            undef -        ); -    } +            Subject     => "Could not load a valid user", +            Explanation => <<EOT, +RT could not load a valid user, and RT's configuration does not allow +for the creation of a new user for your email. +Your RT administrator needs to grant 'Everyone' the right 'CreateTicket' +for this queue. -    unless ($should_store_machine_generated_message) { -        return ( 0, $result, undef ); +EOT +            MIMEObj  => $Message, +            LogLevel => 'error' ) +          unless $AuthStat == -1; +        return ( 0, "Could not load a valid user", undef );      } -     -    # if plugin's updated SystemTicket then update arguments -    $args{'ticket'} = $SystemTicket->Id if $SystemTicket && $SystemTicket->Id; -    my $Ticket = RT::Ticket->new($CurrentUser); +    # }}} -    if ( !$args{'ticket'} && grep /^(comment|correspond)$/, @actions ) -    { +    # {{{ Lets check for mail loops of various sorts. +    my $IsAutoGenerated = CheckForAutoGenerated($head); -        my @Cc; -        my @Requestors = ( $CurrentUser->id ); +    my $IsSuspiciousSender = CheckForSuspiciousSender($head); -        if ($RT::ParseNewMessageForTicketCcs) { -            @Cc = ParseCcAddressesFromHead( -                Head        => $head, -                CurrentUser => $CurrentUser, -                QueueObj    => $SystemQueueObj -            ); -        } +    my $IsALoop = CheckForLoops($head); -        my ( $id, $Transaction, $ErrStr ) = $Ticket->Create( -            Queue     => $SystemQueueObj->Id, -            Subject   => $Subject, -            Requestor => \@Requestors, -            Cc        => \@Cc, -            MIMEObj   => $Message -        ); -        if ( $id == 0 ) { -            MailError( -                To          => $ErrorsTo, -                Subject     => "Ticket creation failed: $Subject", -                Explanation => $ErrStr, -                MIMEObj     => $Message -            ); -            return ( 0, "Ticket creation failed: $ErrStr", $Ticket ); -        } +    my $SquelchReplies = 0; -        # strip comments&corresponds from the actions we don't need -        # to record them if we've created the ticket just now -        @actions = grep !/^(comment|correspond)$/, @actions; -        $args{'ticket'} = $id; +    #If the message is autogenerated, we need to know, so we can not +    # send mail to the sender +    if ( $IsSuspiciousSender || $IsAutoGenerated || $IsALoop ) { +        $SquelchReplies = 1; +        $ErrorsTo       = $RT::OwnerEmail; +    } -    } elsif ( $args{'ticket'} ) { +    # }}} -        $Ticket->Load( $args{'ticket'} ); -        unless ( $Ticket->Id ) { -            my $error = "Could not find a ticket with id " . $args{'ticket'}; -            MailError( -                To          => $ErrorsTo, -                Subject     => "Message not recorded: $Subject", -                Explanation => $error, -                MIMEObj     => $Message -            ); - -            return ( 0, $error ); -        } -        $args{'ticket'} = $Ticket->id; -    } else { -        return ( 1, "Success", $Ticket ); +    # {{{ Drop it if it's disallowed +    if ( $AuthStat == 0 ) { +        MailError( +             To          => $ErrorsTo, +             Subject     => "Permission Denied", +             Explanation => "You do not have permission to communicate with RT", +             MIMEObj     => $Message );      }      # }}} -    foreach my $action (@actions) { - -        #   If the action is comment, add a comment. -        if ( $action =~ /^(?:comment|correspond)$/i ) { -            my $method = ucfirst lc $action; -            my ( $status, $msg ) = $Ticket->$method( MIMEObj => $Message ); -            unless ($status) { - -                #Warn the sender that we couldn't actually submit the comment. -                MailError( -                    To          => $ErrorsTo, -                    Subject     => "Message not recorded: $Subject", -                    Explanation => $msg, -                    MIMEObj     => $Message -                ); -                return ( 0, "Message not recorded: $msg", $Ticket ); -            } -        } elsif ($RT::UnsafeEmailCommands) { -            my ( $status, $msg ) = _RunUnsafeAction( -                Action      => $action, -                ErrorsTo    => $ErrorsTo, -                Message     => $Message, -                Ticket      => $Ticket, -                CurrentUser => $CurrentUser, -            ); -            return ($status, $msg, $Ticket) unless $status == 1; -        } -    } -    return ( 1, "Success", $Ticket ); -} +    # {{{ Warn someone  if it's a loop -sub _RunUnsafeAction { -    my %args = ( -        Action      => undef, -        ErrorsTo    => undef, -        Message     => undef, -        Ticket      => undef, -        CurrentUser => undef, -        @_ -    ); - -    if ( $args{'Action'} =~ /^take$/i ) { -        my ( $status, $msg ) = $args{'Ticket'}->SetOwner( $args{'CurrentUser'}->id ); -        unless ($status) { -            MailError( -                To          => $args{'ErrorsTo'}, -                Subject     => "Ticket not taken", -                Explanation => $msg, -                MIMEObj     => $args{'Message'} -            ); -            return ( 0, "Ticket not taken" ); -        } -    } elsif ( $args{'Action'} =~ /^resolve$/i ) { -        my ( $status, $msg ) = $args{'Ticket'}->SetStatus('resolved'); -        unless ($status) { +    # Warn someone if it's a loop, before we drop it on the ground +    if ($IsALoop) { +        $RT::Logger->crit("RT Recieved mail ($MessageId) from itself."); -            #Warn the sender that we couldn't actually submit the comment. -            MailError( -                To          => $args{'ErrorsTo'}, -                Subject     => "Ticket not resolved", -                Explanation => $msg, -                MIMEObj     => $args{'Message'} -            ); -            return ( 0, "Ticket not resolved" ); +        #Should we mail it to RTOwner? +        if ($RT::LoopsToRTOwner) { +            MailError( To          => $RT::OwnerEmail, +                       Subject     => "RT Bounce: $Subject", +                       Explanation => "RT thinks this message may be a bounce", +                       MIMEObj     => $Message ); + +            #Do we actually want to store it? +            return ( 0, "Message Bounced", undef ) unless ($RT::StoreLoops);          } -    } else { -        return ( 0, "Not supported unsafe action $args{'Action'}", $args{'Ticket'} );      } -    return ( 1, "Success" ); -} - -=head2 _NoAuthorizedUserFound -Emails the RT Owner and the requestor when the auth plugins return "No auth user found" - -=cut - -sub _NoAuthorizedUserFound { -    my %args = ( -        Right     => undef, -        Message   => undef, -        Requestor => undef, -        Queue     => undef, -        @_ -    ); - -    # Notify the RT Admin of the failure. -    MailError( -        To          => $RT::OwnerEmail, -        Subject     => "Could not load a valid user", -        Explanation => <<EOT, -RT could not load a valid user, and RT's configuration does not allow -for the creation of a new user for this email (@{[$args{Requestor}]}). +    # }}} -You might need to grant 'Everyone' the right '@{[$args{Right}]}' for the -queue @{[$args{'Queue'}]}. +    # {{{ Squelch replies if necessary +    # Don't let the user stuff the RT-Squelch-Replies-To header. +    if ( $head->get('RT-Squelch-Replies-To') ) { +        $head->add( 'RT-Relocated-Squelch-Replies-To', +                    $head->get('RT-Squelch-Replies-To') ); +        $head->delete('RT-Squelch-Replies-To'); +    } -EOT -        MIMEObj  => $args{'Message'}, -        LogLevel => 'error' -    ); - -    # Also notify the requestor that his request has been dropped. -    if ($args{'Requestor'} ne $RT::OwnerEmail) { -    MailError( -        To          => $args{'Requestor'}, -        Subject     => "Could not load a valid user", -        Explanation => <<EOT, -RT could not load a valid user, and RT's configuration does not allow -for the creation of a new user for your email. +    if ($SquelchReplies) { +        ## TODO: This is a hack.  It should be some other way to +        ## indicate that the transaction should be "silent". -EOT -        MIMEObj  => $args{'Message'}, -        LogLevel => 'error' -    ); +        my ( $Sender, $junk ) = ParseSenderAddressFromHead($head); +        $head->add( 'RT-Squelch-Replies-To', $Sender );      } -} -=head2 _HandleMachineGeneratedMail - -Takes named params: -    Message -    ErrorsTo -    Subject +    # }}} -Checks the message to see if it's a bounce, if it looks like a loop, if it's autogenerated, etc. -Returns a triple of ("Should we continue (boolean)", "New value for $ErrorsTo", "Status message", -"This message appears to be a loop (boolean)" ); +    my $Ticket = RT::Ticket->new($CurrentUser); -=cut +    # {{{ If we don't have a ticket Id, we're creating a new ticket +    if ( !$args{'ticket'} ) { -sub _HandleMachineGeneratedMail { -    my %args = ( Message => undef, ErrorsTo => undef, Subject => undef, MessageId => undef, @_ ); -    my $head = $args{'Message'}->head; -    my $ErrorsTo = $args{'ErrorsTo'}; +        # {{{ Create a new ticket -    my $IsBounce = CheckForBounce($head); +        my @Cc; +        my @Requestors = ( $CurrentUser->id ); -    my $IsAutoGenerated = CheckForAutoGenerated($head); +        if ($RT::ParseNewMessageForTicketCcs) { +            @Cc = ParseCcAddressesFromHead( Head        => $head, +                                            CurrentUser => $CurrentUser, +                                            QueueObj    => $SystemQueueObj ); +        } -    my $IsSuspiciousSender = CheckForSuspiciousSender($head); +        my ( $id, $Transaction, $ErrStr ) = $Ticket->Create( +                                                      Queue     => $SystemQueueObj->Id, +                                                      Subject   => $Subject, +                                                      Requestor => \@Requestors, +                                                      Cc        => \@Cc, +                                                      MIMEObj   => $Message ); +        if ( $id == 0 ) { +            MailError( To          => $ErrorsTo, +                       Subject     => "Ticket creation failed", +                       Explanation => $ErrStr, +                       MIMEObj     => $Message ); +            $RT::Logger->error("Create failed: $id / $Transaction / $ErrStr "); +            return ( 0, "Ticket creation failed", $Ticket ); +        } -    my $IsALoop = CheckForLoops($head); +        # }}} +    } -    my $SquelchReplies = 0; +    # }}} -    #If the message is autogenerated, we need to know, so we can not -    # send mail to the sender -    if ( $IsBounce || $IsSuspiciousSender || $IsAutoGenerated || $IsALoop ) { -        $SquelchReplies = 1; -        $ErrorsTo       = $RT::OwnerEmail; -    } +    #   If the action is comment, add a comment. +    elsif ( $args{'action'} =~ /^(comment|correspond)$/i ) { +        $Ticket->Load($args{'ticket'}); +        unless ( $Ticket->Id ) { +            my $message = "Could not find a ticket with id ".$args{'ticket'}; +            MailError( To          => $ErrorsTo, +                     Subject     => "Message not recorded", +                     Explanation => $message, +                     MIMEObj     => $Message ); -    # Warn someone if it's a loop, before we drop it on the ground -    if ($IsALoop) { -        $RT::Logger->crit("RT Received mail (".$args{MessageId}.") from itself."); +            return ( 0, $message); +        } -        #Should we mail it to RTOwner? -        if ($RT::LoopsToRTOwner) { -            MailError( -                To          => $RT::OwnerEmail, -                Subject     => "RT Bounce: ".$args{'Subject'}, -                Explanation => "RT thinks this message may be a bounce", -                MIMEObj     => $args{Message} -            ); +        my ( $status, $msg ); +        if ( $args{'action'} =~ /^correspond$/ ) { +            ( $status, $msg ) = $Ticket->Correspond( MIMEObj => $Message );          } +        else { +            ( $status, $msg ) = $Ticket->Comment( MIMEObj => $Message ); +        } +        unless ($status) { -        #Do we actually want to store it? -        return ( 0, $ErrorsTo, "Message Bounced", $IsALoop ) unless ($RT::StoreLoops); +            #Warn the sender that we couldn't actually submit the comment. +            MailError( To          => $ErrorsTo, +                       Subject     => "Message not recorded", +                       Explanation => $msg, +                       MIMEObj     => $Message ); +            return ( 0, "Message not recorded", $Ticket ); +        }      } -    # Squelch replies if necessary -    # Don't let the user stuff the RT-Squelch-Replies-To header. -    if ( $head->get('RT-Squelch-Replies-To') ) { -        $head->add( -            'RT-Relocated-Squelch-Replies-To', -            $head->get('RT-Squelch-Replies-To') -        ); -        $head->delete('RT-Squelch-Replies-To'); -    } +    else { -    if ($SquelchReplies) { +        #Return mail to the sender with an error +        MailError( To          => $ErrorsTo, +                   Subject     => "RT Configuration error", +                   Explanation => "'" +                     . $args{'action'} +                     . "' not a recognized action." +                     . " Your RT administrator has misconfigured " +                     . "the mail aliases which invoke RT", +                   MIMEObj => $Message ); +        $RT::Logger->crit( $args{'action'} . " type unknown for $MessageId" ); +        return ( 0, "Configuration error: " . $args{'action'} . " not a recognized action", $Ticket ); -        # Squelch replies to the sender, and also leave a clue to -        # allow us to squelch ALL outbound messages. This way we -        # can punt the logic of "what to do when we get a bounce" -        # to the scrip. We might want to notify nobody. Or just -        # the RT Owner. Or maybe all Privileged watchers. -        my ( $Sender, $junk ) = ParseSenderAddressFromHead($head); -        $head->add( 'RT-Squelch-Replies-To',    $Sender ); -        $head->add( 'RT-DetectedAutoGenerated', 'true' );      } -    return ( 1, $ErrorsTo, "Handled machine detection", $IsALoop ); -} - -=head2 IsCorrectAction -Returns a list of valid actions we've found for this message -=cut - -sub IsCorrectAction { -    my $action = shift; -    my @actions = grep $_, split /-/, $action; -    return ( 0, '(no value)' ) unless @actions; -    foreach (@actions) { -        return ( 0, $_ ) unless /^(?:comment|correspond|take|resolve)$/; -    } -    return ( 1, @actions ); +return ( 1, "Success", $Ticket );  }  eval "require RT::Interface::Email_Vendor"; -die $@ if ( $@ && $@ !~ qr{^Can't locate RT/Interface/Email_Vendor.pm} ); +die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email_Vendor.pm});  eval "require RT::Interface::Email_Local"; -die $@ if ( $@ && $@ !~ qr{^Can't locate RT/Interface/Email_Local.pm} ); +die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email_Local.pm});  1; diff --git a/rt/lib/RT/Interface/Web.pm b/rt/lib/RT/Interface/Web.pm index 4e5fca151..5097f54a4 100644 --- a/rt/lib/RT/Interface/Web.pm +++ b/rt/lib/RT/Interface/Web.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  ## Portions Copyright 2000 Tobias Brox <tobix@fsck.com>  ## This is a library of static subs to be used by the Mason web @@ -64,176 +40,106 @@ use_ok(RT::Interface::Web);  =cut -use strict; -use warnings; -  package RT::Interface::Web; -use HTTP::Date; -use RT::SavedSearches; -use URI; - -# {{{ EscapeUTF8 - -=head2 EscapeUTF8 SCALARREF - -does a css-busting but minimalist escaping of whatever html you're passing in. - -=cut - -sub EscapeUTF8  { -        my  $ref = shift; -        return unless defined $$ref; -        my $val = $$ref; -        use bytes; -        $val =~ s/&/&/g; -        $val =~ s/</</g;  -        $val =~ s/>/>/g; -        $val =~ s/\(/(/g; -        $val =~ s/\)/)/g; -        $val =~ s/"/"/g; -        $val =~ s/'/'/g; -        $$ref = $val; -        Encode::_utf8_on($$ref); - - -} - -# }}} - -# {{{ EscapeURI - -=head2 EscapeURI SCALARREF +use strict; -Escapes URI component according to RFC2396 -=cut -use Encode qw(); -sub EscapeURI { -    my $ref = shift; -    $$ref = Encode::encode_utf8( $$ref ); -    $$ref =~ s/([^a-zA-Z0-9_.!~*'()-])/uc sprintf("%%%02X", ord($1))/eg; -    Encode::_utf8_on( $$ref ); -} -# }}} -# {{{ WebCanonicalizeInfo +# {{{ sub NewApacheHandler  -=head2 WebCanonicalizeInfo(); +=head2 NewApacheHandler -Different web servers set different environmental varibles. This -function must return something suitable for REMOTE_USER. By default, -just downcase $ENV{'REMOTE_USER'} +  Takes extra options to pass to HTML::Mason::ApacheHandler->new +  Returns a new Mason::ApacheHandler object  =cut -sub WebCanonicalizeInfo { -    my $user; - -    if ( defined $ENV{'REMOTE_USER'} ) { -        $user = lc ( $ENV{'REMOTE_USER'} ) if( length($ENV{'REMOTE_USER'}) ); -    } +sub NewApacheHandler { +    require HTML::Mason::ApacheHandler; +    my $ah = new HTML::Mason::ApacheHandler(  +     +        comp_root                    => [ +            [ local    => $RT::MasonLocalComponentRoot ], +            [ standard => $RT::MasonComponentRoot ] +        ], +        args_method => "CGI", +        default_escape_flags => 'h', +        allow_globals        => [qw(%session)], +        data_dir => "$RT::MasonDataDir", +        @_ +    ); -    return $user; +    $ah->interp->set_escape( h => \&RT::Interface::Web::EscapeUTF8 ); +     +    return ($ah);  }  # }}} -# {{{ WebExternalAutoInfo +# {{{ sub NewCGIHandler  -=head2 WebExternalAutoInfo($user); +=head2 NewCGIHandler -Returns a hash of user attributes, used when WebExternalAuto is set. +  Returns a new Mason::CGIHandler object  =cut -sub WebExternalAutoInfo { -    my $user = shift; +sub NewCGIHandler { +    my %args = ( +        @_ +    ); -    my %user_info; +    my $handler = HTML::Mason::CGIHandler->new( +        comp_root                    => [ +            [ local    => $RT::MasonLocalComponentRoot ], +            [ standard => $RT::MasonComponentRoot ] +        ], +        data_dir => "$RT::MasonDataDir", +        default_escape_flags => 'h', +        allow_globals        => [qw(%session)] +    ); +   -    # default to making Privileged users, even if they specify -    # some other default Attributes -    if (!$RT::AutoCreate || -        ( ref($RT::AutoCreate) && not exists $RT::AutoCreate->{Privileged})) { -        $user_info{'Privileged'} = 1; -    } +    $handler->interp->set_escape( h => \&RT::Interface::Web::EscapeUTF8 ); -    if ($^O !~ /^(?:riscos|MacOS|MSWin32|dos|os2)$/) { -        # Populate fields with information from Unix /etc/passwd -        my ($comments, $realname) = (getpwnam($user))[5, 6]; -        $user_info{'Comments'} = $comments if defined $comments; -        $user_info{'RealName'} = $realname if defined $realname; -    } -    elsif ($^O eq 'MSWin32' and eval 'use Net::AdminMisc; 1') { -        # Populate fields with information from NT domain controller -    } +    return ($handler); -    # and return the wad of stuff -    return {%user_info};  } -  # }}} +# {{{ EscapeUTF8 -=head2 Redirect URL +=head2 EscapeUTF8 SCALARREF -This routine ells the current user's browser to redirect to URL.   -Additionally, it unties the user's currently active session, helping to avoid  -A bug in Apache::Session 1.81 and earlier which clobbers sessions if we try to use  -a cached DBI statement handle twice at the same time. +does a css-busting but minimalist escaping of whatever html you're passing in.  =cut +sub EscapeUTF8  { +        my  $ref = shift; +        my $val = $$ref; +        use bytes; +        $val =~ s/&/&/g; +        $val =~ s/</</g;  +        $val =~ s/>/>/g; +        $val =~ s/\(/(/g; +        $val =~ s/\)/)/g; +        $val =~ s/"/"/g; +        $val =~ s/'/'/g; +        $$ref = $val; +        Encode::_utf8_on($$ref); -sub Redirect { -    my $redir_to = shift; -    untie $HTML::Mason::Commands::session; -    my $uri = URI->new($redir_to); -    my $server_uri = URI->new($RT::WebURL); - -    # If the user is coming in via a non-canonical -    # hostname, don't redirect them to the canonical host, -    # it will just upset them (and invalidate their credentials) -    if ($uri->host  eq $server_uri->host &&  -        $uri->port eq $server_uri->port) { -            $uri->host($ENV{'HTTP_HOST'}); -            $uri->port($ENV{'SERVER_PORT'}); -        } - -    $HTML::Mason::Commands::m->redirect($uri->canonical); -    $HTML::Mason::Commands::m->abort;  } - -=head2 StaticFileHeaders  - -Send the browser a few headers to try to get it to (somewhat agressively) -cache RT's static Javascript and CSS files. - -This routine could really use _accurate_ heuristics. (XXX TODO) - -=cut - -sub StaticFileHeaders { -    # make cache public -    $HTML::Mason::Commands::r->headers_out->{'Cache-Control'} = 'max-age=259200, public'; - -    # Expire things in a month. -    $HTML::Mason::Commands::r->headers_out->{'Expires'} = HTTP::Date::time2str( time() + 2592000 ); - -    # if we set 'Last-Modified' then browser request a comp using 'If-Modified-Since' -    # request, but we don't handle it and generate full reply again -    # Last modified at server start time -    #$HTML::Mason::Commands::r->headers_out->{'Last-Modified'} = HTTP::Date::time2str($^T); - -} +# }}}  package HTML::Mason::Commands; +use strict;  use vars qw/$r $m %session/; @@ -254,13 +160,10 @@ sub loc {          UNIVERSAL::can($session{'CurrentUser'}, 'loc')){          return($session{'CurrentUser'}->loc(@_));      } -    elsif ( my $u = eval { RT::CurrentUser->new($RT::SystemUser->Id) } ) { +    else  { +        my $u = RT::CurrentUser->new($RT::SystemUser);          return ($u->loc(@_));      } -    else { -        # pathetic case -- SystemUser is gone. -        return $_[0]; -    }  }  # }}} @@ -286,7 +189,7 @@ sub loc_fuzzy {          return($session{'CurrentUser'}->loc_fuzzy($msg));      }      else  { -        my $u = RT::CurrentUser->new($RT::SystemUser->Id); +        my $u = RT::CurrentUser->new($RT::SystemUser);          return ($u->loc_fuzzy($msg));      }  } @@ -341,30 +244,23 @@ sub CreateTicket {      my $starts = new RT::Date( $session{'CurrentUser'} );      $starts->Set( Format => 'unknown', Value => $ARGS{'Starts'} ); +    my @Requestors = split ( /\s*,\s*/, $ARGS{'Requestors'} ); +    my @Cc         = split ( /\s*,\s*/, $ARGS{'Cc'} ); +    my @AdminCc    = split ( /\s*,\s*/, $ARGS{'AdminCc'} ); +      my $MIMEObj = MakeMIMEEntity(          Subject             => $ARGS{'Subject'},          From                => $ARGS{'From'},          Cc                  => $ARGS{'Cc'},          Body                => $ARGS{'Content'}, -        Type                => $ARGS{'ContentType'},      ); -    if ( $ARGS{'Attachments'} ) { -        my $rv = $MIMEObj->make_multipart; -        $RT::Logger->error("Couldn't make multipart message") -            if !$rv || $rv !~ /^(?:DONE|ALREADY)$/; - -        foreach ( values %{$ARGS{'Attachments'}} ) { -            unless ( $_ ) { -                $RT::Logger->error("Couldn't add empty attachemnt"); -                next; -            } -            $MIMEObj->add_part($_); -        } +    if ($ARGS{'Attachments'}) { +        $MIMEObj->make_multipart; +        $MIMEObj->add_part($_) foreach values %{$ARGS{'Attachments'}};      }      my %create_args = ( -        Type            => $ARGS{'Type'} || 'ticket',          Queue           => $ARGS{'Queue'},          Owner           => $ARGS{'Owner'},          InitialPriority => $ARGS{'InitialPriority'}, @@ -372,106 +268,45 @@ sub CreateTicket {          TimeLeft        => $ARGS{'TimeLeft'},          TimeEstimated        => $ARGS{'TimeEstimated'},          TimeWorked      => $ARGS{'TimeWorked'}, +        Requestor       => \@Requestors, +        Cc              => \@Cc, +        AdminCc         => \@AdminCc,          Subject         => $ARGS{'Subject'},          Status          => $ARGS{'Status'},          Due             => $due->ISO,          Starts          => $starts->ISO,          MIMEObj         => $MIMEObj      ); - -    my @temp_squelch; -    foreach my $type (qw(Requestors Cc AdminCc)) { -        my @tmp = map { $_->format } grep { $_->address} Mail::Address->parse( $ARGS{ $type } ); - -        $create_args{ $type } = [ -            grep $_, map { -                my $user = RT::User->new( $RT::SystemUser ); -                $user->LoadOrCreateByEmail( $_ ); -                # convert to ids to avoid work later -                $user->id; -            } @tmp -        ]; -        $RT::Logger->debug( -            "$type got ".join(',',@{$create_args{ $type }}) ); - -    } -    # XXX: workaround for name conflict :( -    $create_args{'Requestor'} = delete $create_args{'Requestors'}; - -    foreach my $arg (keys %ARGS) { -        next if $arg =~ /-(?:Magic|Category)$/; - -        if ($arg =~ /^Object-RT::Transaction--CustomField-/) { -            $create_args{$arg} = $ARGS{$arg}; -        } -        # Object-RT::Ticket--CustomField-3-Values -        elsif ($arg =~ /^Object-RT::Ticket--CustomField-(\d+)(.*?)$/) { -            my $cfid = $1; -            my $cf = RT::CustomField->new( $session{'CurrentUser'}); -            $cf->Load($cfid); - -            if ( $cf->Type eq 'Freeform' && ! $cf->SingleValue) { -                $ARGS{$arg} =~ s/\r\n/\n/g; -                $ARGS{$arg} = [split('\n', $ARGS{$arg})]; -            } - -            if ( $cf->Type =~ /text/i) { # Catch both Text and Wikitext -                $ARGS{$arg} =~ s/\r//g; -            } - -            if ( $arg =~ /-Upload$/ ) { -                $create_args{"CustomField-".$cfid} = _UploadedFile($arg); -            } -            else { -                $create_args{"CustomField-".$cfid} = $ARGS{"$arg"}; -            } +  foreach my $arg (%ARGS) { +        if ($arg =~ /^CustomField-(\d+)(.*?)$/) { +            next if ($arg =~ /-Magic$/); +            $create_args{"CustomField-".$1} = $ARGS{"$arg"};          }      } - - -    # XXX TODO This code should be about six lines. and badly needs refactoring. -  -    # {{{ turn new link lists into arrays, and pass in the proper arguments -    my (@dependson, @dependedonby, @parents, @children, @refersto, @referredtoby); - -    foreach my $luri ( split ( / /, $ARGS{"new-DependsOn"} ) ) { -        $luri =~ s/\s*$//;    # Strip trailing whitespace -        push @dependson, $luri; -    } -    $create_args{'DependsOn'} = \@dependson; - -    foreach my $luri ( split ( / /, $ARGS{"DependsOn-new"} ) ) { -        push @dependedonby, $luri; -    } -    $create_args{'DependedOnBy'} = \@dependedonby; - -    foreach my $luri ( split ( / /, $ARGS{"new-MemberOf"} ) ) { -        $luri =~ s/\s*$//;    # Strip trailing whitespace -        push @parents, $luri; +    my ( $id, $Trans, $ErrMsg ) = $Ticket->Create(%create_args); +    unless ( $id && $Trans ) { +        Abort($ErrMsg);      } -    $create_args{'Parents'} = \@parents; +    my @linktypes = qw( DependsOn MemberOf RefersTo ); -    foreach my $luri ( split ( / /, $ARGS{"MemberOf-new"} ) ) { -        push @children, $luri; -    } -    $create_args{'Children'} = \@children; +    foreach my $linktype (@linktypes) { +        foreach my $luri ( split ( / /, $ARGS{"new-$linktype"} ) ) { +            $luri =~ s/\s*$//;    # Strip trailing whitespace +            my ( $val, $msg ) = $Ticket->AddLink( +                Target => $luri, +                Type   => $linktype +            ); +            push ( @Actions, $msg ) unless ($val); +        } -    foreach my $luri ( split ( / /, $ARGS{"new-RefersTo"} ) ) { -        $luri =~ s/\s*$//;    # Strip trailing whitespace -        push @refersto, $luri; -    } -    $create_args{'RefersTo'} = \@refersto; +        foreach my $luri ( split ( / /, $ARGS{"$linktype-new"} ) ) { +            my ( $val, $msg ) = $Ticket->AddLink( +                Base => $luri, +                Type => $linktype +            ); -    foreach my $luri ( split ( / /, $ARGS{"RefersTo-new"} ) ) { -        push @referredtoby, $luri; -    } -    $create_args{'ReferredToBy'} = \@referredtoby; -    # }}} -   -  -    my ( $id, $Trans, $ErrMsg ) = $Ticket->Create(%create_args); -    unless ( $id ) { -        Abort($ErrMsg); +            push ( @Actions, $msg ) unless ($val); +        }      }      push ( @Actions, split("\n", $ErrMsg) ); @@ -530,10 +365,7 @@ sub ProcessUpdateMessage {      );      #Make the update content have no 'weird' newlines in it -    if (   $args{ARGSRef}->{'UpdateTimeWorked'} -        || $args{ARGSRef}->{'UpdateContent'} -        || $args{ARGSRef}->{'UpdateAttachments'} ) -    { +    if ( $args{ARGSRef}->{'UpdateContent'} ) {          if (              $args{ARGSRef}->{'UpdateSubject'} eq $args{'TicketObj'}->Subject() ) @@ -542,77 +374,43 @@ sub ProcessUpdateMessage {          }          my $Message = MakeMIMEEntity( -            Subject => $args{ARGSRef}->{'UpdateSubject'}, -            Body    => $args{ARGSRef}->{'UpdateContent'}, -            Type    => $args{ARGSRef}->{'UpdateContentType'}, +            Subject             => $args{ARGSRef}->{'UpdateSubject'}, +            Body                => $args{ARGSRef}->{'UpdateContent'},          ); -        $Message->head->add( 'Message-ID' =>  -              "<rt-" -              . $RT::VERSION . "-" -              . $$ . "-" -              . CORE::time() . "-" -              . int(rand(2000)) . "." -              . $args{'TicketObj'}->id . "-" -              . "0" . "-"  # Scrip -              . "0" . "@"  # Email sent -              . $RT::Organization -              . ">" ); -        my $old_txn = RT::Transaction->new( $session{'CurrentUser'} ); -        if ( $args{ARGSRef}->{'QuoteTransaction'} ) { -            $old_txn->Load( $args{ARGSRef}->{'QuoteTransaction'} ); -        } -        else { -            $old_txn = $args{TicketObj}->Transactions->First(); +        if ($args{ARGSRef}->{'UpdateAttachments'}) { +            $Message->make_multipart; +            $Message->add_part($_) foreach values %{$args{ARGSRef}->{'UpdateAttachments'}};          } -        if ( $old_txn->Message && $old_txn->Message->First ) { -            my @in_reply_to = split(/\s+/m, $old_txn->Message->First->GetHeader('In-Reply-To') || '');   -            my @references = split(/\s+/m, $old_txn->Message->First->GetHeader('References') || '' );   -            my @msgid = split(/\s+/m,$old_txn->Message->First->GetHeader('Message-ID') || '');  -            my @rtmsgid = split(/\s+/m,$old_txn->Message->First->GetHeader('RT-Message-ID') || '');  - -            $Message->head->replace( 'In-Reply-To', join (' ', @rtmsgid ? @rtmsgid : @msgid)); -            $Message->head->replace( 'References', join(' ', @references, @msgid, @rtmsgid)); +        ## TODO: Implement public comments +        if ( $args{ARGSRef}->{'UpdateType'} =~ /^(private|public)$/ ) { +            my ( $Transaction, $Description ) = $args{TicketObj}->Comment( +                CcMessageTo  => $args{ARGSRef}->{'UpdateCc'}, +                BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, +                MIMEObj      => $Message, +                TimeTaken    => $args{ARGSRef}->{'UpdateTimeWorked'} +            ); +            push ( @{ $args{Actions} }, $Description ); +        } +        elsif ( $args{ARGSRef}->{'UpdateType'} eq 'response' ) { +            my ( $Transaction, $Description ) = $args{TicketObj}->Correspond( +                CcMessageTo  => $args{ARGSRef}->{'UpdateCc'}, +                BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, +                MIMEObj      => $Message, +                TimeTaken    => $args{ARGSRef}->{'UpdateTimeWorked'} +            ); +            push ( @{ $args{Actions} }, $Description ); +        } +        else { +            push ( @{ $args{'Actions'} }, +                loc("Update type was neither correspondence nor comment."). +                " ". +                loc("Update not recorded.") +            );          } - -    if ( $args{ARGSRef}->{'UpdateAttachments'} ) { -        $Message->make_multipart; -        $Message->add_part($_) -          foreach values %{ $args{ARGSRef}->{'UpdateAttachments'} }; -    } - -    ## TODO: Implement public comments -    if ( $args{ARGSRef}->{'UpdateType'} =~ /^(private|public)$/ ) { -        my ( $Transaction, $Description, $Object ) = $args{TicketObj}->Comment( -            CcMessageTo  => $args{ARGSRef}->{'UpdateCc'}, -            BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, -            MIMEObj      => $Message, -            TimeTaken    => $args{ARGSRef}->{'UpdateTimeWorked'} -        ); -        push( @{ $args{Actions} }, $Description ); -        $Object->UpdateCustomFields( ARGSRef => $args{ARGSRef} ) if $Object; -    } -    elsif ( $args{ARGSRef}->{'UpdateType'} eq 'response' ) { -        my ( $Transaction, $Description, $Object ) = -          $args{TicketObj}->Correspond( -            CcMessageTo  => $args{ARGSRef}->{'UpdateCc'}, -            BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, -            MIMEObj      => $Message, -            TimeTaken    => $args{ARGSRef}->{'UpdateTimeWorked'} -          ); -        push( @{ $args{Actions} }, $Description ); -        $Object->UpdateCustomFields( ARGSRef => $args{ARGSRef} ) if $Object; -    } -    else { -        push( -            @{ $args{'Actions'} }, -            loc("Update type was neither correspondence nor comment.") . " " -              . loc("Update not recorded.") -        );      }  } -}  # }}} @@ -622,8 +420,6 @@ sub ProcessUpdateMessage {  Takes a paramhash Subject, Body and AttachmentFieldName. -Also takes Form, Cc and Type as optional paramhash keys. -    Returns a MIME::Entity.  =cut @@ -637,14 +433,12 @@ sub MakeMIMEEntity {          Cc                  => undef,          Body                => undef,          AttachmentFieldName => undef, -        Type                => undef, -#        map Encode::encode_utf8($_), @_, -        @_, +        map Encode::encode_utf8($_), @_,      );      #Make the update content have no 'weird' newlines in it -    $args{'Body'} =~ s/\r\n/\n/gs if $args{'Body'}; +    $args{'Body'} =~ s/\r\n/\n/gs;      my $Message;      {          # MIME::Head is not happy in utf-8 domain.  This only happens @@ -655,8 +449,6 @@ sub MakeMIMEEntity {              Subject => $args{'Subject'} || "",              From    => $args{'From'},              Cc      => $args{'Cc'}, -            Type    => $args{'Type'} || 'text/plain', -            'Charset:' => 'utf8',              Data    => [ $args{'Body'} ]          );      } @@ -671,14 +463,7 @@ sub MakeMIMEEntity {      #foreach my $filehandle (@filenames) { -    my ( $fh, $temp_file ); -    for ( 1 .. 10 ) { -        # on NFS and NTFS, it is possible that tempfile() conflicts -        # with other processes, causing a race condition. we try to -        # accommodate this by pausing and retrying. -        last if ($fh, $temp_file) = eval { tempfile( UNLINK => 1) }; -        sleep 1; -    } +    my ( $fh, $temp_file ) = tempfile();      binmode $fh;    #thank you, windows      my ($buffer); @@ -696,7 +481,7 @@ sub MakeMIMEEntity {      $Message->attach(          Path     => $temp_file, -        Filename => Encode::decode_utf8($filename), +        Filename => $filename,          Type     => $uploadinfo->{'Content-Type'},      );      close($fh); @@ -809,13 +594,13 @@ sub ProcessSearchQuery {      # }}}      # {{{ Limit requestor email -     if ( $args{ARGS}->{'ValueOfWatcherRole'} ne '' ) { -         $session{'tickets'}->LimitWatcher( -             TYPE     => $args{ARGS}->{'WatcherRole'}, -             VALUE    => $args{ARGS}->{'ValueOfWatcherRole'}, -             OPERATOR => $args{ARGS}->{'WatcherRoleOp'}, +    if ( $args{ARGS}->{'ValueOfRequestor'} ne '' ) { +        my $alias = $session{'tickets'}->LimitRequestor( +            VALUE    => $args{ARGS}->{'ValueOfRequestor'}, +            OPERATOR => $args{ARGS}->{'RequestorOp'},          ); +      }      # }}} @@ -960,6 +745,19 @@ sub ParseDateToISO {  # }}} +# {{{ sub Config  +# TODO: This might eventually read the cookies, user configuration +# information from the DB, queue configuration information from the +# DB, etc. + +sub Config { +    my $args = shift; +    my $key  = shift; +    return $args->{$key} || $RT::WebOptions{$key}; +} + +# }}} +  # {{{ sub ProcessACLChanges  sub ProcessACLChanges { @@ -982,13 +780,17 @@ sub ProcessACLChanges {              my $obj; -             if ($object_type eq 'RT::System') { -                $obj = $RT::System; -            } elsif ($RT::ACE::OBJECT_TYPES{$object_type}) { -                $obj = $object_type->new($session{'CurrentUser'}); +            if ($object_type eq 'RT::Queue') { +                $obj = RT::Queue->new($session{'CurrentUser'}); +                $obj->Load($object_id);       +            } elsif ($object_type eq 'RT::Group') { +                $obj = RT::Group->new($session{'CurrentUser'});                  $obj->Load($object_id);       + +            } elsif ($object_type eq 'RT::System') { +                $obj = $RT::System;              } else { -                push (@results, loc("System Error"). ': '. +                push (@results, loc("System Error").                                  loc("Rights could not be granted for [_1]", $object_type));                  next;              } @@ -1011,13 +813,17 @@ sub ProcessACLChanges {              next unless ($right);              my $obj; -             if ($object_type eq 'RT::System') { -                $obj = $RT::System; -            } elsif ($RT::ACE::OBJECT_TYPES{$object_type}) { -                $obj = $object_type->new($session{'CurrentUser'}); +            if ($object_type eq 'RT::Queue') { +                $obj = RT::Queue->new($session{'CurrentUser'}); +                $obj->Load($object_id);       +            } elsif ($object_type eq 'RT::Group') { +                $obj = RT::Group->new($session{'CurrentUser'});                  $obj->Load($object_id);       + +            } elsif ($object_type eq 'RT::System') { +                $obj = $RT::System;              } else { -                push (@results, loc("System Error"). ': '. +                push (@results, loc("System Error").                                  loc("Rights could not be revoked for [_1]", $object_type));                  next;              } @@ -1053,12 +859,52 @@ sub UpdateRecordObject {          @_      ); -    my $Object = $args{'Object'}; -    my @results = $Object->Update(AttributesRef => $args{'AttributesRef'}, -                                  ARGSRef       => $args{'ARGSRef'}, -                  AttributePrefix => $args{'AttributePrefix'} -                                  ); +    my (@results); + +    my $object     = $args{'Object'}; +    my $attributes = $args{'AttributesRef'}; +    my $ARGSRef    = $args{'ARGSRef'}; +    foreach my $attribute (@$attributes) { +        my $value; +        if ( defined $ARGSRef->{$attribute} ) { +            $value = $ARGSRef->{$attribute}; +        } +        elsif ( +              defined( $args{'AttributePrefix'} ) +              && defined( +                  $ARGSRef->{ $args{'AttributePrefix'} . "-" . $attribute } +              ) +          ) { +            $value = $ARGSRef->{ $args{'AttributePrefix'} . "-" . $attribute }; + +        } else { +                next; +        } +            $value =~ s/\r\n/\n/gs; + +        if ($value ne $object->$attribute()){ + +              my $method = "Set$attribute"; +              my ( $code, $msg ) = $object->$method($value); + +              push @results, loc($attribute) . ': ' . loc_fuzzy($msg); +=for loc +                                   "[_1] could not be set to [_2].",       # loc +                                   "That is already the current value",    # loc +                                   "No value sent to _Set!\n",             # loc +                                   "Illegal value for [_1]",               # loc +                                   "The new value has been set.",          # loc +                                   "No column specified",                  # loc +                                   "Immutable field",                      # loc +                                   "Nonexistant field?",                   # loc +                                   "Invalid data",                         # loc +                                   "Couldn't find row",                    # loc +                                   "Missing a primary key?: [_1]",         # loc +                                   "Found Object",                         # loc +=cut +          }; +    }      return (@results);  } @@ -1107,17 +953,6 @@ sub ProcessCustomFieldUpdates {          my ( $err, $msg ) = $Object->DeleteValue($id);          push ( @results, $msg );      } - -    my $vals = $Object->Values(); -    while (my $cfv = $vals->Next()) { -        if (my $so = $ARGSRef->{ 'CustomField-' . $Object->Id . '-SortOrder' . $cfv->Id }) { -            if ($cfv->SortOrder != $so) { -                my ( $err, $msg ) = $cfv->SetSortOrder($so); -                push ( @results, $msg ); -            } -        } -    } -      return (@results);  } @@ -1150,12 +985,10 @@ sub ProcessTicketBasics {        TimeEstimated        TimeWorked        TimeLeft -      Type        Status        Queue      ); -      if ( $ARGSRef->{'Queue'} and ( $ARGSRef->{'Queue'} !~ /^(\d+)$/ ) ) {          my $tempqueue = RT::Queue->new($RT::SystemUser);          $tempqueue->Load( $ARGSRef->{'Queue'} ); @@ -1164,11 +997,6 @@ sub ProcessTicketBasics {          }      } - -   # Status isn't a field that can be set to a null value. -   # RT core complains if you try -    delete $ARGSRef->{'Status'} unless ($ARGSRef->{'Status'}); -          my @results = UpdateRecordObject(          AttributesRef => \@attribs,          Object        => $TicketObj, @@ -1197,205 +1025,142 @@ sub ProcessTicketBasics {  # }}} -sub ProcessTicketCustomFieldUpdates { -    my %args = @_; -    $args{'Object'} = delete $args{'TicketObj'}; -    my $ARGSRef = { %{ $args{'ARGSRef'} } }; +# {{{ Sub ProcessTicketCustomFieldUpdates -    # Build up a list of objects that we want to work with -    my %custom_fields_to_mod; -    foreach my $arg ( keys %$ARGSRef ) { -        if ( $arg =~ /^Ticket-(\d+-.*)/) { -            $ARGSRef->{"Object-RT::Ticket-$1"} = delete $ARGSRef->{$arg}; -        } -        elsif ( $arg =~ /^CustomField-(\d+-.*)/) { -            $ARGSRef->{"Object-RT::Ticket--$1"} = delete $ARGSRef->{$arg}; -        } -    } +sub ProcessTicketCustomFieldUpdates { +    my %args = ( +        ARGSRef => undef, +        @_ +    ); -    return ProcessObjectCustomFieldUpdates(%args, ARGSRef => $ARGSRef); -} +    my @results; -sub ProcessObjectCustomFieldUpdates { -    my %args = @_;      my $ARGSRef = $args{'ARGSRef'}; -    my @results; -    # Build up a list of objects that we want to work with +    # Build up a list of tickets that we want to work with +    my %tickets_to_mod;      my %custom_fields_to_mod; -    foreach my $arg ( keys %$ARGSRef ) { -        # format: Object-<object class>-<object id>-CustomField-<CF id>-<commands> -        next unless $arg =~ /^Object-([\w:]+)-(\d*)-CustomField-(\d+)-(.*)$/; - -        # For each of those objects, find out what custom fields we want to work with. -        $custom_fields_to_mod{ $1 }{ $2 || 0 }{ $3 }{ $4 } = $ARGSRef->{ $arg }; -    } - -    # For each of those objects -    foreach my $class ( keys %custom_fields_to_mod ) { -        foreach my $id ( keys %{$custom_fields_to_mod{$class}} ) { -            my $Object = $args{'Object'}; -            $Object = $class->new( $session{'CurrentUser'} ) -                unless $Object && ref $Object eq $class; - -            $Object->Load( $id ) unless ($Object->id || 0) == $id; -            unless ( $Object->id ) { -                $RT::Logger->warning("Couldn't load object $class #$id"); -                next; -            } +    foreach my $arg ( keys %{$ARGSRef} ) { +        if ( $arg =~ /^Ticket-(\d+)-CustomField-(\d+)-/ ) { -            foreach my $cf ( keys %{ $custom_fields_to_mod{ $class }{ $id } } ) { -                my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} ); -                $CustomFieldObj->LoadById( $cf ); -                unless ( $CustomFieldObj->id ) { -                    $RT::Logger->warning("Couldn't load custom field #$id"); -                    next; -                } -                push @results, _ProcessObjectCustomFieldUpdates( -                    Prefix      => "Object-$class-$id-CustomField-$cf-", -                    Object      => $Object, -                    CustomField => $CustomFieldObj, -                    ARGS        => $custom_fields_to_mod{$class}{$id}{$cf}, -                ); -            } +            # For each of those tickets, find out what custom fields we want to work with. +            $custom_fields_to_mod{$1}{$2} = 1;          }      } -    return @results; -} - -sub _ProcessObjectCustomFieldUpdates { -    my %args = @_; -    my $cf = $args{'CustomField'}; -    my $cf_type = $cf->Type; - -    my @results; -    foreach my $arg ( keys %{ $args{'ARGS'} } ) { -         -        next if $arg =~ /Category$/; -        # since http won't pass in a form element with a null value, we need -        # to fake it -        if ( $arg eq 'Values-Magic' ) { -            # We don't care about the magic, if there's really a values element; -            next if $args{'ARGS'}->{'Value'} || $args{'ARGS'}->{'Values'}; +    # For each of those tickets +    foreach my $tick ( keys %custom_fields_to_mod ) { +        my $Ticket = RT::Ticket->new( $session{'CurrentUser'} ); +        $Ticket->Load($tick); -            # "Empty" values does not mean anything for Image and Binary fields -            next if $cf_type =~ /^(?:Image|Binary)$/; +        # For each custom field   +        foreach my $cf ( keys %{ $custom_fields_to_mod{$tick} } ) { -            $arg = 'Values'; -            $args{'ARGS'}->{'Values'} = undef; -        } +	    my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'}); +	    $CustomFieldObj->LoadById($cf); -        my @values = (); -        if ( ref $args{'ARGS'}->{ $arg } eq 'ARRAY' ) { -            @values = @{ $args{'ARGS'}->{$arg} }; -        } elsif ( $cf_type =~ /text/i ) { # Both Text and Wikitext -            @values = ($args{'ARGS'}->{$arg}); -        } elsif ( defined( $args{'ARGS'}->{ $arg } ) ) { -            @values = split /\n/, $args{'ARGS'}->{ $arg }; -        } -         -        if ( ( $cf_type eq 'Freeform' && !$cf->SingleValue ) || $cf_type =~ /text/i ) { -            s/\r//g foreach @values; -        } -        @values = grep defined && $_ ne '', @values; +            foreach my $arg ( keys %{$ARGSRef} ) { +                # since http won't pass in a form element with a null value, we need +                # to fake it +                if ($arg =~ /^(.*?)-Values-Magic$/ ) { +                    # We don't care about the magic, if there's really a values element; +                    next if (exists $ARGSRef->{$1.'-Values'}) ; -        if ( $arg eq 'AddValue' || $arg eq 'Value' ) { -            foreach my $value (@values) { -                my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( -                    Field => $cf->id, -                    Value => $value -                ); -                push ( @results, $msg ); -            } -        } -        elsif ( $arg eq 'Upload' ) { -            my $value_hash = _UploadedFile( $args{'Prefix'} . $arg ) or next; -            my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( -                %$value_hash, -                Field => $cf, -            ); -            push ( @results, $msg ); -        } -        elsif ( $arg eq 'DeleteValues' ) { -            foreach my $value ( @values ) { -                my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue( -                    Field => $cf, -                    Value => $value, -                ); -                push ( @results, $msg ); -            } -        } -        elsif ( $arg eq 'DeleteValueIds' ) { -            foreach my $value ( @values ) { -                my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue( -                    Field   => $cf, -                    ValueId => $value, -                ); -                push ( @results, $msg ); -            } -        } -        elsif ( $arg eq 'Values' && !$cf->Repeated ) { -            my $cf_values = $args{'Object'}->CustomFieldValues( $cf->id ); - -            my %values_hash; -            foreach my $value ( @values ) { -                # build up a hash of values that the new set has -                $values_hash{$value} = 1; -                next if $cf_values->HasEntry( $value ); - -                my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( -                    Field => $cf, -                    Value => $value -                ); -                push ( @results, $msg ); -            } - -            $cf_values->RedoSearch; -            while ( my $cf_value = $cf_values->Next ) { -                next if $values_hash{ $cf_value->Content }; - -                my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue( -                    Field => $cf, -                    Value => $cf_value->Content -                ); -                push ( @results, $msg); -            } -        } -        elsif ( $arg eq 'Values' ) { -            my $cf_values = $args{'Object'}->CustomFieldValues( $cf->id ); - -            # keep everything up to the point of difference, delete the rest -            my $delete_flag; -            foreach my $old_cf (@{$cf_values->ItemsArrayRef}) { -                if (!$delete_flag and @values and $old_cf->Content eq $values[0]) { -                    shift @values; -                    next; +                    $arg = $1."-Values"; +                    $ARGSRef->{$1."-Values"} = undef; +                 +                } +                next unless ( $arg =~ /^Ticket-$tick-CustomField-$cf-/ ); +                my @values = +                  ( ref( $ARGSRef->{$arg} ) eq 'ARRAY' )  +                  ? @{ $ARGSRef->{$arg} } +                  : ( $ARGSRef->{$arg} ); +                if ( ( $arg =~ /-AddValue$/ ) || ( $arg =~ /-Value$/ ) ) { +                    foreach my $value (@values) { +                        next unless ($value); +                        my ( $val, $msg ) = $Ticket->AddCustomFieldValue( +                            Field => $cf, +                            Value => $value +                        ); +                        push ( @results, $msg ); +                    } +                } +                elsif ( $arg =~ /-DeleteValues$/ ) { +                    foreach my $value (@values) { +                        next unless ($value); +                        my ( $val, $msg ) = $Ticket->DeleteCustomFieldValue( +                            Field => $cf, +                            Value => $value +                        ); +                        push ( @results, $msg ); +                    } +                } +                elsif ( $arg =~ /-Values$/ and $CustomFieldObj->Type !~ /Entry/) { +                    my $cf_values = $Ticket->CustomFieldValues($cf); + +                    my %values_hash; +                    foreach my $value (@values) { +                        next unless ($value); + +                        # build up a hash of values that the new set has +                        $values_hash{$value} = 1; + +                        unless ( $cf_values->HasEntry($value) ) { +                            my ( $val, $msg ) = $Ticket->AddCustomFieldValue( +                                Field => $cf, +                                Value => $value +                            ); +                            push ( @results, $msg ); +                        } + +                    } +                    while ( my $cf_value = $cf_values->Next ) { +                        unless ( $values_hash{ $cf_value->Content } == 1 ) { +                            my ( $val, $msg ) = $Ticket->DeleteCustomFieldValue( +                                Field => $cf, +                                Value => $cf_value->Content +                            ); +                            push ( @results, $msg); + +                        } + +                    } +                } +                elsif ( $arg =~ /-Values$/ ) { +                    my $cf_values = $Ticket->CustomFieldValues($cf); + +		    # keep everything up to the point of difference, delete the rest +		    my $delete_flag; +		    foreach my $old_cf (@{$cf_values->ItemsArrayRef}) { +			if (!$delete_flag and @values and $old_cf->Content eq $values[0]) { +			    shift @values; +			    next; +			} + +			$delete_flag ||= 1; +			$old_cf->Delete; +		    } + +		    # now add/replace extra things, if any +		    foreach my $value (@values) { +			my ( $val, $msg ) = $Ticket->AddCustomFieldValue( +			    Field => $cf, +			    Value => $value +			); +			push ( @results, $msg ); +		    } +		} +                else { +                    push ( @results, "User asked for an unknown update type for custom field " . $cf->Name . " for ticket " . $Ticket->id );                  } - -                $delete_flag ||= 1; -                $old_cf->Delete; -            } - -            # now add/replace extra things, if any -            foreach my $value ( @values ) { -                my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( -                    Field => $cf, -                    Value => $value -                ); -                push ( @results, $msg );              }          } -        else { -            push ( @results, -                loc("User asked for an unknown update type for custom field [_1] for [_2] object #[_3]", -                $cf->Name, ref $args{'Object'}, $args{'Object'}->id ) -            ); -        } +        return (@results);      } -    return @results;  } +# }}} +  # {{{ sub ProcessTicketWatchers  =head2 ProcessTicketWatchers ( TicketObj => $Ticket, ARGSRef => \%ARGS ); @@ -1415,30 +1180,27 @@ sub ProcessTicketWatchers {      my $Ticket  = $args{'TicketObj'};      my $ARGSRef = $args{'ARGSRef'}; -    # Munge watchers +    # {{{ Munge watchers      foreach my $key ( keys %$ARGSRef ) { -        # Delete deletable watchers -        if ( ( $key =~ /^Ticket-DeleteWatcher-Type-(.*)-Principal-(\d+)$/ ) ) -        { -            my ( $code, $msg ) = $Ticket->DeleteWatcher( -                PrincipalId => $2, -                Type        => $1 -            ); +        # {{{ Delete deletable watchers +        if ( ( $key =~ /^Ticket-DelWatcher-Type-(.*)-Principal-(\d+)$/ )  ) { +            my ( $code, $msg ) =  +                $Ticket->DeleteWatcher(PrincipalId => $2, +                                       Type => $1);              push @results, $msg;          }          # Delete watchers in the simple style demanded by the bulk manipulator          elsif ( $key =~ /^Delete(Requestor|Cc|AdminCc)$/ ) { -            my ( $code, $msg ) = $Ticket->DeleteWatcher( -                Email => $ARGSRef->{$key}, -                Type  => $1 -            ); +            my ( $code, $msg ) = $Ticket->DeleteWatcher( Type => $ARGSRef->{$key}, PrincipalId => $1 );              push @results, $msg;          } -        # Add new wathchers by email address +        # }}} + +        # Add new wathchers by email address                elsif ( ( $ARGSRef->{$key} =~ /^(AdminCc|Cc|Requestor)$/ )              and ( $key =~ /^WatcherTypeEmail(\d*)$/ ) )          { @@ -1461,21 +1223,18 @@ sub ProcessTicketWatchers {          }          # Add new  watchers by owner -        elsif ( $key =~ /^Ticket-AddWatcher-Principal-(\d*)$/ ) { -            my $principal_id = $1; -            my $form = $ARGSRef->{$key}; -            foreach my $value ( ref($form) ? @{$form} : ($form) ) { -                next unless $value =~ /^(?:AdminCc|Cc|Requestor)$/i; +        elsif ( ( $ARGSRef->{$key} =~ /^(AdminCc|Cc|Requestor)$/ ) +            and ( $key =~ /^Ticket-AddWatcher-Principal-(\d*)$/ ) ) { -                my ( $code, $msg ) = $Ticket->AddWatcher( -                    Type        => $value, -                    PrincipalId => $principal_id -                ); -                push @results, $msg; -            } +            #They're in this order because otherwise $1 gets clobbered :/ +            my ( $code, $msg ) = +              $Ticket->AddWatcher( Type => $ARGSRef->{$key}, PrincipalId => $1 ); +            push @results, $msg;          } -      } + +    # }}} +      return (@results);  } @@ -1517,7 +1276,7 @@ sub ProcessTicketDates {          my $DateObj = RT::Date->new( $session{'CurrentUser'} );          #If it's something other than just whitespace -        if ( $ARGSRef->{ $field . '_Date' } && ($ARGSRef->{ $field . '_Date' } ne '') ) { +        if ( $ARGSRef->{ $field . '_Date' } ne '' ) {              $DateObj->Set(                  Format => 'unknown',                  Value  => $ARGSRef->{ $field . '_Date' } @@ -1555,30 +1314,6 @@ sub ProcessTicketLinks {      my $Ticket  = $args{'TicketObj'};      my $ARGSRef = $args{'ARGSRef'}; - -    my (@results) = ProcessRecordLinks(RecordObj => $Ticket, -                                       ARGSRef => $ARGSRef); - -    #Merge if we need to -    if ( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ) { -        my ( $val, $msg ) = -          $Ticket->MergeInto( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ); -        push @results, $msg; -    } - -    return (@results); -} - -# }}} - -sub ProcessRecordLinks { -    my %args = ( RecordObj => undef, -                 ARGSRef   => undef, -                 @_ ); - -    my $Record  = $args{'RecordObj'}; -    my $ARGSRef = $args{'ARGSRef'}; -      my (@results);      # Delete links that are gone gone gone. @@ -1590,7 +1325,7 @@ sub ProcessRecordLinks {              push @results,                "Trying to delete: Base: $base Target: $target  Type $type"; -            my ( $val, $msg ) = $Record->DeleteLink( Base   => $base, +            my ( $val, $msg ) = $Ticket->DeleteLink( Base   => $base,                                                       Type   => $type,                                                       Target => $target ); @@ -1603,18 +1338,18 @@ sub ProcessRecordLinks {      my @linktypes = qw( DependsOn MemberOf RefersTo );      foreach my $linktype (@linktypes) { -        if ( $ARGSRef->{ $Record->Id . "-$linktype" } ) { -            for my $luri ( split ( / /, $ARGSRef->{ $Record->Id . "-$linktype" } ) ) { +        if ( $ARGSRef->{ $Ticket->Id . "-$linktype" } ) { +            for my $luri ( split ( / /, $ARGSRef->{ $Ticket->Id . "-$linktype" } ) ) {                  $luri =~ s/\s*$//;    # Strip trailing whitespace -                my ( $val, $msg ) = $Record->AddLink( Target => $luri, +                my ( $val, $msg ) = $Ticket->AddLink( Target => $luri,                                                        Type   => $linktype );                  push @results, $msg;              }          } -        if ( $ARGSRef->{ "$linktype-" . $Record->Id } ) { +        if ( $ARGSRef->{ "$linktype-" . $Ticket->Id } ) { -            for my $luri ( split ( / /, $ARGSRef->{ "$linktype-" . $Record->Id } ) ) { -                my ( $val, $msg ) = $Record->AddLink( Base => $luri, +            for my $luri ( split ( / /, $ARGSRef->{ "$linktype-" . $Ticket->Id } ) ) { +                my ( $val, $msg ) = $Ticket->AddLink( Base => $luri,                                                        Type => $linktype );                  push @results, $msg; @@ -1622,68 +1357,18 @@ sub ProcessRecordLinks {          }       } -    return (@results); -} - - -=head2 _UploadedFile ( $arg ); - -Takes a CGI parameter name; if a file is uploaded under that name, -return a hash reference suitable for AddCustomFieldValue's use: -C<( Value => $filename, LargeContent => $content, ContentType => $type )>. - -Returns C<undef> if no files were uploaded in the C<$arg> field. - -=cut - -sub _UploadedFile { -    my $arg = shift; -    my $cgi_object = $m->cgi_object; -    my $fh = $cgi_object->upload($arg) or return undef; -    my $upload_info = $cgi_object->uploadInfo($fh); - -    my $filename = "$fh"; -    $filename =~ s#^.*[\\/]##; -    binmode($fh); - -    return { -        Value => $filename, -        LargeContent => do { local $/; scalar <$fh> }, -        ContentType => $upload_info->{'Content-Type'}, -    }; -} - -=head2 _load_container_object ( $type, $id ); - -Instantiate container object for saving searches. - -=cut - -sub _load_container_object { -    my ($obj_type, $obj_id) = @_; -    return RT::SavedSearch->new($session{'CurrentUser'})->_load_privacy_object($obj_type, $obj_id); -} - -=head2 _parse_saved_search ( $arg ); - -Given a serialization string for saved search, and returns the -container object and the search id. - -=cut - -sub _parse_saved_search { -    my $spec = shift; -    return unless $spec; -    if ($spec  !~ /^(.*?)-(\d+)-SavedSearch-(\d+)$/ ) { -        return; +    #Merge if we need to +    if ( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ) { +        my ( $val, $msg ) = +          $Ticket->MergeInto( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ); +        push @results, $msg;      } -    my $obj_type  = $1; -    my $obj_id    = $2; -    my $search_id = $3; -    return (_load_container_object ($obj_type, $obj_id), $search_id); +    return (@results);  } +# }}} +  eval "require RT::Interface::Web_Vendor";  die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Web_Vendor.pm});  eval "require RT::Interface::Web_Local"; diff --git a/rt/lib/RT/Interface/Web_Vendor.pm b/rt/lib/RT/Interface/Web_Vendor.pm new file mode 100644 index 000000000..1999096a7 --- /dev/null +++ b/rt/lib/RT/Interface/Web_Vendor.pm @@ -0,0 +1,201 @@ +# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +# Copyright (c) 2008 Freeside Internet Services, Inc. +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +#  +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +# General Public License for more details. + +=head1 NAME + +RT::Interface::Web_Vendor + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +Freeside vendor overlay for RT::Interface::Web. + +=begin testing + +use_ok(RT::Interface::Web_Vendor); + +=end testing + +=cut + +#package RT::Interface::Web; +#use strict; + +package HTML::Mason::Commands; +use strict; + +=head2 ProcessTicketCustomers  + +=cut + +sub ProcessTicketCustomers { +    my %args = ( +        TicketObj => undef, +        ARGSRef   => undef, +        Debug     => 0, +        @_ +    ); +    my @results = (); + +    my $Ticket  = $args{'TicketObj'}; +    my $ARGSRef = $args{'ARGSRef'}; +    my $Debug   = $args{'Debug'}; +    my $me = 'ProcessTicketCustomers'; + +    ### false laziness w/RT::Interface::Web::ProcessTicketLinks +    # Delete links that are gone gone gone. +    foreach my $arg ( keys %$ARGSRef ) { +        if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) { +            my $base   = $1; +            my $type   = $2; +            my $target = $3; + +            push @results, +              "Trying to delete: Base: $base Target: $target  Type $type"; +            my ( $val, $msg ) = $Ticket->DeleteLink( Base   => $base, +                                                     Type   => $type, +                                                     Target => $target ); + +            push @results, $msg; + +        } + +    } +    ### + +    ### +    #find new customers +    ### + +    my @custnums = map  { /^Ticket-AddCustomer-(\d+)$/; $1 } +                   grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } +                   keys %$ARGSRef; + +    #my @delete_custnums = +    #  map  { /^Ticket-AddCustomer-(\d+)$/; $1 } +    #  grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } +    #  keys %$ARGSRef; + +    ### +    #figure out if we're going to auto-link requestors, and find them if so +    ### + +    my $num_cur_cust = $Ticket->Customers->Count; +    my $num_new_cust = scalar(@custnums); +    warn "$me: $num_cur_cust current customers / $num_new_cust new customers\n" +      if $Debug; + +    #if we're linking the first ticket to one customer +    my $link_requestors = ( $num_cur_cust == 0 && $num_new_cust == 1 ); +    warn "$me: adding a single customer to a previously customerless". +         " ticket, so linking customers to requestor too\n" +      if $Debug && $link_requestors; + +    my @Requestors = (); +    if ( $link_requestors ) { + +      #find any requestors without customers +      @Requestors = +        grep { ! $_->Customers->Count } +             @{ $Ticket->Requestors->UserMembersObj->ItemsArrayRef }; + +      warn "$me: found ". scalar(@Requestors). " requestors without". +           " customers; linking them\n" +        if $Debug; + +    } + +    ### +    #link ticket (and requestors) to customers +    ### + +    foreach my $custnum ( @custnums ) { + +      my @link = ( 'Type'   => 'MemberOf', +                   'Target' => "freeside://freeside/cust_main/$custnum", +                 ); + +      my( $val, $msg ) = $Ticket->AddLink(@link); +      push @results, $msg; + +      #add customer links to requestors +      foreach my $Requestor ( @Requestors ) { +        my( $val, $msg ) = $Requestor->AddLink(@link); +        push @results, $msg; +        warn "$me: linking requestor to custnum $custnum: $msg\n" +          if $Debug > 1; +      } + +    } + +    return @results; + +} + +#false laziness w/above... eventually it should go away in favor of this +sub ProcessObjectCustomers { +    my %args = ( +        Object => undef, +        ARGSRef   => undef, +        @_ +    ); +    my @results = (); + +    my $Object  = $args{'Object'}; +    my $ARGSRef = $args{'ARGSRef'}; + +    ### false laziness w/RT::Interface::Web::ProcessTicketLinks +    # Delete links that are gone gone gone. +    foreach my $arg ( keys %$ARGSRef ) { +        if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) { +            my $base   = $1; +            my $type   = $2; +            my $target = $3; + +            push @results, +              "Trying to delete: Base: $base Target: $target  Type $type"; +            my ( $val, $msg ) = $Object->DeleteLink( Base   => $base, +                                                     Type   => $type, +                                                     Target => $target ); + +            push @results, $msg; + +        } + +    } +    ### + +    #my @delete_custnums = +    #  map  { /^Object-AddCustomer-(\d+)$/; $1 } +    #  grep { /^Object-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } +    #  keys %$ARGSRef; + +    my @custnums = map  { /^Object-AddCustomer-(\d+)$/; $1 } +                   grep { /^Object-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } +                   keys %$ARGSRef; + +    foreach my $custnum ( @custnums ) { +      my( $val, $msg ) = +        $Object->AddLink( 'Type'   => 'MemberOf', +                          'Target' => "freeside://freeside/cust_main/$custnum", +                        ); +      push @results, $msg; +    } + +    return @results; + +} + +1; + diff --git a/rt/lib/RT/Link.pm b/rt/lib/RT/Link.pm index 8737b504e..962c378a8 100644 --- a/rt/lib/RT/Link.pm +++ b/rt/lib/RT/Link.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -122,7 +98,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -131,14 +107,14 @@ Returns the current value of id.  =cut -=head2 Base +=item Base  Returns the current value of Base.   (In the database, Base is stored as varchar(240).) -=head2 SetBase VALUE +=item SetBase VALUE  Set Base to VALUE.  @@ -149,14 +125,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Target +=item Target  Returns the current value of Target.   (In the database, Target is stored as varchar(240).) -=head2 SetTarget VALUE +=item SetTarget VALUE  Set Target to VALUE.  @@ -167,14 +143,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Type +=item Type  Returns the current value of Type.   (In the database, Type is stored as varchar(20).) -=head2 SetType VALUE +=item SetType VALUE  Set Type to VALUE.  @@ -185,14 +161,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 LocalTarget +=item LocalTarget  Returns the current value of LocalTarget.   (In the database, LocalTarget is stored as int(11).) -=head2 SetLocalTarget VALUE +=item SetLocalTarget VALUE  Set LocalTarget to VALUE.  @@ -203,14 +179,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 LocalBase +=item LocalBase  Returns the current value of LocalBase.   (In the database, LocalBase is stored as int(11).) -=head2 SetLocalBase VALUE +=item SetLocalBase VALUE  Set LocalBase to VALUE.  @@ -221,7 +197,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -230,7 +206,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -239,7 +215,7 @@ Returns the current value of LastUpdated.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -248,7 +224,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -258,29 +234,29 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Base =>  -		{read => 1, write => 1, sql_type => 12, length => 240,  is_blob => 0,  is_numeric => 0,  type => 'varchar(240)', default => ''}, +		{read => 1, write => 1, type => 'varchar(240)', default => ''},          Target =>  -		{read => 1, write => 1, sql_type => 12, length => 240,  is_blob => 0,  is_numeric => 0,  type => 'varchar(240)', default => ''}, +		{read => 1, write => 1, type => 'varchar(240)', default => ''},          Type =>  -		{read => 1, write => 1, sql_type => 12, length => 20,  is_blob => 0,  is_numeric => 0,  type => 'varchar(20)', default => ''}, +		{read => 1, write => 1, type => 'varchar(20)', default => ''},          LocalTarget =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          LocalBase =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -312,7 +288,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Links.pm b/rt/lib/RT/Links.pm index 47d78fc3a..7a1773af9 100644 --- a/rt/lib/RT/Links.pm +++ b/rt/lib/RT/Links.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Link item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Queue.pm b/rt/lib/RT/Queue.pm index 42fa04c11..b362c9f0d 100755 --- a/rt/lib/RT/Queue.pm +++ b/rt/lib/RT/Queue.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -131,7 +107,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -140,14 +116,14 @@ Returns the current value of id.  =cut -=head2 Name +=item Name  Returns the current value of Name.   (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE  Set Name to VALUE.  @@ -158,14 +134,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Description +=item Description  Returns the current value of Description.   (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE  Set Description to VALUE.  @@ -176,14 +152,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 CorrespondAddress +=item CorrespondAddress  Returns the current value of CorrespondAddress.   (In the database, CorrespondAddress is stored as varchar(120).) -=head2 SetCorrespondAddress VALUE +=item SetCorrespondAddress VALUE  Set CorrespondAddress to VALUE.  @@ -194,14 +170,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 CommentAddress +=item CommentAddress  Returns the current value of CommentAddress.   (In the database, CommentAddress is stored as varchar(120).) -=head2 SetCommentAddress VALUE +=item SetCommentAddress VALUE  Set CommentAddress to VALUE.  @@ -212,14 +188,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 InitialPriority +=item InitialPriority  Returns the current value of InitialPriority.   (In the database, InitialPriority is stored as int(11).) -=head2 SetInitialPriority VALUE +=item SetInitialPriority VALUE  Set InitialPriority to VALUE.  @@ -230,14 +206,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 FinalPriority +=item FinalPriority  Returns the current value of FinalPriority.   (In the database, FinalPriority is stored as int(11).) -=head2 SetFinalPriority VALUE +=item SetFinalPriority VALUE  Set FinalPriority to VALUE.  @@ -248,14 +224,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 DefaultDueIn +=item DefaultDueIn  Returns the current value of DefaultDueIn.   (In the database, DefaultDueIn is stored as int(11).) -=head2 SetDefaultDueIn VALUE +=item SetDefaultDueIn VALUE  Set DefaultDueIn to VALUE.  @@ -266,7 +242,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -275,7 +251,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -284,7 +260,7 @@ Returns the current value of Created.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -293,7 +269,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -302,14 +278,14 @@ Returns the current value of LastUpdated.  =cut -=head2 Disabled +=item Disabled  Returns the current value of Disabled.   (In the database, Disabled is stored as smallint(6).) -=head2 SetDisabled VALUE +=item SetDisabled VALUE  Set Disabled to VALUE.  @@ -321,35 +297,35 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Name =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Description =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          CorrespondAddress =>  -		{read => 1, write => 1, sql_type => 12, length => 120,  is_blob => 0,  is_numeric => 0,  type => 'varchar(120)', default => ''}, +		{read => 1, write => 1, type => 'varchar(120)', default => ''},          CommentAddress =>  -		{read => 1, write => 1, sql_type => 12, length => 120,  is_blob => 0,  is_numeric => 0,  type => 'varchar(120)', default => ''}, +		{read => 1, write => 1, type => 'varchar(120)', default => ''},          InitialPriority =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          FinalPriority =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          DefaultDueIn =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          Disabled =>  -		{read => 1, write => 1, sql_type => 5, length => 6,  is_blob => 0,  is_numeric => 1,  type => 'smallint(6)', default => '0'}, +		{read => 1, write => 1, type => 'smallint(6)', default => '0'},   }  }; @@ -381,7 +357,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Queues.pm b/rt/lib/RT/Queues.pm index ccf1e4208..60aec9086 100755 --- a/rt/lib/RT/Queues.pm +++ b/rt/lib/RT/Queues.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Queue item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Record.pm b/rt/lib/RT/Record.pm index 262bd208a..b32ef5553 100755 --- a/rt/lib/RT/Record.pm +++ b/rt/lib/RT/Record.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -74,6 +74,7 @@ our @ISA;  use base qw(RT::Base);  use RT::Date; +use RT::I18N;  use RT::User;  use RT::Attributes;  use DBIx::SearchBuilder::Record::Cachable; @@ -862,6 +863,7 @@ sub _DecodeLOB {      elsif ( $ContentEncoding && $ContentEncoding ne 'none' ) {          return ( $self->loc( "Unknown ContentEncoding [_1]", $ContentEncoding ) );      } +      if ( RT::I18N::IsTextualContentType($ContentType) ) {         $Content = Encode::decode_utf8($Content) unless Encode::is_utf8($Content);      } @@ -1231,8 +1233,37 @@ sub DependsOn {  # }}} +# {{{ Customers + +=head2 Customers + +  This returns an RT::Links object which references all the customers that this object is a member of. + +=cut + +sub Customers { +    my( $self, %opt ) = @_; +    my $Debug = $opt{'Debug'}; + +    unless ( $self->{'Customers'} ) { +      $self->{'Customers'} = $self->MemberOf->Clone; +      $self->{'Customers'}->Limit( +                                   FIELD    => 'Target', +                                   OPERATOR => 'STARTSWITH', +                                   VALUE    => 'freeside://freeside/cust_main/', +                                 ); +    } + +    warn "->Customers method called on $self; returning ". +         ref($self->{'Customers'}). ' object' +      if $Debug; + +    return $self->{'Customers'}; +} + +# }}}  # {{{ sub _Links  diff --git a/rt/lib/RT/Scrip.pm b/rt/lib/RT/Scrip.pm index 11b8d9455..a69dde04e 100755 --- a/rt/lib/RT/Scrip.pm +++ b/rt/lib/RT/Scrip.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -89,7 +65,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -144,7 +120,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -153,14 +129,14 @@ Returns the current value of id.  =cut -=head2 Description +=item Description  Returns the current value of Description.   (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE  Set Description to VALUE.  @@ -171,14 +147,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ScripCondition +=item ScripCondition  Returns the current value of ScripCondition.   (In the database, ScripCondition is stored as int(11).) -=head2 SetScripCondition VALUE +=item SetScripCondition VALUE  Set ScripCondition to VALUE.  @@ -189,7 +165,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ScripConditionObj +=item ScripConditionObj  Returns the ScripCondition Object which has the id returned by ScripCondition @@ -203,14 +179,14 @@ sub ScripConditionObj {  	return($ScripCondition);  } -=head2 ScripAction +=item ScripAction  Returns the current value of ScripAction.   (In the database, ScripAction is stored as int(11).) -=head2 SetScripAction VALUE +=item SetScripAction VALUE  Set ScripAction to VALUE.  @@ -221,7 +197,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ScripActionObj +=item ScripActionObj  Returns the ScripAction Object which has the id returned by ScripAction @@ -235,14 +211,14 @@ sub ScripActionObj {  	return($ScripAction);  } -=head2 ConditionRules +=item ConditionRules  Returns the current value of ConditionRules.   (In the database, ConditionRules is stored as text.) -=head2 SetConditionRules VALUE +=item SetConditionRules VALUE  Set ConditionRules to VALUE.  @@ -253,14 +229,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ActionRules +=item ActionRules  Returns the current value of ActionRules.   (In the database, ActionRules is stored as text.) -=head2 SetActionRules VALUE +=item SetActionRules VALUE  Set ActionRules to VALUE.  @@ -271,14 +247,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 CustomIsApplicableCode +=item CustomIsApplicableCode  Returns the current value of CustomIsApplicableCode.   (In the database, CustomIsApplicableCode is stored as text.) -=head2 SetCustomIsApplicableCode VALUE +=item SetCustomIsApplicableCode VALUE  Set CustomIsApplicableCode to VALUE.  @@ -289,14 +265,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 CustomPrepareCode +=item CustomPrepareCode  Returns the current value of CustomPrepareCode.   (In the database, CustomPrepareCode is stored as text.) -=head2 SetCustomPrepareCode VALUE +=item SetCustomPrepareCode VALUE  Set CustomPrepareCode to VALUE.  @@ -307,14 +283,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 CustomCommitCode +=item CustomCommitCode  Returns the current value of CustomCommitCode.   (In the database, CustomCommitCode is stored as text.) -=head2 SetCustomCommitCode VALUE +=item SetCustomCommitCode VALUE  Set CustomCommitCode to VALUE.  @@ -325,14 +301,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Stage +=item Stage  Returns the current value of Stage.   (In the database, Stage is stored as varchar(32).) -=head2 SetStage VALUE +=item SetStage VALUE  Set Stage to VALUE.  @@ -343,14 +319,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Queue +=item Queue  Returns the current value of Queue.   (In the database, Queue is stored as int(11).) -=head2 SetQueue VALUE +=item SetQueue VALUE  Set Queue to VALUE.  @@ -361,7 +337,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 QueueObj +=item QueueObj  Returns the Queue Object which has the id returned by Queue @@ -375,14 +351,14 @@ sub QueueObj {  	return($Queue);  } -=head2 Template +=item Template  Returns the current value of Template.   (In the database, Template is stored as int(11).) -=head2 SetTemplate VALUE +=item SetTemplate VALUE  Set Template to VALUE.  @@ -393,7 +369,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 TemplateObj +=item TemplateObj  Returns the Template Object which has the id returned by Template @@ -407,7 +383,7 @@ sub TemplateObj {  	return($Template);  } -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -416,7 +392,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -425,7 +401,7 @@ Returns the current value of Created.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -434,7 +410,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -444,41 +420,41 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Description =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          ScripCondition =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          ScripAction =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          ConditionRules =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'text', default => ''}, +		{read => 1, write => 1, type => 'text', default => ''},          ActionRules =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'text', default => ''}, +		{read => 1, write => 1, type => 'text', default => ''},          CustomIsApplicableCode =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'text', default => ''}, +		{read => 1, write => 1, type => 'text', default => ''},          CustomPrepareCode =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'text', default => ''}, +		{read => 1, write => 1, type => 'text', default => ''},          CustomCommitCode =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'text', default => ''}, +		{read => 1, write => 1, type => 'text', default => ''},          Stage =>  -		{read => 1, write => 1, sql_type => 12, length => 32,  is_blob => 0,  is_numeric => 0,  type => 'varchar(32)', default => ''}, +		{read => 1, write => 1, type => 'varchar(32)', default => ''},          Queue =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Template =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -510,7 +486,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/ScripAction.pm b/rt/lib/RT/ScripAction.pm index daa74f3d6..26824df5d 100755 --- a/rt/lib/RT/ScripAction.pm +++ b/rt/lib/RT/ScripAction.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -119,7 +95,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -128,14 +104,14 @@ Returns the current value of id.  =cut -=head2 Name +=item Name  Returns the current value of Name.   (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE  Set Name to VALUE.  @@ -146,14 +122,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Description +=item Description  Returns the current value of Description.   (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE  Set Description to VALUE.  @@ -164,14 +140,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ExecModule +=item ExecModule  Returns the current value of ExecModule.   (In the database, ExecModule is stored as varchar(60).) -=head2 SetExecModule VALUE +=item SetExecModule VALUE  Set ExecModule to VALUE.  @@ -182,14 +158,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Argument +=item Argument  Returns the current value of Argument.   (In the database, Argument is stored as varchar(255).) -=head2 SetArgument VALUE +=item SetArgument VALUE  Set Argument to VALUE.  @@ -200,7 +176,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -209,7 +185,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -218,7 +194,7 @@ Returns the current value of Created.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -227,7 +203,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -237,27 +213,27 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Name =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Description =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          ExecModule =>  -		{read => 1, write => 1, sql_type => 12, length => 60,  is_blob => 0,  is_numeric => 0,  type => 'varchar(60)', default => ''}, +		{read => 1, write => 1, type => 'varchar(60)', default => ''},          Argument =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -289,7 +265,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/ScripActions.pm b/rt/lib/RT/ScripActions.pm index b186fb857..614ff374f 100755 --- a/rt/lib/RT/ScripActions.pm +++ b/rt/lib/RT/ScripActions.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::ScripAction item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/ScripCondition.pm b/rt/lib/RT/ScripCondition.pm index 3303398d3..fe0aa2d5a 100755 --- a/rt/lib/RT/ScripCondition.pm +++ b/rt/lib/RT/ScripCondition.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -122,7 +98,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -131,14 +107,14 @@ Returns the current value of id.  =cut -=head2 Name +=item Name  Returns the current value of Name.   (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE  Set Name to VALUE.  @@ -149,14 +125,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Description +=item Description  Returns the current value of Description.   (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE  Set Description to VALUE.  @@ -167,14 +143,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ExecModule +=item ExecModule  Returns the current value of ExecModule.   (In the database, ExecModule is stored as varchar(60).) -=head2 SetExecModule VALUE +=item SetExecModule VALUE  Set ExecModule to VALUE.  @@ -185,14 +161,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Argument +=item Argument  Returns the current value of Argument.   (In the database, Argument is stored as varchar(255).) -=head2 SetArgument VALUE +=item SetArgument VALUE  Set Argument to VALUE.  @@ -203,14 +179,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ApplicableTransTypes +=item ApplicableTransTypes  Returns the current value of ApplicableTransTypes.   (In the database, ApplicableTransTypes is stored as varchar(60).) -=head2 SetApplicableTransTypes VALUE +=item SetApplicableTransTypes VALUE  Set ApplicableTransTypes to VALUE.  @@ -221,7 +197,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -230,7 +206,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -239,7 +215,7 @@ Returns the current value of Created.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -248,7 +224,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -258,29 +234,29 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Name =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Description =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          ExecModule =>  -		{read => 1, write => 1, sql_type => 12, length => 60,  is_blob => 0,  is_numeric => 0,  type => 'varchar(60)', default => ''}, +		{read => 1, write => 1, type => 'varchar(60)', default => ''},          Argument =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          ApplicableTransTypes =>  -		{read => 1, write => 1, sql_type => 12, length => 60,  is_blob => 0,  is_numeric => 0,  type => 'varchar(60)', default => ''}, +		{read => 1, write => 1, type => 'varchar(60)', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -312,7 +288,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/ScripConditions.pm b/rt/lib/RT/ScripConditions.pm index 623ba10c3..34f788d9c 100755 --- a/rt/lib/RT/ScripConditions.pm +++ b/rt/lib/RT/ScripConditions.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::ScripCondition item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Scrips.pm b/rt/lib/RT/Scrips.pm index 684012f10..a39443136 100755 --- a/rt/lib/RT/Scrips.pm +++ b/rt/lib/RT/Scrips.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Scrip item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/SearchBuilder.pm b/rt/lib/RT/SearchBuilder.pm index 62ae13e70..aa915d433 100644 --- a/rt/lib/RT/SearchBuilder.pm +++ b/rt/lib/RT/SearchBuilder.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -69,7 +69,7 @@ ok (require RT::SearchBuilder);  package RT::SearchBuilder;  use RT::Base; -use DBIx::SearchBuilder "1.40"; +use DBIx::SearchBuilder "1.50";  use strict;  use vars qw(@ISA); diff --git a/rt/lib/RT/Template.pm b/rt/lib/RT/Template.pm index a46eef117..f73ea3ed6 100755 --- a/rt/lib/RT/Template.pm +++ b/rt/lib/RT/Template.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -86,7 +62,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -129,7 +105,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -138,14 +114,14 @@ Returns the current value of id.  =cut -=head2 Queue +=item Queue  Returns the current value of Queue.   (In the database, Queue is stored as int(11).) -=head2 SetQueue VALUE +=item SetQueue VALUE  Set Queue to VALUE.  @@ -156,7 +132,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 QueueObj +=item QueueObj  Returns the Queue Object which has the id returned by Queue @@ -170,14 +146,14 @@ sub QueueObj {  	return($Queue);  } -=head2 Name +=item Name  Returns the current value of Name.   (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE  Set Name to VALUE.  @@ -188,14 +164,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Description +=item Description  Returns the current value of Description.   (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE  Set Description to VALUE.  @@ -206,14 +182,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Type +=item Type  Returns the current value of Type.   (In the database, Type is stored as varchar(16).) -=head2 SetType VALUE +=item SetType VALUE  Set Type to VALUE.  @@ -224,14 +200,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Language +=item Language  Returns the current value of Language.   (In the database, Language is stored as varchar(16).) -=head2 SetLanguage VALUE +=item SetLanguage VALUE  Set Language to VALUE.  @@ -242,14 +218,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 TranslationOf +=item TranslationOf  Returns the current value of TranslationOf.   (In the database, TranslationOf is stored as int(11).) -=head2 SetTranslationOf VALUE +=item SetTranslationOf VALUE  Set TranslationOf to VALUE.  @@ -260,14 +236,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Content +=item Content  Returns the current value of Content.   (In the database, Content is stored as blob.) -=head2 SetContent VALUE +=item SetContent VALUE  Set Content to VALUE.  @@ -278,7 +254,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -287,7 +263,7 @@ Returns the current value of LastUpdated.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -296,7 +272,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -305,7 +281,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -315,33 +291,33 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Queue =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Name =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Description =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          Type =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          Language =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          TranslationOf =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Content =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'blob', default => ''}, +		{read => 1, write => 1, type => 'blob', default => ''},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -373,7 +349,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Templates.pm b/rt/lib/RT/Templates.pm index 9a2acbdc6..37db84086 100755 --- a/rt/lib/RT/Templates.pm +++ b/rt/lib/RT/Templates.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Template item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Ticket.pm b/rt/lib/RT/Ticket.pm index 81bbbd004..2f075a20c 100755 --- a/rt/lib/RT/Ticket.pm +++ b/rt/lib/RT/Ticket.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -86,7 +62,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -168,7 +144,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -177,14 +153,14 @@ Returns the current value of id.  =cut -=head2 EffectiveId +=item EffectiveId  Returns the current value of EffectiveId.   (In the database, EffectiveId is stored as int(11).) -=head2 SetEffectiveId VALUE +=item SetEffectiveId VALUE  Set EffectiveId to VALUE.  @@ -195,14 +171,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Queue +=item Queue  Returns the current value of Queue.   (In the database, Queue is stored as int(11).) -=head2 SetQueue VALUE +=item SetQueue VALUE  Set Queue to VALUE.  @@ -213,7 +189,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 QueueObj +=item QueueObj  Returns the Queue Object which has the id returned by Queue @@ -227,14 +203,14 @@ sub QueueObj {  	return($Queue);  } -=head2 Type +=item Type  Returns the current value of Type.   (In the database, Type is stored as varchar(16).) -=head2 SetType VALUE +=item SetType VALUE  Set Type to VALUE.  @@ -245,14 +221,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 IssueStatement +=item IssueStatement  Returns the current value of IssueStatement.   (In the database, IssueStatement is stored as int(11).) -=head2 SetIssueStatement VALUE +=item SetIssueStatement VALUE  Set IssueStatement to VALUE.  @@ -263,14 +239,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Resolution +=item Resolution  Returns the current value of Resolution.   (In the database, Resolution is stored as int(11).) -=head2 SetResolution VALUE +=item SetResolution VALUE  Set Resolution to VALUE.  @@ -281,14 +257,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Owner +=item Owner  Returns the current value of Owner.   (In the database, Owner is stored as int(11).) -=head2 SetOwner VALUE +=item SetOwner VALUE  Set Owner to VALUE.  @@ -299,14 +275,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Subject +=item Subject  Returns the current value of Subject.   (In the database, Subject is stored as varchar(200).) -=head2 SetSubject VALUE +=item SetSubject VALUE  Set Subject to VALUE.  @@ -317,14 +293,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 InitialPriority +=item InitialPriority  Returns the current value of InitialPriority.   (In the database, InitialPriority is stored as int(11).) -=head2 SetInitialPriority VALUE +=item SetInitialPriority VALUE  Set InitialPriority to VALUE.  @@ -335,14 +311,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 FinalPriority +=item FinalPriority  Returns the current value of FinalPriority.   (In the database, FinalPriority is stored as int(11).) -=head2 SetFinalPriority VALUE +=item SetFinalPriority VALUE  Set FinalPriority to VALUE.  @@ -353,14 +329,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Priority +=item Priority  Returns the current value of Priority.   (In the database, Priority is stored as int(11).) -=head2 SetPriority VALUE +=item SetPriority VALUE  Set Priority to VALUE.  @@ -371,14 +347,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 TimeEstimated +=item TimeEstimated  Returns the current value of TimeEstimated.   (In the database, TimeEstimated is stored as int(11).) -=head2 SetTimeEstimated VALUE +=item SetTimeEstimated VALUE  Set TimeEstimated to VALUE.  @@ -389,14 +365,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 TimeWorked +=item TimeWorked  Returns the current value of TimeWorked.   (In the database, TimeWorked is stored as int(11).) -=head2 SetTimeWorked VALUE +=item SetTimeWorked VALUE  Set TimeWorked to VALUE.  @@ -407,14 +383,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Status +=item Status  Returns the current value of Status.   (In the database, Status is stored as varchar(10).) -=head2 SetStatus VALUE +=item SetStatus VALUE  Set Status to VALUE.  @@ -425,14 +401,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 TimeLeft +=item TimeLeft  Returns the current value of TimeLeft.   (In the database, TimeLeft is stored as int(11).) -=head2 SetTimeLeft VALUE +=item SetTimeLeft VALUE  Set TimeLeft to VALUE.  @@ -443,14 +419,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Told +=item Told  Returns the current value of Told.   (In the database, Told is stored as datetime.) -=head2 SetTold VALUE +=item SetTold VALUE  Set Told to VALUE.  @@ -461,14 +437,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Starts +=item Starts  Returns the current value of Starts.   (In the database, Starts is stored as datetime.) -=head2 SetStarts VALUE +=item SetStarts VALUE  Set Starts to VALUE.  @@ -479,14 +455,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Started +=item Started  Returns the current value of Started.   (In the database, Started is stored as datetime.) -=head2 SetStarted VALUE +=item SetStarted VALUE  Set Started to VALUE.  @@ -497,14 +473,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Due +=item Due  Returns the current value of Due.   (In the database, Due is stored as datetime.) -=head2 SetDue VALUE +=item SetDue VALUE  Set Due to VALUE.  @@ -515,14 +491,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Resolved +=item Resolved  Returns the current value of Resolved.   (In the database, Resolved is stored as datetime.) -=head2 SetResolved VALUE +=item SetResolved VALUE  Set Resolved to VALUE.  @@ -533,7 +509,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -542,7 +518,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -551,7 +527,7 @@ Returns the current value of LastUpdated.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -560,7 +536,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -569,14 +545,14 @@ Returns the current value of Created.  =cut -=head2 Disabled +=item Disabled  Returns the current value of Disabled.   (In the database, Disabled is stored as smallint(6).) -=head2 SetDisabled VALUE +=item SetDisabled VALUE  Set Disabled to VALUE.  @@ -588,59 +564,59 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          EffectiveId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Queue =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Type =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          IssueStatement =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Resolution =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Owner =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Subject =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => '[no subject]'}, +		{read => 1, write => 1, type => 'varchar(200)', default => '[no subject]'},          InitialPriority =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          FinalPriority =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Priority =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          TimeEstimated =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          TimeWorked =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Status =>  -		{read => 1, write => 1, sql_type => 12, length => 10,  is_blob => 0,  is_numeric => 0,  type => 'varchar(10)', default => ''}, +		{read => 1, write => 1, type => 'varchar(10)', default => ''},          TimeLeft =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Told =>  -		{read => 1, write => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, write => 1, type => 'datetime', default => ''},          Starts =>  -		{read => 1, write => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, write => 1, type => 'datetime', default => ''},          Started =>  -		{read => 1, write => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, write => 1, type => 'datetime', default => ''},          Due =>  -		{read => 1, write => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, write => 1, type => 'datetime', default => ''},          Resolved =>  -		{read => 1, write => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, write => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          Disabled =>  -		{read => 1, write => 1, sql_type => 5, length => 6,  is_blob => 0,  is_numeric => 1,  type => 'smallint(6)', default => '0'}, +		{read => 1, write => 1, type => 'smallint(6)', default => '0'},   }  }; @@ -672,7 +648,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/TicketCustomFieldValue.pm b/rt/lib/RT/TicketCustomFieldValue.pm deleted file mode 100644 index 717647266..000000000 --- a/rt/lib/RT/TicketCustomFieldValue.pm +++ /dev/null @@ -1,308 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -#  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> -#  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: -#  -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -#  -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -# General Public License for more details. -#  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# }}} END BPS TAGGED BLOCK -# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.   -#  -# !! DO NOT EDIT THIS FILE !! -# - -use strict; - - -=head1 NAME - -RT::TicketCustomFieldValue - - -=head1 SYNOPSIS - -=head1 DESCRIPTION - -=head1 METHODS - -=cut - -package RT::TicketCustomFieldValue; -use RT::Record;  -use RT::CustomField; -use RT::Ticket; - - -use vars qw( @ISA ); -@ISA= qw( RT::Record ); - -sub _Init { -  my $self = shift;  - -  $self->Table('TicketCustomFieldValues'); -  $self->SUPER::_Init(@_); -} - - - - - -=head2 Create PARAMHASH - -Create takes a hash of values and creates a row in the database: - -  int(11) 'Ticket'. -  int(11) 'CustomField'. -  varchar(255) 'Content'. - -=cut - - - - -sub Create { -    my $self = shift; -    my %args = (  -                Ticket => '0', -                CustomField => '0', -                Content => '', - -		  @_); -    $self->SUPER::Create( -                         Ticket => $args{'Ticket'}, -                         CustomField => $args{'CustomField'}, -                         Content => $args{'Content'}, -); - -} - - - -=head2 id - -Returns the current value of id.  -(In the database, id is stored as int(11).) - - -=cut - - -=head2 Ticket - -Returns the current value of Ticket.  -(In the database, Ticket is stored as int(11).) - - - -=head2 SetTicket VALUE - - -Set Ticket to VALUE.  -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Ticket will be stored as a int(11).) - - -=cut - - -=head2 TicketObj - -Returns the Ticket Object which has the id returned by Ticket - - -=cut - -sub TicketObj { -	my $self = shift; -	my $Ticket =  RT::Ticket->new($self->CurrentUser); -	$Ticket->Load($self->__Value('Ticket')); -	return($Ticket); -} - -=head2 CustomField - -Returns the current value of CustomField.  -(In the database, CustomField is stored as int(11).) - - - -=head2 SetCustomField VALUE - - -Set CustomField to VALUE.  -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, CustomField will be stored as a int(11).) - - -=cut - - -=head2 CustomFieldObj - -Returns the CustomField Object which has the id returned by CustomField - - -=cut - -sub CustomFieldObj { -	my $self = shift; -	my $CustomField =  RT::CustomField->new($self->CurrentUser); -	$CustomField->Load($self->__Value('CustomField')); -	return($CustomField); -} - -=head2 Content - -Returns the current value of Content.  -(In the database, Content is stored as varchar(255).) - - - -=head2 SetContent VALUE - - -Set Content to VALUE.  -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Content will be stored as a varchar(255).) - - -=cut - - -=head2 Creator - -Returns the current value of Creator.  -(In the database, Creator is stored as int(11).) - - -=cut - - -=head2 Created - -Returns the current value of Created.  -(In the database, Created is stored as datetime.) - - -=cut - - -=head2 LastUpdatedBy - -Returns the current value of LastUpdatedBy.  -(In the database, LastUpdatedBy is stored as int(11).) - - -=cut - - -=head2 LastUpdated - -Returns the current value of LastUpdated.  -(In the database, LastUpdated is stored as datetime.) - - -=cut - - - -sub _CoreAccessible { -    { -      -        id => -		{read => 1, type => 'int(11)', default => ''}, -        Ticket =>  -		{read => 1, write => 1, type => 'int(11)', default => '0'}, -        CustomField =>  -		{read => 1, write => 1, type => 'int(11)', default => '0'}, -        Content =>  -		{read => 1, write => 1, type => 'varchar(255)', default => ''}, -        Creator =>  -		{read => 1, auto => 1, type => 'int(11)', default => '0'}, -        Created =>  -		{read => 1, auto => 1, type => 'datetime', default => ''}, -        LastUpdatedBy =>  -		{read => 1, auto => 1, type => 'int(11)', default => '0'}, -        LastUpdated =>  -		{read => 1, auto => 1, type => 'datetime', default => ''}, - - } -}; - - -        eval "require RT::TicketCustomFieldValue_Overlay"; -        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Overlay.pm}) { -            die $@; -        }; - -        eval "require RT::TicketCustomFieldValue_Vendor"; -        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Vendor.pm}) { -            die $@; -        }; - -        eval "require RT::TicketCustomFieldValue_Local"; -        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Local.pm}) { -            die $@; -        }; - - - - -=head1 SEE ALSO - -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.   - -These overlay files can contain new subs or subs to replace existing subs in this module. - -If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line  - -   no warnings qw(redefine); - -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. - -RT::TicketCustomFieldValue_Overlay, RT::TicketCustomFieldValue_Vendor, RT::TicketCustomFieldValue_Local - -=cut - - -1; diff --git a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm b/rt/lib/RT/TicketCustomFieldValue_Overlay.pm deleted file mode 100644 index 270c5939a..000000000 --- a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm +++ /dev/null @@ -1,74 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -#  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> -#  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: -#  -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -#  -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -# General Public License for more details. -#  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# }}} END BPS TAGGED BLOCK -use strict; -no warnings qw(redefine); - - - -=head2 LoadByTicketContentAndCustomField { Ticket => TICKET, CustomField => CUSTOMFIELD, Content => CONTENT } - -Loads a custom field value by Ticket, Content and which CustomField it's tied to - -=cut - - -sub LoadByTicketContentAndCustomField { -    my $self = shift; -    my %args = ( Ticket => undef, -                CustomField => undef, -                Content => undef, -                @_ -                ); - - -    $self->LoadByCols( Content => $args{'Content'}, -                         CustomField => $args{'CustomField'}, -                         Ticket => $args{'Ticket'}); - -     -} - -1; diff --git a/rt/lib/RT/TicketCustomFieldValues.pm b/rt/lib/RT/TicketCustomFieldValues.pm deleted file mode 100644 index 2174afef3..000000000 --- a/rt/lib/RT/TicketCustomFieldValues.pm +++ /dev/null @@ -1,137 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -#  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> -#  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: -#  -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -#  -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -# General Public License for more details. -#  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# }}} END BPS TAGGED BLOCK -# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.   -#  -# !! DO NOT EDIT THIS FILE !! -# - -use strict; - - -=head1 NAME - -  RT::TicketCustomFieldValues -- Class Description -  -=head1 SYNOPSIS - -  use RT::TicketCustomFieldValues - -=head1 DESCRIPTION - - -=head1 METHODS - -=cut - -package RT::TicketCustomFieldValues; - -use RT::SearchBuilder; -use RT::TicketCustomFieldValue; - -use vars qw( @ISA ); -@ISA= qw(RT::SearchBuilder); - - -sub _Init { -    my $self = shift; -    $self->{'table'} = 'TicketCustomFieldValues'; -    $self->{'primary_key'} = 'id'; - - -    return ( $self->SUPER::_Init(@_) ); -} - - -=head2 NewItem - -Returns an empty new RT::TicketCustomFieldValue item - -=cut - -sub NewItem { -    my $self = shift; -    return(RT::TicketCustomFieldValue->new($self->CurrentUser)); -} - -        eval "require RT::TicketCustomFieldValues_Overlay"; -        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Overlay.pm}) { -            die $@; -        }; - -        eval "require RT::TicketCustomFieldValues_Vendor"; -        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Vendor.pm}) { -            die $@; -        }; - -        eval "require RT::TicketCustomFieldValues_Local"; -        if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Local.pm}) { -            die $@; -        }; - - - - -=head1 SEE ALSO - -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations.   - -These overlay files can contain new subs or subs to replace existing subs in this module. - -If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line  - -   no warnings qw(redefine); - -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. - -RT::TicketCustomFieldValues_Overlay, RT::TicketCustomFieldValues_Vendor, RT::TicketCustomFieldValues_Local - -=cut - - -1; diff --git a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm b/rt/lib/RT/TicketCustomFieldValues_Overlay.pm deleted file mode 100644 index 8cbaca574..000000000 --- a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm +++ /dev/null @@ -1,108 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -#  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> -#  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: -#  -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -#  -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -# General Public License for more details. -#  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# }}} END BPS TAGGED BLOCK -use strict; -no warnings qw(redefine); - -# {{{ sub LimitToCustomField - -=head2 LimitToCustomField FIELD - -Limits the returned set to values for the custom field with Id FIELD - -=cut -   -sub LimitToCustomField { -    my $self = shift; -    my $cf = shift; -    return ($self->Limit( FIELD => 'CustomField', -			  VALUE => $cf, -			  OPERATOR => '=')); - -} - -# }}} - -# {{{ sub LimitToTicket - -=head2 LimitToTicket TICKETID - -Limits the returned set to values for the ticket with Id TICKETID - -=cut -   -sub LimitToTicket { -    my $self = shift; -    my $ticket = shift; -    return ($self->Limit( FIELD => 'Ticket', -			  VALUE => $ticket, -			  OPERATOR => '=')); - -} - -# }}} - - -=sub HasEntry VALUE - -Returns true if this CustomFieldValues collection has an entry with content that eq VALUE - -=cut - - -sub HasEntry { -    my $self = shift; -    my $value = shift; - -    #TODO: this could cache and optimize a fair bit. -    foreach my $item (@{$self->ItemsArrayRef}) { -        return(1) if ($item->Content eq $value);   -    } -    return undef; - -} - -1; - diff --git a/rt/lib/RT/Ticket_Overlay.pm b/rt/lib/RT/Ticket_Overlay.pm index 90f83a8a8..dad94375f 100644 --- a/rt/lib/RT/Ticket_Overlay.pm +++ b/rt/lib/RT/Ticket_Overlay.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -716,6 +716,68 @@ sub Create {      # }}} +    # {{{ Deal with auto-customer association + +    #unless we already have (a) customer(s)... +    unless ( $self->Customers->Count ) { + +      #first find any requestors with emails but *without* customer targets +      my @NoCust_Requestors = +        grep { $_->EmailAddress && ! $_->Customers->Count } +             @{ $self->_Requestors->UserMembersObj->ItemsArrayRef }; + +      for my $Requestor (@NoCust_Requestors) { + +         #perhaps the stuff in here should be in a User method?? +         my @Customers = +           &RT::URI::freeside::email_search( email=>$Requestor->EmailAddress ); + +         foreach my $custnum ( map $_->{'custnum'}, @Customers ) { + +           ## false laziness w/RT/Interface/Web_Vendor.pm +           my @link = ( 'Type'   => 'MemberOf', +                        'Target' => "freeside://freeside/cust_main/$custnum", +                      ); + +           my( $val, $msg ) = $Requestor->_AddLink(@link); +           #XXX should do something with $msg# push @non_fatal_errors, $msg; + +         } + +      } + +      #find any requestors with customer targets +   +      my %cust_target = (); +   +      my @Requestors = +        grep { $_->Customers->Count } +             @{ $self->_Requestors->UserMembersObj->ItemsArrayRef }; +   +      foreach my $Requestor ( @Requestors ) { +        foreach my $cust_link ( @{ $Requestor->Customers->ItemsArrayRef } ) { +          $cust_target{ $cust_link->Target } = 1; +        } +      } +   +      #and then auto-associate this ticket with those customers +   +      foreach my $cust_target ( keys %cust_target ) { +   +        my @link = ( 'Type'   => 'MemberOf', +                     #'Target' => "freeside://freeside/cust_main/$custnum", +                     'Target' => $cust_target, +                   ); +   +        my( $val, $msg ) = $self->_AddLink(@link); +        push @non_fatal_errors, $msg; +   +      } + +    } + +    # }}} +      # {{{ Add all the custom fields      foreach my $arg ( keys %args ) { @@ -1341,43 +1403,52 @@ sub AddWatcher {          @_      ); -    return ( 0, "No principal specified" ) -        unless $args{'Email'} or $args{'PrincipalId'}; - -    if ( !$args{'PrincipalId'} and $args{'Email'} ) { -        my $user = RT::User->new( $self->CurrentUser ); -        $user->LoadByEmail( $args{'Email'} ); -        if ( $user->id ) { -            $args{'PrincipalId'} = $user->PrincipalId; -            delete $args{'Email'}; -        } -    } +    # XXX, FIXME, BUG: if only email is provided then we only check +    # for ModifyTicket right, but must try to get PrincipalId and +    # check Watch* rights too if user exist      # {{{ Check ACLS -    # ModifyTicket allow you to add any watcher -    return $self->_AddWatcher(%args) -        if $self->CurrentUserHasRight('ModifyTicket'); -      #If the watcher we're trying to add is for the current user -    if ( $self->CurrentUser->PrincipalId == ($args{'PrincipalId'} || 0) ) { -        #  If it's an AdminCc and they have 'WatchAsAdminCc' +    if ( $self->CurrentUser->PrincipalId == ($args{'PrincipalId'} || 0) +       or    lc( $self->CurrentUser->UserObj->EmailAddress ) +          eq lc( RT::User->CanonicalizeEmailAddress( $args{'Email'} ) || '' ) ) +    { +        #  If it's an AdminCc and they don't have  +        #   'WatchAsAdminCc' or 'ModifyTicket', bail          if ( $args{'Type'} eq 'AdminCc' ) { -            return $self->_AddWatcher( %args ) -                if $self->CurrentUserHasRight('WatchAsAdminCc'); +            unless ( $self->CurrentUserHasRight('ModifyTicket') +                or $self->CurrentUserHasRight('WatchAsAdminCc') ) { +                return ( 0, $self->loc('Permission Denied')) +            }          } -        #  If it's a Requestor or Cc and they have 'Watch' -        elsif ( $args{'Type'} eq 'Cc' || $args{'Type'} eq 'Requestor' ) { -            return $self->_AddWatcher( %args ) -                if $self->CurrentUserHasRight('Watch'); +        #  If it's a Requestor or Cc and they don't have +        #   'Watch' or 'ModifyTicket', bail +        elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) { + +            unless ( $self->CurrentUserHasRight('ModifyTicket') +                or $self->CurrentUserHasRight('Watch') ) { +                return ( 0, $self->loc('Permission Denied')) +            }          }          else { -            $RT::Logger->warning( "AddWatcher got passed a bogus type" ); +            $RT::Logger->warning( "$self -> AddWatcher got passed a bogus type");              return ( 0, $self->loc('Error in parameters to Ticket->AddWatcher') );          }      } -    return ( 0, $self->loc("Permission Denied") ); +    # If the watcher isn't the current user  +    # and the current user  doesn't have 'ModifyTicket' +    # bail +    else { +        unless ( $self->CurrentUserHasRight('ModifyTicket') ) { +            return ( 0, $self->loc("Permission Denied") ); +        } +    } + +    # }}} + +    return ( $self->_AddWatcher(%args) );  }  #This contains the meat of AddWatcher. but can be called from a routine like @@ -1740,6 +1811,25 @@ sub Requestors {  # }}} +# {{{ sub _Requestors + +=head2 _Requestors + +Private non-ACLed variant of Reqeustors so that we can look them up for the +purposes of customer auto-association during create. + +=cut + +sub _Requestors { +    my $self = shift; + +    my $group = RT::Group->new($RT::SystemUser); +    $group->LoadTicketRoleGroup(Type => 'Requestor', Ticket => $self->Id); +    return ($group); +} + +# }}} +  # {{{ sub Cc  =head2 Cc @@ -2418,7 +2508,7 @@ sub _RecordNote {      unless ( ($args{'MIMEObj'}->head->get('Message-ID') || '')              =~ /<(rt-.*?-\d+-\d+)\.(\d+-0-0)\@\Q$RT::Organization>/ )      { -        $args{'MIMEObj'}->head->replace( 'RT-Message-ID', +        $args{'MIMEObj'}->head->set( 'RT-Message-ID',              "<rt-"              . $RT::VERSION . "-"              . $$ . "-" @@ -2464,7 +2554,13 @@ sub _Links {      unless ( $self->{"$field$type"} ) {          $self->{"$field$type"} = new RT::Links( $self->CurrentUser ); -        if ( $self->CurrentUserHasRight('ShowTicket') ) { + +        #not sure what this ACL was supposed to do... but returning the +        # bare (unlimited) RT::Links certainly seems wrong, it causes the +        # $Ticket->Customers method during creation to return results for every +        # ticket... +        #if ( $self->CurrentUserHasRight('ShowTicket') ) { +              # Maybe this ticket is a merged ticket              my $Tickets = new RT::Tickets( $self->CurrentUser );              # at least to myself @@ -2481,7 +2577,7 @@ sub _Links {              $self->{"$field$type"}->Limit( FIELD => 'Type',                                             VALUE => $type )                if ($type); -        } +        #}      }      return ( $self->{"$field$type"} );  } @@ -3773,21 +3869,18 @@ See L<RT::Record>  sub CustomFieldValues {      my $self  = shift;      my $field = shift; - -    return $self->SUPER::CustomFieldValues( $field ) -        if !$field || $field =~ /^\d+$/; - -    my $cf = RT::CustomField->new( $self->CurrentUser ); -    $cf->LoadByNameAndQueue( Name => $field, Queue => $self->Queue ); -    unless ( $cf->id ) { -        $cf->LoadByNameAndQueue( Name => $field, Queue => 0 ); +    if ( $field and $field !~ /^\d+$/ ) { +        my $cf = RT::CustomField->new( $self->CurrentUser ); +        $cf->LoadByNameAndQueue( Name => $field, Queue => $self->Queue ); +        unless ( $cf->id ) { +            $cf->LoadByNameAndQueue( Name => $field, Queue => 0 ); +        } +        unless ( $cf->id ) { +            # If we didn't find a valid cfid, give up. +            return RT::CustomFieldValues->new($self->CurrentUser); +        }      } - -    # If we didn't find a valid cfid, give up. -    return RT::ObjectCustomFieldValues->new( $self->CurrentUser ) -        unless $cf->id; - -    return $self->SUPER::CustomFieldValues( $cf->id ); +    return $self->SUPER::CustomFieldValues($field);  }  # }}} diff --git a/rt/lib/RT/Tickets.pm b/rt/lib/RT/Tickets.pm index 2d98b1ed5..b6b349144 100755 --- a/rt/lib/RT/Tickets.pm +++ b/rt/lib/RT/Tickets.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Ticket item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Transaction.pm b/rt/lib/RT/Transaction.pm index 7757b6a0a..ca491a6c7 100755 --- a/rt/lib/RT/Transaction.pm +++ b/rt/lib/RT/Transaction.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# CONTRIBUTION SUBMISSION POLICY:  #  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -#  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -#  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -69,6 +45,7 @@ RT::Transaction  package RT::Transaction;  use RT::Record;  +use RT::Ticket;  use vars qw( @ISA ); @@ -85,21 +62,18 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: -  varchar(64) 'ObjectType'. -  int(11) 'ObjectId'. +  int(11) 'EffectiveTicket'. +  int(11) 'Ticket'.    int(11) 'TimeTaken'.    varchar(20) 'Type'.    varchar(40) 'Field'.    varchar(255) 'OldValue'.    varchar(255) 'NewValue'. -  varchar(255) 'ReferenceType'. -  int(11) 'OldReference'. -  int(11) 'NewReference'. -  varchar(255) 'Data'. +  varchar(100) 'Data'.  =cut @@ -109,30 +83,24 @@ Create takes a hash of values and creates a row in the database:  sub Create {      my $self = shift;      my %args = (  -                ObjectType => '', -                ObjectId => '0', +                EffectiveTicket => '0', +                Ticket => '0',                  TimeTaken => '0',                  Type => '',                  Field => '',                  OldValue => '',                  NewValue => '', -                ReferenceType => '', -                OldReference => '', -                NewReference => '',                  Data => '',  		  @_);      $self->SUPER::Create( -                         ObjectType => $args{'ObjectType'}, -                         ObjectId => $args{'ObjectId'}, +                         EffectiveTicket => $args{'EffectiveTicket'}, +                         Ticket => $args{'Ticket'},                           TimeTaken => $args{'TimeTaken'},                           Type => $args{'Type'},                           Field => $args{'Field'},                           OldValue => $args{'OldValue'},                           NewValue => $args{'NewValue'}, -                         ReferenceType => $args{'ReferenceType'}, -                         OldReference => $args{'OldReference'}, -                         NewReference => $args{'NewReference'},                           Data => $args{'Data'},  ); @@ -140,7 +108,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -149,50 +117,64 @@ Returns the current value of id.  =cut -=head2 ObjectType +=item EffectiveTicket -Returns the current value of ObjectType.  -(In the database, ObjectType is stored as varchar(64).) +Returns the current value of EffectiveTicket.  +(In the database, EffectiveTicket is stored as int(11).) -=head2 SetObjectType VALUE +=item SetEffectiveTicket VALUE -Set ObjectType to VALUE.  +Set EffectiveTicket to VALUE.   Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, ObjectType will be stored as a varchar(64).) +(In the database, EffectiveTicket will be stored as a int(11).)  =cut -=head2 ObjectId +=item Ticket -Returns the current value of ObjectId.  -(In the database, ObjectId is stored as int(11).) +Returns the current value of Ticket.  +(In the database, Ticket is stored as int(11).) -=head2 SetObjectId VALUE +=item SetTicket VALUE -Set ObjectId to VALUE.  +Set Ticket to VALUE.   Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, ObjectId will be stored as a int(11).) +(In the database, Ticket will be stored as a int(11).) + + +=cut + + +=item TicketObj + +Returns the Ticket Object which has the id returned by Ticket  =cut +sub TicketObj { +	my $self = shift; +	my $Ticket =  RT::Ticket->new($self->CurrentUser); +	$Ticket->Load($self->__Value('Ticket')); +	return($Ticket); +} -=head2 TimeTaken +=item TimeTaken  Returns the current value of TimeTaken.   (In the database, TimeTaken is stored as int(11).) -=head2 SetTimeTaken VALUE +=item SetTimeTaken VALUE  Set TimeTaken to VALUE.  @@ -203,14 +185,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Type +=item Type  Returns the current value of Type.   (In the database, Type is stored as varchar(20).) -=head2 SetType VALUE +=item SetType VALUE  Set Type to VALUE.  @@ -221,14 +203,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Field +=item Field  Returns the current value of Field.   (In the database, Field is stored as varchar(40).) -=head2 SetField VALUE +=item SetField VALUE  Set Field to VALUE.  @@ -239,14 +221,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 OldValue +=item OldValue  Returns the current value of OldValue.   (In the database, OldValue is stored as varchar(255).) -=head2 SetOldValue VALUE +=item SetOldValue VALUE  Set OldValue to VALUE.  @@ -257,14 +239,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 NewValue +=item NewValue  Returns the current value of NewValue.   (In the database, NewValue is stored as varchar(255).) -=head2 SetNewValue VALUE +=item SetNewValue VALUE  Set NewValue to VALUE.  @@ -275,79 +257,25 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ReferenceType - -Returns the current value of ReferenceType.  -(In the database, ReferenceType is stored as varchar(255).) - - - -=head2 SetReferenceType VALUE - - -Set ReferenceType to VALUE.  -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, ReferenceType will be stored as a varchar(255).) - - -=cut - - -=head2 OldReference - -Returns the current value of OldReference.  -(In the database, OldReference is stored as int(11).) - - - -=head2 SetOldReference VALUE - - -Set OldReference to VALUE.  -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, OldReference will be stored as a int(11).) - - -=cut - - -=head2 NewReference - -Returns the current value of NewReference.  -(In the database, NewReference is stored as int(11).) - - - -=head2 SetNewReference VALUE - - -Set NewReference to VALUE.  -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, NewReference will be stored as a int(11).) - - -=cut - - -=head2 Data +=item Data  Returns the current value of Data.  -(In the database, Data is stored as varchar(255).) +(In the database, Data is stored as varchar(100).) -=head2 SetData VALUE +=item SetData VALUE  Set Data to VALUE.   Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Data will be stored as a varchar(255).) +(In the database, Data will be stored as a varchar(100).)  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -356,7 +284,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -366,37 +294,31 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, -        ObjectType =>  -		{read => 1, write => 1, sql_type => 12, length => 64,  is_blob => 0,  is_numeric => 0,  type => 'varchar(64)', default => ''}, -        ObjectId =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, type => 'int(11)', default => ''}, +        EffectiveTicket =>  +		{read => 1, write => 1, type => 'int(11)', default => '0'}, +        Ticket =>  +		{read => 1, write => 1, type => 'int(11)', default => '0'},          TimeTaken =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, write => 1, type => 'int(11)', default => '0'},          Type =>  -		{read => 1, write => 1, sql_type => 12, length => 20,  is_blob => 0,  is_numeric => 0,  type => 'varchar(20)', default => ''}, +		{read => 1, write => 1, type => 'varchar(20)', default => ''},          Field =>  -		{read => 1, write => 1, sql_type => 12, length => 40,  is_blob => 0,  is_numeric => 0,  type => 'varchar(40)', default => ''}, +		{read => 1, write => 1, type => 'varchar(40)', default => ''},          OldValue =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          NewValue =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, -        ReferenceType =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, -        OldReference =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, -        NewReference =>  -		{read => 1, write => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, write => 1, type => 'varchar(255)', default => ''},          Data =>  -		{read => 1, write => 1, sql_type => 12, length => 255,  is_blob => 0,  is_numeric => 0,  type => 'varchar(255)', default => ''}, +		{read => 1, write => 1, type => 'varchar(100)', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -428,7 +350,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Transaction_Overlay.pm b/rt/lib/RT/Transaction_Overlay.pm index 5716d6643..dd1887e33 100644 --- a/rt/lib/RT/Transaction_Overlay.pm +++ b/rt/lib/RT/Transaction_Overlay.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -276,7 +276,7 @@ textual part (as defined in RT::I18N::IsTextualContentType).  Otherwise,  returns undef.  Takes a paramhash.  If the $args{'Quote'} parameter is set, wraps this message  -at $args{'Wrap'}.  $args{'Wrap'} defaults to 70. +at $args{'Wrap'}.  $args{'Wrap'} defaults to $RT::MessageBoxWidth - 2 or 70.  If $args{'Type'} is set to C<text/html>, plain texts are upgraded to HTML.  Otherwise, HTML texts are downgraded to plain text.  If $args{'Type'} is @@ -290,6 +290,7 @@ sub Content {          Type  => $PreferredContentType,          Quote => 0,          Wrap  => 70, +        Wrap  => ( $RT::MessageBoxWidth || 72 ) - 2,          @_      ); @@ -335,7 +336,7 @@ sub Content {              $max = length if ( length > $max );          } -        if ( $max > 76 ) { +        if ( $max > $args{'Wrap'}+6 ) { # 76 ) {              require Text::Wrapper;              my $wrapper = new Text::Wrapper(                  columns    => $args{'Wrap'}, diff --git a/rt/lib/RT/Transactions.pm b/rt/lib/RT/Transactions.pm index 447ab1abc..23a475ac6 100755 --- a/rt/lib/RT/Transactions.pm +++ b/rt/lib/RT/Transactions.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::Transaction item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/URI/freeside.pm b/rt/lib/RT/URI/freeside.pm new file mode 100644 index 000000000..d73dbacad --- /dev/null +++ b/rt/lib/RT/URI/freeside.pm @@ -0,0 +1,285 @@ +# BEGIN LICENSE BLOCK +#  +# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> +# Based on the original RT::URI::base and RT::URI::fsck_com_rt. +#  +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> +#  +# (Except where explictly superceded by other copyright notices) +#  +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +#  +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +# General Public License for more details. +#  +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +#  +#  +# END LICENSE BLOCK +package RT::URI::freeside; + +use RT::URI::base; +use strict; +use vars qw(@ISA $IntegrationType $URL); +@ISA = qw/RT::URI::base/; + + +=head1 NAME + +RT::URI::freeside + +=head1 DESCRIPTION + +URI handler for Freeside URIs.  See http://www.freeside.biz/ for more +information on Freeside. + + +=head1 Public subroutines + +=over 4 + +=item FreesideGetConfig CONFKEY + +Subroutine that returns the freeside's configuration value(s) for CONFKEY +as a scalar or list. + +=cut + +sub FreesideGetConfig { return undef; } + + +=item FreesideURL + +Returns the URL for freeside's web interface. + +=cut + +sub FreesideURL { return $URL; } + + +=item FreesideVersion + +Returns a string describing the freeside version being used. + +=cut + +sub FreesideVersion { return undef; } + + +=item smart_search + +A wrapper for the FS::cust_main::smart_search subroutine. + +=cut + +sub smart_search { return undef; } + + +=item small_custview + +A wrapper for the FS::CGI::small_custview subroutine. + +=cut + +sub small_custview { return 'Freeside integration error!</A>'; } + + +=back + +=head1 Private methods + +=over 4 + +=item _FreesideGetRecord + +Method returns a hashref of the freeside record referenced in the URI. +Must be called after ParseURI. + +=cut + +sub _FreesideGetRecord { return undef; } + + +=item _FreesideURIPrefix + +Method that returns the URI prefix for freeside URIs. + +=cut + +sub _FreesideURIPrefix { + +  my $self = shift; +  return($self->Scheme . '://freeside'); + +} + +=item _FreesideURILabel + +Method that returns a short string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabel { + +  my $self = shift; + +  $RT::Logger->debug("Called _FreesideURILabel()"); + +  return unless (exists($self->{'fstable'}) and +                 exists($self->{'fspkey'})); + +  my $label; +  my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + +  if ($table ne 'cust_main') { +    warn "FS::${table} not currently supported"; +    return; +  } + +  my $rec = $self->_FreesideGetRecord(); + +  if (ref($rec) eq 'HASH' and $table eq 'cust_main') { +    my $name = $rec->{'last'} . ', ' . $rec->{'first'}; +    $name = $rec->{'company'} . " ($name)" if $rec->{'company'}; +    $label = "$pkey: $name"; +  } else { +    $label = "$pkey: $table"; +  } + +  if ($label and !$@) { +    return($label); +  } else { +    return; +  } + +} + +=item _FreesideURILabelLong + +Method that returns a longer string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabelLong { + +  my $self = shift; + +  return $self->_FreesideURILabel(); + +} + +=back + +=head1 Public methods + +=over 4 + +=cut + +sub ParseURI {  +    my $self = shift; +    my $uri = shift; +    my ($table, $pkey); + +    my $uriprefix = $self->_FreesideURIPrefix; +    if ($uri =~ /^$uriprefix\/(\w+)\/(\d+)$/) { +      $table = $1; +      $pkey = $2; +      $self->{'scheme'} = $self->Scheme; +    } else { +      return(undef); +    } + +    $self->{'uri'} = "${uriprefix}/${table}/${pkey}"; +    $self->{'fstable'} = $table; +    $self->{'fspkey'} = $pkey; + + +    my $url = $self->FreesideURL(); + +    if ($url ne '') { +      $self->{'href'} = "${url}/view/${table}.cgi?${pkey}"; +    } else { +      $self->{'href'} = $self->{'uri'}; +    } + +    $self->{'uri'}; + +} + +sub Scheme {  +    my $self = shift; +    return('freeside'); + +} + +sub HREF { +    my $self = shift; +    return($self->{'href'} || $self->{'uri'}); +} + +sub IsLocal { +    my $self = shift; +    return undef; +} + +=item AsString + +Return a "pretty" string representing the URI object. + +This is meant to be used like this: + + % $re = $uri->Resolver; + <A HREF="<% $re->HREF %>"><% $re->AsString %></A> + +=cut + +sub AsString { +    my $self = shift; +    my $prettystring; +    if ($prettystring = $self->_FreesideURILabel) { +      return $prettystring; +    } else { +      return $self->URI; +    } +} + +=item AsStringLong + +Return a longer (HTML) string representing the URI object. + +=cut + +sub AsStringLong { +    my $self = shift; +    my $prettystring; +    if ($prettystring = $self->_FreesideURILabelLong || $self->_FreesideURILabel){ +      return $prettystring; +    } else { +      return $self->URI; +    } +} + +$IntegrationType ||= 'Internal'; +eval "require RT::URI::freeside::${RT::URI::freeside::IntegrationType}"; +warn $@ if $@; +if ($@ && +    $@ !~ qr(^Can't locate RT/URI/freeside/${RT::URI::freeside::IntegrationType}.pm)) { +  die $@; +}; + +=back + +=cut + +1; diff --git a/rt/lib/RT/URI/freeside/Internal.pm b/rt/lib/RT/URI/freeside/Internal.pm new file mode 100644 index 000000000..bd7c42ccf --- /dev/null +++ b/rt/lib/RT/URI/freeside/Internal.pm @@ -0,0 +1,145 @@ +# BEGIN LICENSE BLOCK +#  +# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> +# Based on the original RT::URI::base and RT::URI::fsck_com_rt. +#  +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> +#  +# (Except where explictly superceded by other copyright notices) +#  +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +#  +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +# General Public License for more details. +#  +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +#  +#  +# END LICENSE BLOCK +# +use strict; +no warnings qw(redefine); + +#use vars qw($conf); + +use FS; +use FS::UID qw(dbh); +use FS::CGI qw(popurl); +use FS::UI::Web::small_custview qw(small_custview); +use FS::Conf; +use FS::Record qw(qsearchs qsearch dbdef); +use FS::cust_main; +use FS::cust_svc; + +=head1 NAME + +RT::URI::freeside::Internal + +=head1 DESCRIPTION + +Overlay for the RT::URI::freeside URI handler implementing the Internal integration type. + +See L<RT::URI::freeside> for public/private interface documentation. + +=cut + + + +sub _FreesideGetRecord { + +  my $self = shift; +  my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + +  $RT::Logger->debug("Called _FreesideGetRecord()"); + +  #eval "use FS::$table;"; + +  my $dbdef = dbdef; +  unless ($dbdef) { +    $RT::Logger->error("Using Internal freeside integration type, ". +                       "but it doesn't look like we're running under ". +                       "freeside's Mason handler."); +    return; +  } + +  my $pkeyfield = $dbdef->table($table)->primary_key; +  unless ($pkeyfield) { +    $RT::Logger->error("No primary key for freeside table '$table'"); +    return; +  } + +  my $fsrec = qsearchs($table, { $pkeyfield => $pkey }); +  unless ($fsrec) { +    $RT::Logger->error("Record with '$pkeyfield' == '$pkey' does " . +                       "not exist in table $table"); +    return; +  } + +  return { $fsrec->hash, '_object' => $fsrec }; + +} + +sub FreesideVersion { + +  return $FS::VERSION; + +} + +sub FreesideGetConfig { + +  #$conf = new FS::Conf unless ref($conf); +  my $conf = new FS::Conf; + +  return scalar($conf->config(@_)); + +} + +sub smart_search { #Subroutine + +  return map { { $_->hash } } &FS::cust_main::smart_search(@_); + +} + +sub email_search { #Subroutine + +  return map { { $_->hash } } &FS::cust_main::email_search(@_); + +} + +sub small_custview { + +  return &FS::UI::Web::small_custview::small_custview(@_); + +} + +sub _FreesideURILabelLong { + +  my $self = shift; + +  my $table = $self->{'fstable'}; + +  if ( $table eq 'cust_main' ) { + +    my $rec = $self->_FreesideGetRecord(); +    return small_custview( $rec->{'_object'}, +                           scalar(FS::Conf->new->config('countrydefault')), +                           1 #nobalance +                         ); + +  } else { + +    return $self->_FreesideURILabel(); + +  } + +} + +1; diff --git a/rt/lib/RT/URI/freeside/XMLRPC.pm b/rt/lib/RT/URI/freeside/XMLRPC.pm new file mode 100644 index 000000000..916c20d7b --- /dev/null +++ b/rt/lib/RT/URI/freeside/XMLRPC.pm @@ -0,0 +1,122 @@ +# BEGIN LICENSE BLOCK +#  +# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> +# Based on the original RT::URI::base and RT::URI::fsck_com_rt. +#  +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> +#  +# (Except where explictly superceded by other copyright notices) +#  +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +#  +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +# General Public License for more details. +#  +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +#  +#  +# END LICENSE BLOCK + +use strict; +no warnings qw(redefine); + +use vars qw($XMLRPC_URL $_FS_VERSION); + +use Frontier::Client; + +=head1 NAME + +RT::URI::freeside::XMLRPC + +=head1 DESCRIPTION + +Overlay for the RT::URI::freeside URI handler implementing the XMLRPC integration type. + +See L<RT::URI::freeside> for public/private interface documentation. + +=cut + + +sub _XMLRPCRequest { #Subroutine + +  my $method = shift; +  my @args = @_; + +  my $result; +  eval { +    my $server = new Frontier::Client ( url => $XMLRPC_URL ); +    $result = $server->call($method, @args); +  }; + +  if (not $@ and ref($result) eq 'ARRAY') { +    return (scalar(@$result) == 1) ? @$result[0] : @$result; +  } else { +    $RT::Logger->debug("Freeside XMLRPC: " . $result || $@); +    return (); +  } + +} + +sub _FreesideGetRecord { + +  my $self = shift; +  my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); +  my $record; + +  $RT::Logger->debug("Called XMLRPC::_FreesideGetRecord()"); + +  #FIXME: Need a better way to get primary keys. +  # Maybe create a method for it and cache them like version? +  my %table_pkeys = ( +    cust_main => 'custnum', +  ); +     +  my $method = 'Record.qsearchs'; +  my @args = ($table, { $table_pkeys{$table} => $pkey }); +  my ($record) = &_XMLRPCRequest($method, @args); + +  return $record; + +} + + +sub FreesideGetConfig { + +  return _XMLRPCRequest('Conf.config', @_); + +} + + +sub FreesideVersion { + +  return $_FS_VERSION if ($_FS_VERSION =~ /^\d+\.\d+\.\d+/); + +  $RT::Logger->debug("Requesting freeside version..."); +  ($_FS_VERSION) = &_XMLRPCRequest('version'); +  $RT::Logger->debug("Cached freeside version: ${_FS_VERSION}"); +  +  return $_FS_VERSION; + +} + +sub smart_search { #Subroutine + +  return _XMLRPCRequest('cust_main.smart_search', @_); + +} + +sub small_custview { + +  return _XMLRPCRequest('Web.UI.small_custview.small_custview', @_); + +} + +1; diff --git a/rt/lib/RT/User.pm b/rt/lib/RT/User.pm index 5c5eb7f2a..cbc10f5b4 100755 --- a/rt/lib/RT/User.pm +++ b/rt/lib/RT/User.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH  Create takes a hash of values and creates a row in the database: @@ -194,7 +170,7 @@ sub Create { -=head2 id +=item id  Returns the current value of id.   (In the database, id is stored as int(11).) @@ -203,14 +179,14 @@ Returns the current value of id.  =cut -=head2 Name +=item Name  Returns the current value of Name.   (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE  Set Name to VALUE.  @@ -221,14 +197,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Password +=item Password  Returns the current value of Password.   (In the database, Password is stored as varchar(40).) -=head2 SetPassword VALUE +=item SetPassword VALUE  Set Password to VALUE.  @@ -239,14 +215,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Comments +=item Comments  Returns the current value of Comments.   (In the database, Comments is stored as blob.) -=head2 SetComments VALUE +=item SetComments VALUE  Set Comments to VALUE.  @@ -257,14 +233,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Signature +=item Signature  Returns the current value of Signature.   (In the database, Signature is stored as blob.) -=head2 SetSignature VALUE +=item SetSignature VALUE  Set Signature to VALUE.  @@ -275,14 +251,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 EmailAddress +=item EmailAddress  Returns the current value of EmailAddress.   (In the database, EmailAddress is stored as varchar(120).) -=head2 SetEmailAddress VALUE +=item SetEmailAddress VALUE  Set EmailAddress to VALUE.  @@ -293,14 +269,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 FreeformContactInfo +=item FreeformContactInfo  Returns the current value of FreeformContactInfo.   (In the database, FreeformContactInfo is stored as blob.) -=head2 SetFreeformContactInfo VALUE +=item SetFreeformContactInfo VALUE  Set FreeformContactInfo to VALUE.  @@ -311,14 +287,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Organization +=item Organization  Returns the current value of Organization.   (In the database, Organization is stored as varchar(200).) -=head2 SetOrganization VALUE +=item SetOrganization VALUE  Set Organization to VALUE.  @@ -329,14 +305,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 RealName +=item RealName  Returns the current value of RealName.   (In the database, RealName is stored as varchar(120).) -=head2 SetRealName VALUE +=item SetRealName VALUE  Set RealName to VALUE.  @@ -347,14 +323,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 NickName +=item NickName  Returns the current value of NickName.   (In the database, NickName is stored as varchar(16).) -=head2 SetNickName VALUE +=item SetNickName VALUE  Set NickName to VALUE.  @@ -365,14 +341,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Lang +=item Lang  Returns the current value of Lang.   (In the database, Lang is stored as varchar(16).) -=head2 SetLang VALUE +=item SetLang VALUE  Set Lang to VALUE.  @@ -383,14 +359,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 EmailEncoding +=item EmailEncoding  Returns the current value of EmailEncoding.   (In the database, EmailEncoding is stored as varchar(16).) -=head2 SetEmailEncoding VALUE +=item SetEmailEncoding VALUE  Set EmailEncoding to VALUE.  @@ -401,14 +377,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 WebEncoding +=item WebEncoding  Returns the current value of WebEncoding.   (In the database, WebEncoding is stored as varchar(16).) -=head2 SetWebEncoding VALUE +=item SetWebEncoding VALUE  Set WebEncoding to VALUE.  @@ -419,14 +395,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ExternalContactInfoId +=item ExternalContactInfoId  Returns the current value of ExternalContactInfoId.   (In the database, ExternalContactInfoId is stored as varchar(100).) -=head2 SetExternalContactInfoId VALUE +=item SetExternalContactInfoId VALUE  Set ExternalContactInfoId to VALUE.  @@ -437,14 +413,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ContactInfoSystem +=item ContactInfoSystem  Returns the current value of ContactInfoSystem.   (In the database, ContactInfoSystem is stored as varchar(30).) -=head2 SetContactInfoSystem VALUE +=item SetContactInfoSystem VALUE  Set ContactInfoSystem to VALUE.  @@ -455,14 +431,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 ExternalAuthId +=item ExternalAuthId  Returns the current value of ExternalAuthId.   (In the database, ExternalAuthId is stored as varchar(100).) -=head2 SetExternalAuthId VALUE +=item SetExternalAuthId VALUE  Set ExternalAuthId to VALUE.  @@ -473,14 +449,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 AuthSystem +=item AuthSystem  Returns the current value of AuthSystem.   (In the database, AuthSystem is stored as varchar(30).) -=head2 SetAuthSystem VALUE +=item SetAuthSystem VALUE  Set AuthSystem to VALUE.  @@ -491,14 +467,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Gecos +=item Gecos  Returns the current value of Gecos.   (In the database, Gecos is stored as varchar(16).) -=head2 SetGecos VALUE +=item SetGecos VALUE  Set Gecos to VALUE.  @@ -509,14 +485,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 HomePhone +=item HomePhone  Returns the current value of HomePhone.   (In the database, HomePhone is stored as varchar(30).) -=head2 SetHomePhone VALUE +=item SetHomePhone VALUE  Set HomePhone to VALUE.  @@ -527,14 +503,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 WorkPhone +=item WorkPhone  Returns the current value of WorkPhone.   (In the database, WorkPhone is stored as varchar(30).) -=head2 SetWorkPhone VALUE +=item SetWorkPhone VALUE  Set WorkPhone to VALUE.  @@ -545,14 +521,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 MobilePhone +=item MobilePhone  Returns the current value of MobilePhone.   (In the database, MobilePhone is stored as varchar(30).) -=head2 SetMobilePhone VALUE +=item SetMobilePhone VALUE  Set MobilePhone to VALUE.  @@ -563,14 +539,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 PagerPhone +=item PagerPhone  Returns the current value of PagerPhone.   (In the database, PagerPhone is stored as varchar(30).) -=head2 SetPagerPhone VALUE +=item SetPagerPhone VALUE  Set PagerPhone to VALUE.  @@ -581,14 +557,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Address1 +=item Address1  Returns the current value of Address1.   (In the database, Address1 is stored as varchar(200).) -=head2 SetAddress1 VALUE +=item SetAddress1 VALUE  Set Address1 to VALUE.  @@ -599,14 +575,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Address2 +=item Address2  Returns the current value of Address2.   (In the database, Address2 is stored as varchar(200).) -=head2 SetAddress2 VALUE +=item SetAddress2 VALUE  Set Address2 to VALUE.  @@ -617,14 +593,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 City +=item City  Returns the current value of City.   (In the database, City is stored as varchar(100).) -=head2 SetCity VALUE +=item SetCity VALUE  Set City to VALUE.  @@ -635,14 +611,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 State +=item State  Returns the current value of State.   (In the database, State is stored as varchar(100).) -=head2 SetState VALUE +=item SetState VALUE  Set State to VALUE.  @@ -653,14 +629,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Zip +=item Zip  Returns the current value of Zip.   (In the database, Zip is stored as varchar(16).) -=head2 SetZip VALUE +=item SetZip VALUE  Set Zip to VALUE.  @@ -671,14 +647,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Country +=item Country  Returns the current value of Country.   (In the database, Country is stored as varchar(50).) -=head2 SetCountry VALUE +=item SetCountry VALUE  Set Country to VALUE.  @@ -689,14 +665,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Timezone +=item Timezone  Returns the current value of Timezone.   (In the database, Timezone is stored as varchar(50).) -=head2 SetTimezone VALUE +=item SetTimezone VALUE  Set Timezone to VALUE.  @@ -707,14 +683,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 PGPKey +=item PGPKey  Returns the current value of PGPKey.   (In the database, PGPKey is stored as text.) -=head2 SetPGPKey VALUE +=item SetPGPKey VALUE  Set PGPKey to VALUE.  @@ -725,7 +701,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.  =cut -=head2 Creator +=item Creator  Returns the current value of Creator.   (In the database, Creator is stored as int(11).) @@ -734,7 +710,7 @@ Returns the current value of Creator.  =cut -=head2 Created +=item Created  Returns the current value of Created.   (In the database, Created is stored as datetime.) @@ -743,7 +719,7 @@ Returns the current value of Created.  =cut -=head2 LastUpdatedBy +=item LastUpdatedBy  Returns the current value of LastUpdatedBy.   (In the database, LastUpdatedBy is stored as int(11).) @@ -752,7 +728,7 @@ Returns the current value of LastUpdatedBy.  =cut -=head2 LastUpdated +=item LastUpdated  Returns the current value of LastUpdated.   (In the database, LastUpdated is stored as datetime.) @@ -762,77 +738,77 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible {      {          id => -		{read => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => ''}, +		{read => 1, type => 'int(11)', default => ''},          Name =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Password =>  -		{read => 1, write => 1, sql_type => 12, length => 40,  is_blob => 0,  is_numeric => 0,  type => 'varchar(40)', default => ''}, +		{read => 1, write => 1, type => 'varchar(40)', default => ''},          Comments =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'blob', default => ''}, +		{read => 1, write => 1, type => 'blob', default => ''},          Signature =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'blob', default => ''}, +		{read => 1, write => 1, type => 'blob', default => ''},          EmailAddress =>  -		{read => 1, write => 1, sql_type => 12, length => 120,  is_blob => 0,  is_numeric => 0,  type => 'varchar(120)', default => ''}, +		{read => 1, write => 1, type => 'varchar(120)', default => ''},          FreeformContactInfo =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'blob', default => ''}, +		{read => 1, write => 1, type => 'blob', default => ''},          Organization =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          RealName =>  -		{read => 1, write => 1, sql_type => 12, length => 120,  is_blob => 0,  is_numeric => 0,  type => 'varchar(120)', default => ''}, +		{read => 1, write => 1, type => 'varchar(120)', default => ''},          NickName =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          Lang =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          EmailEncoding =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          WebEncoding =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          ExternalContactInfoId =>  -		{read => 1, write => 1, sql_type => 12, length => 100,  is_blob => 0,  is_numeric => 0,  type => 'varchar(100)', default => ''}, +		{read => 1, write => 1, type => 'varchar(100)', default => ''},          ContactInfoSystem =>  -		{read => 1, write => 1, sql_type => 12, length => 30,  is_blob => 0,  is_numeric => 0,  type => 'varchar(30)', default => ''}, +		{read => 1, write => 1, type => 'varchar(30)', default => ''},          ExternalAuthId =>  -		{read => 1, write => 1, sql_type => 12, length => 100,  is_blob => 0,  is_numeric => 0,  type => 'varchar(100)', default => ''}, +		{read => 1, write => 1, type => 'varchar(100)', default => ''},          AuthSystem =>  -		{read => 1, write => 1, sql_type => 12, length => 30,  is_blob => 0,  is_numeric => 0,  type => 'varchar(30)', default => ''}, +		{read => 1, write => 1, type => 'varchar(30)', default => ''},          Gecos =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          HomePhone =>  -		{read => 1, write => 1, sql_type => 12, length => 30,  is_blob => 0,  is_numeric => 0,  type => 'varchar(30)', default => ''}, +		{read => 1, write => 1, type => 'varchar(30)', default => ''},          WorkPhone =>  -		{read => 1, write => 1, sql_type => 12, length => 30,  is_blob => 0,  is_numeric => 0,  type => 'varchar(30)', default => ''}, +		{read => 1, write => 1, type => 'varchar(30)', default => ''},          MobilePhone =>  -		{read => 1, write => 1, sql_type => 12, length => 30,  is_blob => 0,  is_numeric => 0,  type => 'varchar(30)', default => ''}, +		{read => 1, write => 1, type => 'varchar(30)', default => ''},          PagerPhone =>  -		{read => 1, write => 1, sql_type => 12, length => 30,  is_blob => 0,  is_numeric => 0,  type => 'varchar(30)', default => ''}, +		{read => 1, write => 1, type => 'varchar(30)', default => ''},          Address1 =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          Address2 =>  -		{read => 1, write => 1, sql_type => 12, length => 200,  is_blob => 0,  is_numeric => 0,  type => 'varchar(200)', default => ''}, +		{read => 1, write => 1, type => 'varchar(200)', default => ''},          City =>  -		{read => 1, write => 1, sql_type => 12, length => 100,  is_blob => 0,  is_numeric => 0,  type => 'varchar(100)', default => ''}, +		{read => 1, write => 1, type => 'varchar(100)', default => ''},          State =>  -		{read => 1, write => 1, sql_type => 12, length => 100,  is_blob => 0,  is_numeric => 0,  type => 'varchar(100)', default => ''}, +		{read => 1, write => 1, type => 'varchar(100)', default => ''},          Zip =>  -		{read => 1, write => 1, sql_type => 12, length => 16,  is_blob => 0,  is_numeric => 0,  type => 'varchar(16)', default => ''}, +		{read => 1, write => 1, type => 'varchar(16)', default => ''},          Country =>  -		{read => 1, write => 1, sql_type => 12, length => 50,  is_blob => 0,  is_numeric => 0,  type => 'varchar(50)', default => ''}, +		{read => 1, write => 1, type => 'varchar(50)', default => ''},          Timezone =>  -		{read => 1, write => 1, sql_type => 12, length => 50,  is_blob => 0,  is_numeric => 0,  type => 'varchar(50)', default => ''}, +		{read => 1, write => 1, type => 'varchar(50)', default => ''},          PGPKey =>  -		{read => 1, write => 1, sql_type => -4, length => 0,  is_blob => 1,  is_numeric => 0,  type => 'text', default => ''}, +		{read => 1, write => 1, type => 'text', default => ''},          Creator =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          Created =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},          LastUpdatedBy =>  -		{read => 1, auto => 1, sql_type => 4, length => 11,  is_blob => 0,  is_numeric => 1,  type => 'int(11)', default => '0'}, +		{read => 1, auto => 1, type => 'int(11)', default => '0'},          LastUpdated =>  -		{read => 1, auto => 1, sql_type => 11, length => 0,  is_blob => 0,  is_numeric => 0,  type => 'datetime', default => ''}, +		{read => 1, auto => 1, type => 'datetime', default => ''},   }  }; @@ -864,7 +840,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/User_Overlay.pm b/rt/lib/RT/User_Overlay.pm index fd83630d5..8f4df467d 100644 --- a/rt/lib/RT/User_Overlay.pm +++ b/rt/lib/RT/User_Overlay.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -1308,6 +1308,267 @@ sub OwnGroups {  # }}} +# {{{ Links + +#much false laziness w/Ticket_Overlay.pm + +# A helper table for links mapping to make it easier +# to build and parse links between tickets + +use vars '%LINKDIRMAP'; + +%LINKDIRMAP = ( +    MemberOf => { Base => 'MemberOf', +                  Target => 'HasMember', }, +    RefersTo => { Base => 'RefersTo', +                Target => 'ReferredToBy', }, +    DependsOn => { Base => 'DependsOn', +                   Target => 'DependedOnBy', }, +    MergedInto => { Base => 'MergedInto', +                   Target => 'MergedInto', }, + +); + +sub LINKDIRMAP   { return \%LINKDIRMAP   } + +#sub _Links { +#    my $self = shift; +# +#    #TODO: Field isn't the right thing here. but I ahave no idea what mnemonic --- +#    #tobias meant by $f +#    my $field = shift; +#    my $type  = shift || ""; +# +#    unless ( $self->{"$field$type"} ) { +#        $self->{"$field$type"} = new RT::Links( $self->CurrentUser ); +#        if ( $self->CurrentUserHasRight('ShowTicket') ) { +#            # Maybe this ticket is a merged ticket +#            my $Tickets = new RT::Tickets( $self->CurrentUser ); +#            # at least to myself +#            $self->{"$field$type"}->Limit( FIELD => $field, +#                                           VALUE => $self->URI, +#                                           ENTRYAGGREGATOR => 'OR' ); +#            $Tickets->Limit( FIELD => 'EffectiveId', +#                             VALUE => $self->EffectiveId ); +#            while (my $Ticket = $Tickets->Next) { +#                $self->{"$field$type"}->Limit( FIELD => $field, +#                                               VALUE => $Ticket->URI, +#                                               ENTRYAGGREGATOR => 'OR' ); +#            } +#            $self->{"$field$type"}->Limit( FIELD => 'Type', +#                                           VALUE => $type ) +#              if ($type); +#        } +#    } +#    return ( $self->{"$field$type"} ); +#} + +=head2 DeleteLink + +Delete a link. takes a paramhash of Base, Target and Type. +Either Base or Target must be null. The null value will  +be replaced with this ticket\'s id + +=cut  + +sub DeleteLink { +    my $self = shift; +    my %args = ( +        Base   => undef, +        Target => undef, +        Type   => undef, +        @_ +    ); + +    unless ( $args{'Target'} || $args{'Base'} ) { +        $RT::Logger->error("Base or Target must be specified\n"); +        return ( 0, $self->loc('Either base or target must be specified') ); +    } + +    #check acls +    my $right = 0; +    $right++ if $self->CurrentUserHasRight('ModifyUser'); +    if ( !$right && $RT::StrictLinkACL ) { +        return ( 0, $self->loc("Permission Denied") ); +    } + +#    # If the other URI is an RT::Ticket, we want to make sure the user +#    # can modify it too... +#    my ($status, $msg, $other_ticket) = $self->__GetTicketFromURI( URI => $args{'Target'} || $args{'Base'} ); +#    return (0, $msg) unless $status; +#    if ( !$other_ticket || $other_ticket->CurrentUserHasRight('ModifyTicket') ) { +#        $right++; +#    } +#    if ( ( !$RT::StrictLinkACL && $right == 0 ) || +#         ( $RT::StrictLinkACL && $right < 2 ) ) +#    { +#        return ( 0, $self->loc("Permission Denied") ); +#    } + +    my ($val, $Msg) = $self->SUPER::_DeleteLink(%args); + +    if ( !$val ) { +        $RT::Logger->debug("Couldn't find that link\n"); +        return ( 0, $Msg ); +    } + +    my ($direction, $remote_link); + +    if ( $args{'Base'} ) { +	$remote_link = $args{'Base'}; +    	$direction = 'Target'; +    } +    elsif ( $args{'Target'} ) { +	$remote_link = $args{'Target'}; +        $direction='Base'; +    } + +    if ( $args{'Silent'} ) { +        return ( $val, $Msg ); +    } +    else { +	my $remote_uri = RT::URI->new( $self->CurrentUser ); +    	$remote_uri->FromURI( $remote_link ); + +        my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction( +            Type      => 'DeleteLink', +            Field => $LINKDIRMAP{$args{'Type'}}->{$direction}, +	    OldValue =>  $remote_uri->URI || $remote_link, +            TimeTaken => 0 +        ); + +        if ( $remote_uri->IsLocal ) { + +            my $OtherObj = $remote_uri->Object; +            my ( $val, $Msg ) = $OtherObj->_NewTransaction(Type  => 'DeleteLink', +                                                           Field => $direction eq 'Target' ? $LINKDIRMAP{$args{'Type'}}->{Base} +                                                                                           : $LINKDIRMAP{$args{'Type'}}->{Target}, +                                                           OldValue => $self->URI, +                                                           ActivateScrips => ! $RT::LinkTransactionsRun1Scrip, +                                                           TimeTaken => 0 ); +        } + +        return ( $Trans, $Msg ); +    } +} + +sub AddLink { +    my $self = shift; +    my %args = ( Target => '', +                 Base   => '', +                 Type   => '', +                 Silent => undef, +                 @_ ); + +    unless ( $args{'Target'} || $args{'Base'} ) { +        $RT::Logger->error("Base or Target must be specified\n"); +        return ( 0, $self->loc('Either base or target must be specified') ); +    } + +    my $right = 0; +    $right++ if $self->CurrentUserHasRight('ModifyUser'); +    if ( !$right && $RT::StrictLinkACL ) { +        return ( 0, $self->loc("Permission Denied") ); +    } + +#    # If the other URI is an RT::Ticket, we want to make sure the user +#    # can modify it too... +#    my ($status, $msg, $other_ticket) = $self->__GetTicketFromURI( URI => $args{'Target'} || $args{'Base'} ); +#    return (0, $msg) unless $status; +#    if ( !$other_ticket || $other_ticket->CurrentUserHasRight('ModifyTicket') ) { +#        $right++; +#    } +#    if ( ( !$RT::StrictLinkACL && $right == 0 ) || +#         ( $RT::StrictLinkACL && $right < 2 ) ) +#    { +#        return ( 0, $self->loc("Permission Denied") ); +#    } + +    return $self->_AddLink(%args); +} + +#sub __GetTicketFromURI { +#    my $self = shift; +#    my %args = ( URI => '', @_ ); +# +#    # If the other URI is an RT::Ticket, we want to make sure the user +#    # can modify it too... +#    my $uri_obj = RT::URI->new( $self->CurrentUser ); +#    $uri_obj->FromURI( $args{'URI'} ); +# +#    unless ( $uri_obj->Resolver && $uri_obj->Scheme ) { +#	    my $msg = $self->loc( "Couldn't resolve '[_1]' into a URI.", $args{'URI'} ); +#        $RT::Logger->warning( "$msg\n" ); +#        return( 0, $msg ); +#    } +#    my $obj = $uri_obj->Resolver->Object; +#    unless ( UNIVERSAL::isa($obj, 'RT::Ticket') && $obj->id ) { +#        return (1, 'Found not a ticket', undef); +#    } +#    return (1, 'Found ticket', $obj); +#} + +=head2 _AddLink   + +Private non-acled variant of AddLink so that links can be added during create. + +=cut + +sub _AddLink { +    my $self = shift; +    my %args = ( Target => '', +                 Base   => '', +                 Type   => '', +                 Silent => undef, +                 @_ ); + +    my ($val, $msg, $exist) = $self->SUPER::_AddLink(%args); +    return ($val, $msg) if !$val || $exist; + +    my ($direction, $remote_link); +    if ( $args{'Target'} ) { +        $remote_link  = $args{'Target'}; +        $direction    = 'Base'; +    } elsif ( $args{'Base'} ) { +        $remote_link  = $args{'Base'}; +        $direction    = 'Target'; +    } + +    # Don't write the transaction if we're doing this on create +    if ( $args{'Silent'} ) { +        return ( $val, $msg ); +    } +    else { +        my $remote_uri = RT::URI->new( $self->CurrentUser ); +    	$remote_uri->FromURI( $remote_link ); + +        #Write the transaction +        my ( $Trans, $Msg, $TransObj ) =  +	    $self->_NewTransaction(Type  => 'AddLink', +				   Field => $LINKDIRMAP{$args{'Type'}}->{$direction}, +				   NewValue =>  $remote_uri->URI || $remote_link, +				   TimeTaken => 0 ); + +        if ( $remote_uri->IsLocal ) { + +            my $OtherObj = $remote_uri->Object; +            my ( $val, $Msg ) = $OtherObj->_NewTransaction(Type  => 'AddLink', +                                                           Field => $direction eq 'Target' ? $LINKDIRMAP{$args{'Type'}}->{Base}  +                                                                                           : $LINKDIRMAP{$args{'Type'}}->{Target}, +                                                           NewValue => $self->URI, +                                                           ActivateScrips => ! $RT::LinkTransactionsRun1Scrip, +                                                           TimeTaken => 0 ); +        } +        return ( $val, $Msg ); +    } + +} + + + +# }}} + +  # {{{ sub Rights testing  =head1 Rights testing diff --git a/rt/lib/RT/Users.pm b/rt/lib/RT/Users.pm index 8d574849d..d58f69653 100755 --- a/rt/lib/RT/Users.pm +++ b/rt/lib/RT/Users.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK  #  -# COPYRIGHT: -#   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  -#                                          <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>  #  -# (Except where explicitly superseded by other copyright notices) -#  -#  -# LICENSE: +# (Except where explictly superceded by other copyright notices)  #   # This work is made available to you under the terms of Version 2 of  # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  # General Public License for more details.  #  -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -#  -#  -# CONTRIBUTION SUBMISSION POLICY: -#  -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work.  #  -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof.  #  -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK  # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>)  # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST.    #  @@ -88,7 +64,7 @@ sub _Init {  } -=head2 NewItem +=item NewItem  Returns an empty new RT::User item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz  These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line  +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line      no warnings qw(redefine); diff --git a/rt/lib/RT/Users_Overlay.pm b/rt/lib/RT/Users_Overlay.pm index 96621e388..809fa6707 100644 --- a/rt/lib/RT/Users_Overlay.pm +++ b/rt/lib/RT/Users_Overlay.pm @@ -2,7 +2,7 @@  #   # COPYRIGHT:  #   -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC  +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC   #                                          <jesse@bestpractical.com>  #   # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html.  #   #   # CONTRIBUTION SUBMISSION POLICY: @@ -440,6 +440,7 @@ sub WhoHaveRight {      $from_group->WhoHaveGroupRight( %args );      #XXX: DIRTY HACK +    use DBIx::SearchBuilder 1.50; #no version on ::Union :(      use DBIx::SearchBuilder::Union;      my $union = new DBIx::SearchBuilder::Union;      $union->add( $_ ) foreach @from_role; | 
