Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /sql /sandboxed_vfs.h
blob: f318bab7ac161ef4e0fb8905d7c949d9146d183a [file] [log] [blame] [edit]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SQL_SANDBOXED_VFS_H_
#define SQL_SANDBOXED_VFS_H_
#include<memory>
#include<optional>
#include"base/component_export.h"
#include"base/files/file.h"
#include"base/files/file_path.h"
#include"base/time/time.h"
#include"sql/sandboxed_vfs_file.h"
#include"third_party/sqlite/sqlite3.h"
namespace sql{
// The file types associated with a SQLite database.
enumclassSandboxedVfsFileType{
// The main file, which stores the database pages.
kDatabase,
// The transaction rollback journal file. Used when WAL is off.
// This file has the same path as the database, plus the "-journal" suffix.
kJournal,
// The Write-Ahead Log (WAL) file.
// This file has the same path as the database, plus the "-wal" suffix.
kWal,
};
// SQLite VFS file implementation that works in a sandboxed process.
//
// Instances are thread-friendly.
class COMPONENT_EXPORT(SQL)SandboxedVfs{
public:
// Describes access rights for a path, used by Delegate::GetPathAccess below.
structPathAccessInfo{
bool can_read=false;
bool can_write=false;
};
// Environment-specific SandboxedVfs implementation details.
//
// This abstracts a handful of operations that don't typically work in a
// sandbox environment given a typical naive implementation. Instances must be
// thread-safe.
classDelegate{
public:
virtual~Delegate()=default;
// Retrieve a sandboxed file associated to `file`.
//
// Returns the sandboxed file for a given file. Do not take ownership of the
// returned instance. The VFS is responsible for the liveness of this
// object.
virtualSandboxedVfsFile*RetrieveSandboxedVfsFile(
base::File file,
base::FilePath file_path,
SandboxedVfsFileType file_type,
SandboxedVfs* vfs)=0;
// Opens a file.
//
// `file_path` is the parsed version of a path passed by SQLite to Open().
// `sqlite_requested_flags` is a bitwise combination SQLite flags used when
// opening files. Returns the opened File on success, or an invalid File on
// failure.
virtualbase::FileOpenFile(constbase::FilePath& file_path,
int sqlite_requested_flags)=0;
// Deletes a file.
//
// `file_path` is the parsed version of a path passed by SQLite to Delete().
// If `sync_dir` is true, the implementation should attempt to flush to disk
// the changes to the file's directory, to ensure that the deletion is
// reflected after a power failure. Returns an SQLite error code indicating
// the status of the operation.
virtualintDeleteFile(constbase::FilePath& file_path,bool sync_dir)=0;
// Queries path access information for `file_path`. Returns null if the
// given path does not exist.
virtual std::optional<PathAccessInfo>GetPathAccess(
constbase::FilePath& file_path)=0;
};
// We don't allow SandboxedVfs instances to be destroyed. Once created, they
// are permanently registered in the calling process.
~SandboxedVfs()=delete;
// Constructs a new instance of ths object using `delegate` to support various
// operations from within the sandbox. The VFS is registered with SQLite under
// `name` and if `make_default` is true then the VFS is also set as the global
// default for new database instances within the calling process.
//
// Note that `name` must be globally unique to the calling process.
staticvoidRegister(constchar* name,
std::unique_ptr<Delegate>delegate,
bool make_default);
Delegate*delegate()const{return delegate_.get();}
// sqlite3_vfs implementation.
intOpen(constchar* full_path,
sqlite3_file& result_file,
int requested_flags,
int* granted_flags);
intDelete(constchar* full_path,int sync_dir);
intAccess(constchar* full_path,int flags,int& result);
intFullPathname(constchar* file_path,int result_size,char* result);
intRandomness(int result_size,char* result);
intSleep(int microseconds);
intGetLastError(int message_size,char* message)const;
intCurrentTimeInt64(sqlite3_int64* result_ms);
// Used by SandboxedVfsFile.
voidSetLastError(base::File::Error error){this->last_error_= error;}
private:
SandboxedVfs(constchar* name,
std::unique_ptr<Delegate>delegate,
bool make_default);
sqlite3_vfs sandboxed_vfs_;
constbase::Time sqlite_epoch_;
const std::unique_ptr<Delegate> delegate_;
base::File::Error last_error_;
};
}// namespace sql
#endif// SQL_SANDBOXED_VFS_H_

[8]ページ先頭

©2009-2025 Movatter.jp