line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
1
|
|
|
1
|
|
82466
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
78
|
|
2
|
1
|
|
|
1
|
|
7
|
use warnings; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
72
|
|
3
|
|
|
|
|
|
|
package Test::Reporter::Transport::Net::SMTP::Authen; |
4
|
1
|
|
|
1
|
|
8
|
use base 'Test::Reporter::Transport::Net::SMTP'; |
|
1
|
|
|
|
|
7
|
|
|
1
|
|
|
|
|
2121
|
|
5
|
1
|
|
|
1
|
|
9
|
use vars qw/$VERSION/; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
84
|
|
6
|
|
|
|
|
|
|
$VERSION = '1.02'; |
7
|
|
|
|
|
|
|
$VERSION = eval $VERSION; |
8
|
1
|
|
|
1
|
|
5
|
use Exporter 'import'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
2900
|
|
9
|
|
|
|
|
|
|
our @EXPORT_OK=qw(install); |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
sub install($$$){ |
12
|
0
|
|
|
0
|
0
|
|
my ($smtp, $user, $password) = @_; |
13
|
0
|
0
|
|
|
|
|
if ( @_ != 3){ |
14
|
0
|
|
|
|
|
|
croak( "Usage: install(\$smtp_server, \$user, \$password)" ); |
15
|
|
|
|
|
|
|
}; |
16
|
0
|
0
|
0
|
|
|
|
unless( $ENV{PERL_CPAN_REPORTER_DIR} || $ENV{HOME} ){ |
17
|
0
|
|
|
|
|
|
require Carp; |
18
|
0
|
|
|
|
|
|
croak( "Please define your enviroment variable PERL_CPAN_REPORTER_DIR or HOME" ); |
19
|
|
|
|
|
|
|
} |
20
|
0
|
|
0
|
|
|
|
my $reporter_folder = $ENV{PERL_CPAN_REPORTER_DIR} ||= $ENV{HOME} . '/.cpanreporter'; |
21
|
0
|
|
|
|
|
|
require File::Path; |
22
|
0
|
|
|
|
|
|
require Carp; |
23
|
0
|
|
|
|
|
|
File::Path->import('mkpath'); |
24
|
0
|
|
|
|
|
|
mkpath( $reporter_folder ); |
25
|
0
|
0
|
|
|
|
|
open my $fh , '>', $reporter_folder .'/config.ini' or Carp::croak( "Can't write config.ini in $reporter_folder $!"); |
26
|
0
|
|
|
|
|
|
$a = select ($fh); |
27
|
0
|
|
|
|
|
|
print "edit_report=no\n"; |
28
|
0
|
|
|
|
|
|
print "email_from=$user\n"; |
29
|
0
|
|
|
|
|
|
print "send_report=yes\n"; |
30
|
0
|
|
|
|
|
|
print "smtp_server=$smtp\n"; |
31
|
0
|
|
|
|
|
|
print "transport=Net::SMTP::Authen User $user Password $password\n"; |
32
|
0
|
0
|
|
|
|
|
close $fh or Carp::croak ("Can't finish write $reporter_folder/config.ini $!"); |
33
|
0
|
|
|
|
|
|
select $a; |
34
|
0
|
|
|
|
|
|
print STDERR "Writen $reporter_folder/config.ini .\n\tType cpan \n"; |
35
|
0
|
|
|
|
|
|
print STDERR "\to conf test_report 1\n"; |
36
|
0
|
|
|
|
|
|
print STDERR "\to conf commit\n"; |
37
|
|
|
|
|
|
|
} |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
sub new { |
40
|
0
|
|
|
0
|
1
|
|
my ($class, @args) = @_; |
41
|
0
|
|
|
|
|
|
bless { args => \@args } => $class; |
42
|
|
|
|
|
|
|
} |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
sub _net_class { |
45
|
0
|
|
|
0
|
|
|
my ($self) = @_; |
46
|
0
|
0
|
|
|
|
|
my $class = ref $self ? ref $self : $self; |
47
|
0
|
|
|
|
|
|
my ($net_class) = ($class =~ /^Test::Reporter::Transport::(.+)\z/); |
48
|
0
|
0
|
|
|
|
|
return 'Net::SMTP' if $net_class eq 'Net::SMTP::Authen'; |
49
|
0
|
|
|
|
|
|
return $net_class; |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub _perform_auth{ |
53
|
0
|
|
|
0
|
|
|
my $self = shift; |
54
|
0
|
|
|
|
|
|
my $transport = shift; |
55
|
0
|
|
|
|
|
|
my $args = $$self{args}; |
56
|
0
|
|
|
|
|
|
my %opts = ( @$args ); |
57
|
|
|
|
|
|
|
|
58
|
0
|
|
0
|
|
|
|
my ($user_name) = $opts{'User'} || $opts{'Username'}; |
59
|
0
|
|
0
|
|
|
|
my ($password) = $opts{'Password'} || $opts{'Pass'}; |
60
|
0
|
0
|
|
|
|
|
die "No user_name" unless $user_name; |
61
|
0
|
0
|
|
|
|
|
return 1 if ($self->_net_class() eq 'Net::SMTP::TLS'); |
62
|
0
|
|
|
|
|
|
return $transport->auth($user_name, $password); |
63
|
|
|
|
|
|
|
} |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
sub send { |
67
|
0
|
|
|
0
|
1
|
|
my ($self, $report, $recipients) = @_; |
68
|
0
|
|
0
|
|
|
|
$recipients ||= []; |
69
|
|
|
|
|
|
|
|
70
|
0
|
|
|
|
|
|
my $helo = $report->_maildomain(); # XXX: tight -- rjbs, 2008-04-06 |
71
|
0
|
|
|
|
|
|
my $from = $report->from(); |
72
|
0
|
|
|
|
|
|
my $via = $report->via(); |
73
|
0
|
|
|
|
|
|
my @tmprecipients = (); |
74
|
0
|
|
|
|
|
|
my @bad = (); |
75
|
0
|
|
|
|
|
|
my $smtp; |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
my $mx; |
78
|
|
|
|
|
|
|
|
79
|
0
|
|
|
|
|
|
my $transport = $self->_net_class; |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
# Sorry. Tight coupling happened before I got here. -- rjbs, 2008-04-06 |
82
|
0
|
|
|
|
|
|
for my $server (@{$report->{_mx}}) { |
|
0
|
|
|
|
|
|
|
83
|
0
|
|
|
|
|
|
eval { |
84
|
0
|
|
|
|
|
|
$smtp = $transport->new( |
85
|
|
|
|
|
|
|
$server, |
86
|
|
|
|
|
|
|
Hello => $helo, |
87
|
|
|
|
|
|
|
Timeout => $report->timeout(), |
88
|
|
|
|
|
|
|
Debug => $report->debug(), |
89
|
|
|
|
|
|
|
$report->transport_args(), |
90
|
|
|
|
|
|
|
); |
91
|
|
|
|
|
|
|
}; |
92
|
|
|
|
|
|
|
|
93
|
0
|
0
|
|
|
|
|
if (defined $smtp) { |
94
|
0
|
|
|
|
|
|
$mx = $server; |
95
|
0
|
|
|
|
|
|
last; |
96
|
|
|
|
|
|
|
} |
97
|
|
|
|
|
|
|
} |
98
|
|
|
|
|
|
|
|
99
|
0
|
0
|
0
|
|
|
|
die "Unable to connect to any MX's: $@" unless $mx && $smtp; |
100
|
|
|
|
|
|
|
|
101
|
0
|
|
|
|
|
|
my $cc_str; |
102
|
0
|
0
|
|
|
|
|
if (@$recipients) { |
103
|
0
|
0
|
|
|
|
|
if ($mx =~ /(?:^|\.)(?:perl|cpan)\.org$/) { |
104
|
0
|
|
|
|
|
|
for my $recipient (sort @$recipients) { |
105
|
0
|
0
|
|
|
|
|
if ($recipient =~ /(?:@|\.)(?:perl|cpan)\.org$/) { |
106
|
0
|
|
|
|
|
|
push @tmprecipients, $recipient; |
107
|
|
|
|
|
|
|
} else { |
108
|
0
|
|
|
|
|
|
push @bad, $recipient; |
109
|
|
|
|
|
|
|
} |
110
|
|
|
|
|
|
|
} |
111
|
|
|
|
|
|
|
|
112
|
0
|
0
|
|
|
|
|
if (@bad) { |
113
|
0
|
|
|
|
|
|
warn __PACKAGE__, ": Will not attempt to cc the following recipients since perl.org MX's will not relay for them. Either use Test::Reporter::Transport::Mail::Send, use other MX's, or only cc address ending in cpan.org or perl.org: ${\(join ', ', @bad)}.\n"; |
|
0
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
} |
115
|
|
|
|
|
|
|
|
116
|
0
|
|
|
|
|
|
$recipients = \@tmprecipients; |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
|
119
|
0
|
|
|
|
|
|
$cc_str = join ', ', @$recipients; |
120
|
0
|
|
|
|
|
|
chomp $cc_str; |
121
|
0
|
|
|
|
|
|
chomp $cc_str; |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
0
|
0
|
|
|
|
|
$via = ', via ' . $via if $via; |
125
|
|
|
|
|
|
|
|
126
|
0
|
|
|
|
|
|
my $envelope_sender = $from; |
127
|
0
|
|
|
|
|
|
$envelope_sender =~ s/\s\([^)]+\)$//; # email only; no name |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
# Net::SMTP returns 1 or undef for pass/fail |
130
|
|
|
|
|
|
|
# Net::SMTP::TLS croaks on fail but may not return 1 on pass |
131
|
|
|
|
|
|
|
# so this closure lets us die on an undef return only for Net::SMTP |
132
|
0
|
0
|
|
0
|
|
|
my $die = sub { die $smtp->message if ref $smtp eq 'Net::SMTP' }; |
|
0
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
|
135
|
0
|
0
|
|
|
|
|
eval { |
136
|
0
|
|
|
|
|
|
trace(1); |
137
|
0
|
0
|
|
|
|
|
$self->_perform_auth($smtp) or $die->(); |
138
|
0
|
|
|
|
|
|
trace(); |
139
|
|
|
|
|
|
|
|
140
|
0
|
0
|
|
|
|
|
$smtp->mail($envelope_sender) or $die->(); |
141
|
0
|
|
|
|
|
|
trace(); |
142
|
0
|
0
|
|
|
|
|
$smtp->to($report->address) or $die->(); |
143
|
0
|
|
|
|
|
|
trace(); |
144
|
0
|
0
|
|
|
|
|
if ( @$recipients ) { $smtp->cc(@$recipients) or $die->() }; |
|
0
|
0
|
|
|
|
|
|
145
|
0
|
|
|
|
|
|
trace(); |
146
|
0
|
0
|
|
|
|
|
$smtp->data() or $die->(); |
147
|
0
|
|
|
|
|
|
trace(); |
148
|
0
|
0
|
|
|
|
|
$smtp->datasend("Date: ", $self->_format_date, "\n") or $die->(); |
149
|
0
|
|
|
|
|
|
trace(); |
150
|
0
|
0
|
|
|
|
|
$smtp->datasend("Subject: ", $report->subject, "\n") or $die->(); |
151
|
0
|
|
|
|
|
|
trace(); |
152
|
0
|
0
|
|
|
|
|
$smtp->datasend("From: $from\n") or $die->(); |
153
|
0
|
|
|
|
|
|
trace(); |
154
|
0
|
0
|
|
|
|
|
$smtp->datasend("To: ", $report->address, "\n") or $die->(); |
155
|
0
|
|
|
|
|
|
trace(); |
156
|
0
|
0
|
|
|
|
|
if ( @$recipients ) { $smtp->datasend("Cc: $cc_str\n") or $die->() }; |
|
0
|
0
|
|
|
|
|
|
157
|
0
|
|
|
|
|
|
trace(); |
158
|
0
|
0
|
|
|
|
|
$smtp->datasend("Message-ID: ", $report->message_id(), "\n") or $die->(); |
159
|
0
|
|
|
|
|
|
trace(); |
160
|
0
|
0
|
|
|
|
|
$smtp->datasend("X-Reported-Via: Test::Reporter $Test::Reporter::VERSION$via\n") or $die->(); |
161
|
0
|
|
|
|
|
|
trace(); |
162
|
0
|
0
|
|
|
|
|
$smtp->datasend("\n") or $die->(); |
163
|
0
|
|
|
|
|
|
trace(); |
164
|
0
|
|
|
|
|
|
trace(); |
165
|
0
|
0
|
|
|
|
|
$smtp->datasend($report->report()) or $die->(); |
166
|
0
|
|
|
|
|
|
trace(); |
167
|
0
|
0
|
|
|
|
|
$smtp->dataend() or $die->(); |
168
|
0
|
|
|
|
|
|
trace(); |
169
|
0
|
0
|
|
|
|
|
$smtp->quit or $die->(); |
170
|
0
|
|
|
|
|
|
trace(); |
171
|
0
|
|
|
|
|
|
1; |
172
|
|
|
|
|
|
|
} or die "$transport - $@"; |
173
|
|
|
|
|
|
|
|
174
|
0
|
|
|
|
|
|
return 1; |
175
|
|
|
|
|
|
|
} |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
1; |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
sub trace{ |
180
|
0
|
|
|
0
|
0
|
|
my $mess = shift; |
181
|
0
|
|
|
|
|
|
my ($package, $file, $line, $func) = caller 1; |
182
|
0
|
|
|
|
|
|
my ($package1, $file1, $line1, $func1) = caller 0; |
183
|
|
|
|
|
|
|
#print STDERR "[$line:$line1] "; |
184
|
|
|
|
|
|
|
} |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
__END__ |