# -- # Copyright (C) 2001-2019 OTRS AG, https://otrs.com/ # -- # This software comes with ABSOLUTELY NO WARRANTY. For details, see # the enclosed file COPYING for license information (GPL). If you # did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt. # -- package Kernel::Modules::AgentTicketArticleContent; ## nofilter(TidyAll::Plugin::OTRS::Perl::Print) use strict; use warnings; our $ObjectManagerDisabled = 1; sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {%Param}; bless( $Self, $Type ); return $Self; } sub Run { my ( $Self, %Param ) = @_; # get param object my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request'); # get ArticleID my $TicketID = $ParamObject->GetParam( Param => 'TicketID' ); my $ArticleID = $ParamObject->GetParam( Param => 'ArticleID' ); # get needed objects my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout'); my $LogObject = $Kernel::OM->Get('Kernel::System::Log'); # check params if ( !$ArticleID || !$TicketID ) { $LogObject->Log( Message => 'TicketID and ArticleID are needed!', Priority => 'error', ); return $LayoutObject->ErrorScreen(); } my $TicketNumber = $Kernel::OM->Get('Kernel::System::Ticket')->TicketNumberLookup( TicketID => $TicketID, ); my $ArticleBackendObject = $Kernel::OM->Get('Kernel::System::Ticket::Article')->BackendForArticle( TicketID => $TicketID, ArticleID => $ArticleID, ); # Check permissions. my %Article = $ArticleBackendObject->ArticleGet( TicketID => $TicketID, ArticleID => $ArticleID, DynamicFields => 0, ); my $Access = $Kernel::OM->Get('Kernel::System::Ticket')->TicketPermission( Type => 'ro', TicketID => $TicketID, UserID => $Self->{UserID}, ); if ( !$Access ) { return $LayoutObject->NoPermission( WithHeader => 'yes' ); } # Render article content. my $ArticleContent = $LayoutObject->ArticlePreview( TicketID => $TicketID, ArticleID => $ArticleID, ); if ( !$ArticleContent ) { $LogObject->Log( Message => 'No such article!', Priority => 'error', ); return $LayoutObject->ErrorScreen(); } my $Content = $LayoutObject->Output( Template => '[% Data.HTML %]', Data => { HTML => $ArticleContent, }, ); my %Data = ( Content => $Content, ContentAlternative => '', ContentID => '', ContentType => 'text/html; charset="utf-8"', Disposition => 'inline', FilesizeRaw => bytes::length($Content), ); # get config object my $ConfigObject = $Kernel::OM->Get('Kernel::Config'); # set download type to inline $ConfigObject->Set( Key => 'AttachmentDownloadType', Value => 'inline' ); # set filename for inline viewing $Data{Filename} = "Ticket-$TicketNumber-ArticleID-$Article{ArticleID}.html"; # generate base url my $URL = 'Action=AgentTicketAttachment;Subaction=HTMLView' . ";TicketID=$TicketID;ArticleID=$ArticleID;FileID="; # replace links to inline images in html content my %AtmBox = $ArticleBackendObject->ArticleAttachmentIndex( ArticleID => $ArticleID, ); # Do not load external images if 'BlockLoadingRemoteContent' is enabled. my $LoadExternalImages; if ( $ConfigObject->Get('Ticket::Frontend::BlockLoadingRemoteContent') ) { $LoadExternalImages = 0; } else { $LoadExternalImages = $ParamObject->GetParam( Param => 'LoadExternalImages' ) || 0; # Safety check only on customer article. if ( !$LoadExternalImages && $Article{SenderType} ne 'customer' ) { $LoadExternalImages = 1; } } # reformat rich text document to have correct charset and links to # inline documents %Data = $LayoutObject->RichTextDocumentServe( Data => \%Data, URL => $URL, Attachments => \%AtmBox, LoadExternalImages => $LoadExternalImages, ); # if there is unexpectedly pgp decrypted content in the html email (OE), # we will use the article body (plain text) from the database as fall back # see bug#9672 if ( $Data{Content} =~ m{ ^ .* -----BEGIN [ ] PGP [ ] MESSAGE----- .* $ # grep PGP begin tag .+ # PGP parts may be nested in html ^ .* -----END [ ] PGP [ ] MESSAGE----- .* $ # grep PGP end tag }xms ) { # html quoting $Article{Body} = $LayoutObject->Ascii2Html( NewLine => $ConfigObject->Get('DefaultViewNewLine'), Text => $Article{Body}, VMax => $ConfigObject->Get('DefaultViewLines') || 5000, HTMLResultMode => 1, LinkFeature => 1, ); # use the article body as content, because pgp was definitly descrypted if possible $Data{Content} = $Article{Body}; } # return html attachment return $LayoutObject->Attachment( %Data, Sandbox => 1, ); } 1;