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