Files
Benjamin Beurdouche f158cf08b8 Bug 1996558 - Address review feedback for SQLite encryption (excluding keystore). r=gcp,places-reviewers,mconley,mak,mossop
Follow-up to D270165 addressing reviewer comments outside security/keystore/
and adding a profile-encryption launch guard:

- Add a database-at-rest launch guard. nsAppRunner reads an
  EncryptedDatabases marker from compatibility.ini early in
  XRE_mainStartup and refuses to launch (alert + clean exit) rather than
  corrupt data when the profile's on-disk state and the
  security.storage.encryption.sqlite.enabled pref disagree: an encrypted
  profile opened by a pref-off build, or plaintext databases under a
  pref-on build (the latter detected by reading the SQLite header's
  8192-byte-page / 32-reserved-byte obfsvfs signature, no mozStorage).
  The gate is skipped in backgroundtask mode. The EncryptedDatabases flag
  is read in CheckCompatibility (which already parses compatibility.ini)
  and written by a new nsIXULRuntime.markProfileEncryptedDatabases
  (append-only, modeled on invalidateCachesOnRestart), with an xpcshell
  test; the storage layer wires the marker write on profile-after-change
  in the lockstore commit.
- Drop duplicate hasKey/mDatabaseEncrypted assignment and clarify the
  "outside profile" fallback comments in Connection::initialize.
- Restore explicit `return rv` at the three sqlite3_open failure sites
  that the original patch had switched to NS_ENSURE_SUCCESS.
- Strengthen the security.storage.encryption.sqlite.enabled pref
  description to flag it INTERNAL / DO NOT ENABLE pending the
  enterprise-policy gate in the rest of the stack.
- Replace the mozilla_net_percent_encode Rust addition in
  netwerk/base/idna_glue with a call to NS_EscapeURLSpan(esc_FilePath |
  esc_Forced) inside a new shared helper, storage::PreparePathForURI,
  exported via storage/StoragePathUtil.h. NS_EscapeURLSpan covers '?',
  '#', '&', space, etc. -- not just '%'.
- Expose obfsvfs::kObfsPageSize from ObfuscatingVFS.h so that
  Connection::GetDefaultPageSize and ObfuscatingVFS.cpp share the same
  8192 constant instead of duplicating literals.
- Use storage::PreparePathForURI in toolkit/components/places/
  Database.cpp::AttachDatabase before building the file: URI, so paths
  containing URI-significant bytes don't produce malformed URIs.
- Make ExtractURIPathAndQuery tolerant of bare filesystem paths. PRAGMA
  database_list returns normalized filenames (no file: prefix), so the
  encrypted-clone branch was previously returning NS_ERROR_FAILURE and
  breaking Connection::initializeClone for encrypted DBs with attached
  databases.
- Track the pending mozIStoragePendingStatement returned by
  attachDatabase in Sqlite.sys.mjs's _pendingStatements map, matching
  the _executeStatement pattern, so shutdown can cancel in-flight
  ATTACH operations instead of leaking them.
- Parameterize test_page_size_is_32k.js on the encryption pref (8 KiB
  when on, 32 KiB when off) and drop its pref override in xpcshell.toml.
- Strengthen the comment in dom/indexedDB/test/marionette/
  manifest.toml about the PBM x obfsvfs interaction gap and reference a
  pending follow-up bug.

Differential Revision: https://phabricator.services.mozilla.com/D301054
2026-06-16 13:00:19 +00:00

38 lines
928 B
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef STORAGE_OBFUSCATINGVFS_H_
#define STORAGE_OBFUSCATINGVFS_H_
#include <cstdint>
#include "mozilla/UniquePtr.h"
struct sqlite3_vfs;
struct sqlite3_file;
template <typename T>
struct already_AddRefed;
namespace mozilla::dom::quota {
class QuotaObject;
}
namespace mozilla::storage::obfsvfs {
// Page size for obfuscated databases. Baked into the on-disk format;
// changing it requires a migration.
inline constexpr int32_t kObfsPageSize = 8192;
const char* GetVFSName();
UniquePtr<sqlite3_vfs> ConstructVFS(const char* aBaseVFSName);
already_AddRefed<dom::quota::QuotaObject> GetQuotaObjectForFile(
sqlite3_file* pFile);
} // namespace mozilla::storage::obfsvfs
#endif // STORAGE_OBFUSCATINGVFS_H_