Skip to content

Commit 0b569cb

Browse files
tym83claude
andcommitted
feat: add Security Summary page under OSS Health
- Add "OSS Health > Security Summary" menu item - Create /oss-health/security/ page showing monthly security report - Display cards (new, fixed, in-progress, total tracked) and tables for fixed vulnerabilities, in-progress fixes, and accepted risks - Data source: data/security/monthly.json (updated by security scanner) - Styled consistently with the rest of the site Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> -e Signed-off-by: tym83 <6355522@gmail.com>
1 parent 28ae3dc commit 0b569cb

8 files changed

Lines changed: 246 additions & 0 deletions

File tree

assets/scss/_security.scss

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/* security summary page */
2+
3+
.security-page {
4+
margin-top: 4rem;
5+
6+
@include media-breakpoint-down(sm) {
7+
margin-top: 2rem;
8+
}
9+
10+
.security-card {
11+
border: none;
12+
border-radius: 0.75rem;
13+
transition: transform 0.15s ease;
14+
15+
&:hover {
16+
transform: translateY(-2px);
17+
}
18+
19+
.security-icon {
20+
font-size: 1.75rem;
21+
color: $primary;
22+
margin-bottom: 0.5rem;
23+
}
24+
25+
.security-value {
26+
font-size: 2.5rem;
27+
font-weight: 700;
28+
color: $cozy-black;
29+
line-height: 1.2;
30+
}
31+
32+
.security-label {
33+
font-size: 0.95rem;
34+
font-weight: 600;
35+
color: $cozy-mid-gray;
36+
text-transform: uppercase;
37+
letter-spacing: 0.05em;
38+
margin-top: 0.25rem;
39+
}
40+
}
41+
42+
.table code {
43+
color: $primary;
44+
font-weight: 500;
45+
background: rgba($primary, 0.06);
46+
padding: 0.15rem 0.4rem;
47+
border-radius: 0.25rem;
48+
}
49+
}

assets/scss/main.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,4 @@ a {
149149
@import "announcement-banner";
150150
@import "tabs_alerts";
151151
@import "override-docsy-tabs";
152+
@import "security";

content/en/oss-health/_index.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: OSS Health
3+
description: Open source project health metrics for Cozystack
4+
type: oss-health
5+
---
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
title: Security Summary
3+
description: Monthly public security summary for the Cozystack project
4+
type: oss-health
5+
layout: security
6+
---

data/security/monthly.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"month": "",
3+
"generated_at": "",
4+
"new_count": 0,
5+
"fixed": [],
6+
"in_progress": [],
7+
"accepted_risk": [],
8+
"stats": {
9+
"total_tracked": 0,
10+
"total_triaged": 0,
11+
"false_positives": 0
12+
}
13+
}

hugo.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,13 @@ params:
178178

179179
menus:
180180
main:
181+
- name: OSS Health
182+
weight: 3
183+
identifier: oss-health
184+
- name: Security Summary
185+
parent: oss-health
186+
url: /oss-health/security/
187+
weight: 1
181188
- name: Enterprise support
182189
url: /support
183190
weight: 5

layouts/oss-health/baseof.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<!doctype html>
2+
<html lang="{{ .Site.Language.Lang }}" class="no-js">
3+
<head>
4+
{{ partial "head.html" . }}
5+
</head>
6+
<body class="td-{{ .Kind }}">
7+
<header>
8+
{{ partial "navbar.html" . }}
9+
</header>
10+
<div class="container-fluid td-outer">
11+
<div class="td-main">
12+
{{ block "main" . }}{{ end }}
13+
</div>
14+
{{ partial "footer.html" . }}
15+
</div>
16+
{{ partial "scripts.html" . }}
17+
</body>
18+
</html>

layouts/oss-health/security.html

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
{{ define "main" }}
2+
{{ $data := index .Site.Data.security "monthly" }}
3+
4+
<div class="security-page container py-5">
5+
<div class="text-center mb-5">
6+
<h1 class="display-5 fw-bold">Security Summary</h1>
7+
<p class="lead text-muted">Monthly public security report for the Cozystack project.</p>
8+
</div>
9+
10+
{{ if and $data $data.month (ne $data.month "") }}
11+
12+
<h3 class="text-center mb-4">{{ $data.month }}</h3>
13+
14+
<!-- Overview cards -->
15+
<div class="row g-3 mb-5">
16+
<div class="col-md-3 col-sm-6">
17+
<div class="card text-center h-100 shadow-sm security-card">
18+
<div class="card-body">
19+
<div class="security-icon"><i class="fas fa-shield-alt"></i></div>
20+
<div class="security-value">{{ $data.new_count }}</div>
21+
<div class="security-label">New This Month</div>
22+
</div>
23+
</div>
24+
</div>
25+
<div class="col-md-3 col-sm-6">
26+
<div class="card text-center h-100 shadow-sm security-card">
27+
<div class="card-body">
28+
<div class="security-icon text-success"><i class="fas fa-check-circle"></i></div>
29+
<div class="security-value">{{ len $data.fixed }}</div>
30+
<div class="security-label">Fixed</div>
31+
</div>
32+
</div>
33+
</div>
34+
<div class="col-md-3 col-sm-6">
35+
<div class="card text-center h-100 shadow-sm security-card">
36+
<div class="card-body">
37+
<div class="security-icon text-warning"><i class="fas fa-wrench"></i></div>
38+
<div class="security-value">{{ len $data.in_progress }}</div>
39+
<div class="security-label">In Progress</div>
40+
</div>
41+
</div>
42+
</div>
43+
<div class="col-md-3 col-sm-6">
44+
<div class="card text-center h-100 shadow-sm security-card">
45+
<div class="card-body">
46+
<div class="security-icon text-info"><i class="fas fa-info-circle"></i></div>
47+
<div class="security-value">{{ $data.stats.total_tracked }}</div>
48+
<div class="security-label">Total Tracked</div>
49+
</div>
50+
</div>
51+
</div>
52+
</div>
53+
54+
<!-- Fixed vulnerabilities -->
55+
{{ if $data.fixed }}
56+
<h5 class="mb-3"><i class="fas fa-check-circle text-success me-2"></i>Security Updates Released</h5>
57+
<div class="table-responsive mb-5">
58+
<table class="table table-striped table-hover">
59+
<thead class="table-success">
60+
<tr><th>CVE</th><th>Severity</th><th>Package</th><th>Fixed Version</th></tr>
61+
</thead>
62+
<tbody>
63+
{{ range $data.fixed }}
64+
<tr>
65+
<td><a href="https://nvd.nist.gov/vuln/detail/{{ .cve_id }}"><code>{{ .cve_id }}</code></a></td>
66+
<td>{{ .severity }}</td>
67+
<td><code>{{ .package }}</code></td>
68+
<td><code>{{ .fixed_version }}</code></td>
69+
</tr>
70+
{{ end }}
71+
</tbody>
72+
</table>
73+
</div>
74+
{{ end }}
75+
76+
<!-- In progress -->
77+
{{ if $data.in_progress }}
78+
<h5 class="mb-3"><i class="fas fa-wrench text-warning me-2"></i>In Progress</h5>
79+
<div class="table-responsive mb-5">
80+
<table class="table table-striped table-hover">
81+
<thead class="table-warning">
82+
<tr><th>CVE</th><th>Severity</th><th>Package</th><th>Status</th></tr>
83+
</thead>
84+
<tbody>
85+
{{ range $data.in_progress }}
86+
<tr>
87+
<td><a href="https://nvd.nist.gov/vuln/detail/{{ .cve_id }}"><code>{{ .cve_id }}</code></a></td>
88+
<td>{{ .severity }}</td>
89+
<td><code>{{ .package }}</code></td>
90+
<td>Fix in progress</td>
91+
</tr>
92+
{{ end }}
93+
</tbody>
94+
</table>
95+
</div>
96+
{{ end }}
97+
98+
<!-- Accepted risk -->
99+
{{ if $data.accepted_risk }}
100+
<h5 class="mb-3"><i class="fas fa-info-circle text-info me-2"></i>Accepted Risks</h5>
101+
<div class="table-responsive mb-5">
102+
<table class="table table-striped table-hover">
103+
<thead class="table-info">
104+
<tr><th>CVE</th><th>Severity</th><th>Package</th><th>Reason</th></tr>
105+
</thead>
106+
<tbody>
107+
{{ range $data.accepted_risk }}
108+
<tr>
109+
<td><a href="https://nvd.nist.gov/vuln/detail/{{ .cve_id }}"><code>{{ .cve_id }}</code></a></td>
110+
<td>{{ .severity }}</td>
111+
<td><code>{{ .package }}</code></td>
112+
<td>{{ .reason }}</td>
113+
</tr>
114+
{{ end }}
115+
</tbody>
116+
</table>
117+
</div>
118+
{{ end }}
119+
120+
{{ if $data.generated_at }}
121+
<p class="text-center text-muted mt-4">
122+
<small>Report generated: {{ $data.generated_at }}</small>
123+
</p>
124+
{{ end }}
125+
126+
{{ else }}
127+
128+
<div class="text-center py-5">
129+
<div class="mb-3"><i class="fas fa-shield-alt fa-3x text-muted"></i></div>
130+
<h4 class="text-muted">No security summary available yet</h4>
131+
<p class="text-muted">The first monthly report will appear here after the next reporting cycle.</p>
132+
</div>
133+
134+
{{ end }}
135+
136+
<div class="text-center mt-5 mb-3">
137+
<p class="text-muted">
138+
<small>
139+
To report a vulnerability, use
140+
<a href="https://github.com/cozystack/cozystack/security/advisories/new">GitHub Private Vulnerability Reporting</a>
141+
or email <a href="mailto:cncf-cozystack-security@lists.cncf.io">cncf-cozystack-security@lists.cncf.io</a>.
142+
</small>
143+
</p>
144+
</div>
145+
</div>
146+
147+
{{ end }}

0 commit comments

Comments
 (0)