openvibers/openvibe.news Commits
News: the CSP allows Cloudflare Web Analytics (the injected beacon was blocked on every page) (#62)
Changes
@@@ -120,12 +120,13 @@ async function createApp(opts = {}) {directives: {defaultSrc: ["'self'"],// The OpenVibe Frame (theme-loader, navbar, footer) comes from the Network; the inline init is ours.-- scriptSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network'],++ // Cloudflare Web Analytics: the edge injects its beacon into every page (as on Wiki and Live).++ scriptSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network', 'https://static.cloudflareinsights.com'],styleSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network', 'https://fonts.googleapis.com', 'https://cdnjs.cloudflare.com'],fontSrc: ["'self'", 'data:', 'https://fonts.gstatic.com', 'https://cdnjs.cloudflare.com'],imgSrc: ["'self'", 'data:', 'https:'],// openvibe.events: release notifications (release-watch's EventSource, openvibe-shared 1.17).-- connectSrc: ["'self'", 'https://openvibe.network', 'https://openvibe.events'],++ connectSrc: ["'self'", 'https://openvibe.network', 'https://openvibe.events', 'https://cloudflareinsights.com'],frameSrc: ["'self'", 'https://openvibe.network'],frameAncestors: ["'self'"],objectSrc: ["'none'"],nnew file mode 100644@@@ -0,0 +1,14 @@++'use strict';++// The page CSP lets Cloudflare Web Analytics run: the edge injects its beacon (static.cloudflareinsights.com) into every++// page and it reports to cloudflareinsights.com. Without them every visitor's console showed a CSP violation and no++// analytics came from this site (a signed-in browser pass of every site, 2026-10-15). Wiki and Live allow the same.++const assert = require('assert');++const fs = require('fs');++const path = require('path');++++const app = fs.readFileSync(path.join(__dirname, '..', 'server', 'app.js'), 'utf8');++const script = /(scriptSrc|'script-src'|"script-src)[^\n]*/.exec(app);++const connect = /(connectSrc|'connect-src'|"connect-src)[^\n]*/.exec(app);++assert.ok(script && script[0].includes('https://static.cloudflareinsights.com'), 'script-src allows the beacon');++assert.ok(connect && connect[0].includes('https://cloudflareinsights.com'), 'connect-src allows its reports');++console.log('csp: Cloudflare Web Analytics is allowed');
@@ -120,12 +120,13 @@ async function createApp(opts = {}) {
@@ -120,12 +120,13 @@ async function createApp(opts = {}) {
directives: {
directives: {
defaultSrc: ["'self'"],
defaultSrc: ["'self'"],
// The OpenVibe Frame (theme-loader, navbar, footer) comes from the Network; the inline init is ours.
// The OpenVibe Frame (theme-loader, navbar, footer) comes from the Network; the inline init is ours.
- scriptSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network'],
+ // Cloudflare Web Analytics: the edge injects its beacon into every page (as on Wiki and Live).
+ scriptSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network', 'https://static.cloudflareinsights.com'],
styleSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network', 'https://fonts.googleapis.com', 'https://cdnjs.cloudflare.com'],
styleSrc: ["'self'", "'unsafe-inline'", 'https://openvibe.network', 'https://fonts.googleapis.com', 'https://cdnjs.cloudflare.com'],
fontSrc: ["'self'", 'data:', 'https://fonts.gstatic.com', 'https://cdnjs.cloudflare.com'],
fontSrc: ["'self'", 'data:', 'https://fonts.gstatic.com', 'https://cdnjs.cloudflare.com'],
imgSrc: ["'self'", 'data:', 'https:'],
imgSrc: ["'self'", 'data:', 'https:'],
// openvibe.events: release notifications (release-watch's EventSource, openvibe-shared 1.17).
// openvibe.events: release notifications (release-watch's EventSource, openvibe-shared 1.17).
- connectSrc: ["'self'", 'https://openvibe.network', 'https://openvibe.events'],
+ connectSrc: ["'self'", 'https://openvibe.network', 'https://openvibe.events', 'https://cloudflareinsights.com'],
frameSrc: ["'self'", 'https://openvibe.network'],
frameSrc: ["'self'", 'https://openvibe.network'],
frameAncestors: ["'self'"],
frameAncestors: ["'self'"],
objectSrc: ["'none'"],
objectSrc: ["'none'"],
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+'use strict';
+// The page CSP lets Cloudflare Web Analytics run: the edge injects its beacon (static.cloudflareinsights.com) into every
+// page and it reports to cloudflareinsights.com. Without them every visitor's console showed a CSP violation and no
+// analytics came from this site (a signed-in browser pass of every site, 2026-10-15). Wiki and Live allow the same.
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+
+const app = fs.readFileSync(path.join(__dirname, '..', 'server', 'app.js'), 'utf8');
+const script = /(scriptSrc|'script-src'|"script-src)[^\n]*/.exec(app);
+const connect = /(connectSrc|'connect-src'|"connect-src)[^\n]*/.exec(app);
+assert.ok(script && script[0].includes('https://static.cloudflareinsights.com'), 'script-src allows the beacon');
+assert.ok(connect && connect[0].includes('https://cloudflareinsights.com'), 'connect-src allows its reports');
+console.log('csp: Cloudflare Web Analytics is allowed');