blob: 44cb9e75aa91b4537cc4d09aab0bcd8a645e1ba0 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "storage/browser/quota/storage_directory.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_util.h"
#include "base/notreached.h"
#include "base/strings/strcat.h"
#include "components/services/storage/public/cpp/constants.h"
#include "storage/browser/quota/storage_directory_util.h"
namespace storage {
namespace {
const base::FilePath::CharType kDoomedPathName[] =
FILE_PATH_LITERAL("-doomed-");
}
StorageDirectory::StorageDirectory(const base::FilePath& profile_path)
: web_storage_path_(profile_path.Append(kWebStorageDirectory)) {
DCHECK(!profile_path.empty()) << "Should not be called in incognito mode.";
}
StorageDirectory::~StorageDirectory() = default;
bool StorageDirectory::Create() {
return base::CreateDirectory(web_storage_path_);
}
bool StorageDirectory::Doom() {
return DoomPath(web_storage_path_);
}
void StorageDirectory::ClearDoomed() {
std::set<base::FilePath> paths = EnumerateDoomedDirectories();
for (const base::FilePath& path : paths)
base::DeletePathRecursively(path);
}
bool StorageDirectory::CreateBucket(const BucketLocator& bucket) {
base::FilePath bucket_path =
CreateBucketPath(web_storage_path_.DirName(), bucket);
return base::CreateDirectory(bucket_path);
}
bool StorageDirectory::DoomBucket(const BucketLocator& bucket) {
base::FilePath bucket_path =
CreateBucketPath(web_storage_path_.DirName(), bucket);
return DoomPath(bucket_path);
}
void StorageDirectory::ClearDoomedBuckets() {
std::set<base::FilePath> paths = EnumerateDoomedBuckets();
for (const base::FilePath& path : paths)
base::DeletePathRecursively(path);
}
bool StorageDirectory::DoomPath(const base::FilePath& path) {
if (!base::PathExists(path))
return true;
base::FilePath doomed_dir;
base::CreateTemporaryDirInDir(
path.DirName(), base::StrCat({path.BaseName().value(), kDoomedPathName}),
&doomed_dir);
return base::Move(path, doomed_dir);
}
std::set<base::FilePath> StorageDirectory::EnumerateDoomedDirectories() {
base::FileEnumerator enumerator(
web_storage_path_.DirName(),
/*recursive=*/false, base::FileEnumerator::DIRECTORIES,
base::StrCat(
{kWebStorageDirectory, kDoomedPathName, FILE_PATH_LITERAL("*")}));
std::set<base::FilePath> paths;
base::FilePath path;
while (path = enumerator.Next(), !path.empty())
paths.insert(path);
return paths;
}
std::set<base::FilePath> StorageDirectory::EnumerateDoomedBuckets() {
base::FileEnumerator enumerator(
web_storage_path_, /*recursive=*/false, base::FileEnumerator::DIRECTORIES,
base::StrCat(
{FILE_PATH_LITERAL("*"), kDoomedPathName, FILE_PATH_LITERAL("*")}));
std::set<base::FilePath> paths;
base::FilePath path;
while (path = enumerator.Next(), !path.empty())
paths.insert(path);
return paths;
}
} // namespace storage