6.2 KiB
UI_VOLUMES_DIRECTORY_VIEW_V1
1. Doel
Doel van deze stap is om de webui een host-achtige navigatiestructuur te geven waarbij de gebruiker eerst /Volumes ziet en daarna daarbinnen de beschikbare mounts kan openen, zoals:
/Volumes/8TB/Volumes/8TB_RAID1
Waarom dit gewenst is:
- het sluit beter aan op de werkelijke host- en containerstructuur
- het voorkomt dat technische aliasnamen zoals
storage1enstorage2het primaire navigatiemodel bepalen - het maakt de UI begrijpelijker voor gebruikers die denken in echte mountpunten en directories, niet in app-specifieke labels
2. Gewenste UI-weergave
Gewenst gedrag in beide panelen:
- een paneel kan op
/Volumesstaan als huidige directoryweergave - in die weergave ziet de gebruiker de toegestane submappen als normale directory entries
- voor deze case moeten daar minimaal zichtbaar zijn:
8TB8TB_RAID1
Navigatieflow:
- gebruiker opent of kiest
/Volumes - de lijst toont
8TBen8TB_RAID1als directories - klikken of
Enterop8TBopent/Volumes/8TB - klikken of
Enterop8TB_RAID1opent/Volumes/8TB_RAID1
Voor dual-pane gedrag:
- beide panelen moeten onafhankelijk op
/Volumesof op een onderliggende mount kunnen staan - er is geen speciaal verschillend gedrag nodig tussen links en rechts
- breadcrumbs moeten
/Volumesen daarna de mountnaam tonen
3. Relatie met huidige whitelist/root-configuratie
Huidige situatie:
- de backend werkt met expliciete toegestane roots via aliases
- defaults zijn nu:
storage1 -> /Volumes/8TBstorage2 -> /Volumes/8TB_RAID1
Belangrijk verschil:
- de huidige whitelist geeft alleen directe toegang tot specifieke roots
/Volumeszelf is op dit moment conceptueel geen browsebare root in het bestaande model
Voor het gewenste gedrag is een extra browsebaar niveau nodig:
- niet als volledig vrije root over het hele filesystem
- maar als gecontroleerde containerdirectory die alleen als bovenliggende presentatie-laag dient voor de whitelisted mounts
Cruciale eis:
- als
/Volumeszichtbaar wordt, mag niet automatisch alle andere inhoud van/Volumesbrowsebaar worden - alleen de expliciet toegestane mounts onder
/Volumesmogen zichtbaar zijn
4. Veiligheidsmodel
Aanbevolen veiligheidsmodel:
/Volumeswordt niet behandeld als een normale vrije root/Volumeswordt behandeld als een virtuele of gecontroleerde container-directoryweergave boven de bestaande whitelisted roots
Veilige semantiek:
- de UI/backend toont in
/Volumesalleen de mountnamen die corresponderen met toegestane roots - voor deze case dus alleen:
8TB8TB_RAID1
- andere directories onder de echte
/Volumesmogen niet automatisch zichtbaar worden
Concreet:
- browse van
/Volumesretourneert een samengestelde directorylisting op basis van toegestane roots - navigatie naar
/Volumes/<naam>is alleen geldig als die volledige path overeenkomt met een geconfigureerde root of daarbinnen valt
Passend bij bestaand model:
- alle verdere padresolutie onder
/Volumes/8TB/...en/Volumes/8TB_RAID1/...blijft via bestaandpath_guard - traversal en whitelistcontrole blijven dus centraal gehandhaafd
5. Backend-impact
Dit kan niet netjes alleen frontend-side worden opgelost.
Waarom niet frontend-only:
- de bestaande browse-API verwacht een pad dat door de backend gevalideerd en opgelijst wordt
- als de backend
/Volumesniet kent als geldige browsecontext, kan de frontend die laag niet betrouwbaar simuleren zonder speciale hardcoded clientlogica - frontend-only zou ook de securitygrenzen vertroebelen, omdat de UI dan zelf een deel van de directorystructuur zou moeten faken
Backend-aanpassing is dus nodig.
Veiligste en simpelste richting:
- een kleine backend-uitbreiding in de browse-service/path-interpretatie
- introduceer een gecontroleerd browse-niveau voor
/Volumes - behandel dat niveau als speciale, beperkte listing van geconfigureerde roots
- behoud voor alle onderliggende operaties het bestaande whitelist/path_guard-model
Pragmatische v1-richting:
- voeg een expliciete conceptuele container-root toe, bijvoorbeeld browsepad
/Volumes - browse op
/Volumesretourneert alleen directory-entries voor de toegestane mount-roots - browse op
/Volumes/<mount>mapt naar de bestaande geconfigureerde root
Dat is veiliger dan /Volumes volledig als nieuwe whitelist-root toevoegen.
6. Risico's
Regressierisico
- browse-contract moet duidelijk blijven voor bestaande paden zoals
storage1/... - bestaande UI- en golden-tests zijn nu alias-gebaseerd; die mogen niet onbedoeld breken
- copy/move/rename/delete/bookmarks werken nu op bestaande padrepresentaties; migratie naar
/Volumes/...moet doordacht gebeuren
Securitygevolgen
- een onzorgvuldige implementatie zou per ongeluk meer van
/Volumeskunnen tonen dan toegestaan - een onzorgvuldige mapping van
/Volumes/<naam>naar echte paden kan whitelistcontroles verzwakken
UX-verwarring
- tijdelijke co-existentie van aliaspaden (
storage1/...) en hostachtige paden (/Volumes/8TB/...) kan verwarrend zijn - zonder heldere keuze ontstaat een hybride model dat lastig te begrijpen en te testen is
7. Aanbeveling
Aanbevolen implementatierichting voor v1:
- Niet frontend-only doen.
- Geen vrije browse-root van heel
/Volumestoevoegen. - Wel een gecontroleerde backend-browseweergave voor
/Volumesintroduceren. - Laat die weergave alleen expliciet geconfigureerde mountdirectories tonen.
- Houd alle echte padvalidatie en verdere navigatie onder die mounts via bestaand
path_guard-model.
Concreet aanbevolen model:
/Volumeswordt een speciale browse-entrypoint- listing van
/Volumesbevat alleen de whitelisted mountnamen /Volumes/8TB/...en/Volumes/8TB_RAID1/...worden daarna normaal browsebaar binnen de bestaande veiligheidsgrenzen
Waarom dit de beste v1-richting is:
- sluit aan op de echte hoststructuur
- behoudt securitycontrole centraal in backend
- vermijdt frontend-hardcoding als primaire oplossing
- is beperkt, uitlegbaar en testbaar
Niet aanbevolen voor v1:
- puur frontend-aliasing
- volledig openstellen van
/Volumesals generieke root - tegelijk zowel aliasmodel als hostpathmodel als primaire UX blijven promoten zonder expliciete migratiekeuze