File: authenticator_touch_id_view.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (91 lines) | stat: -rw-r--r-- 3,772 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2024 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/ui/views/webauthn/authenticator_touch_id_view.h"

#include <memory>
#include <optional>
#include <utility>

#include "base/functional/bind.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/views/webauthn/authenticator_common_views.h"
#include "chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.h"
#include "chrome/browser/ui/views/webauthn/mac_authentication_view.h"
#include "chrome/browser/ui/webauthn/sheet_models.h"
#include "chrome/browser/webauthn/local_authentication_token.h"
#include "chrome/grit/generated_resources.h"
#include "components/vector_icons/vector_icons.h"
#include "device/fido/fido_constants.h"
#include "device/fido/mac/util.h"
#include "device/fido/strings/grit/fido_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/models/image_model.h"
#include "ui/color/color_id.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/box_layout_view.h"
#include "ui/views/view.h"

namespace {
constexpr int kVerticalPadding = 20;

// The size if the lock icon that replaces the Touch ID prompt when locked
// (square).
constexpr int kLockIconSize = 64;
}  // namespace

AuthenticatorTouchIdView::AuthenticatorTouchIdView(
    std::unique_ptr<AuthenticatorTouchIdSheetModel> sheet_model)
    : AuthenticatorRequestSheetView(std::move(sheet_model)) {}

AuthenticatorTouchIdView::~AuthenticatorTouchIdView() = default;

std::unique_ptr<views::View>
AuthenticatorTouchIdView::BuildStepSpecificHeader() {
  return CreateGpmIconWithLabel();
}

std::pair<std::unique_ptr<views::View>, AuthenticatorTouchIdView::AutoFocus>
AuthenticatorTouchIdView::BuildStepSpecificContent() {
  auto container = std::make_unique<views::BoxLayoutView>();
  auto* dialog_model =
      static_cast<AuthenticatorTouchIdSheetModel*>(model())->dialog_model();
  bool is_get_assertion =
      dialog_model->request_type == device::FidoRequestType::kGetAssertion;
  container->SetOrientation(views::BoxLayout::Orientation::kVertical);
  container->SetBetweenChildSpacing(kVerticalPadding);
  container->AddChildView(CreatePasskeyWithUsernameLabel(base::UTF8ToUTF16(
      (is_get_assertion ? dialog_model->preselected_cred->user.name
                        : dialog_model->user_entity.name)
          .value_or(""))));
  if (device::fido::mac::DeviceHasBiometricsAvailable()) {
    container->AddChildView(std::make_unique<MacAuthenticationView>(
        base::BindOnce(&AuthenticatorTouchIdView::OnTouchIDComplete,
                       base::Unretained(this)),
        l10n_util::GetStringFUTF16(
            IDS_WEBAUTHN_TOUCH_ID_PROMPT_REASON,
            base::UTF8ToUTF16(dialog_model->relying_party_id))));
    container->AddChildView(std::make_unique<views::Label>(
        l10n_util::GetStringUTF16(IDS_WEBAUTHN_TOUCH_ID_CONTINUE)));
  } else {
    container->AddChildView(
        std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon(
            vector_icons::kLockIcon, ui::kColorMenuIcon, kLockIconSize)));
    container->AddChildView(std::make_unique<views::Label>(
        l10n_util::GetStringUTF16(IDS_WEBAUTHN_TOUCH_ID_LOCKED)));
  }
  return {std::move(container), AutoFocus::kNo};
}

void AuthenticatorTouchIdView::OnTouchIDComplete(
    std::optional<webauthn::LocalAuthenticationToken> local_auth_token) {
  static_cast<AuthenticatorTouchIdSheetModel*>(model())->OnTouchIDSensorTapped(
      std::move(local_auth_token));
}

BEGIN_METADATA(AuthenticatorTouchIdView)
END_METADATA