X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Fshare%2Fhtml%2FTicket%2FElements%2FShowTransactionAttachments;h=4e9fd60de1b1d075c086f5fcb2635fb69a8b322f;hp=a8cdfc11c392dc476010b9ae03c13b03e183e310;hb=e9e0cf0989259b94d9758eceff448666a2e5a5cc;hpb=e70abd21bab68b23488f7ef1ee2e693a3b365691 diff --git a/rt/share/html/Ticket/Elements/ShowTransactionAttachments b/rt/share/html/Ticket/Elements/ShowTransactionAttachments index a8cdfc11c..4e9fd60de 100644 --- a/rt/share/html/Ticket/Elements/ShowTransactionAttachments +++ b/rt/share/html/Ticket/Elements/ShowTransactionAttachments @@ -1,40 +1,40 @@ %# BEGIN BPS TAGGED BLOCK {{{ -%# +%# %# COPYRIGHT: -%# -%# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -%# -%# +%# +%# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +%# +%# %# (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., 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.) -%# +%# %# 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 @@ -43,7 +43,7 @@ %# 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 }}} <%PERL> # Find all the attachments which have parent $Parent @@ -60,21 +60,19 @@ foreach my $message ( grep $_->__Value('Parent') == $Parent, @$Attachments ) { ); my $size = $message->ContentLength; + my $name = defined $message->Filename && length $message->Filename ? $message->Filename : ''; if ( $size ) {
-<&|/l&>Download <% $message->Filename || loc('(untitled)') %> -% if ( $DownloadableHeaders && !$message->Filename && $message->ContentType =~ /text/ ) { +<&|/l&>Download <% length $name ? $name : loc('(untitled)') %>\ +% if ( $DownloadableHeaders && ! length $name && $message->ContentType =~ /text/ ) { / <% loc('with headers') %> % } - % $m->callback(CallbackName => 'AfterDownloadLinks', ARGSRef => \%ARGS, Ticket => $Ticket, Transaction => $Transaction, Attachment => $message); -
<% $message->ContentType %> <% $size_to_str->( $size ) %>
% } - %# If there is sub-messages, open a dedicated div % if ( scalar ( grep $_->__Value('Parent') == $message->id, @$Attachments ) ) {
@@ -125,11 +123,13 @@ elsif (!$ShowHeaders) { push @DisplayHeaders, 'RT-Send-Bcc' if RT->Config->Get('ShowBccHeader'); } +$m->callback(CallbackName => 'MassageDisplayHeaders', DisplayHeaders => \@DisplayHeaders, Transaction => $Transaction); + my $size_to_str = sub { my $size = shift; # show a download link if ( $size > 1024*1024 ) { - $size = loc( "[_1]b", int( $size / 1024 / 102.4 ) / 10 ); + $size = loc( "[_1]m", int( $size / 1024 / 102.4 ) / 10 ); } elsif ( $size > 1024 ) { $size = loc( "[_1]k", int( $size / 102.4 ) / 10 ); @@ -142,28 +142,32 @@ my $size_to_str = sub { my $render_attachment = sub { my $message = shift; + my $name = defined $message->Filename && length $message->Filename ? $message->Filename : ''; + + my $content_type = lc $message->ContentType; # if it has a content-disposition: attachment, don't show inline my $disposition = $message->GetHeader('Content-Disposition'); - if ( $disposition && $disposition =~ /attachment/i && $disposition !~ /^\s*inline/ ) { - $disposition = 'attachemnt'; + + if ( $disposition && $disposition =~ /^\s*attachment/i ) { + $disposition = 'attachment'; } else { $disposition = 'inline'; } # If it's text - if ( $message->ContentType =~ m{^(text|message)}i ) { + if ( $content_type =~ m{^(text|message)/} ) { my $max_size = RT->Config->Get( 'MaxInlineBody', $session{'CurrentUser'} ); - if ( $message->Filename && RT->Config->Get('SuppressInlineTextFiles', $session{'CurrentUser'} ) ) { - $m->out('

'. loc( 'Text file is not shown because it is disabled in preferences.' ) .'

'); + if ( $disposition ne 'inline' ) { + $m->out('

'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'

'); return; } - elsif ( $max_size && $message->ContentLength > $max_size ) { - $m->out('

'. loc( 'Message body not shown because it is too large.' ) .'

'); + elsif ( length $name && RT->Config->Get('SuppressInlineTextFiles', $session{'CurrentUser'} ) ) { + $m->out('

'. loc( 'Text file is not shown because it is disabled in preferences.' ) .'

'); return; } - elsif ( $disposition ne 'inline' ) { - $m->out('

'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'

'); + elsif ( $max_size && $message->ContentLength > $max_size ) { + $m->out('

'. loc( 'Message body is not shown because it is too large.' ) .'

'); return; } @@ -173,70 +177,112 @@ my $render_attachment = sub { !$ParentObj # or its parent isn't a multipart alternative - || ( $ParentObj->ContentType !~ m{^multipart/alternative$}i ) + || ( $ParentObj->ContentType !~ m{^multipart/(?:alternative|related)$}i ) # or it's of our prefered alterative type || ( ( RT->Config->Get('PreferRichText') - && ( $message->ContentType =~ m{^text/(?:html|enriched)$} ) + && ( $content_type =~ m{^text/(?:html|enriched)$} ) ) || ( !RT->Config->Get('PreferRichText') - && ( $message->ContentType !~ m{^text/(?:html|enriched)$} ) + && ( $content_type !~ m{^text/(?:html|enriched)$} ) ) ) - ) - { + ) { my $content; - if ( $AttachmentContent->{ $message->id } ) { - $content = $AttachmentContent->{ $message->id }->Content; + # If we've cached the content, use it from there + if (my $x = $AttachmentContent->{ $Transaction->id }->{$message->id}) { + $content = $x->Content; } else { $content = $message->Content; } + $RT::Logger->debug( + "Rendering attachment #". $message->id + ." of '$content_type' type" + ); + # if it's a text/html clean the body and show it - if ( $message->ContentType =~ m{^text/(?:html|enriched)$}i ) { + if ( $content_type eq 'text/html' ) { $content = $m->comp( '/Elements/ScrubHTML', Content => $content ); - if ( $message->ContentType eq 'text/html' ) { - $m->comp('/Elements/MakeClicky', - content => \$content, html => 1, - ticket => $Ticket ); + + $m->comp( + '/Elements/MakeClicky', + content => \$content, + html => 1, + ticket => $Ticket, + ); + + unless (length $name) { + eval { + require HTML::Quoted; + $content = HTML::Quoted->extract($content) + }; + if ($@) { + RT->Logger->error( + "HTML::Quoted couldn't process attachment #@{[$message->id]}: $@." + . " This is a bug, please report it to rt-bugs\@bestpractical.com."); + } } - $m->out( $content ); + + $m->comp( + 'ShowMessageStanza', + Message => $content, + Transaction => $Transaction, + ContentType => 'text/html', + ); } - # if it's a text/plain show the body - elsif ( $message->ContentType =~ m{^(text|message)}i ) { + elsif ( $content_type eq 'text/enriched' ) { + $content = $m->comp( '/Elements/ScrubHTML', Content => $content ); + $m->out( $content ); + } - eval { require Text::Quoted; $content = Text::Quoted::extract($content); }; - if ($@) { $RT::Logger->warning( "Text::Quoted failed: $@" ) } + # It's a text type we don't have special handling for + else { + unless ( length $name ) { + eval { + require Text::Quoted; + # XXX: Deprecate ->can check in 4.2 and simply bump version requirement. + Text::Quoted::set_quote_characters(undef) # only use > + if Text::Quoted->can("set_quote_characters"); + $content = Text::Quoted::extract($content); + }; + if ($@) { + RT->Logger->error( + "Text::Quoted couldn't process attachment #@{[$message->id]}: $@." + . " This is a bug, please report it to rt-bugs\@bestpractical.com."); + } + } $m->comp( 'ShowMessageStanza', - Depth => 0, Message => $content, - Transaction => $Transaction + Transaction => $Transaction, + ContentType => 'text/plain', ); } } } # if it's an image, show it as an image - elsif ( RT->Config->Get('ShowTransactionImages') and $message->ContentType =~ /^image\//i ) { + elsif ( RT->Config->Get('ShowTransactionImages') and $content_type =~ m{^image/} ) { if ( $disposition ne 'inline' ) { $m->out('

'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'

'); return; } - my $filename = $message->Filename || loc('(untitled)'); + my $filename = length $name ? $name : loc('(untitled)'); + my $efilename = $m->interp->apply_escapes( $filename, 'h' ); $m->out('' ); } - elsif ( $message->ContentLength > 0 ) { + elsif ( $message->ContentLength && $message->ContentLength > 0 ) { $m->out( '

' . loc( 'Message body not shown because it is not plain text.' ) . '

'