blob: cbdb9ab0f7b7bace90713896d1605817af2a2770 [file] [log] [blame]
// Copyright 2020 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 "components/permissions/permission_auditing_service.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/files/file_util.h"
#include "components/permissions/permission_auditing_database.h"
namespace {
// Specifies the permissions usage session lifetime. Each session older
// than this value is to be deleted.
constexpr base::TimeDelta kUsageSessionMaxAge = base::Days(90);
// Specifies the time period between the regular sessions deletions.
constexpr base::TimeDelta kUsageSessionCullingInterval = base::Minutes(30);
} // namespace
namespace permissions {
PermissionAuditingService::PermissionAuditingService(
scoped_refptr<base::SequencedTaskRunner> backend_task_runner)
: backend_task_runner_(backend_task_runner) {}
PermissionAuditingService::~PermissionAuditingService() {
if (db_) {
backend_task_runner_->DeleteSoon(FROM_HERE, db_.get());
db_ = nullptr;
}
}
void PermissionAuditingService::Init(const base::FilePath& database_path) {
DCHECK(!db_);
db_ = new PermissionAuditingDatabase();
backend_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(base::IgnoreResult(&PermissionAuditingDatabase::Init),
base::Unretained(db_), database_path));
}
void PermissionAuditingService::StartPeriodicCullingOfExpiredSessions() {
timer_.Start(
FROM_HERE, kUsageSessionCullingInterval,
base::BindRepeating(&PermissionAuditingService::ExpireOldSessions,
this->AsWeakPtr()));
}
void PermissionAuditingService::StorePermissionUsage(
const PermissionUsageSession& session) {
DCHECK(db_);
backend_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
base::IgnoreResult(&PermissionAuditingDatabase::StorePermissionUsage),
base::Unretained(db_), session));
}
void PermissionAuditingService::GetPermissionUsageHistory(
ContentSettingsType type,
const url::Origin& origin,
base::Time start_time,
PermissionUsageHistoryCallback result_callback) {
DCHECK(db_);
backend_task_runner_->PostTaskAndReplyWithResult(
FROM_HERE,
base::BindOnce(&PermissionAuditingDatabase::GetPermissionUsageHistory,
base::Unretained(db_), type, origin, start_time),
std::move(result_callback));
}
void PermissionAuditingService::GetLastPermissionUsageTime(
ContentSettingsType type,
const url::Origin& origin,
LastPermissionUsageTimeCallback result_callback) {
DCHECK(db_);
backend_task_runner_->PostTaskAndReplyWithResult(
FROM_HERE,
base::BindOnce(&PermissionAuditingDatabase::GetLastPermissionUsageTime,
base::Unretained(db_), type, origin),
std::move(result_callback));
}
void PermissionAuditingService::UpdateEndTime(ContentSettingsType type,
const url::Origin& origin,
base::Time start_time,
base::Time new_end_time) {
DCHECK(db_);
backend_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
base::IgnoreResult(&PermissionAuditingDatabase::UpdateEndTime),
base::Unretained(db_), type, origin, start_time, new_end_time));
}
void PermissionAuditingService::DeleteSessionsBetween(base::Time start,
base::Time end) {
DCHECK(db_);
backend_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(base::IgnoreResult(
&PermissionAuditingDatabase::DeleteSessionsBetween),
base::Unretained(db_), start, end));
}
void PermissionAuditingService::ExpireOldSessions() {
DCHECK(db_);
backend_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(base::IgnoreResult(
&PermissionAuditingDatabase::DeleteSessionsBetween),
base::Unretained(db_), base::Time(),
base::Time::Now() - kUsageSessionMaxAge));
}
// static
base::TimeDelta PermissionAuditingService::GetUsageSessionMaxAge() {
return kUsageSessionMaxAge;
}
// static
base::TimeDelta PermissionAuditingService::GetUsageSessionCullingInterval() {
return kUsageSessionCullingInterval;
}
} // namespace permissions