// Copyright 2023 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/device_reauth/chromeos/authenticator_chromeos.h"
#include "base/strings/utf_string_conversions.h"
#include "build/chromeos_buildflags.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/public/cpp/in_session_auth_dialog_controller.h"
#include "chromeos/ash/components/osauth/public/common_types.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chromeos/components/in_session_auth/mojom/in_session_auth.mojom.h"
#include "chromeos/lacros/lacros_service.h"
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
namespace {
#if BUILDFLAG(IS_CHROMEOS_ASH)
void OnAuthComplete(base::OnceCallback<void(bool)> callback,
bool success,
const ash::AuthProofToken& token,
base::TimeDelta timeout) {
// Here we simply ignore `token` and `timeout`, as password manager manages
// its own auth timeout
std::move(callback).Run(success);
}
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
void OnRequestToken(base::OnceCallback<void(bool)> callback,
chromeos::auth::mojom::RequestTokenReplyPtr reply) {
// Similarly to `OnAuthComplete`, we ignore the token provided in reply, if
// any.
std::move(callback).Run(
reply !=
mojo::StructPtr<chromeos::auth::mojom::RequestTokenReply>(nullptr));
}
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
} // namespace
AuthenticatorChromeOS::AuthenticatorChromeOS() = default;
AuthenticatorChromeOS::~AuthenticatorChromeOS() = default;
void AuthenticatorChromeOS::AuthenticateUser(
const std::u16string& message,
base::OnceCallback<void(bool)> result_callback) {
// Calls `InSessionAuthDialogController::ShowAuthDialog` to authenticate the
// currently active user using configured auth factors.
// On Lacros, makes a crosapi call to the
// `chromeos::auth::mojom::InSessionAuth` interface implemented by ash. This
// in turn calls `InSessionAuthDialogController::ShowAuthDialog` to
// authenticate the currently active user using configured auth factors.
#if BUILDFLAG(IS_CHROMEOS_ASH)
ash::InSessionAuthDialogController::Get()->ShowAuthDialog(
ash::InSessionAuthDialogController::Reason::kAccessPasswordManager,
base::UTF16ToUTF8(message),
base::BindOnce(&OnAuthComplete, std::move(result_callback)));
#elif BUILDFLAG(IS_CHROMEOS_LACROS)
if (auto* lacros_service = chromeos::LacrosService::Get();
lacros_service->IsAvailable<chromeos::auth::mojom::InSessionAuth>()) {
if (lacros_service
->GetInterfaceVersion<chromeos::auth::mojom::InSessionAuth>() <
static_cast<int>(chromeos::auth::mojom::InSessionAuth::
MethodMinVersions::kRequestTokenMinVersion)) {
lacros_service->GetRemote<chromeos::auth::mojom::InSessionAuth>()
->RequestToken(
chromeos::auth::mojom::Reason::kAccessPasswordManager,
std::nullopt,
base::BindOnce(&OnRequestToken, std::move(result_callback)));
} else {
lacros_service->GetRemote<chromeos::auth::mojom::InSessionAuth>()
->RequestToken(
chromeos::auth::mojom::Reason::kAccessPasswordManager,
base::UTF16ToUTF8(message),
base::BindOnce(&OnRequestToken, std::move(result_callback)));
}
}
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
}