# duck - check for various urls in file # Copyright (C) 2016 Simon Kainz # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # he Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # On Debian GNU/Linux systems, the complete text of the GNU General # Public License can be found in `/usr/share/common-licenses/GPL-2'. # # You should have received a copy of the GNU General Public License # along with this program. If not, you can find it on the World Wide # Web at https://www.gnu.org/copyleft/gpl.html, or write to the Free # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, # MA 02110-1301, USA. package DUCK::list_file; use strict; use warnings; use autodie; use Data::Dumper; use Parse::DebControl qw(parse_file); use Regexp::Common qw /URI Email::Address/; use Mail::Address; use DUCK; my %options=( "l:" => " -l file\tspecify path to list file"); sub opts() { return keys %options; } sub desc() { my $r; foreach (sort keys %options) { $r.=$options{$_}."\n"; } return $r; } sub run() { my ($sname,$params,$entries_ref)=@_; my %opt=%$params; if ($opt{l}) { if (! -r $opt{l}) { print STDERR "Unable to open user-specified list file: ".$opt{l}."\n"; exit(2); } #processing list file my $list_fn=($opt{l}); my @list_raw; if (open my $fh,"<",$list_fn) { @list_raw=<$fh>; close($fh); chomp @list_raw; } my $linenum=0; foreach my $list_line (@list_raw) { $linenum++; $list_line =~ s/^[*\s#\-|\/\.]*//; $list_line =~ s/[\s#\-|\)*]*$//; next unless length($list_line); my $cc=DUCK->extract_url($list_line); if ($cc) { my $list_line_mangled =$cc; $list_line_mangled =~ s/,$//; #Strip trailing commas. my $check_method="URL"; my $guess_info=""; my $certainty="possible"; my $verbose=""; push (@$entries_ref, [$guess_info.$list_fn.":".$linenum,$check_method,$list_line_mangled,$list_line, {filename => $list_fn, linenumber => $linenum, checkmethod =>$check_method, orig_line => $list_line, url=>$list_line_mangled, verbose =>$verbose, certainty=>$certainty} ]); } else { if ($list_line =~ /^\s*svn/) { my $list_line_mangled =$list_line; $list_line_mangled =~ s/,$//; #Strip trailing commas. my $check_method="Vcs-Svn"; my $guess_info=""; my $certainty="possible"; my $verbose=""; push (@$entries_ref, [$guess_info.$list_fn.":".$linenum,$check_method,$list_line_mangled,$list_line, {filename => $list_fn, linenumber => $linenum, checkmethod =>$check_method, orig_line => $list_line, url=>$list_line_mangled, verbose =>$verbose, certainty=>$certainty} ]); } if ($list_line =~ /^\s*git/) { my $list_line_mangled =$list_line; $list_line_mangled =~ s/,$//; #Strip trailing commas. my $check_method="Vcs-Git"; my $guess_info=""; my $certainty="possible"; my $verbose=""; push (@$entries_ref, [$guess_info.$list_fn.":".$linenum,$check_method,$list_line_mangled,$list_line, {filename => $list_fn, linenumber => $linenum, checkmethod =>$check_method, orig_line => $list_line, url=>$list_line_mangled, verbose =>$verbose, certainty=>$certainty} ]); } if ($list_line =~ /[^\s.]@[^\s.]/) { my $list_line_mangled =$list_line; $list_line_mangled =~ s/[\*\#|<>\(\)\/]/ /g; $list_line_mangled =~ s/\s\s*/ /g; next unless length($list_line_mangled); my @emails = ($list_line_mangled =~ /$RE{Email}{Address}{-keep}/go ); if (@emails && (!($list_line =~ /Message-id:/i ))) { my @parsed = map $_->address,Mail::Address->parse(@emails); foreach (@parsed) { push (@$entries_ref, [$list_fn.":".$linenum,"Email",$_,$list_line_mangled, {filename => $list_fn,linenumber => $linenum, checkmethod =>"Email", orig_line => $list_line, url=>$_, certainty=>"possible"} ]); } } } } } } return; } 1;