From 874889b86abea4c01ceb1368a836b66694fae1c3 Mon Sep 17 00:00:00 2001
From: Zoran Ilibasic <zilibasic@s7designcreative.com>
Date: Tue, 3 Dec 2019 10:17:06 +0100
Subject: [PATCH] Improved article sending via email communication channel.

---
 Kernel/Modules/AgentTicketBounce.pm           |  11 +-
 Kernel/Modules/AgentTicketCompose.pm          |   9 +-
 Kernel/Modules/AgentTicketEmailOutbound.pm    |   9 +-
 Kernel/Modules/AgentTicketForward.pm          |   9 +-
 .../Templates/Standard/AgentTicketBounce.tt   |   1 -
 .../Templates/Standard/AgentTicketCompose.tt  |   1 -
 .../Standard/AgentTicketEmailOutbound.tt      |   1 -
 .../Templates/Standard/AgentTicketForward.tt  |   1 -
 .../Selenium/Agent/AgentTicketComposeSender.t | 156 ++++++++++++++++++
 9 files changed, 185 insertions(+), 13 deletions(-)
 create mode 100644 scripts/test/Selenium/Agent/AgentTicketComposeSender.t

--- a/Kernel/Modules/AgentTicketBounce.pm
+++ b/Kernel/Modules/AgentTicketBounce.pm
@@ -315,7 +315,7 @@ $Param{Signature}";
         $LayoutObject->ChallengeTokenCheck();
 
         # get params
-        for my $Parameter (qw(From BounceTo To Subject Body InformSender BounceStateID)) {
+        for my $Parameter (qw(BounceTo To Subject Body InformSender BounceStateID)) {
             $Param{$Parameter}
                 = $Kernel::OM->Get('Kernel::System::Web::Request')->GetParam( Param => $Parameter ) || '';
         }
@@ -442,12 +442,17 @@ $Param{Signature}";
             return $Output;
         }
 
+        my $From = $Kernel::OM->Get('Kernel::System::TemplateGenerator')->Sender(
+            QueueID => $Ticket{QueueID},
+            UserID  => $Self->{UserID},
+        );
+
         my $Bounce = $TicketObject->ArticleBounce(
             TicketID    => $Self->{TicketID},
             ArticleID   => $Self->{ArticleID},
             UserID      => $Self->{UserID},
             To          => $Param{BounceTo},
-            From        => $Param{From},
+            From        => $From,
             HistoryType => 'Bounce',
         );
 
@@ -484,7 +489,7 @@ $Param{Signature}";
                 TicketID       => $Self->{TicketID},
                 HistoryType    => 'Bounce',
                 HistoryComment => "Bounced info to '$Param{To}'.",
-                From           => $Param{From},
+                From           => $From,
                 Email          => $Param{Email},
                 To             => $Param{To},
                 Subject        => $Param{Subject},
--- a/Kernel/Modules/AgentTicketCompose.pm
+++ b/Kernel/Modules/AgentTicketCompose.pm
@@ -155,7 +155,7 @@ sub Run {
     my %GetParam;
     for (
         qw(
-        From To Cc Bcc Subject Body InReplyTo References ResponseID ReplyArticleID StateID
+        To Cc Bcc Subject Body InReplyTo References ResponseID ReplyArticleID StateID
         ArticleID ArticleTypeID TimeUnits Year Month Day Hour Minute FormID ReplyAll
         )
         )
@@ -839,6 +839,11 @@ sub Run {
             );
         }
 
+        my $From = $Kernel::OM->Get('Kernel::System::TemplateGenerator')->Sender(
+            QueueID => $Ticket{QueueID},
+            UserID  => $Self->{UserID},
+        );
+
         # send email
         my $ArticleID = $TicketObject->ArticleSend(
             ArticleTypeID  => $ArticleTypeID,
@@ -846,7 +851,7 @@ sub Run {
             TicketID       => $Self->{TicketID},
             HistoryType    => 'SendAnswer',
             HistoryComment => "\%\%$Recipients",
-            From           => $GetParam{From},
+            From           => $From,
             To             => $GetParam{To},
             Cc             => $GetParam{Cc},
             Bcc            => $GetParam{Bcc},
--- a/Kernel/Modules/AgentTicketEmailOutbound.pm
+++ b/Kernel/Modules/AgentTicketEmailOutbound.pm
@@ -1158,13 +1158,18 @@ sub SendEmail {
     # get article type ID param
     my $ArticleTypeID = $ParamObject->GetParam( Param => 'ArticleTypeID' );
 
+    my $From = $Kernel::OM->Get('Kernel::System::TemplateGenerator')->Sender(
+        QueueID => $Ticket{QueueID},
+        UserID  => $Self->{UserID},
+    );
+
     my $ArticleID = $TicketObject->ArticleSend(
         ArticleTypeID  => $ArticleTypeID,
         SenderType     => 'agent',
         TicketID       => $Self->{TicketID},
         HistoryType    => 'EmailAgent',
         HistoryComment => "\%\%$To",
-        From           => $GetParam{From},
+        From           => $From,
         To             => $GetParam{To},
         Cc             => $GetParam{Cc},
         Bcc            => $GetParam{Bcc},
@@ -1921,7 +1926,7 @@ sub _GetExtendedParams {
     # get params
     my %GetParam;
     for my $Key (
-        qw(From To Cc Bcc Subject Body ComposeStateID ArticleTypeID
+        qw(To Cc Bcc Subject Body ComposeStateID ArticleTypeID
         ArticleID TimeUnits Year Month Day Hour Minute FormID)
         )
     {
--- a/Kernel/Modules/AgentTicketForward.pm
+++ b/Kernel/Modules/AgentTicketForward.pm
@@ -31,7 +31,7 @@ sub new {
 
     # get params
     for (
-        qw(From To Cc Bcc Subject Body InReplyTo References ComposeStateID ArticleTypeID
+        qw(To Cc Bcc Subject Body InReplyTo References ComposeStateID ArticleTypeID
         ArticleID TimeUnits Year Month Day Hour Minute FormID)
         )
     {
@@ -1026,13 +1026,18 @@ sub SendEmail {
         );
     }
 
+    my $From = $Kernel::OM->Get('Kernel::System::TemplateGenerator')->Sender(
+        QueueID => $Ticket{QueueID},
+        UserID  => $Self->{UserID},
+    );
+
     my $ArticleID = $TicketObject->ArticleSend(
         ArticleTypeID  => $ArticleTypeID,
         SenderType     => 'agent',
         TicketID       => $Self->{TicketID},
         HistoryType    => 'Forward',
         HistoryComment => "\%\%$To",
-        From           => $GetParam{From},
+        From           => $From,
         To             => $GetParam{To},
         Cc             => $GetParam{Cc},
         Bcc            => $GetParam{Bcc},
--- a/Kernel/Output/HTML/Templates/Standard/AgentTicketBounce.tt
+++ b/Kernel/Output/HTML/Templates/Standard/AgentTicketBounce.tt
@@ -78,7 +78,6 @@
 
                 <label>[% Translate("From") | html %]:</label>
                 <div class="Field">
-                    <input type="hidden" name="From" value="[% Data.From | html %]"/>
                     [% Data.From | html %]
                 </div>
                 <div class="Clear"></div>
--- a/Kernel/Output/HTML/Templates/Standard/AgentTicketCompose.tt
+++ b/Kernel/Output/HTML/Templates/Standard/AgentTicketCompose.tt
@@ -42,7 +42,6 @@
                     <label>[% Translate("From") | html %]:</label>
                     <div class="Field">
                         [% Data.From | html %]
-                        <input type="hidden" name="From" value="[% Data.From | html %]"/>
                     </div>
                     <div class="Clear"></div>
 
--- a/Kernel/Output/HTML/Templates/Standard/AgentTicketEmailOutbound.tt
+++ b/Kernel/Output/HTML/Templates/Standard/AgentTicketEmailOutbound.tt
@@ -41,7 +41,6 @@
                 <label>[% Translate("From") | html %]:</label>
                 <div class="Field">
                     [% Data.From | html %]
-                    <input type="hidden" name="From" value="[% Data.From | html %]"/>
                 </div>
                 <div class="Clear"></div>
 
--- a/Kernel/Output/HTML/Templates/Standard/AgentTicketForward.tt
+++ b/Kernel/Output/HTML/Templates/Standard/AgentTicketForward.tt
@@ -43,7 +43,6 @@
                 <label>[% Translate("From") | html %]:</label>
                 <div class="Field">
                     [% Data.From | html %]
-                    <input type="hidden" name="From" value="[% Data.From | html %]"/>
                 </div>
                 <div class="Clear"></div>
 
--- /dev/null
+++ b/scripts/test/Selenium/Agent/AgentTicketComposeSender.t
@@ -0,0 +1,156 @@
+# --
+# 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.
+# --
+
+use strict;
+use warnings;
+use utf8;
+
+use vars (qw($Self));
+
+# Get selenium object.
+my $Selenium = $Kernel::OM->Get('Kernel::System::UnitTest::Selenium');
+
+$Selenium->RunTest(
+    sub {
+
+        my $Helper = $Kernel::OM->Get('Kernel::System::UnitTest::Helper');
+
+        # Disable check email addresses.
+        $Helper->ConfigSettingChange(
+            Key   => 'CheckEmailAddresses',
+            Value => 0,
+        );
+
+        # Disable RichText control.
+        $Helper->ConfigSettingChange(
+            Valid => 1,
+            Key   => 'Frontend::RichText',
+            Value => 0,
+        );
+
+        my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
+        my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
+
+        # Get RandomID.
+        my $RandomID = $Helper->GetRandomID();
+
+        # Create test customer.
+        my $TestCustomer       = 'Customer' . $RandomID;
+        my $TestCustomerUserID = $Kernel::OM->Get('Kernel::System::CustomerUser')->CustomerUserAdd(
+            Source         => 'CustomerUser',
+            UserFirstname  => $TestCustomer,
+            UserLastname   => $TestCustomer,
+            UserCustomerID => $TestCustomer,
+            UserLogin      => $TestCustomer,
+            UserEmail      => "$TestCustomer\@localhost.com",
+            ValidID        => 1,
+            UserID         => 1,
+        );
+        $Self->True(
+            $TestCustomerUserID,
+            "CustomerUserID $TestCustomerUserID is created",
+        );
+
+        # Create test ticket.
+        my $TicketID = $TicketObject->TicketCreate(
+            Title        => 'Selenium Test Ticket',
+            Queue        => 'Raw',
+            Lock         => 'unlock',
+            Priority     => '3 normal',
+            State        => 'new',
+            CustomerID   => 'SeleniumCustomer',
+            CustomerUser => 'SeleniumCustomer@localhost.com',
+            OwnerID      => 1,
+            UserID       => 1,
+        );
+        $Self->True(
+            $TicketID,
+            "Ticket ID $TicketID is created",
+        );
+
+        # Create test email Article.
+        my $ArticleID = $TicketObject->ArticleCreate(
+            TicketID       => $TicketID,
+            ArticleType    => 'email-internal',
+            SenderType     => 'agent',
+            From           => 'Some Agent <otrs@example.com>',
+            To             => 'Suplier<suplier@example.com>',
+            Subject        => 'Email for suplier',
+            Body           => 'the message text',
+            Charset        => 'utf8',
+            MimeType       => 'text/plain',
+            HistoryType    => 'OwnerUpdate',
+            HistoryComment => 'Some free text!',
+            UserID         => 1,
+        );
+
+        $Self->True(
+            $ArticleID,
+            "ArticleID $ArticleID is created",
+        );
+
+        # Create test user and login.
+        my $TestUserLogin = $Helper->TestUserCreate(
+            Groups => [ 'admin', 'users' ],
+        ) || die "Did not get test user";
+
+        $Selenium->Login(
+            Type     => 'Agent',
+            User     => $TestUserLogin,
+            Password => $TestUserLogin,
+        );
+
+        # Get script alias.
+        my $ScriptAlias = $Kernel::OM->Get('Kernel::Config')->Get('ScriptAlias');
+        my $From        = $Helper->GetRandomID() . "somesender\@localhost";
+
+        # Navigate AgentTicketCompose for created test ticket.
+        $Selenium->VerifiedGet(
+            "${ScriptAlias}index.pl?Action=AgentTicketCompose;TicketID=$TicketID;ArticleID=$ArticleID;ResponseID=1&From=$From"
+        );
+        $Selenium->find_element('//span[contains(.,\'Send mail\')]')->VerifiedClick();
+
+        $Self->True(
+            index( $Selenium->get_page_source(), $From ) == -1,
+            "$From is not found on page",
+        );
+
+        # Delete created test ticket.
+        my $Success = $TicketObject->TicketDelete(
+            TicketID => $TicketID,
+            UserID   => 1,
+        );
+
+        # Ticket deletion could fail if apache still writes to ticket history. Try again in this case.
+        if ( !$Success ) {
+            sleep 3;
+            $Success = $TicketObject->TicketDelete(
+                TicketID => $TicketID,
+                UserID   => 1,
+            );
+        }
+        $Self->True(
+            $Success,
+            "Ticket ID $TicketID is deleted"
+        );
+
+        # Delete test created customer.
+        my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
+        $TestCustomer = $DBObject->Quote($TestCustomer);
+        $Success      = $DBObject->Do(
+            SQL  => "DELETE FROM customer_user WHERE login = ?",
+            Bind => [ \$TestCustomer ],
+        );
+        $Self->True(
+            $Success,
+            "Delete customer user - $TestCustomer",
+        );
+    }
+);
+
+1;
