import rt 3.8.7
[freeside.git] / rt / share / html / Ticket / Elements / ShowTransactionAttachments
diff --git a/rt/share/html/Ticket/Elements/ShowTransactionAttachments b/rt/share/html/Ticket/Elements/ShowTransactionAttachments
new file mode 100644 (file)
index 0000000..9c40b28
--- /dev/null
@@ -0,0 +1,252 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%# 
+%# COPYRIGHT:
+%# 
+%# This software is Copyright (c) 1996-2009 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., 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;
+    if ( $size ) {
+</%PERL>
+<div class="downloadattachment">
+<a href="<% $AttachPath %>/<% $Transaction->Id %>/<% $message->Id %>/<% ($message->Filename ||'')| u%>"><&|/l&>Download</&> <% $message->Filename || loc('(untitled)') %></a>
+% if ( $DownloadableHeaders && !$message->Filename && $message->ContentType =~ /text/  ) {
+ / <a href="<% $AttachPath %>/WithHeaders/<% $message->Id %>"><% loc('with headers') %></a>
+% }
+<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 <% RT->Config->Get('PlainTextMono', $session{'CurrentUser'}) ? ' plain-text-white-space' : ''%>">
+% }
+<%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');
+}
+
+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 );
+    }
+    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;
+
+    # 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';
+    } else {
+        $disposition = 'inline';
+    }
+
+    # If it's text
+    if ( $message->ContentType =~ m{^(text|message)}i ) {
+        my $max_size = RT->Config->Get( 'MaxInlineBody', $session{'CurrentUser'} );
+        if ( $message->Filename && 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 not shown because it is too large.' ) .'</p>');
+            return;
+        }
+        elsif ( $disposition ne 'inline' ) {
+            $m->out('<p>'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'</p>');
+            return;
+        }
+
+        if (
+
+            # it's a toplevel object
+            !$ParentObj
+
+            # or its parent isn't a multipart alternative
+            || ( $ParentObj->ContentType !~ m{^multipart/alternative$}i )
+
+            # or it's of our prefered alterative type
+            || (
+                (
+                    RT->Config->Get('PreferRichText')
+                    && ( $message->ContentType =~ m{^text/(?:html|enriched)$} )
+                )
+                || ( !RT->Config->Get('PreferRichText')
+                    && ( $message->ContentType !~ m{^text/(?:html|enriched)$} )
+                )
+            )
+          )
+        {
+
+            my $content;
+            if ( $AttachmentContent->{ $message->id } ) {
+                $content = $AttachmentContent->{ $message->id }->Content;
+            }
+            else {
+                $content = $message->Content;
+            }
+
+            # if it's a text/html clean the body and show it
+            if ( $message->ContentType =~ m{^text/(?:html|enriched)$}i ) {
+                $content = $m->comp( '/Elements/ScrubHTML', Content => $content );
+                if ( $message->ContentType eq 'text/html' ) {
+                    $m->comp('/Elements/MakeClicky', 
+                            content => \$content, html => 1,
+                            ticket => $Ticket );
+                }
+                $m->out( $content );
+            }
+
+            # if it's a text/plain show the body
+            elsif ( $message->ContentType =~ m{^(text|message)}i ) {
+
+                eval { require Text::Quoted;  $content = Text::Quoted::extract($content); };
+                if ($@) { $RT::Logger->warning( "Text::Quoted failed: $@" ) }
+
+                $m->comp(
+                    'ShowMessageStanza',
+                    Depth       => 0,
+                    Message     => $content,
+                    Transaction => $Transaction
+                );
+            }
+        }
+    }
+
+    # if it's an image, show it as an image
+    elsif ( RT->Config->Get('ShowTransactionImages') and  $message->ContentType =~ /^image\//i ) {
+        if ( $disposition ne 'inline' ) {
+            $m->out('<p>'. loc( 'Message body is not shown because sender requested not to inline it.' ) .'</p>');
+            return;
+        }
+
+        my $filename =  $message->Filename || loc('(untitled)');
+        $m->out('<img'
+              . ' alt="'
+              . $filename
+              . '"' 
+              . ' title="'
+              . $filename
+              . '"' 
+              . ' src="'
+              . $AttachPath . '/'
+              . $Transaction->Id . '/'
+              . $message->Id
+              . '/" />' );
+    }
+    elsif ( $message->ContentLength > 0 ) {
+        $m->out( '<p>' .
+            loc( 'Message body not shown because it is not plain text.' ) .
+            '</p>'
+        );
+    }
+};
+
+</%INIT>