Skip to content

Commit f907c28

Browse files
committed
Privacy-first: remove local storage of inputs from cloud, docker and network tools
1 parent fa6121b commit f907c28

3 files changed

Lines changed: 29 additions & 117 deletions

File tree

src/tools/cloud-misconfig/CloudMisconfigScanner.jsx

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import React, { useRef, useState, useEffect } from 'react'
1+
import React, { useRef, useState } from 'react'
22
import AboutSection from '../../components/AboutSection.jsx'
3-
import { getTemp, setTemp } from '../../utils/storage.js'
43
import { downloadTextFile, findingsToMarkdown } from '../../utils/exportUtils.js'
54
import {
65
analyzeMultiCloudConfig,
@@ -59,35 +58,10 @@ function safeParseJsonWithLocation(text) {
5958
}
6059

6160
function CloudMisconfigScanner({ onBack }) {
62-
const [configText, setConfigText] = useState(() =>
63-
getTemp('sw_cloud_config_text', ''),
64-
)
65-
const [findings, setFindings] = useState(() =>
66-
getTemp('sw_cloud_findings', []),
67-
)
68-
const [hasAnalyzed, setHasAnalyzed] = useState(() =>
69-
getTemp('sw_cloud_hasAnalyzed', false),
70-
)
71-
const [detectedPlatform, setDetectedPlatform] = useState(() =>
72-
getTemp('sw_cloud_detectedPlatform', null),
73-
)
74-
75-
// Sync to temp storage (TTL-limited)
76-
useEffect(() => {
77-
setTemp('sw_cloud_config_text', configText)
78-
}, [configText])
79-
80-
useEffect(() => {
81-
setTemp('sw_cloud_findings', findings)
82-
}, [findings])
83-
84-
useEffect(() => {
85-
setTemp('sw_cloud_hasAnalyzed', hasAnalyzed)
86-
}, [hasAnalyzed])
87-
88-
useEffect(() => {
89-
setTemp('sw_cloud_detectedPlatform', detectedPlatform)
90-
}, [detectedPlatform])
61+
const [configText, setConfigText] = useState('')
62+
const [findings, setFindings] = useState([])
63+
const [hasAnalyzed, setHasAnalyzed] = useState(false)
64+
const [detectedPlatform, setDetectedPlatform] = useState(null)
9165

9266
// Ephemeral UI state
9367
const [error, setError] = useState(null)

src/tools/docker-analyzer/DockerAnalyzer.jsx

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,13 @@
1-
import React, { useRef, useState, useEffect } from 'react'
1+
import React, { useRef, useState } from 'react'
22
import { analyzeDockerfile } from './dockerRules.js'
33
import AboutSection from '../../components/AboutSection.jsx'
4-
import { getTemp, setTemp } from '../../utils/storage.js'
54
import { downloadTextFile, findingsToMarkdown } from '../../utils/exportUtils.js'
65

76
function DockerAnalyzer({ onBack }) {
8-
// Persisted state (temp storage with TTL)
9-
const [dockerfileText, setDockerfileText] = useState(() =>
10-
getTemp('sw_docker_text', ''),
11-
)
12-
const [findings, setFindings] = useState(() =>
13-
getTemp('sw_docker_findings', []),
14-
)
15-
const [hasAnalyzed, setHasAnalyzed] = useState(() =>
16-
getTemp('sw_docker_hasAnalyzed', false),
17-
)
18-
19-
// Sync to temp storage
20-
useEffect(() => {
21-
setTemp('sw_docker_text', dockerfileText)
22-
}, [dockerfileText])
23-
24-
useEffect(() => {
25-
setTemp('sw_docker_findings', findings)
26-
}, [findings])
27-
28-
useEffect(() => {
29-
setTemp('sw_docker_hasAnalyzed', hasAnalyzed)
30-
}, [hasAnalyzed])
7+
// Ephemeral state (in-memory only)
8+
const [dockerfileText, setDockerfileText] = useState('')
9+
const [findings, setFindings] = useState([])
10+
const [hasAnalyzed, setHasAnalyzed] = useState(false)
3111

3212
// Ephemeral UI state
3313
const [error, setError] = useState(null)

src/tools/network-exposure-map/NetworkExposureMap.jsx

Lines changed: 19 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useMemo, useRef, useEffect } from 'react'
1+
import React, { useState, useMemo, useRef } from 'react'
22
import {
33
parseScanFile,
44
SAMPLE_SCAN_XML,
@@ -10,7 +10,6 @@ import {
1010
} from './scanParsers.js'
1111
import AboutSection from '../../components/AboutSection.jsx'
1212
import { downloadTextFile } from '../../utils/exportUtils.js'
13-
import {getTemp, setTemp, getPersistent, setPersistent } from '../../utils/storage.js'
1413

1514
function riskBadgeClasses(level) {
1615
switch (level) {
@@ -168,71 +167,27 @@ function hostsToCsvReport(hosts) {
168167
}
169168

170169
function NetworkExposureMap({ onBack }) {
171-
const [hosts, setHosts] = useState(() =>
172-
getTemp('sw_netmap_hosts', []),
173-
)
170+
const [hosts, setHosts] = useState([])
174171
const [error, setError] = useState(null)
175172
const [lastSource, setLastSource] = useState(null)
176-
const [manualInput, setManualInput] = useState(() =>
177-
getTemp('sw_netmap_manual', ''),
178-
)
179-
const [showOnlyElevated, setShowOnlyElevated] = useState(() =>
180-
getPersistent('sw_netmap_showElevated', false),
181-
)
173+
const [manualInput, setManualInput] = useState('')
174+
const [showOnlyElevated, setShowOnlyElevated] = useState(false)
182175
const [exportMessage, setExportMessage] = useState(null)
183176
const [searchQuery, setSearchQuery] = useState('')
184-
const [onlyUpHosts, setOnlyUpHosts] = useState(() =>
185-
getPersistent('sw_netmap_onlyUp', false),
186-
)
187-
const [viewMode, setViewMode] = useState(() =>
188-
getPersistent('sw_netmap_viewMode', 'hosts'),
189-
)
177+
const [onlyUpHosts, setOnlyUpHosts] = useState(false)
178+
const [viewMode, setViewMode] = useState('hosts')
190179

191180
// Host detail side panel
192181
const [selectedHost, setSelectedHost] = useState(null)
193182

194183
// Custom high-risk markers (UI-only, persisted locally)
195-
const [userHighRiskPorts, setUserHighRiskPorts] = useState(() =>
196-
getPersistent('sw_netmap_custom_ports', []),
197-
)
198-
const [userHighRiskServices, setUserHighRiskServices] = useState(() =>
199-
getPersistent('sw_netmap_custom_services', []),
200-
)
184+
const [userHighRiskPorts, setUserHighRiskPorts] = useState([])
185+
const [userHighRiskServices, setUserHighRiskServices] = useState([])
201186
const [newHighPort, setNewHighPort] = useState('')
202187
const [newHighService, setNewHighService] = useState('')
203188

204189
const fileInputRef = useRef(null)
205190

206-
// Sync temp state to storage
207-
useEffect(() => {
208-
setTemp('sw_netmap_hosts', hosts)
209-
}, [hosts])
210-
211-
useEffect(() => {
212-
setTemp('sw_netmap_manual', manualInput)
213-
}, [manualInput])
214-
215-
// Sync persistent prefs to storage
216-
useEffect(() => {
217-
setPersistent('sw_netmap_showElevated', showOnlyElevated)
218-
}, [showOnlyElevated])
219-
220-
useEffect(() => {
221-
setPersistent('sw_netmap_onlyUp', onlyUpHosts)
222-
}, [onlyUpHosts])
223-
224-
useEffect(() => {
225-
setPersistent('sw_netmap_viewMode', viewMode)
226-
}, [viewMode])
227-
228-
useEffect(() => {
229-
setPersistent('sw_netmap_custom_ports', userHighRiskPorts)
230-
}, [userHighRiskPorts])
231-
232-
useEffect(() => {
233-
setPersistent('sw_netmap_custom_services', userHighRiskServices)
234-
}, [userHighRiskServices])
235-
236191
// Helper: custom high-risk logic (adds on top of built-in)
237192
const isCustomHighRisk = (port) => {
238193
if (!port) return false
@@ -554,20 +509,23 @@ function NetworkExposureMap({ onBack }) {
554509
)
555510
</p>
556511

557-
<label className="block">
558-
<span className="sr-only">Upload scan file</span>
512+
<label className="inline-flex items-center">
513+
<span className="inline-flex items-center justify-center
514+
px-3 py-1.5 rounded-full
515+
text-xs font-semibold
516+
bg-emerald-500/90 text-slate-950
517+
hover:bg-emerald-400/90 cursor-pointer">
518+
Browse…
519+
</span>
520+
559521
<input
560522
ref={fileInputRef}
561523
type="file"
562524
accept=".xml,.json,.txt"
563525
onChange={handleFileChange}
564-
className="block w-full text-xs text-slate-200
565-
file:mr-3 file:py-1.5 file:px-3 file:rounded-full
566-
file:border-0 file:text-xs file:font-semibold
567-
file:bg-emerald-500/90 file:text-slate-950
568-
hover:file:bg-emerald-400/90 cursor-pointer"
526+
className="sr-only"
569527
/>
570-
</label>
528+
</label>
571529

572530
{lastSource && (
573531
<p className="mt-2 text-[0.7rem] text-slate-500">

0 commit comments

Comments
 (0)