blob: a5bf2276f4507178cbecd7e0e7a0c44ae4c7532f [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DLP_DLP_DATABASE_H_
#define DLP_DLP_DATABASE_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include <base/files/file_path.h>
#include <base/functional/callback.h>
#include <base/task/single_thread_task_runner.h>
#include <base/threading/thread.h>
#include "dlp/dlp_metrics.h"
#include "dlp/file_id.h"
namespace dlp {
// Database for storing information about DLP-protected files.
// |FileEntry| objects stored in |file_entries| table.
// A file entry represents a DLP-protected file. |id| identifies the file on
// the user filesystem, |source_url| and |referrer_url| (possibly empty)
// tell where from the file was originated.
struct FileEntry {
FileId id;
std::string source_url;
std::string referrer_url;
};
class DlpDatabaseDelegate {
public:
// Called when an error occurres.
virtual void OnDatabaseError(DatabaseError error) = 0;
protected:
virtual ~DlpDatabaseDelegate() = default;
};
// Provides API to access database and base functions.
// Access to the database is done on a separate thread.
class DlpDatabase : public DlpDatabaseDelegate {
public:
class Delegate {
public:
// Called when an error occurres.
virtual void OnDatabaseError(DatabaseError error) = 0;
};
// Creates an instance to talk to the database file at |db_path|. Init() must
// be called to establish connection.
DlpDatabase(const base::FilePath& db_path, Delegate* delegate);
// Not copyable or movable.
DlpDatabase(const DlpDatabase&) = delete;
DlpDatabase& operator=(const DlpDatabase&) = delete;
~DlpDatabase();
// Initializes database connection. Must be called before any other queries.
// Returns to the |callback| a pair of result and if migration is pending.
// Result is |SQLITE_OK| if no error occurred.
void Init(base::OnceCallback<void(std::pair<int, bool>)> callback);
// Upserts file_entry into database. Returns true to the |callback| if no
// error occurred.
void UpsertFileEntry(const FileEntry& file_entry,
base::OnceCallback<void(bool)> callback);
// Upserts file_entry into the legacy database. Returns true to the |callback|
// if no error occurred.
void UpsertLegacyFileEntryForTesting(const FileEntry& file_entry,
base::OnceCallback<void(bool)> callback);
// Upserts file_entries into database. Returns true to the |callback| if no
// error occurred.
void UpsertFileEntries(const std::vector<FileEntry>& file_entries,
base::OnceCallback<void(bool)> callback);
// Gets the file entries by ids. Returns a map of only found entries to
// the |callback|.
void GetFileEntriesByIds(
std::vector<FileId> ids,
base::OnceCallback<void(std::map<FileId, FileEntry>)> callback) const;
// Returns all database entries.
void GetDatabaseEntries(
base::OnceCallback<void(std::map<FileId, FileEntry>)> callback) const;
// Deletes file entry with |inode| from database. Returns true to the
// |callback| if no error occurred.
void DeleteFileEntryByInode(ino64_t inode,
base::OnceCallback<void(bool)> callback);
// Filters the file entries table to contain only entries with
// |ids_to_keep| id values. Returns true to the |callback| if no error
// occurred.
void DeleteFileEntriesWithIdsNotInSet(
std::set<FileId> ids_to_keep, base::OnceCallback<void(bool)> callback);
// Migrates all entries from the old database to the new one, adding crtime
// base on |existing_files| info.
void MigrateDatabase(const std::vector<FileId>& existing_files,
base::OnceCallback<void(bool)> callback);
private:
// DlpDatabaseDelegate overrides:
void OnDatabaseError(DatabaseError error) override;
// Class impelmenting the core functionality.
class Core;
std::unique_ptr<Core> core_;
base::Thread database_thread_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
Delegate* delegate_;
};
} // namespace dlp
#endif // DLP_DLP_DATABASE_H_