Index: extensions/browser/api/cast_channel/cast_message_util.cc |
diff --git a/extensions/browser/api/cast_channel/cast_message_util.cc b/extensions/browser/api/cast_channel/cast_message_util.cc |
index 2d15891134b09439c3a50b59df4dbfe091f7292d..3b646610642902fc7ba7822bda2b45e6ed72bd87 100644 |
--- a/extensions/browser/api/cast_channel/cast_message_util.cc |
+++ b/extensions/browser/api/cast_channel/cast_message_util.cc |
@@ -9,21 +9,29 @@ |
#include "base/logging.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/values.h" |
-#include "components/cast_channel/proto/cast_channel.pb.h" |
+#include "extensions/browser/api/cast_channel/cast_auth_util.h" |
#include "extensions/common/api/cast_channel.h" |
+#include "extensions/common/api/cast_channel/cast_channel.pb.h" |
+ |
+namespace { |
+static const char kAuthNamespace[] = |
+ "urn:x-cast:com.google.cast.tp.deviceauth"; |
+// Sender and receiver IDs to use for platform messages. |
+static const char kPlatformSenderId[] = "sender-0"; |
+static const char kPlatformReceiverId[] = "receiver-0"; |
+} // namespace |
namespace extensions { |
namespace api { |
namespace cast_channel { |
bool MessageInfoToCastMessage(const MessageInfo& message, |
- ::cast_channel::CastMessage* message_proto) { |
+ CastMessage* message_proto) { |
DCHECK(message_proto); |
if (!message.data) |
return false; |
- message_proto->set_protocol_version( |
- ::cast_channel::CastMessage_ProtocolVersion_CASTV2_1_0); |
+ message_proto->set_protocol_version(CastMessage_ProtocolVersion_CASTV2_1_0); |
message_proto->set_source_id(message.source_id); |
message_proto->set_destination_id(message.destination_id); |
message_proto->set_namespace_(message.namespace_); |
@@ -34,15 +42,13 @@ |
// JS string |
case base::Value::Type::STRING: |
if (message.data->GetAsString(&data)) { |
- message_proto->set_payload_type( |
- ::cast_channel::CastMessage_PayloadType_STRING); |
+ message_proto->set_payload_type(CastMessage_PayloadType_STRING); |
message_proto->set_payload_utf8(data); |
} |
break; |
// JS ArrayBuffer |
case base::Value::Type::BINARY: |
- message_proto->set_payload_type( |
- ::cast_channel::CastMessage_PayloadType_BINARY); |
+ message_proto->set_payload_type(CastMessage_PayloadType_BINARY); |
message_proto->set_payload_binary(message.data->GetBlob().data(), |
message.data->GetBlob().size()); |
break; |
@@ -54,7 +60,18 @@ |
return message_proto->IsInitialized(); |
} |
-bool CastMessageToMessageInfo(const ::cast_channel::CastMessage& message_proto, |
+bool IsCastMessageValid(const CastMessage& message_proto) { |
+ if (message_proto.namespace_().empty() || message_proto.source_id().empty() || |
+ message_proto.destination_id().empty()) { |
+ return false; |
+ } |
+ return (message_proto.payload_type() == CastMessage_PayloadType_STRING && |
+ message_proto.has_payload_utf8()) || |
+ (message_proto.payload_type() == CastMessage_PayloadType_BINARY && |
+ message_proto.has_payload_binary()); |
+} |
+ |
+bool CastMessageToMessageInfo(const CastMessage& message_proto, |
MessageInfo* message) { |
DCHECK(message); |
message->source_id = message_proto.source_id(); |
@@ -63,19 +80,19 @@ |
// Determine the type of the payload and fill base::Value appropriately. |
std::unique_ptr<base::Value> value; |
switch (message_proto.payload_type()) { |
- case ::cast_channel::CastMessage_PayloadType_STRING: |
- if (message_proto.has_payload_utf8()) |
- value.reset(new base::Value(message_proto.payload_utf8())); |
- break; |
- case ::cast_channel::CastMessage_PayloadType_BINARY: |
- if (message_proto.has_payload_binary()) |
- value = base::Value::CreateWithCopiedBuffer( |
- message_proto.payload_binary().data(), |
- message_proto.payload_binary().size()); |
- break; |
- default: |
- // Unknown payload type. value will remain unset. |
- break; |
+ case CastMessage_PayloadType_STRING: |
+ if (message_proto.has_payload_utf8()) |
+ value.reset(new base::Value(message_proto.payload_utf8())); |
+ break; |
+ case CastMessage_PayloadType_BINARY: |
+ if (message_proto.has_payload_binary()) |
+ value = base::Value::CreateWithCopiedBuffer( |
+ message_proto.payload_binary().data(), |
+ message_proto.payload_binary().size()); |
+ break; |
+ default: |
+ // Unknown payload type. value will remain unset. |
+ break; |
} |
if (value.get()) { |
DCHECK(!message->data.get()); |
@@ -86,6 +103,58 @@ |
} |
} |
+std::string CastMessageToString(const CastMessage& message_proto) { |
+ std::string out("{"); |
+ out += "namespace = " + message_proto.namespace_(); |
+ out += ", sourceId = " + message_proto.source_id(); |
+ out += ", destId = " + message_proto.destination_id(); |
+ out += ", type = " + base::IntToString(message_proto.payload_type()); |
+ out += ", str = \"" + message_proto.payload_utf8() + "\"}"; |
+ return out; |
+} |
+ |
+std::string AuthMessageToString(const DeviceAuthMessage& message) { |
+ std::string out("{"); |
+ if (message.has_challenge()) { |
+ out += "challenge: {}, "; |
+ } |
+ if (message.has_response()) { |
+ out += "response: {signature: ("; |
+ out += base::SizeTToString(message.response().signature().length()); |
+ out += " bytes), certificate: ("; |
+ out += base::SizeTToString( |
+ message.response().client_auth_certificate().length()); |
+ out += " bytes)}"; |
+ } |
+ if (message.has_error()) { |
+ out += ", error: {"; |
+ out += base::IntToString(message.error().error_type()); |
+ out += "}"; |
+ } |
+ out += "}"; |
+ return out; |
+} |
+ |
+void CreateAuthChallengeMessage(CastMessage* message_proto, |
+ const AuthContext& auth_context) { |
+ CHECK(message_proto); |
+ DeviceAuthMessage auth_message; |
+ auth_message.mutable_challenge()->set_sender_nonce(auth_context.nonce()); |
+ std::string auth_message_string; |
+ auth_message.SerializeToString(&auth_message_string); |
+ |
+ message_proto->set_protocol_version(CastMessage_ProtocolVersion_CASTV2_1_0); |
+ message_proto->set_source_id(kPlatformSenderId); |
+ message_proto->set_destination_id(kPlatformReceiverId); |
+ message_proto->set_namespace_(kAuthNamespace); |
+ message_proto->set_payload_type(CastMessage_PayloadType_BINARY); |
+ message_proto->set_payload_binary(auth_message_string); |
+} |
+ |
+bool IsAuthMessage(const CastMessage& message) { |
+ return message.namespace_() == kAuthNamespace; |
+} |
+ |
} // namespace cast_channel |
} // namespace api |
} // namespace extensions |