Skip to content

feat: unified DataDirectory model for preset data access#17

Open
hikaps wants to merge 12 commits intodevelopfrom
feat-generic-data
Open

feat: unified DataDirectory model for preset data access#17
hikaps wants to merge 12 commits intodevelopfrom
feat-generic-data

Conversation

@hikaps
Copy link
Copy Markdown
Owner

@hikaps hikaps commented Apr 28, 2026

Summary

  • Replaces 5 scattered data directory mechanisms (sharedDirectories, needsDataAcl, needsConfigCopy, gameDirectories, setupLauncherAccess/setupSharedDirectories) with a single unified DataDirectory model
  • Each data directory entry has a path + mode (copy | overlay | acl), fully configurable per preset
  • Launcher-specific config managers (Steam, Heroic) provide prepare/finalize hooks (prepareDataDir() / finalizeDataDir()) for launcher-specific setup around generic operations
  • Adds OverlayFS mounting (SetupOverlayMount) and directory copying (CopyDirectoryToUser) to the D-Bus helper service
  • Custom presets work out of the box with pure generic operations (null configManager → hooks skipped)

Architecture

DataDirectory { path: "/home/user/.steam", mode: "overlay" }
        │
        ▼
setupDataDirectories() in SessionRunner
  ├── For each directory:
  │     ├── configManager->prepareDataDir(path, mode, user)  // Steam: loads library+ACLs
  │     ├── dispatch by mode:
  │     │     ├── "acl"    → SetPathAclWithParents
  │     │     ├── "copy"   → CopyDirectoryToUser
  │     │     └── "overlay"→ SetupOverlayMount (upperdir per user)
  │     └── configManager->finalizeDataDir(path, mode, user) // Steam: copies manifests+VDF

Test plan

  • cmake --build build passes clean
  • ctest --test-dir build --output-on-failure — 12/14 pass (2 pre-existing: flatpak test on build host, D-Bus helper version test)
  • test_presetmanager — 230 lines of new tests for DataDirectory model, serialization, defaults
  • test_sessionrunner — updated for new unified dispatcher API
  • test_gamescopeinstance — updated for launcherId changes
  • Grep confirmed zero references to removed symbols across codebase
  • Manual: verify overlay mount creates correct upperdir structure
  • Manual: verify QML mode selector in EditPresetDialog

Breaking changes

  • sharedDirectories config key replaced by dataDirectories (legacy migration reads old key as fallback, converts to acl mode)
  • needsDataAcl, needsConfigCopy, gameDirectories removed from LauncherInfo
  • setupLauncherAccess() and setupSharedDirectories() removed from SessionRunner

hikaps added 12 commits April 26, 2026 20:47
…rectory model

Replace 5 separate data directory mechanisms with a unified DataDirectory
model where each directory has a configurable mode (copy, overlay, acl):

- Add DataDirectory Q_GADGET struct (path + mode) to PresetManager
- Remove needsDataAcl, needsConfigCopy, gameDirectories from LauncherInfo
- Remove sharedDirectories from LaunchPreset and InstanceConfig
- Add prepareDataDir/finalizeDataDir hooks to Steam/HeroicConfigManager
- Add SetupOverlayMount and CopyDirectoryToUser to D-Bus helper
- Add setupOverlayMount and copyDirectoryToUser to CouchPlayHelperClient
- Implement unified setupDataDirectories() in SessionRunner
- Remove setupLauncherAccess() and setupSharedDirectories()
- Update QML EditPresetDialog with mode selector dropdown
- Update tests for new API

20 files changed, +933, -493 lines
Add isPathWithinAllowedPrefix() to reject paths outside /home/,
/var/home/, /run/media/, /tmp/ and reject '..' traversal in:
- computeMountTarget: reject alias/source traversal, verify target
  stays within userHome
- MountSharedDirectories: validate source path prefix
- SetupOverlayMount: validate sourceDir path prefix
- SetDirectoryAcl: validate path prefix
- SetPathAclWithParents: validate path prefix
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant