Commit 69de77e1 authored by Jun Choi's avatar Jun Choi Committed by Commit Bot

Refactor FidoHidDevice::MessageReceived()

|is_success| parameter in FidoHidDevice::MessageReceived() can be
represented by nullptr |message| parameter.

Bug: 828088
Change-Id: Ia13439acc98f43af1741308063ac7c2ab1b62af9
Reviewed-on: https://chromium-review.googlesource.com/1014655Reviewed-by: default avatarJan Wilken Dörrie <jdoerrie@chromium.org>
Commit-Queue: Jun Choi <hongjunchoi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#551741}
parent 6c575653
...@@ -148,13 +148,13 @@ void FidoHidDevice::AllocateChannel(std::vector<uint8_t> command, ...@@ -148,13 +148,13 @@ void FidoHidDevice::AllocateChannel(std::vector<uint8_t> command,
void FidoHidDevice::OnAllocateChannel(std::vector<uint8_t> nonce, void FidoHidDevice::OnAllocateChannel(std::vector<uint8_t> nonce,
std::vector<uint8_t> command, std::vector<uint8_t> command,
DeviceCallback callback, DeviceCallback callback,
bool success, base::Optional<FidoHidMessage> message) {
std::unique_ptr<FidoHidMessage> message) {
if (state_ == State::kDeviceError) if (state_ == State::kDeviceError)
return; return;
timeout_callback_.Cancel(); timeout_callback_.Cancel();
if (!success || !message) { if (!message) {
state_ = State::kDeviceError; state_ = State::kDeviceError;
Transition(std::vector<uint8_t>(), std::move(callback)); Transition(std::vector<uint8_t>(), std::move(callback));
return; return;
...@@ -198,11 +198,11 @@ void FidoHidDevice::OnAllocateChannel(std::vector<uint8_t> nonce, ...@@ -198,11 +198,11 @@ void FidoHidDevice::OnAllocateChannel(std::vector<uint8_t> nonce,
Transition(std::move(command), std::move(callback)); Transition(std::move(command), std::move(callback));
} }
void FidoHidDevice::WriteMessage(std::unique_ptr<FidoHidMessage> message, void FidoHidDevice::WriteMessage(base::Optional<FidoHidMessage> message,
bool response_expected, bool response_expected,
HidMessageCallback callback) { HidMessageCallback callback) {
if (!connection_ || !message || message->NumPackets() == 0) { if (!connection_ || !message || message->NumPackets() == 0) {
std::move(callback).Run(false, nullptr); std::move(callback).Run(base::nullopt);
return; return;
} }
const auto& packet = message->PopNextPacket(); const auto& packet = message->PopNextPacket();
...@@ -213,7 +213,7 @@ void FidoHidDevice::WriteMessage(std::unique_ptr<FidoHidMessage> message, ...@@ -213,7 +213,7 @@ void FidoHidDevice::WriteMessage(std::unique_ptr<FidoHidMessage> message,
std::move(callback))); std::move(callback)));
} }
void FidoHidDevice::PacketWritten(std::unique_ptr<FidoHidMessage> message, void FidoHidDevice::PacketWritten(base::Optional<FidoHidMessage> message,
bool response_expected, bool response_expected,
HidMessageCallback callback, HidMessageCallback callback,
bool success) { bool success) {
...@@ -222,13 +222,13 @@ void FidoHidDevice::PacketWritten(std::unique_ptr<FidoHidMessage> message, ...@@ -222,13 +222,13 @@ void FidoHidDevice::PacketWritten(std::unique_ptr<FidoHidMessage> message,
} else if (success && response_expected) { } else if (success && response_expected) {
ReadMessage(std::move(callback)); ReadMessage(std::move(callback));
} else { } else {
std::move(callback).Run(success, nullptr); std::move(callback).Run(base::nullopt);
} }
} }
void FidoHidDevice::ReadMessage(HidMessageCallback callback) { void FidoHidDevice::ReadMessage(HidMessageCallback callback) {
if (!connection_) { if (!connection_) {
std::move(callback).Run(false, nullptr); std::move(callback).Run(base::nullopt);
return; return;
} }
...@@ -241,14 +241,14 @@ void FidoHidDevice::OnRead(HidMessageCallback callback, ...@@ -241,14 +241,14 @@ void FidoHidDevice::OnRead(HidMessageCallback callback,
uint8_t report_id, uint8_t report_id,
const base::Optional<std::vector<uint8_t>>& buf) { const base::Optional<std::vector<uint8_t>>& buf) {
if (!success) { if (!success) {
std::move(callback).Run(success, nullptr); std::move(callback).Run(base::nullopt);
return; return;
} }
DCHECK(buf); DCHECK(buf);
auto read_message = FidoHidMessage::CreateFromSerializedData(*buf); auto read_message = FidoHidMessage::CreateFromSerializedData(*buf);
if (!read_message) { if (!read_message) {
std::move(callback).Run(false, nullptr); std::move(callback).Run(base::nullopt);
return; return;
} }
...@@ -261,7 +261,7 @@ void FidoHidDevice::OnRead(HidMessageCallback callback, ...@@ -261,7 +261,7 @@ void FidoHidDevice::OnRead(HidMessageCallback callback,
} }
if (read_message->MessageComplete()) { if (read_message->MessageComplete()) {
std::move(callback).Run(success, std::move(read_message)); std::move(callback).Run(std::move(read_message));
return; return;
} }
...@@ -272,20 +272,20 @@ void FidoHidDevice::OnRead(HidMessageCallback callback, ...@@ -272,20 +272,20 @@ void FidoHidDevice::OnRead(HidMessageCallback callback,
} }
void FidoHidDevice::OnReadContinuation( void FidoHidDevice::OnReadContinuation(
std::unique_ptr<FidoHidMessage> message, base::Optional<FidoHidMessage> message,
HidMessageCallback callback, HidMessageCallback callback,
bool success, bool success,
uint8_t report_id, uint8_t report_id,
const base::Optional<std::vector<uint8_t>>& buf) { const base::Optional<std::vector<uint8_t>>& buf) {
if (!success) { if (!success) {
std::move(callback).Run(success, nullptr); std::move(callback).Run(base::nullopt);
return; return;
} }
DCHECK(buf); DCHECK(buf);
message->AddContinuationPacket(*buf); message->AddContinuationPacket(*buf);
if (message->MessageComplete()) { if (message->MessageComplete()) {
std::move(callback).Run(success, std::move(message)); std::move(callback).Run(std::move(message));
return; return;
} }
connection_->Read(base::BindOnce(&FidoHidDevice::OnReadContinuation, connection_->Read(base::BindOnce(&FidoHidDevice::OnReadContinuation,
...@@ -294,13 +294,12 @@ void FidoHidDevice::OnReadContinuation( ...@@ -294,13 +294,12 @@ void FidoHidDevice::OnReadContinuation(
} }
void FidoHidDevice::MessageReceived(DeviceCallback callback, void FidoHidDevice::MessageReceived(DeviceCallback callback,
bool success, base::Optional<FidoHidMessage> message) {
std::unique_ptr<FidoHidMessage> message) {
if (state_ == State::kDeviceError) if (state_ == State::kDeviceError)
return; return;
timeout_callback_.Cancel(); timeout_callback_.Cancel();
if (!success || !message) { if (!message) {
state_ = State::kDeviceError; state_ = State::kDeviceError;
Transition(std::vector<uint8_t>(), std::move(callback)); Transition(std::vector<uint8_t>(), std::move(callback));
return; return;
...@@ -329,8 +328,8 @@ void FidoHidDevice::MessageReceived(DeviceCallback callback, ...@@ -329,8 +328,8 @@ void FidoHidDevice::MessageReceived(DeviceCallback callback,
state_ = State::kReady; state_ = State::kReady;
base::WeakPtr<FidoHidDevice> self = weak_factory_.GetWeakPtr(); base::WeakPtr<FidoHidDevice> self = weak_factory_.GetWeakPtr();
std::move(callback).Run( std::move(callback).Run(
(success && message) ? base::make_optional(message->GetMessagePayload()) message ? base::make_optional(message->GetMessagePayload())
: base::nullopt); : base::nullopt);
// Executing |callback| may have freed |this|. Check |self| first. // Executing |callback| may have freed |this|. Check |self| first.
if (self && !pending_transactions_.empty()) { if (self && !pending_transactions_.empty()) {
...@@ -366,8 +365,7 @@ void FidoHidDevice::OnKeepAlive(DeviceCallback callback) { ...@@ -366,8 +365,7 @@ void FidoHidDevice::OnKeepAlive(DeviceCallback callback) {
} }
void FidoHidDevice::OnWink(WinkCallback callback, void FidoHidDevice::OnWink(WinkCallback callback,
bool success, base::Optional<FidoHidMessage> response) {
std::unique_ptr<FidoHidMessage> response) {
std::move(callback).Run(); std::move(callback).Run();
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#ifndef DEVICE_FIDO_FIDO_HID_DEVICE_H_ #ifndef DEVICE_FIDO_FIDO_HID_DEVICE_H_
#define DEVICE_FIDO_FIDO_HID_DEVICE_H_ #define DEVICE_FIDO_FIDO_HID_DEVICE_H_
#include <memory>
#include <queue> #include <queue>
#include <string> #include <string>
#include <utility> #include <utility>
...@@ -15,6 +14,7 @@ ...@@ -15,6 +14,7 @@
#include "base/cancelable_callback.h" #include "base/cancelable_callback.h"
#include "base/component_export.h" #include "base/component_export.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/optional.h"
#include "components/apdu/apdu_command.h" #include "components/apdu/apdu_command.h"
#include "components/apdu/apdu_response.h" #include "components/apdu/apdu_response.h"
#include "device/fido/fido_device.h" #include "device/fido/fido_device.h"
...@@ -58,7 +58,7 @@ class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidDevice : public FidoDevice { ...@@ -58,7 +58,7 @@ class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidDevice : public FidoDevice {
static constexpr uint32_t kBroadcastChannel = 0xffffffff; static constexpr uint32_t kBroadcastChannel = 0xffffffff;
using HidMessageCallback = using HidMessageCallback =
base::OnceCallback<void(bool, std::unique_ptr<FidoHidMessage>)>; base::OnceCallback<void(base::Optional<FidoHidMessage>)>;
using ConnectCallback = device::mojom::HidManager::ConnectCallback; using ConnectCallback = device::mojom::HidManager::ConnectCallback;
// Open a connection to this device. // Open a connection to this device.
...@@ -71,35 +71,31 @@ class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidDevice : public FidoDevice { ...@@ -71,35 +71,31 @@ class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidDevice : public FidoDevice {
void OnAllocateChannel(std::vector<uint8_t> nonce, void OnAllocateChannel(std::vector<uint8_t> nonce,
std::vector<uint8_t> command, std::vector<uint8_t> command,
DeviceCallback callback, DeviceCallback callback,
bool success, base::Optional<FidoHidMessage> message);
std::unique_ptr<FidoHidMessage> message);
void Transition(std::vector<uint8_t> command, DeviceCallback callback); void Transition(std::vector<uint8_t> command, DeviceCallback callback);
// Write all message packets to device, and read response if expected. // Write all message packets to device, and read response if expected.
void WriteMessage(std::unique_ptr<FidoHidMessage> message, void WriteMessage(base::Optional<FidoHidMessage> message,
bool response_expected, bool response_expected,
HidMessageCallback callback); HidMessageCallback callback);
void PacketWritten(std::unique_ptr<FidoHidMessage> message, void PacketWritten(base::Optional<FidoHidMessage> message,
bool response_expected, bool response_expected,
HidMessageCallback callback, HidMessageCallback callback,
bool success); bool success);
// Read all response message packets from device. // Read all response message packets from device.
void ReadMessage(HidMessageCallback callback); void ReadMessage(HidMessageCallback callback);
void MessageReceived(DeviceCallback callback, void MessageReceived(DeviceCallback callback,
bool success, base::Optional<FidoHidMessage> message);
std::unique_ptr<FidoHidMessage> message);
void OnRead(HidMessageCallback callback, void OnRead(HidMessageCallback callback,
bool success, bool success,
uint8_t report_id, uint8_t report_id,
const base::Optional<std::vector<uint8_t>>& buf); const base::Optional<std::vector<uint8_t>>& buf);
void OnReadContinuation(std::unique_ptr<FidoHidMessage> message, void OnReadContinuation(base::Optional<FidoHidMessage> message,
HidMessageCallback callback, HidMessageCallback callback,
bool success, bool success,
uint8_t report_id, uint8_t report_id,
const base::Optional<std::vector<uint8_t>>& buf); const base::Optional<std::vector<uint8_t>>& buf);
void OnKeepAlive(DeviceCallback callback); void OnKeepAlive(DeviceCallback callback);
void OnWink(WinkCallback callback, void OnWink(WinkCallback callback, base::Optional<FidoHidMessage> response);
bool success,
std::unique_ptr<FidoHidMessage> response);
void ArmTimeout(DeviceCallback callback); void ArmTimeout(DeviceCallback callback);
void OnTimeout(DeviceCallback callback); void OnTimeout(DeviceCallback callback);
......
...@@ -15,12 +15,12 @@ ...@@ -15,12 +15,12 @@
namespace device { namespace device {
// static // static
std::unique_ptr<FidoHidMessage> FidoHidMessage::Create( base::Optional<FidoHidMessage> FidoHidMessage::Create(
uint32_t channel_id, uint32_t channel_id,
FidoHidDeviceCommand type, FidoHidDeviceCommand type,
base::span<const uint8_t> data) { base::span<const uint8_t> data) {
if (data.size() > kHidMaxMessageSize) if (data.size() > kHidMaxMessageSize)
return nullptr; return base::nullopt;
switch (type) { switch (type) {
case FidoHidDeviceCommand::kPing: case FidoHidDeviceCommand::kPing:
...@@ -28,53 +28,56 @@ std::unique_ptr<FidoHidMessage> FidoHidMessage::Create( ...@@ -28,53 +28,56 @@ std::unique_ptr<FidoHidMessage> FidoHidMessage::Create(
case FidoHidDeviceCommand::kMsg: case FidoHidDeviceCommand::kMsg:
case FidoHidDeviceCommand::kCbor: { case FidoHidDeviceCommand::kCbor: {
if (data.empty()) if (data.empty())
return nullptr; return base::nullopt;
break; break;
} }
case FidoHidDeviceCommand::kCancel: case FidoHidDeviceCommand::kCancel:
case FidoHidDeviceCommand::kWink: { case FidoHidDeviceCommand::kWink: {
if (!data.empty()) if (!data.empty())
return nullptr; return base::nullopt;
break; break;
} }
case FidoHidDeviceCommand::kLock: { case FidoHidDeviceCommand::kLock: {
if (data.size() != 1 || data[0] > kHidMaxLockSeconds) if (data.size() != 1 || data[0] > kHidMaxLockSeconds)
return nullptr; return base::nullopt;
break; break;
} }
case FidoHidDeviceCommand::kInit: { case FidoHidDeviceCommand::kInit: {
if (data.size() != 8) if (data.size() != 8)
return nullptr; return base::nullopt;
break; break;
} }
case FidoHidDeviceCommand::kKeepAlive: case FidoHidDeviceCommand::kKeepAlive:
case FidoHidDeviceCommand::kError: case FidoHidDeviceCommand::kError:
if (data.size() != 1) if (data.size() != 1)
return nullptr; return base::nullopt;
} }
return base::WrapUnique(new FidoHidMessage(channel_id, type, data)); return FidoHidMessage(channel_id, type, data);
} }
// static // static
std::unique_ptr<FidoHidMessage> FidoHidMessage::CreateFromSerializedData( base::Optional<FidoHidMessage> FidoHidMessage::CreateFromSerializedData(
base::span<const uint8_t> serialized_data) { base::span<const uint8_t> serialized_data) {
size_t remaining_size = 0; size_t remaining_size = 0;
if (serialized_data.size() > kHidPacketSize || if (serialized_data.size() > kHidPacketSize ||
serialized_data.size() < kHidInitPacketHeaderSize) serialized_data.size() < kHidInitPacketHeaderSize)
return nullptr; return base::nullopt;
auto init_packet = FidoHidInitPacket::CreateFromSerializedData( auto init_packet = FidoHidInitPacket::CreateFromSerializedData(
serialized_data, &remaining_size); serialized_data, &remaining_size);
if (init_packet == nullptr) if (init_packet == nullptr)
return nullptr; return base::nullopt;
return base::WrapUnique( return FidoHidMessage(std::move(init_packet), remaining_size);
new FidoHidMessage(std::move(init_packet), remaining_size));
} }
FidoHidMessage::FidoHidMessage(FidoHidMessage&& that) = default;
FidoHidMessage& FidoHidMessage::operator=(FidoHidMessage&& other) = default;
FidoHidMessage::~FidoHidMessage() = default; FidoHidMessage::~FidoHidMessage() = default;
bool FidoHidMessage::MessageComplete() const { bool FidoHidMessage::MessageComplete() const {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "base/containers/queue.h" #include "base/containers/queue.h"
#include "base/containers/span.h" #include "base/containers/span.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/optional.h"
#include "device/fido/fido_constants.h" #include "device/fido/fido_constants.h"
#include "device/fido/fido_hid_packet.h" #include "device/fido/fido_hid_packet.h"
...@@ -27,14 +28,16 @@ namespace device { ...@@ -27,14 +28,16 @@ namespace device {
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidMessage { class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidMessage {
public: public:
// Static functions to create CTAP/U2F HID commands. // Static functions to create CTAP/U2F HID commands.
static std::unique_ptr<FidoHidMessage> Create(uint32_t channel_id, static base::Optional<FidoHidMessage> Create(uint32_t channel_id,
FidoHidDeviceCommand cmd, FidoHidDeviceCommand cmd,
base::span<const uint8_t> data); base::span<const uint8_t> data);
// Reconstruct a message from serialized message data. // Reconstruct a message from serialized message data.
static std::unique_ptr<FidoHidMessage> CreateFromSerializedData( static base::Optional<FidoHidMessage> CreateFromSerializedData(
base::span<const uint8_t> serialized_data); base::span<const uint8_t> serialized_data);
FidoHidMessage(FidoHidMessage&& that);
FidoHidMessage& operator=(FidoHidMessage&& other);
~FidoHidMessage(); ~FidoHidMessage();
bool MessageComplete() const; bool MessageComplete() const;
......
...@@ -160,7 +160,7 @@ TEST(FidoHidMessageTest, TestMaxSize) { ...@@ -160,7 +160,7 @@ TEST(FidoHidMessageTest, TestMaxSize) {
std::vector<uint8_t> data(kHidMaxMessageSize + 1); std::vector<uint8_t> data(kHidMaxMessageSize + 1);
auto oversize_message = auto oversize_message =
FidoHidMessage::Create(channel_id, FidoHidDeviceCommand::kPing, data); FidoHidMessage::Create(channel_id, FidoHidDeviceCommand::kPing, data);
EXPECT_EQ(nullptr, oversize_message); EXPECT_FALSE(oversize_message);
} }
TEST(FidoHidMessageTest, TestDeconstruct) { TEST(FidoHidMessageTest, TestDeconstruct) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment