| // 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 |