File Coverage

blib/lib/Mail/BIMI/App/Command/checkrecord.pm
Criterion Covered Total %
statement 66 74 89.1
branch 11 16 68.7
condition 7 13 53.8
subroutine 14 14 100.0
pod 5 5 100.0
total 103 122 84.4


line stmt bran cond sub pod time code
1             package Mail::BIMI::App::Command::checkrecord;
2             # ABSTRACT: Validate a given BIMI assertion record
3             our $VERSION = '3.20210301'; # VERSION
4 2     2   2268 use 5.20.0;
  2         8  
5 2     2   51 BEGIN { $ENV{MAIL_BIMI_CACHE_DEFAULT_BACKEND} = 'Null' };
6 2     2   13 use Mail::BIMI::Prelude;
  2         5  
  2         17  
7 2     2   572 use Mail::BIMI::App -command;
  2         5  
  2         17  
8 2     2   777 use Mail::BIMI;
  2         8  
  2         49  
9 2     2   21 use Mail::BIMI::Indicator;
  2         6  
  2         47  
10 2     2   10 use Mail::BIMI::Record;
  2         5  
  2         46  
11 2     2   11 use Mail::DMARC;
  2         3  
  2         57  
12 2     2   13 use Term::ANSIColor qw{ :constants };
  2         3  
  2         1960  
13              
14              
15 1     1 1 626 sub description { 'Check a given BIMI assertion record' }
16 7     7 1 67289 sub usage_desc { "%c checkrecord %o <RECORD>" }
17              
18             sub opt_spec {
19             return (
20 7     7 1 57 [ 'profile=s', 'SVG Profile to validate against ('.join('|',@Mail::BIMI::Indicator::VALIDATOR_PROFILES).')' ],
21             [ 'domain=s', 'Optional domain' ],
22             );
23             }
24              
25 6     6 1 4444 sub validate_args($self,$opt,$args) {
  6         14  
  6         13  
  6         11  
  6         9  
26 6 100       30 $self->usage_error('No Record specified') if !@$args;
27 5 100       23 $self->usage_error('Multiple Records specified') if scalar @$args > 1;
28 4 100 100     14 $self->usage_error('Unknown SVG Profile') if $opt->profile && !grep {;$_ eq $opt->profile} @Mail::BIMI::Indicator::VALIDATOR_PROFILES;
  9         55  
29             }
30              
31 3     3 1 34 sub execute($self,$opt,$args) {
  3         7  
  3         4  
  3         5  
  3         6  
32 3         7 my $check_record = $args->[0];
33 3   50     8 my $domain = $opt->domain // '-none-';
34              
35 3         39 my $dmarc = Mail::DMARC::PurePerl->new;
36 3   50     49 $dmarc->header_from($opt->domain // 'reject.test.fastmaildmarc.com');
37 3         1062 $dmarc->validate;
38 3         746724 $dmarc->result->result('pass');
39 3 50       103 my $bimi = Mail::BIMI->new(
    100          
40             dmarc_object => $dmarc,
41             domain => $domain,
42             options => {
43             force_record => $check_record,
44             vmc_no_check_alt => $opt->domain ? 0 : 1,
45             ( $opt->profile ? ( svg_profile => $opt->profile ) : () ),
46             }
47             );
48              
49 3         2054 my $record = $bimi->record;
50             # my $record = Mail::BIMI::Record->new( domain => $domain, selector => $selector );
51 3         26 say "BIMI domain checker";
52 3         70 say '';
53 3         35 say 'Requested:';
54 3         83 say YELLOW.' Domain '.WHITE.': '.CYAN.$domain.RESET;
55 3         301 say YELLOW.' Record '.WHITE.': '.CYAN.$check_record.RESET;
56 3         187 say '';
57 3         52 $record->app_validate;
58 3 50 33     281 if ( $record->location && $record->location->indicator ) {
59 0         0 say '';
60 0         0 $record->location->indicator->app_validate;
61             }
62 3 50 33     67 if ( $record->authority && $record->authority->vmc ) {
63 0         0 say '';
64 0         0 $record->authority->vmc->app_validate;
65 0 0       0 if ( $record->authority->vmc->indicator ) {
66 0         0 say '';
67 0         0 $record->authority->vmc->indicator->app_validate;
68             }
69             }
70 3         10 say '';
71              
72 3         41 say 'An authenticated email with this record would receive the following BIMI results:';
73 3         40 say '';
74 3         107 my $result = $bimi->result;
75 3         14 say "Authentication-Results: authservid.example.com; ".$result->get_authentication_results;
76 3         1708 my $headers = $result->headers;
77 3         12 foreach my $header ( sort keys $headers->%* ) {
78 0         0 say "$header: ".$headers->{$header};
79             }
80              
81 3         10 $bimi->finish;
82             }
83              
84             1;
85              
86             __END__
87              
88             =pod
89              
90             =encoding UTF-8
91              
92             =head1 NAME
93              
94             Mail::BIMI::App::Command::checkrecord - Validate a given BIMI assertion record
95              
96             =head1 VERSION
97              
98             version 3.20210301
99              
100             =head1 DESCRIPTION
101              
102             App::Cmd class implementing the 'mailbimi checkdomain' command
103              
104             =head1 REQUIRES
105              
106             =over 4
107              
108             =item * L<Mail::BIMI|Mail::BIMI>
109              
110             =item * L<Mail::BIMI::App|Mail::BIMI::App>
111              
112             =item * L<Mail::BIMI::Indicator|Mail::BIMI::Indicator>
113              
114             =item * L<Mail::BIMI::Prelude|Mail::BIMI::Prelude>
115              
116             =item * L<Mail::BIMI::Record|Mail::BIMI::Record>
117              
118             =item * L<Mail::DMARC|Mail::DMARC>
119              
120             =item * L<Term::ANSIColor|Term::ANSIColor>
121              
122             =back
123              
124             =head1 AUTHOR
125              
126             Marc Bradshaw <marc@marcbradshaw.net>
127              
128             =head1 COPYRIGHT AND LICENSE
129              
130             This software is copyright (c) 2020 by Marc Bradshaw.
131              
132             This is free software; you can redistribute it and/or modify it under
133             the same terms as the Perl 5 programming language system itself.
134              
135             =cut