blob: 500075386a5f974571b4f9b2d1899d63253ff96d [file] [log] [blame]
// Copyright 2019 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.
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_SETTINGS_SECURITY_KEY_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_SETTINGS_SECURITY_KEY_HANDLER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "device/fido/fido_constants.h"
#include "device/fido/bio/enrollment.h"
namespace base {
class ListValue;
}
namespace device {
struct AggregatedEnumerateCredentialsResponse;
class FidoDiscoveryFactory;
class CredentialManagementHandler;
enum class CredentialManagementStatus;
class SetPINRequestHandler;
class ResetRequestHandler;
class BioEnrollmentHandler;
enum class BioEnrollmentStatus;
} // namespace device
namespace settings {
// Base class for message handlers on the "Security Keys" settings subpage.
class SecurityKeysHandlerBase : public SettingsPageUIHandler {
protected:
SecurityKeysHandlerBase() = default;
// Subclasses must implement close to invalidate all pending callbacks.
virtual void Close() = 0;
private:
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
SecurityKeysHandlerBase(const SecurityKeysHandlerBase&) = delete;
SecurityKeysHandlerBase& operator=(const SecurityKeysHandlerBase&) = delete;
};
// SecurityKeysPINHandler processes messages from the "Create a PIN" dialog of
// the "Security Keys" settings subpage. An instance of this class is created
// for each settings tab and is destroyed when the tab is closed. See
// SecurityKeysPINBrowserProxy about the interface.
class SecurityKeysPINHandler : public SecurityKeysHandlerBase {
public:
SecurityKeysPINHandler();
~SecurityKeysPINHandler() override;
private:
enum class State {
kNone,
kStartSetPIN,
kGatherNewPIN,
kGatherChangePIN,
kSettingPIN,
};
void RegisterMessages() override;
void Close() override;
void HandleStartSetPIN(const base::ListValue* args);
void OnGatherPIN(base::Optional<int64_t> num_retries);
void OnSetPINComplete(device::CtapDeviceResponseCode code);
void HandleSetPIN(const base::ListValue* args);
State state_ = State::kNone;
std::unique_ptr<device::SetPINRequestHandler> set_pin_;
std::string callback_id_;
base::WeakPtrFactory<SecurityKeysPINHandler> weak_factory_{this};
};
// SecurityKeysResetHandler processes messages from the "Reset your Security
// Key" dialog of the "Security Keys" settings subpage. An instance of this
// class is created for each settings tab and is destroyed when the tab is
// closed. See SecurityKeysResetBrowserProxy about the interface.
class SecurityKeysResetHandler : public SecurityKeysHandlerBase {
public:
SecurityKeysResetHandler();
~SecurityKeysResetHandler() override;
private:
enum class State {
kNone,
kStartReset,
kWaitingForResetNoCallbackYet,
kWaitingForResetHaveCallback,
kWaitingForCompleteReset,
};
void RegisterMessages() override;
void Close() override;
void HandleReset(const base::ListValue* args);
void OnResetSent();
void HandleCompleteReset(const base::ListValue* args);
void OnResetFinished(device::CtapDeviceResponseCode result);
State state_ = State::kNone;
std::unique_ptr<device::ResetRequestHandler> reset_;
base::Optional<device::CtapDeviceResponseCode> reset_result_;
std::string callback_id_;
base::WeakPtrFactory<SecurityKeysResetHandler> weak_factory_{this};
};
// SecurityKeysCredentialHandler processes messages from the "Manage
// sign-in data" dialog of the "Security Keys" settings subpage. An instance of
// this class is created for each settings tab and is destroyed when the tab is
// closed. See SecurityKeysCredentialBrowserProxy about the interface.
class SecurityKeysCredentialHandler : public SecurityKeysHandlerBase {
public:
SecurityKeysCredentialHandler();
~SecurityKeysCredentialHandler() override;
private:
enum class State {
kNone,
kStart,
kPIN,
kReady,
kGettingCredentials,
kDeletingCredentials,
};
void RegisterMessages() override;
void Close() override;
void HandleStart(const base::ListValue* args);
void HandlePIN(const base::ListValue* args);
void HandleEnumerate(const base::ListValue* args);
void HandleDelete(const base::ListValue* args);
void OnCredentialManagementReady();
void OnHaveCredentials(
device::CtapDeviceResponseCode status,
base::Optional<
std::vector<device::AggregatedEnumerateCredentialsResponse>>
responses,
base::Optional<size_t> remaining_credentials);
void OnGatherPIN(int64_t num_retries, base::OnceCallback<void(std::string)>);
void OnCredentialsDeleted(device::CtapDeviceResponseCode status);
void OnFinished(device::CredentialManagementStatus status);
State state_ = State::kNone;
base::OnceCallback<void(std::string)> credential_management_provide_pin_cb_;
std::unique_ptr<device::FidoDiscoveryFactory> discovery_factory_;
std::unique_ptr<device::CredentialManagementHandler> credential_management_;
std::string callback_id_;
base::WeakPtrFactory<SecurityKeysCredentialHandler> weak_factory_{this};
};
// SecurityKeysBioEnrollmentHandler processes messages from the "Manage
// fingerprints" dialog of the "Security Keys" settings subpage. An instance of
// this class is created for each settings tab and is destroyed when the tab is
// closed. See SecurityKeysBioEnrollProxy about the interface.
class SecurityKeysBioEnrollmentHandler : public SecurityKeysHandlerBase {
public:
SecurityKeysBioEnrollmentHandler();
~SecurityKeysBioEnrollmentHandler() override;
private:
enum class State {
kNone,
kStart,
kGatherPIN,
kReady,
kEnumerating,
kEnrolling,
kDeleting,
};
void RegisterMessages() override;
void Close() override;
void HandleStart(const base::ListValue* args);
void OnReady();
void OnError(device::BioEnrollmentStatus status);
void OnGatherPIN(int64_t retries, base::OnceCallback<void(std::string)>);
void HandleProvidePIN(const base::ListValue* args);
void HandleEnumerate(const base::ListValue* args);
void OnHaveEnumeration(
device::CtapDeviceResponseCode,
base::Optional<std::map<std::vector<uint8_t>, std::string>>);
void HandleStartEnrolling(const base::ListValue* args);
void OnEnrollingResponse(device::BioEnrollmentSampleStatus, uint8_t);
void OnEnrollmentFinished(device::CtapDeviceResponseCode);
void HandleDelete(const base::ListValue* args);
void OnDelete(device::CtapDeviceResponseCode);
void HandleCancel(const base::ListValue* args);
State state_ = State::kNone;
std::string callback_id_;
base::OnceCallback<void(std::string)> provide_pin_cb_;
std::unique_ptr<device::FidoDiscoveryFactory> discovery_factory_;
std::unique_ptr<device::BioEnrollmentHandler> bio_;
base::WeakPtrFactory<SecurityKeysBioEnrollmentHandler> weak_factory_{this};
};
} // namespace settings
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_SETTINGS_SECURITY_KEY_HANDLER_H_