|  | // Copyright 2021 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/ash/crosapi/authentication_ash.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "ash/constants/ash_features.h" | 
|  | #include "base/check.h" | 
|  | #include "chrome/browser/ash/profiles/profile_helper.h" | 
|  | #include "chrome/browser/extensions/api/passwords_private/passwords_private_utils_chromeos.h" | 
|  | #include "chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.h" | 
|  | #include "chrome/browser/profiles/profile.h" | 
|  | #include "chrome/browser/profiles/profile_manager.h" | 
|  | #include "chrome/common/extensions/api/quick_unlock_private.h" | 
|  | #include "content/public/browser/browser_thread.h" | 
|  | #include "third_party/abseil-cpp/absl/types/optional.h" | 
|  |  | 
|  | namespace crosapi { | 
|  |  | 
|  | using TokenInfo = extensions::api::quick_unlock_private::TokenInfo; | 
|  |  | 
|  | AuthenticationAsh::AuthenticationAsh() = default; | 
|  | AuthenticationAsh::~AuthenticationAsh() = default; | 
|  |  | 
|  | void AuthenticationAsh::BindReceiver( | 
|  | mojo::PendingReceiver<mojom::Authentication> receiver) { | 
|  | receivers_.Add(this, std::move(receiver)); | 
|  | } | 
|  |  | 
|  | void AuthenticationAsh::CreateQuickUnlockPrivateTokenInfo( | 
|  | const std::string& password, | 
|  | CreateQuickUnlockPrivateTokenInfoCallback callback) { | 
|  | DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
|  |  | 
|  | Profile* profile = ProfileManager::GetActiveUserProfile(); | 
|  |  | 
|  | // `helper` is kept alive by binding it to the result callback. | 
|  | auto helper = | 
|  | std::make_unique<extensions::QuickUnlockPrivateGetAuthTokenHelper>( | 
|  | profile, password); | 
|  | auto* helper_ptr = helper.get(); | 
|  | auto on_result_callback = base::BindOnce( | 
|  | &AuthenticationAsh::OnCreateQuickUnlockPrivateTokenInfoResults, | 
|  | weak_factory_.GetWeakPtr(), std::move(helper), std::move(callback)); | 
|  | helper_ptr->Run(std::move(on_result_callback)); | 
|  | } | 
|  |  | 
|  | void AuthenticationAsh::IsOsReauthAllowedForActiveUserProfile( | 
|  | base::TimeDelta auth_token_lifetime, | 
|  | IsOsReauthAllowedForActiveUserProfileCallback callback) { | 
|  | DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
|  | bool allowed = extensions::IsOsReauthAllowedAsh( | 
|  | ProfileManager::GetActiveUserProfile(), auth_token_lifetime); | 
|  | std::move(callback).Run(allowed); | 
|  | } | 
|  |  | 
|  | void AuthenticationAsh::OnCreateQuickUnlockPrivateTokenInfoResults( | 
|  | std::unique_ptr<extensions::QuickUnlockPrivateGetAuthTokenHelper> helper, | 
|  | CreateQuickUnlockPrivateTokenInfoCallback callback, | 
|  | absl::optional<TokenInfo> token_info, | 
|  | absl::optional<ash::AuthenticationError> error) { | 
|  | mojom::CreateQuickUnlockPrivateTokenInfoResultPtr result; | 
|  | if (!error.has_value()) { | 
|  | DCHECK(token_info.has_value()); | 
|  | crosapi::mojom::QuickUnlockPrivateTokenInfoPtr out_token_info = | 
|  | crosapi::mojom::QuickUnlockPrivateTokenInfo::New(); | 
|  | out_token_info->token = token_info->token; | 
|  | out_token_info->lifetime_seconds = token_info->lifetime_seconds; | 
|  | result = mojom::CreateQuickUnlockPrivateTokenInfoResult::NewTokenInfo( | 
|  | std::move(out_token_info)); | 
|  | } else { | 
|  | DCHECK(error.has_value()); | 
|  | result = mojom::CreateQuickUnlockPrivateTokenInfoResult::NewErrorMessage( | 
|  | extensions::LegacyQuickUnlockPrivateGetAuthTokenHelper:: | 
|  | kPasswordIncorrect); | 
|  | } | 
|  | std::move(callback).Run(std::move(result)); | 
|  | } | 
|  |  | 
|  | }  // namespace crosapi |