test(session-persistence): pin rollback journal permissions
This commit is contained in:
@@ -12,7 +12,7 @@ Each `SessionEvent` maps 1:1 onto a row in an `events` table `(session_id, seq,
|
|||||||
|
|
||||||
The repository's Node range supports unflagged `node:sqlite`. The database enables foreign keys and uses the configured journal mode (`wal` by default; use a rollback mode where WAL shared-memory files are unsuitable). `PRAGMA user_version` stores the table-layout version; databases with any other version are rejected because this unreleased format has no migrations.
|
The repository's Node range supports unflagged `node:sqlite`. The database enables foreign keys and uses the configured journal mode (`wal` by default; use a rollback mode where WAL shared-memory files are unsuitable). `PRAGMA user_version` stores the table-layout version; databases with any other version are rejected because this unreleased format has no migrations.
|
||||||
|
|
||||||
On filesystems with POSIX modes, the backend requests mode `0700` for missing directories and exclusively creates a missing database with mode `0600` before SQLite opens it; the process umask may further restrict both. New WAL sidecars receive the database's resulting owner-only mode. Existing directories, database files, and sidecars keep their modes; filesystem setup errors other than an existing database fail initialization. These defaults prevent incidental exposure through a permissive process umask, but do not protect database confidentiality or integrity when another principal can replace the database entry in its parent directory.
|
On filesystems with POSIX modes, the backend requests mode `0700` for missing directories and exclusively creates a missing database with mode `0600` before SQLite opens it; the process umask may further restrict both. New WAL, shared-memory, and persistent rollback-journal sidecars receive the database's resulting owner-only mode. Existing directories, database files, and sidecars keep their modes; filesystem setup errors other than an existing database fail initialization. These defaults prevent incidental exposure through a permissive process umask, but do not protect database confidentiality or integrity when another principal can replace the database entry in its parent directory.
|
||||||
|
|
||||||
## Contract semantics over rows
|
## Contract semantics over rows
|
||||||
|
|
||||||
|
|||||||
@@ -406,6 +406,22 @@ describe('SessionPersistenceSqlite: edge cases', () => {
|
|||||||
await b.dispose()
|
await b.dispose()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('creates a persistent rollback journal with owner-only mode', async () => {
|
||||||
|
if (process.platform === 'win32') return
|
||||||
|
const path = await freshDbPath()
|
||||||
|
const ctx = new Context()
|
||||||
|
await ctx.plugin(SessionStore)
|
||||||
|
const fiber = await ctx.plugin(SessionPersistenceSqlite, { path, journalMode: 'persist' })
|
||||||
|
const m = meta('persist-permissions')
|
||||||
|
|
||||||
|
await ctx.sessionPersistence.create(m)
|
||||||
|
await ctx.sessionPersistence.append(m.id, oneTurnLog())
|
||||||
|
|
||||||
|
expect((await stat(path)).mode & 0o777).toBe(0o600)
|
||||||
|
expect((await stat(`${path}-journal`)).mode & 0o777).toBe(0o600)
|
||||||
|
await fiber.dispose()
|
||||||
|
})
|
||||||
|
|
||||||
it('preserves the mode of an existing database file', async () => {
|
it('preserves the mode of an existing database file', async () => {
|
||||||
if (process.platform === 'win32') return
|
if (process.platform === 'win32') return
|
||||||
const path = await freshDbPath()
|
const path = await freshDbPath()
|
||||||
|
|||||||
Reference in New Issue
Block a user