See: story index
pwsafe on Linux opened .psafe3 files via pws_os::FOpen / FClose, which ultimately called the standard C library fopen / fclose. No network awareness at all.
To keep a password database on a WebDAV server the only option was an OS-level DAV filesystem mount: /z → https://webdav.critchley.biz/. Then open /z/mydb.psafe3 as if it were a local file.
• Mount required at login — if the mount isn't up, pwsafe fails immediately.
• Locking broken — pwsafe's LockFile creates a .plk sidecar file. On a DAV mount that becomes a WebDAV HEAD request → 404 (the .plk file is local-only), so IsLockedFile always returned false. This meant SafeUnlockFile never called UnlockFile on app close — so the server's WebDAV lock was never released. Next time you opened the same database, the server returned HTTP 423 Locked.
• Not portable — macOS and Windows don't have an equivalent /z-style mount that works the same way.
• No URL entry in the UI — the file picker dialog only accepted local paths; there was no way to type a URL.
Build a first-class URL-based open/save path:
1. User types https://webdav.critchley.biz/test/mydb.psafe3 in the UI.
2. pwsafe fetches the file, opens it normally (password prompt, etc.).
3. On save, pwsafe stores back to the server — with a proper WebDAV LOCK held for the duration of the editing session.
4. On close (normal or crash), the server lock is always released.
5. No OS mount required. No .plk file on the server.
The intercept point (pws_os::FOpen) is the same for every supported OS. Putting network logic there — behind a plugin ABI — means:
• The core (src/core/) and UI are completely untouched. They pass strings to FOpen; if the string happens to be a URL, the transport layer handles it transparently.
• Plugins (WebDAV, future S3, SFTP, …) are separate .so files loaded at runtime. Adding a new protocol doesn't require a rebuild of pwsafe itself.
• The plugin ABI is small, stable, and versioned (PWSTransport_ABI_VERSION).
The existing /z DAV-mount workflow still works — the original pwsafe binary (from the distro package) is installed alongside the webdav-branch build. The user can pick either from the desktop launcher. The /z mount is the fallback; the new build is the first-class URL path.