Fix viewer share links to use LAN IP; bind Flask to 0.0.0.0
Share links copied from the Share modal were built with window.location.origin, producing 127.0.0.1 URLs that remote viewers could never reach. - Bind Flask to 0.0.0.0 in gdpr_scanner.py (--host default), m365_launcher.py, and build_gdpr.py so the server is reachable on the local network. Internal loopback URLs (urllib exports, webview window, port probe) intentionally keep 127.0.0.1. - Add /api/local_ip endpoint: UDP probe to 8.8.8.8 discovers the active LAN IP without sending real traffic. - Add _getShareBaseUrl() in viewer.js: fetches /api/local_ip and substitutes the LAN IP; falls back to window.location.origin. - createShareLink and copyTokenLink are now async and await _getShareBaseUrl() before building the viewer URL. - Update CLAUDE.md and static/js/CLAUDE.md with the new invariants. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
66bbf35192
commit
3ad68b45f7
6 files changed
+37
-7
No files matched your search
+17
-3
@@ -1,6 +1,20 @@
|
||||
// ── Viewer token management (#33) ─────────────────────────────────────────────
|
||||
// Share button → modal to create, copy, and revoke read-only viewer links.
|
||||
|
||||
async function _getShareBaseUrl() {
|
||||
// Use the machine's LAN IP so links work for remote users, not just localhost.
|
||||
try {
|
||||
const r = await fetch('/api/local_ip');
|
||||
if (r.ok) {
|
||||
const d = await r.json();
|
||||
if (d.ip && d.ip !== '127.0.0.1') {
|
||||
return 'http://' + d.ip + ':' + window.location.port;
|
||||
}
|
||||
}
|
||||
} catch(e) {}
|
||||
return window.location.origin;
|
||||
}
|
||||
|
||||
function openShareModal() {
|
||||
document.getElementById('shareBackdrop').classList.add('open');
|
||||
document.getElementById('shareNewLinkRow').style.display = 'none';
|
||||
@@ -69,7 +83,7 @@ async function createShareLink() {
|
||||
});
|
||||
if (!r.ok) throw new Error('Server error ' + r.status);
|
||||
const entry = await r.json();
|
||||
const url = window.location.origin + '/view?token=' + encodeURIComponent(entry.token);
|
||||
const url = (await _getShareBaseUrl()) + '/view?token=' + encodeURIComponent(entry.token);
|
||||
const urlInput = document.getElementById('shareNewLinkUrl');
|
||||
urlInput.value = url;
|
||||
document.getElementById('shareNewLinkRow').style.display = 'block';
|
||||
@@ -86,8 +100,8 @@ function copyShareLink() {
|
||||
_copyText(url, document.getElementById('shareCopyBtn'));
|
||||
}
|
||||
|
||||
function copyTokenLink(token, btn) {
|
||||
const url = window.location.origin + '/view?token=' + encodeURIComponent(token);
|
||||
async function copyTokenLink(token, btn) {
|
||||
const url = (await _getShareBaseUrl()) + '/view?token=' + encodeURIComponent(token);
|
||||
_copyText(url, btn);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user