Twitch-VOD-Manager/src
xRangerDE 32e0b1ab7d security: open-file IPC blocks executable extensions
Companion to 4.6.61. The open-file IPC handler (used by the
"Open file" buttons in the queue + archive) was previously a
plain shell.openPath call with only an existsSync check:

  if (typeof filePath !== "string" || !filePath) return false;
  if (!fs.existsSync(filePath)) return false;
  const result = await shell.openPath(filePath);

shell.openPath happily launches any path the OS knows how to
execute. An XSS landing through e.g. a smuggled queue item URL
that reached the renderer-side openFile global function could
pass `C:\\Windows\\System32\\calc.exe` and the IPC would launch
calc.

Added a deny-list of obvious shell-execution extensions (.exe,
.bat, .cmd, .com, .ps1, .vbs, .vbe, .js, .jse, .wsf, .wsh, .scr,
.msi, .msp, .lnk, .cpl, .reg, .hta, .jar, .application). Rejected
calls log to debug + return false to the renderer. Media + text +
image extensions remain unaffected — those open in their normal
default-app viewers, which is the intended use case.

show-in-folder + open-folder stay permissive on extension since
they only open File Explorer (no execution).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 04:16:46 +02:00
..
index.html a11y: sidebar nav-items keyboard-accessible + aria-current 2026-05-11 03:27:53 +02:00
main.ts security: open-file IPC blocks executable extensions 2026-05-11 04:16:46 +02:00
preload.ts perf: trim live-status batch IPC payload + skip empty broadcasts 2026-05-11 02:33:09 +02:00
renderer-archive.ts feat: local archive search — new Archiv tab 2026-05-11 00:26:42 +02:00
renderer-globals.d.ts perf: trim live-status batch IPC payload + skip empty broadcasts 2026-05-11 02:33:09 +02:00
renderer-locale-de.ts i18n: localize "Invalid time values" alert in clip-cutter 2026-05-11 04:00:27 +02:00
renderer-locale-en.ts i18n: localize "Invalid time values" alert in clip-cutter 2026-05-11 04:00:27 +02:00
renderer-profile.ts a11y: streamer-profile header — avatar wrap + live card keyboard-activatable 2026-05-11 03:41:21 +02:00
renderer-queue.ts a11y: queue-item title + selector keyboard-accessible 2026-05-11 03:46:40 +02:00
renderer-settings.ts cleanup: unify template-lint visual + drop 3 hardcoded color literals 2026-05-11 03:04:30 +02:00
renderer-shared.ts fix: persist expanded details across re-renders, guard drag-drop init against duplicates 2026-03-21 15:03:20 +01:00
renderer-stats.ts cleanup: extract events/chat viewer inline styles + drop dead var 2026-05-11 02:05:37 +02:00
renderer-streamers.ts a11y: VOD cards keyboard-activatable — opens VOD on Twitch via Enter/Space 2026-05-11 03:37:14 +02:00
renderer-texts.ts i18n: localize 3 empty-state strings (VOD grid + Merge tab) 2026-05-11 02:20:29 +02:00
renderer-updates.ts feat: skip-version + addStreamer validation + smart-scheduler tooltip 2026-05-10 12:14:13 +02:00
renderer-vod-hover.ts perf: bound the renderer-side VOD storyboard cache (FIFO 100) 2026-05-11 04:08:42 +02:00
renderer.ts i18n: localize "Invalid time values" alert in clip-cutter 2026-05-11 04:00:27 +02:00
styles.css cleanup: merge-tab empty state — DOM-built instead of innerHTML template 2026-05-11 03:56:13 +02:00
tools.ts refactor: extract tool discovery functions to src/tools.ts 2026-03-20 10:00:51 +01:00
types.ts feat: live recording health indicator (green/amber dot per item) 2026-05-10 22:04:53 +02:00
update-version-utils.ts chore: migrate repository to Codeberg, bump version to 4.2.0, update update logic 2026-03-01 20:23:21 +01:00