68 lines
1.5 KiB
Perl
68 lines
1.5 KiB
Perl
package CPAN::Audit::Query;
|
|
use strict;
|
|
use warnings;
|
|
use CPAN::Audit::Version;
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my (%params) = @_;
|
|
|
|
my $self = {};
|
|
bless $self, $class;
|
|
|
|
$self->{db} = $params{db} || {};
|
|
|
|
return $self;
|
|
}
|
|
|
|
sub advisories_for {
|
|
my $self = shift;
|
|
my ( $distname, $version_range ) = @_;
|
|
|
|
my $dist = $self->{db}->{dists}->{$distname};
|
|
return unless $dist;
|
|
|
|
my @advisories = @{ $dist->{advisories} };
|
|
my @versions = @{ $dist->{versions} };
|
|
|
|
if ( !$version_range ) {
|
|
return @advisories;
|
|
}
|
|
|
|
my $version_checker = CPAN::Audit::Version->new;
|
|
|
|
my @all_versions = map { $_->{version} } @versions;
|
|
my @selected_versions;
|
|
|
|
foreach my $version (@all_versions) {
|
|
if ( $version_checker->in_range( $version, $version_range ) ) {
|
|
push @selected_versions, $version;
|
|
}
|
|
}
|
|
|
|
if ( !@selected_versions ) {
|
|
return;
|
|
}
|
|
|
|
my @matched_advisories;
|
|
foreach my $advisory (@advisories) {
|
|
my @affected_versions = $version_checker->affected_versions( \@all_versions, $advisory->{affected_versions} );
|
|
next unless @affected_versions;
|
|
|
|
foreach my $affected_version ( reverse @affected_versions ) {
|
|
if ( $version_checker->in_range( $affected_version, $version_range ) ) {
|
|
push @matched_advisories, $advisory;
|
|
last;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !@matched_advisories ) {
|
|
return;
|
|
}
|
|
|
|
return @matched_advisories;
|
|
}
|
|
|
|
1;
|