Skip to content

Commit 9f943d5

Browse files
sarg3ntclaude
andcommitted
fix: load D3.js locally for Traffic plugin to comply with CSP
D3.js was hardcoded to load from CDN (d3js.org) but CSP in local asset mode only allows 'self', blocking the script and causing "d3 is not defined" errors and a stuck loading spinner. - Update traffic.templ and widgets.templ to use UseLocalAssets pattern - Add d3js.org to production CSP whitelist - Add D3.js to Makefile dev-assets download target - D3.js v7 downloaded locally via make dev-assets or manual curl Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent f8a4907 commit 9f943d5

4 files changed

Lines changed: 19 additions & 4 deletions

File tree

gearbox/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ dev-assets: ## Download CDN assets locally for secure development (CSP-compliant
101101
@curl -fsSL https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js -o static/js/vendor/hammer.min.js
102102
@echo " → Chart.js Zoom Plugin..."
103103
@curl -fsSL https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@2.0.1/dist/chartjs-plugin-zoom.min.js -o static/js/vendor/chartjs-plugin-zoom.min.js
104+
@echo " → D3.js..."
105+
@curl -fsSL https://d3js.org/d3.v7.min.js -o static/js/vendor/d3.v7.min.js
104106
@echo " → Tabulator CSS..."
105107
@curl -fsSL https://unpkg.com/tabulator-tables@6.3.0/dist/css/tabulator.min.css -o static/css/vendor/tabulator.min.css
106108
@echo " → Tabulator JS..."

gearbox/internal/framework/middleware/security_headers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func buildCSP() string {
7272
// CDNs provide automatic updates and good performance via edge caching
7373
directives = []string{
7474
"default-src 'self'",
75-
"script-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com https://unpkg.com https://cdn.jsdelivr.net",
75+
"script-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com https://unpkg.com https://cdn.jsdelivr.net https://d3js.org",
7676
"style-src 'self' 'unsafe-inline' https://unpkg.com",
7777
"img-src 'self' data: blob:",
7878
"font-src 'self' data:",

gearbox/internal/framework/templates/pages/traffic.templ

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package pages
22

33
import (
4+
"github.com/sarg3nt/gearbox/internal/framework/middleware"
45
"github.com/sarg3nt/gearbox/internal/framework/models"
56
"github.com/sarg3nt/gearbox/internal/framework/templates/layouts"
67
"github.com/sarg3nt/gearbox/internal/framework/templates/pages/traffic"
@@ -26,7 +27,11 @@ templ TrafficPage(user *models.User, servers []models.BoxConfig) {
2627
</div>
2728
}
2829
<!-- D3.js for force-directed graph -->
29-
<script src="https://d3js.org/d3.v7.min.js"></script>
30+
if middleware.UseLocalAssets(ctx) {
31+
<script src="/static/js/vendor/d3.v7.min.js"></script>
32+
} else {
33+
<script src="https://d3js.org/d3.v7.min.js"></script>
34+
}
3035
<script src="/static/js/traffic/traffic-visualization.js"></script>
3136
}
3237
}

gearbox/internal/plugins/traffic/widgets.templ

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package traffic
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
6+
"github.com/sarg3nt/gearbox/internal/framework/middleware"
7+
)
48

59

610
// TrafficSummaryCardWidget shows 5-card summary of traffic metrics
@@ -118,7 +122,11 @@ templ TrafficFlowVisualizationWidget(serverID string, height int, showControls b
118122
</div>
119123
</div>
120124
<!-- D3.js and visualization script -->
121-
<script src="https://d3js.org/d3.v7.min.js"></script>
125+
if middleware.UseLocalAssets(ctx) {
126+
<script src="/static/js/vendor/d3.v7.min.js"></script>
127+
} else {
128+
<script src="https://d3js.org/d3.v7.min.js"></script>
129+
}
122130
<script src="/static/js/traffic/traffic-visualization.js"></script>
123131
}
124132

0 commit comments

Comments
 (0)