1# --
2# Copyright (C) 2001-2020 OTRS AG, https://otrs.com/
3# --
4# This software comes with ABSOLUTELY NO WARRANTY. For details, see
5# the enclosed file COPYING for license information (GPL). If you
6# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
7# --
8
9use strict;
10use warnings;
11use utf8;
12
13use vars (qw($Self));
14
15# get helper object
16$Kernel::OM->ObjectParamAdd(
17    'Kernel::System::UnitTest::Helper' => {
18        RestoreDatabase => 1,
19    },
20);
21my $Helper = $Kernel::OM->Get('Kernel::System::UnitTest::Helper');
22
23# Disable email addresses checking.
24$Helper->ConfigSettingChange(
25    Key   => 'CheckEmailAddresses',
26    Value => 0,
27);
28
29# do not really send emails
30$Kernel::OM->Get('Kernel::Config')->Set(
31    Key   => 'SendmailModule',
32    Value => 'Kernel::System::Email::DoNotSendEmail',
33);
34
35my $SendEmail = sub {
36    my %Param = @_;
37
38    my $EmailObject     = $Kernel::OM->Get('Kernel::System::Email');
39    my $MailQueueObject = $Kernel::OM->Get('Kernel::System::MailQueue');
40
41    # Delete mail queue
42    $MailQueueObject->Delete();
43
44    # Generate the mail and queue it
45    $EmailObject->Send( %Param, );
46
47    # Get last item in the queue.
48    my $Items = $MailQueueObject->List();
49    $Items = [ sort { $b->{ID} <=> $a->{ID} } @{$Items} ];
50    my $LastItem = $Items->[0];
51
52    my $Result = $MailQueueObject->Send( %{$LastItem} );
53
54    return {
55        Data => $LastItem->{Message},
56    };
57};
58
59# Check that long references and in-reply-to headers are correctly split across lines.
60# See bug#9345 and RFC5322.
61my $MsgIDShort = '<54DEDF2@xyz-intra.net>';
62my $MsgIDLong  = '<54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>';
63
64my @Tests = (
65    {
66        Name         => "Short MSGID 2x",
67        Header       => $MsgIDShort x 2,
68        FoldedHeader => '<54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net>',
69    },
70
71    {
72        Name         => "Short MSGID 2x",
73        Header       => $MsgIDShort x 10,
74        FoldedHeader => '<54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net>
75 <54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net>
76 <54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net><54DEDF2@xyz-intra.net>
77 <54DEDF2@xyz-intra.net>',
78    },
79    {
80        Name         => "Long MSGID 10x",
81        Header       => $MsgIDLong x 10,
82        FoldedHeader => '<54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
83 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
84 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
85 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
86 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
87 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
88 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
89 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
90 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>
91 <54DEDF2AD94D34F9A6C123E21D7CA6102A2E7HHIDHDGSUFKF@EFNPNCY115.xyz-intra.net>',
92    },
93);
94
95for my $Test (@Tests) {
96    my $Result = $SendEmail->(
97        From       => 'john.smith@example.com',
98        To         => 'john.smith2@example.com',
99        Subject    => 'some subject',
100        Body       => 'Some Body',
101        MimeType   => 'text/html',
102        Charset    => 'utf8',
103        References => $Test->{Header},
104        InReplyTo  => $Test->{Header},
105    );
106
107    my ($ReferencesHeader) = $Result->{Data}->{Header} =~ m{^(References:.*?)(^\S|\z)}xms;
108    my ($InReplyToHeader)  = $Result->{Data}->{Header} =~ m{^(In-Reply-To:.*?)(^\S|\z)}xms;
109
110    $Self->Is(
111        $ReferencesHeader,
112        "References: $Test->{FoldedHeader}\n",
113        'Check that references header is split across lines',
114    );
115
116    $Self->Is(
117        $InReplyToHeader,
118        "In-Reply-To: $Test->{FoldedHeader}\n",
119        'Check that in-reply-to header is split across lines',
120    );
121}
122
123# call Send a
124
125#
126# Check header security
127#
128$Kernel::OM->Get('Kernel::Config')->Set(
129    Key   => 'Secure::DisableBanner',
130    Value => 0,
131);
132
133my $Result = $SendEmail->(
134    From    => 'john.smith@example.com',
135    To      => 'john.smith2@example.com',
136    Subject => 'some subject',
137    Body    => 'Some Body',
138    Type    => 'text/html',
139    Charset => 'utf8',
140);
141
142my ($XMailerHeader)    = $Result->{Data}->{Header} =~ m{^X-Mailer:\s+(.*?)$}ixms;
143my ($XPoweredByHeader) = $Result->{Data}->{Header} =~ m{^X-Powered-By:\s+(.*?)$}ixms;
144
145my $Product = $Kernel::OM->Get('Kernel::Config')->Get('Product');
146my $Version = $Kernel::OM->Get('Kernel::Config')->Get('Version');
147
148$Self->Is(
149    $XMailerHeader,
150    "$Product Mail Service ($Version)",
151    "Default X-Mailer header",
152);
153
154$Self->Is(
155    $XPoweredByHeader,
156    "OTRS (https://otrs.com/)",
157    "Default X-Powered-By header",
158);
159
160$Kernel::OM->Get('Kernel::Config')->Set(
161    Key   => 'Secure::DisableBanner',
162    Value => 1,
163);
164
165$Result = $SendEmail->(
166    From     => 'john.smith@example.com',
167    To       => 'john.smith2@example.com',
168    Subject  => 'some subject',
169    Body     => 'Some Body',
170    MimeType => 'text/html',
171    Charset  => 'utf8',
172);
173
174($XMailerHeader)    = $Result->{Data}->{Header} =~ m{^X-Mailer:\s+(.*?)$}ixms;
175($XPoweredByHeader) = $Result->{Data}->{Header} =~ m{^X-Powered-By:\s+(.*?)$}ixms;
176
177$Self->Is(
178    $XMailerHeader,
179    undef,
180    "Disabled X-Mailer header",
181);
182
183$Self->Is(
184    $XPoweredByHeader,
185    undef,
186    "Disabled X-Powered-By header",
187);
188
1891;
190