# -- # 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::CustomerTicketArticleContent; use strict; use warnings; use Kernel::System::VariableCheck qw(:all); use Kernel::Language qw(Translatable); 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 ) = @_; my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request'); my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout'); my $LogObject = $Kernel::OM->Get('Kernel::System::Log'); my $TicketID = $ParamObject->GetParam( Param => 'TicketID' ); my $ArticleID = $ParamObject->GetParam( Param => 'ArticleID' ); # check params if ( !$ArticleID ) { my $Output = $LayoutObject->CustomerHeader( Title => Translatable('Error'), ); $Output .= $LayoutObject->CustomerError( Message => Translatable('ArticleID is needed!'), Comment => Translatable('Please contact the administrator.'), ); $LogObject->Log( Message => 'ArticleID is needed!', Priority => 'error', ); $Output .= $LayoutObject->CustomerFooter(); return $Output; } if ( !$TicketID ) { my $Output = $LayoutObject->CustomerHeader( Title => Translatable('Error'), ); $Output .= $LayoutObject->CustomerError( Message => $LayoutObject->{LanguageObject}->Translate( 'No TicketID for ArticleID (%s)!', $ArticleID ), Comment => Translatable('Please contact the administrator.'), ); $LogObject->Log( Message => "No TicketID for ArticleID ($ArticleID)!", Priority => 'error', ); $Output .= $LayoutObject->CustomerFooter(); return $Output; } my $ArticleObject = $Kernel::OM->Get('Kernel::System::Ticket::Article'); my @ArticleList = $ArticleObject->ArticleList( TicketID => $TicketID, ArticleID => $ArticleID, IsVisibleForCustomer => 1, ); my $ArticleBackendObject; my %Article; ARTICLEMETADATA: for my $ArticleMetaData (@ArticleList) { next ARTICLEMETADATA if !$ArticleMetaData; next ARTICLEMETADATA if !IsHashRefWithData($ArticleMetaData); $ArticleBackendObject = $ArticleObject->BackendForArticle( %{$ArticleMetaData} ); %Article = $ArticleBackendObject->ArticleGet( TicketID => $TicketID, ArticleID => $ArticleMetaData->{ArticleID}, DynamicFields => 0, ); } # check permission my $Access = $Kernel::OM->Get('Kernel::System::Ticket')->TicketCustomerPermission( Type => 'ro', TicketID => $TicketID, UserID => $Self->{UserID} ); if ( !$Access ) { return $LayoutObject->CustomerNoPermission( WithHeader => 'yes' ); } # Render article content. my $ArticleContent = $LayoutObject->ArticlePreview( TicketID => $TicketID, ArticleID => $ArticleID, ); if ( !$ArticleContent ) { my $Output = $LayoutObject->CustomerHeader( Title => Translatable('Error'), ); $Output .= $LayoutObject->CustomerError( Message => $LayoutObject->{LanguageObject}->Translate('HTML body attachment is missing!'), Comment => Translatable('Please contact the administrator.'), ); $LogObject->Log( Priority => 'error', Message => 'HTML body attachment is missing!', ); $Output .= $LayoutObject->CustomerFooter(); return $Output; } 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), ); # set download type to inline $Kernel::OM->Get('Kernel::Config')->Set( Key => 'AttachmentDownloadType', Value => 'inline' ); my $TicketNumber = $Kernel::OM->Get('Kernel::System::Ticket')->TicketNumberLookup( TicketID => $TicketID, ); # unset filename for inline viewing $Data{Filename} = "Ticket-$TicketNumber-ArticleID-$Article{ArticleID}.html"; # generate base url my $URL = 'Action=CustomerTicketAttachment;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 ( $Kernel::OM->Get('Kernel::Config')->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, ); # return html attachment return $LayoutObject->Attachment( %Data, Sandbox => 1, ); } 1;