Files
scripts/Perl OTRS/Kernel/cpan-lib/CPAN/Audit/Query.pm
2024-10-14 00:08:40 +02:00

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;