Skip to content

Commit 03ec78c

Browse files
authored
Merge pull request #3531 from metacpan/fix-3513
Make CVEs available in the UI
2 parents 0c1e2dd + 35b4bb6 commit 03ec78c

File tree

7 files changed

+114
-1
lines changed

7 files changed

+114
-1
lines changed

lib/MetaCPAN/Web/Model/API/CVE.pm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package MetaCPAN::Web::Model::API::CVE;
2+
use Moose;
3+
extends 'MetaCPAN::Web::Model::API';
4+
5+
sub get {
6+
my ( $self, $author, $release ) = @_;
7+
$self->request("/cve/release/$author/$release")->then( sub {
8+
my $data = shift;
9+
Future->done( { cves => $data->{cve} || [] } );
10+
} );
11+
}
12+
13+
__PACKAGE__->meta->make_immutable;
14+
1;

lib/MetaCPAN/Web/Model/ReleaseInfo.pm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ my %models = (
2121
_changes => 'API::Changes',
2222
_favorite => 'API::Favorite',
2323
_permission => 'API::Permission',
24+
_cve => 'API::CVE',
2425
);
2526

2627
has [ keys %models ] => ( is => 'ro' );
@@ -69,6 +70,9 @@ sub _fetch {
6970
[
7071
coverage => $self->_release->coverage( $author, $release )
7172
],
73+
[
74+
cves => $self->_cve->get( $author, $release )
75+
],
7276
);
7377
},
7478
)->with_dist(

perlimports.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# preserve_unused disabled.
1111

1212
cache = false # setting this to true is currently discouraged
13-
ignore_modules = ["Catalyst::Runtime","namespace::clean", "Test::More", "Type::Library", "With::Roles"]
13+
ignore_modules = ["Catalyst::Runtime","namespace::clean", "Test::More", "Test2::V0", "Type::Library", "With::Roles"]
1414
ignore_modules_filename = ""
1515
ignore_modules_pattern = "" # regex like "^(Foo|Foo::Bar)"
1616
ignore_modules_pattern_filename = ""

root/base/release.tx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@
232232
%% }
233233
%% override content -> {
234234

235+
%% include inc::cve_banner;
235236
%% include inc::notification;
236237

237238
%% block page_content -> { }

root/inc/cve_banner.tx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
%% if $cves && $cves.size() {
2+
<details class="cve-banner">
3+
<summary class="cve-summary">
4+
<i class="fa fa-shield" aria-hidden="true"></i>
5+
<strong>Security Advisories ([% $cves.size() %])</strong>
6+
</summary>
7+
<div class="cve-body">
8+
%% for $cves -> $cve {
9+
<div class="cve-entry">
10+
<div class="cve-header">
11+
<strong>
12+
%% if $cve.cves.size() {
13+
[% $cve.cves.join(', ') %]
14+
%% }
15+
%% else {
16+
[% $cve.cpansa_id %]
17+
%% }
18+
</strong>
19+
%% if $cve.reported {
20+
([% $cve.reported %])
21+
%% }
22+
</div>
23+
<p>[% $cve.description %]</p>
24+
%% if $cve.references.size() {
25+
<ul class="cve-references">
26+
%% for $cve.references -> $ref {
27+
<li><a rel="noopener nofollow" href="[% $ref %]">[% $ref %]</a></li>
28+
%% }
29+
</ul>
30+
%% }
31+
</div>
32+
%% }
33+
</div>
34+
</details>
35+
%% }

root/static/less/notification.less

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,36 @@ label.remove-notification {
4848
.notify-MODULE_DEPRECATED {
4949
background: #f8d7da;
5050
}
51+
52+
.cve-banner {
53+
border: 1px solid @alert-danger-border;
54+
border-radius: 4px;
55+
margin-bottom: 15px;
56+
}
57+
58+
.cve-summary {
59+
display: list-item;
60+
background: @alert-danger-bg;
61+
color: @alert-danger-text;
62+
padding: 8px 12px;
63+
cursor: pointer;
64+
}
65+
66+
.cve-body {
67+
padding: 10px 12px;
68+
}
69+
70+
.cve-entry + .cve-entry {
71+
border-top: 1px solid #eee;
72+
padding-top: 8px;
73+
margin-top: 8px;
74+
}
75+
76+
ul.cve-references {
77+
margin-bottom: 0;
78+
list-style: disc;
79+
}
80+
81+
ul.cve-references a {
82+
word-break: break-all;
83+
}

t/model/api/cve.t

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use strict;
2+
use warnings;
3+
use lib 't/lib';
4+
5+
use MetaCPAN::Web ();
6+
use Test::More;
7+
8+
my $model = MetaCPAN::Web->model('API::CVE');
9+
10+
subtest 'has cves' => sub {
11+
my $result = $model->get( 'SRI', 'Mojolicious-9.30' )->get;
12+
my $cve = $result->{cves}[1];
13+
ok( $cve->{cpansa_id}, 'cpansa_id' );
14+
ok( $cve->{cves}, 'cves' );
15+
ok( $cve->{description}, 'description' );
16+
is( $cve->{severity}, undef, 'undef severity' );
17+
ok( $cve->{reported}, 'reported date' );
18+
ok( $cve->{references}, 'references' );
19+
};
20+
21+
subtest 'no cves' => sub {
22+
my $empty = $model->get( 'OALDERS', 'HTML-Restrict-3.0.2' )->get;
23+
is_deeply( $empty->{cves}, [], 'cve list is empty' );
24+
};
25+
26+
done_testing;

0 commit comments

Comments
 (0)