feat(images): support SVG image imports (replaces #2663) #2666
No reviewers
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck!2666
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/svg-image-import"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Vervangende PR voor #2663 van @jhermans — de fork staat geen maintainer-edits toe, dus de poortreparaties staan als aparte commit bovenop de originele (behouden) inzender-commit.
Summary (uit #2663)
Add SVG vector images as a supported slide and Image Library format. SVGs can be selected, dropped, stored in the Library, copied into saved or unsaved decks, previewed, presented, and exported without losing vector sharpness.
This also fixes two compatibility regressions found during manual testing:
Security trade-off: SVG is active XML rather than an inert raster format, so safety takes precedence over accepting every SVG feature. Import parses the complete, size-bounded document and stores only a renderer-derived allow-list; scripts, event handlers, animation, stylesheets, external URLs, and general
data:URLs are removed. The soledata:exception is a base64 PNG whose signature, decoded size (8 MiB maximum), and dimensions (8192 px per edge maximum) are validated. Arbitrary external paths remain blocked; unsaved slides may render only files OciDeck itself placed under its private staging root.Maintainer-wijzigingen bovenop #2663
De originele head
1d14f05d4faalde op vier poorten en één decode-guard:dart formatopimage_service.dartenimage_service_test.dart.image_service.dartgroeide naar 1042 regels. De SVG-helpers staan nu inlib/services/image_service_svg.dart(part of), wat het bestand op 995 en de klasse op 947 houdt._ImageCarouselPickerStatekwam 3 regels over zijn plafond; de uitgeschreven_exts-lijst deelt nusupportedImageExtensionsmet de service.safe_svg_image_test.dartwachtte met een vaste 100 ms; nupumpUntilop de werkelijke uitkomst.image_decode_guard_test: de embedded-PNG-route decodeerde met een bareImage.memory; nucappedMemoryImage(beide assen begrensd).docs/SOURCE_MAP.mdenCHANGELOG.mdaangevuld.Verification
make check(format, analyze, alle statische poorten, 14.963 tests, coverage-vloeren, 1.238 pakkettests, 83 goldens),make check-secrets,make sast,make check-web,make check-l10n-orphans,licenses,sbom-verify,deps-check,shellcheckencheck-marp— allemaal groen op head43634f212.Review-notities (niet-blokkerend)
isStagedPathis een lexicale containment-check; de lees-route doet voorprojectPath == nullgeen realpath/symlink-controle. Enige praktische aanvalsvector vergt schrijftoegang tot de stagingmap van de gebruiker (per-user temp op macOS); documenteerbaar als bekende grens.SafeSvgImagegebruikterrorBuilderalsplaceholderBuildertijdens laden — korte fout-frame bij trage SVG, cosmetisch.data:/http:SVG's renderen niet (rasterdecode faalt → placeholder); consistent met de ingestelde grens.