+++ /dev/null
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC
-%# <sales@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., 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
-%# 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 }}}
-<%PERL>
-# Find all the attachments which have parent $Parent
-# For each of these attachments
-foreach my $message ( grep $_->__Value('Parent') == $Parent, @$Attachments ) {
-
- if (RT->Config->Get('GnuPG')->{'Enable'}) {
- $m->comp( 'ShowGnuPGStatus', Attachment => $message, WarnUnsigned => $WarnUnsigned );
- }
-
- $m->comp( 'ShowMessageHeaders',
- Message => $message,
- DisplayHeaders => \@DisplayHeaders,
- );
-
- my $size = $message->ContentLength;
- my $name = defined $message->Filename && length $message->Filename ? $message->Filename : '';
- if ( $size ) {
-</%PERL>
-<div class="downloadattachment">
-<a href="<% $AttachPath %>/<% $Transaction->Id %>/<% $message->Id %>/<% $name | u%>"><&|/l&>Download</&> <% length $name ? $name : loc('(untitled)') %></a>\
-% if ( $DownloadableHeaders && ! length $name && $message->ContentType =~ /text/ ) {
- / <a href="<% $AttachPath %>/WithHeaders/<% $message->Id %>"><% loc('with headers') %></a>
-% }
-% $m->callback(CallbackName => 'AfterDownloadLinks', ARGSRef => \%ARGS, Ticket => $Ticket, Transaction => $Transaction, Attachment => $message);
-<br />
-<span class="downloadcontenttype"><% $message->ContentType %> <% $size_to_str->( $size ) %></span>
-</div>
-% }
-%# If there is sub-messages, open a dedicated div
-% if ( scalar ( grep $_->__Value('Parent') == $message->id, @$Attachments ) ) {
-<div class="messageattachments">
-% } else {
-<div class="messagebody">
-% }
-<%PERL>
-
-$render_attachment->( $message );
-
-$m->comp(
- $m->current_comp,
- %ARGS,
- Parent => $message->id,
- ParentObj => $message
-);
-
-</%PERL>
-</div>
-% }
-<%ARGS>
-$Ticket => undef
-$Transaction => undef
-$ShowHeaders => 0
-$Collapsed => undef
-$DownloadableHeaders => 1
-$ShowTitleBarCommands => 1
-$RowNum => 1
-$AttachPath => RT->Config->Get('WebPath')."/Ticket/Attachment"
-$UpdatePath => RT->Config->Get('WebPath')."/Ticket/Update.html"
-$EmailRecordPath => RT->Config->Get('WebPath')."/Ticket/ShowEmailRecord.html"
-$Attachments => undef
-$AttachmentContent => {}
-$ShowBody => 1
-$Parent => 0
-$ParentObj => undef
-$WarnUnsigned => 0
-</%ARGS>
-<%INIT>
-my @DisplayHeaders=qw(_all);
-if ( $Transaction->Type =~ /EmailRecord$/ ) {
- @DisplayHeaders = qw(To Cc Bcc);
-}
-
-# If the transaction has anything attached to it at all
-elsif (!$ShowHeaders) {
- @DisplayHeaders = qw(To From RT-Send-Cc Cc Bcc Date Subject);
- 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]m", int( $size / 1024 / 102.4 ) / 10 );
- }
- elsif ( $size > 1024 ) {
- $size = loc( "[_1]k", int( $size / 102.4 ) / 10 );
- }
- else {
- $size = loc( "[_1]b", $size );
- }
- return $size;
-};
-
-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 =~ /^\s*attachment/i ) {
- $disposition = 'attachment';
- } else {
- $disposition = 'inline';
- }
-
- # If it's text
- if ( $content_type =~ m{^(text|message)/} ) {
- my $max_size = RT->Config->Get( 'MaxInlineBody', $session{'CurrentUser'} );
- if ( $disposition ne 'inline' ) {
- $m->out('<p>'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'</p>');
- return;
- }
- elsif ( length $name && RT->Config->Get('SuppressInlineTextFiles', $session{'CurrentUser'} ) ) {
- $m->out('<p>'. loc( 'Text file is not shown because it is disabled in preferences.' ) .'</p>');
- return;
- }
- elsif ( $max_size && $message->ContentLength > $max_size ) {
- $m->out('<p>'. loc( 'Message body is not shown because it is too large.' ) .'</p>');
- return;
- }
-
- if (
-
- # it's a toplevel object
- !$ParentObj
-
- # or its parent isn't a multipart alternative
- || ( $ParentObj->ContentType !~ m{^multipart/(?:alternative|related)$}i )
-
- # or it's of our prefered alterative type
- || (
- (
- RT->Config->Get('PreferRichText')
- && ( $content_type =~ m{^text/(?:html|enriched)$} )
- )
- || ( !RT->Config->Get('PreferRichText')
- && ( $content_type !~ m{^text/(?:html|enriched)$} )
- )
- )
- ) {
-
- my $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 ( $content_type eq 'text/html' ) {
- $content = $m->comp( '/Elements/ScrubHTML', Content => $content );
-
- $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->comp(
- 'ShowMessageStanza',
- Message => $content,
- Transaction => $Transaction,
- ContentType => 'text/html',
- );
- }
-
- elsif ( $content_type eq 'text/enriched' ) {
- $content = $m->comp( '/Elements/ScrubHTML', Content => $content );
- $m->out( $content );
- }
-
- # 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',
- Message => $content,
- Transaction => $Transaction,
- ContentType => 'text/plain',
- );
- }
- }
- }
-
- # if it's an image, show it as an image
- elsif ( RT->Config->Get('ShowTransactionImages') and $content_type =~ m{^image/} ) {
- if ( $disposition ne 'inline' ) {
- $m->out('<p>'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'</p>');
- return;
- }
-
- my $filename = length $name ? $name : loc('(untitled)');
- my $efilename = $m->interp->apply_escapes( $filename, 'h' );
- $m->out('<img'
- . ' alt="'
- . $efilename
- . '"'
- . ' title="'
- . $efilename
- . '"'
- . ' src="'
- . $AttachPath . '/'
- . $Transaction->Id . '/'
- . $message->Id
- . '/" />' );
- }
- elsif ( $message->ContentLength && $message->ContentLength > 0 ) {
- $m->out( '<p>' .
- loc( 'Message body not shown because it is not plain text.' ) .
- '</p>'
- );
- }
-};
-
-</%INIT>