| line | % | coverage | condition |
| 595 | 100 | | Params::Get::get_params(undef, \@_) || {} |
| 619 | 33 | | $HAS_CHI and not $_cache |
| 758 | 50 | | $text // "" |
| 771 | 67 | | defined $text and $text =~ /\S/ |
| 857 | 100 | | $self->{'_origin'} //= $self->_find_origin |
| 945 | 67 | | $self->{'_urls'} //= $self->_extract_and_resolve_urls |
| 1027 | 67 | | $self->{'_mailto_domains'} //= $self->_extract_and_analyse_domains |
| 1095 | 33 | | $dom and not $seen{$dom}++ |
| 1100 | 33 | | _registrable($d->{'domain'}) // $d->{'domain'} |
| 1101 | 67 | | $dom and not $seen{$dom}++ |
| 1180 | 50 | | $c->{'address'} // "" |
| 1188 | 33 | | $u->{'abuse'} and $u->{'abuse'} ne "(unknown)" |
| 1208 | 50 | | $d->{'source'} // "" |
| 1462 | 50 | | $FLAG_WEIGHT{$severity} // 1 |
| 1470 | 100 | | $orig->{'rdns'} and $orig->{'rdns'} =~ /
\d+[-_.]\d+[-_.]\d+[-_.]\d+ # dotted-quad in rDNS
| (?:dsl|adsl|cable|broad|dial|dynamic|dhcp|ppp|
residential|cust|home|pool|client|user|
static\d|host\d)
/xi |
| 1481 | 100 | | not $orig->{'rdns'} or $orig->{'rdns'} eq "(no reverse DNS)" |
| 1493 | 100 | | $orig->{'country'} and $orig->{'country'} =~ /^(?:CN|RU|NG|VN|IN|PK|BD)$/ |
| 1514 | 100 | | defined $auth->{'dkim'} and not $auth->{'dkim'} =~ /^pass/i |
| 1518 | 100 | | defined $auth->{'dmarc'} and not $auth->{'dmarc'} =~ /^pass/i |
| 1524 | 50 | | $self->_header_value("from") // "" |
| 1526 | 33 | | _registrable($auth->{'dkim_domain'}) // $auth->{'dkim_domain'} |
| 1527 | 33 | | _registrable(lc $from_domain) // lc $from_domain |
| 1530 | 67 | | $auth->{'dkim'} and $auth->{'dkim'} =~ /^pass/i |
| 1546 | 67 | | $date_raw && $date_raw =~ /\S/ |
| 1554 | 100 | | $mm >= 60 || $sign eq '+' && $offset_mins > $TZ_MAX_POS_MINS || $sign eq '-' && $offset_mins > $TZ_MAX_NEG_MINS |
| 1579 | 100 | | $self->_header_value("from") // "" |
| 1588 | 50 | | $addr_domain // "" |
| 1591 | 25 | | $reg_disp and $reg_addr and $reg_disp ne $reg_addr |
| 1599 | 100 | | $from_raw =~ /\@(gmail|yahoo|hotmail|outlook|live|aol|protonmail|yandex)\./i or $from_raw =~ /\@mail\.ru(?:[\s>]|$)/i |
| 1610 | 50 | | $from_addr and $reply_addr and lc $from_addr ne lc $reply_addr |
| 1617 | 100 | | $self->_header_value("to") // "" |
| 1618 | 100 | | $to =~ /undisclosed|:;/ or $to eq "" |
| 1624 | 100 | | $self->_header_value("subject") // "" |
| 1641 | 40 | | A | B | C | dec |
|---|
| 0 | 0 | X | 0 | | 0 | 1 | 0 | 0 | | 0 | 1 | 1 | 1 | | 1 | X | 0 | 0 | | 1 | X | 1 | 1 |
| $URL_SHORTENERS{$bare} || $self->{'url_shorteners'}{$bare} and not $shortener_seen{$bare}++ |
| 1646 | 67 | | $u->{'url'} =~ m[^http://]i and not $url_host_seen{$u->{'host'}}++ |
| 1665 | 100 | | $remaining > 0 and $remaining < $EXPIRY_WARN_DAYS * $SECS_PER_DAY |
| 1679 | 100 | | $d->{'domain'} =~ /\Q$brand\E/i and not $d->{'domain'} =~ /^\Q$brand\E\.(?:com|co\.uk|net|org)$/ |
| 1905 | 50 | | $args{'address'} // "" |
| 1906 | 67 | | $addr and $addr =~ /\@/ |
| 1912 | 75 | | $pa and $pa->{'form'} and not $pa->{'email'} |
| 1961 | 67 | | $orig->{'abuse'} and $orig->{'abuse'} ne "(unknown)" |
| 1989 | 67 | | $u->{'abuse'} and $u->{'abuse'} ne "(unknown)" |
| 2016 | 100 | | $d->{'web_org'} // "(unknown org)" |
| 50 | | $dom // "(unknown domain)" |
| 100 | | $d->{'web_ip'} // "(unknown IP)" |
| 2029 | 100 | | $d->{'mx_org'} // "(unknown org)" |
| 100 | | $d->{'mx_host'} // "(unknown host)" |
| 100 | | $d->{'mx_ip'} // "(unknown IP)" |
| 2042 | 100 | | $d->{'ns_org'} // "(unknown org)" |
| 100 | | $d->{'ns_host'} // "(unknown host)" |
| 100 | | $d->{'ns_ip'} // "(unknown IP)" |
| 2052 | 100 | | $d->{'source'} =~ /^(?:From:|Return-Path:|Sender:) header$/ && !scalar(grep {_registrable($_->{'host'}) eq (_registrable($dom) // $dom) if $_->{'host'};} $self->embedded_urls) |
| 2059 | 100 | | $d->{'registrar'} // "(unknown)" |
| 2068 | 100 | | $self->_header_value($hname) // (next) |
| 2135 | 67 | | $pa and $pa->{'email'} |
| 2137 | 33 | | $example_addr //= "\@$addr_dom" |
| 2229 | 50 | | $args{'form'} // "" |
| 2239 | 67 | | $pa and $pa->{'form'} |
| 2245 | 0 | | $pa->{'form_upload'} // "" |
| 0 | | $pa->{'note'} // "" |
| 0 | | $pa->{'form_paste'} // "" |
| 2256 | 67 | | $pa and $pa->{'form'} |
| 2263 | 0 | | $pa->{'form_upload'} // "" |
| 0 | | $pa->{'note'} // "" |
| 0 | | $pa->{'form_paste'} // "" |
| 2273 | 33 | | $pa and $pa->{'form'} |
| 2280 | 0 | | $pa->{'form_upload'} // "" |
| 0 | | $pa->{'note'} // "" |
| 0 | | $pa->{'form_paste'} // "" |
| 2286 | 67 | | $d->{'registrar_abuse'} and $d->{'registrar_abuse'} =~ /\@([\w.-]+)/ |
| 2289 | 100 | | $rpa and $rpa->{'form'} |
| 2296 | 50 | | $rpa->{'form_upload'} // "" |
| 50 | | $rpa->{'note'} // "" |
| 50 | | $rpa->{'form_paste'} // "" |
| 2305 | 100 | | $self->_header_value($hname) // (next) |
| 2312 | 67 | | $pa and $pa->{'form'} |
| 2320 | 0 | | $pa->{'form_upload'} // "" |
| 0 | | $pa->{'note'} // "" |
| 0 | | $pa->{'form_paste'} // "" |
| 2330 | 33 | | $pa and $pa->{'form'} |
| 2336 | 0 | | $pa->{'form_upload'} // "" |
| 0 | | $pa->{'note'} // "" |
| 0 | | $pa->{'form_paste'} // "" |
| 2351 | 0 | | $pa and $pa->{'form'} |
| 2357 | 0 | | $pa->{'form_upload'} // "" |
| 0 | | $pa->{'note'} // "" |
| 0 | | $pa->{'form_paste'} // "" |
| 2498 | 0 | | _sanitise_output($hop->{'ip'}) // "(unknown)" |
| 2530 | 67 | | $URL_SHORTENERS{$bare} || $self->{'url_shorteners'}{$bare} |
| 2626 | 100 | | defined $line and length "$line $w" > $ROLE_WRAP_LEN |
| 2712 | 33 | | defined $header_block and $header_block =~ /\S/ |
| 2713 | 100 | | $body_raw //= "" |
| 2781 | 50 | | defined $ip or defined $for_addr or defined $srv_id |
| 2816 | 50 | | $depth //= 0 |
| 2848 | 100 | | $phdr{'content-type'} // "" |
| 2849 | 100 | | $phdr{'content-transfer-encoding'} // "" |
| 2865 | 100 | | $pct =~ /text/i or not $pct |
| 2889 | 100 | | $cte //= "" |
| 2892 | 100 | | $body // "" |
| 2929 | 100 | | $self->_extract_ip_from_received($hdr) // (next) |
| 3009 | 100 | | defined $ip and $ip ne "" |
| 3073 | 33 | | $HAS_ANYEVENT_DNS and scalar keys %hostname_needed > 1 |
| 3089 | 100 | | $self->_resolve_host($host) // "(unresolved)" |
| 3096 | 33 | | _registrable($host) // $host |
| 3106 | 100 | | $whois->{'country'} // undef |
| 100 | | $whois->{'org'} // "(unknown)" |
| 100 | | $whois->{'abuse'} // "(unknown)" |
| 3188 | 100 | | $attrs{$attr} // "" |
| 3245 | 100 | | $self->_header_value($hname) // (next) |
| 3247 | 33 | | _registrable($dom) // $dom |
| 3255 | 33 | | $hop->{'for'} and $hop->{'for'} =~ /\@([\w.-]+)/ |
| 3257 | 0 | | _registrable($dom) // $dom |
| 3270 | 67 | | _registrable($dom) // $dom |
| 3286 | 100 | | $self->_header_value($hname) // (next) |
| 3293 | 67 | | $mid and $mid =~ /\@([\w.-]+)/ |
| 3295 | 67 | | _registrable($mid_dom) // $mid_dom |
| 3297 | 40 | | A | B | C | D | dec |
|---|
| 0 | 0 | 0 | 0 | 0 | | 0 | 0 | 0 | 1 | 1 | | 0 | 0 | 1 | X | 1 | | 0 | 1 | X | X | 1 | | 1 | X | X | X | 1 |
| $TRUSTED_DOMAINS{$mid_dom} or $TRUSTED_DOMAINS{$mid_reg} or $self->{'trusted_domains'}{$mid_dom} or $self->{'trusted_domains'}{$mid_reg} |
| 3302 | 100 | | $auth->{'dkim_domains'} // [] |
| 3476 | 100 | | not $info{'registrar_abuse'} and $domain_whois =~ /$pat/ |
| 3488 | 100 | | not $info{'registered'} and $domain_whois =~ /$pat/ |
| 3499 | 100 | | not $info{'expires'} and $domain_whois =~ /$pat/ |
| 3507 | 67 | | $epoch and time - $epoch < $RECENT_REG_DAYS * $SECS_PER_DAY |
| 3582 | 0 | | $ip // "" |
| 3658 | 33 | | $_cache and $result |
| 3677 | 100 | | $self->_raw_whois($domain, "whois.iana.org") // (return undef) |
| 3698 | 100 | | $self->_domain_whois($domain) // (return {}) |
| 3709 | 67 | | not $info{'abuse'} and $raw =~ /$pat/ |
| 3753 | 0 | | $res and $res->is_success |
| 3799 | 50 | | $server //= "whois.iana.org" |
| 3830 | 50 | | $@ or not defined $n or $n <= 0 |
| 3834 | 33 | | defined $n and $n > 0 |
| 3839 | 50 | | $response || undef |
| 3864 | 100 | | not $info{'org'} and $text =~ /$pat/ |
| 3874 | 100 | | not $info{'abuse'} and $text =~ /$pat/ |
| 3880 | 67 | | $info{'abuse'} //= $1 |
| 3949 | 67 | | $preferred // $dkim_domains[0] |
| 4028 | 100 | | $host and $host =~ /\./ |
| 4042 | 100 | | $labels[-1] =~ /^[a-z]{2}$/ and $labels[-2] =~ /^(?:co|com|net|org|gov|edu|ac|me)$/ |
| 4077 | 100 | | $whois->{'country'} // undef |
| 100 | | $rdns // "(no reverse DNS)" |
| 100 | | $whois->{'org'} // "(unknown)" |
| 100 | | $whois->{'abuse'} // "(unknown)" |
| 4120 | 50 | | defined $prefix and $prefix =~ /^\d+$/ and $prefix <= 32 |
| 4124 | 50 | | inet_aton($net_addr) // (return 0) |
| 4125 | 50 | | inet_aton($ip) // (return 0) |
| 4210 | 100 | | $Readonly::Values::Months::months{lc $2} // 0 |
| 4213 | 75 | | $y and $m and $d |
| 4243 | 50 | | $Readonly::Values::Months::months{lc $2} // 0 |
| 4272 | 67 | | $names{$cc} // $cc |