security_token_request_controller.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/login/security_token_request_controller.h"
  5. #include <string>
  6. #include <utility>
  7. #include "ash/login/ui/pin_request_widget.h"
  8. #include "ash/public/cpp/login_types.h"
  9. #include "ash/strings/grit/ash_strings.h"
  10. #include "base/bind.h"
  11. #include "base/callback_helpers.h"
  12. #include "base/i18n/number_formatting.h"
  13. #include "chromeos/components/security_token_pin/error_generator.h"
  14. #include "ui/base/l10n/l10n_util.h"
  15. namespace ash {
  16. namespace {
  17. std::u16string GetTitle() {
  18. return l10n_util::GetStringUTF16(
  19. IDS_ASH_LOGIN_SECURITY_TOKEN_REQUEST_DIALOG_TITLE);
  20. }
  21. std::u16string GetDescription() {
  22. return l10n_util::GetStringUTF16(
  23. IDS_ASH_LOGIN_SECURITY_TOKEN_REQUEST_DIALOG_DESCRIPTION);
  24. }
  25. std::u16string GetAccessibleTitle() {
  26. return l10n_util::GetStringUTF16(
  27. IDS_ASH_LOGIN_SECURITY_TOKEN_REQUEST_DIALOG_TITLE);
  28. }
  29. } // namespace
  30. SecurityTokenRequestController::SecurityTokenRequestController() = default;
  31. SecurityTokenRequestController::~SecurityTokenRequestController() {
  32. ClosePinUi();
  33. }
  34. void SecurityTokenRequestController::ResetRequestCanceled() {
  35. request_canceled_ = false;
  36. }
  37. PinRequestView::SubmissionResult SecurityTokenRequestController::OnPinSubmitted(
  38. const std::string& code) {
  39. if (!on_pin_submitted_.is_null()) {
  40. std::move(on_pin_submitted_).Run(code);
  41. }
  42. return PinRequestView::SubmissionResult::kSubmitPending;
  43. }
  44. void SecurityTokenRequestController::OnBack() {
  45. request_canceled_ = true;
  46. if (!on_canceled_by_user_.is_null()) {
  47. std::move(on_canceled_by_user_).Run();
  48. }
  49. ClosePinUi();
  50. }
  51. void SecurityTokenRequestController::OnHelp() {
  52. NOTREACHED();
  53. }
  54. bool SecurityTokenRequestController::SetPinUiState(
  55. SecurityTokenPinRequest request) {
  56. // Unable to request a PIN while the PinRequestWidget is already used for
  57. // something that is not a SecurityTokenPinRequest.
  58. // Also deny the request when the user has just canceled another request: For
  59. // example, logging in with smart cards usually requires two requests for the
  60. // same PIN. When the user has canceled the first one, we do not show another
  61. // right afterwards.
  62. if ((PinRequestWidget::Get() && !security_token_request_in_progress_) ||
  63. request_canceled_) {
  64. std::move(request.pin_ui_closed_callback).Run();
  65. return false;
  66. }
  67. on_pin_submitted_ = std::move(request.pin_entered_callback);
  68. on_canceled_by_user_ = std::move(request.pin_ui_closed_callback);
  69. // If this is a new request, open a PIN widget. Otherwise, just update the
  70. // existing widget.
  71. if (!security_token_request_in_progress_) {
  72. security_token_request_in_progress_ = true;
  73. PinRequest pin_request;
  74. pin_request.on_pin_request_done = base::DoNothing();
  75. pin_request.pin_keyboard_always_enabled = true;
  76. pin_request.extra_dimmer = true;
  77. pin_request.title = GetTitle();
  78. pin_request.description = GetDescription();
  79. pin_request.accessible_title = GetAccessibleTitle();
  80. PinRequestWidget::Show(std::move(pin_request), this);
  81. }
  82. PinRequestWidget::Get()->ClearInput();
  83. PinRequestWidget::Get()->SetPinInputEnabled(request.enable_user_input);
  84. if (request.error_label == chromeos::security_token_pin::ErrorLabel::kNone) {
  85. PinRequestWidget::Get()->UpdateState(PinRequestViewState::kNormal,
  86. GetTitle(), GetDescription());
  87. } else {
  88. PinRequestWidget::Get()->UpdateState(
  89. PinRequestViewState::kError,
  90. /*title=*/
  91. chromeos::security_token_pin::GenerateErrorMessage(
  92. request.error_label, request.attempts_left,
  93. request.enable_user_input),
  94. /*description=*/std::u16string());
  95. }
  96. return true;
  97. }
  98. void SecurityTokenRequestController::ClosePinUi() {
  99. if (!security_token_request_in_progress_)
  100. return;
  101. if (PinRequestWidget::Get()) {
  102. PinRequestWidget::Get()->Close(false); // Parameter will be ignored.
  103. }
  104. on_pin_submitted_.Reset();
  105. on_canceled_by_user_.Reset();
  106. security_token_request_in_progress_ = false;
  107. }
  108. } // namespace ash