Commit 668783bd authored by Eero Häkkinen's avatar Eero Häkkinen Committed by Commit Bot

[chrome.displaySource] Use network.mojom.IPEndPoint

This changes the display source extension to use network.mojom.IPAddress
for passing IP addresses over Mojo and network.mojom.IPEndPoint for
passing IP address and port number combinations over Mojo. That prevents
invalid IP addresses and port numbers from be accepted.

Bug: 242107,666823
Change-Id: Id3d4d98e389ff224d073983f61261bd643d29d9a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1675432
Commit-Queue: Eero Häkkinen <eero.hakkinen@intel.com>
Auto-Submit: Eero Häkkinen <eero.hakkinen@intel.com>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#707451}
parent d6a88e19
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/base/ip_address.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/log/net_log_source.h" #include "net/log/net_log_source.h"
#include "net/socket/udp_socket.h" #include "net/socket/udp_socket.h"
...@@ -65,9 +66,9 @@ class MockDisplaySourceConnectionDelegate ...@@ -65,9 +66,9 @@ class MockDisplaySourceConnectionDelegate
void StopWatchingAvailableSinks() override; void StopWatchingAvailableSinks() override;
std::string GetLocalAddress() const override; net::IPAddress GetLocalAddress() const override;
std::string GetSinkAddress() const override; net::IPAddress GetSinkAddress() const override;
void SendMessage(const std::string& message) override; void SendMessage(const std::string& message) override;
...@@ -366,12 +367,12 @@ MockDisplaySourceConnectionDelegate::GetConnectedSink() const { ...@@ -366,12 +367,12 @@ MockDisplaySourceConnectionDelegate::GetConnectedSink() const {
void MockDisplaySourceConnectionDelegate::StopWatchingAvailableSinks() {} void MockDisplaySourceConnectionDelegate::StopWatchingAvailableSinks() {}
std::string MockDisplaySourceConnectionDelegate::GetLocalAddress() const { net::IPAddress MockDisplaySourceConnectionDelegate::GetLocalAddress() const {
return "127.0.0.1"; return net::IPAddress::IPv4Localhost();
} }
std::string MockDisplaySourceConnectionDelegate::GetSinkAddress() const { net::IPAddress MockDisplaySourceConnectionDelegate::GetSinkAddress() const {
return "127.0.0.1"; return net::IPAddress::IPv4Localhost();
} }
void MockDisplaySourceConnectionDelegate::SendMessage( void MockDisplaySourceConnectionDelegate::SendMessage(
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/observer_list.h" #include "base/observer_list.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "extensions/common/api/display_source.h" #include "extensions/common/api/display_source.h"
#include "net/base/ip_address.h"
namespace extensions { namespace extensions {
...@@ -34,10 +35,10 @@ class DisplaySourceConnectionDelegate : public KeyedService { ...@@ -34,10 +35,10 @@ class DisplaySourceConnectionDelegate : public KeyedService {
virtual const DisplaySourceSinkInfo& GetConnectedSink() const = 0; virtual const DisplaySourceSinkInfo& GetConnectedSink() const = 0;
// Returns the local address of the source. // Returns the local address of the source.
virtual std::string GetLocalAddress() const = 0; virtual net::IPAddress GetLocalAddress() const = 0;
// Returns the address of the connected sink. // Returns the address of the connected sink.
virtual std::string GetSinkAddress() const = 0; virtual net::IPAddress GetSinkAddress() const = 0;
// Sends a control message to the connected sink. // Sends a control message to the connected sink.
// If an error occurs 'Observer::OnConnectionError' is invoked. // If an error occurs 'Observer::OnConnectionError' is invoked.
......
...@@ -66,25 +66,16 @@ WiFiDisplayMediaServiceImpl::WiFiDisplayMediaServiceImpl() ...@@ -66,25 +66,16 @@ WiFiDisplayMediaServiceImpl::WiFiDisplayMediaServiceImpl()
WiFiDisplayMediaServiceImpl::~WiFiDisplayMediaServiceImpl() {} WiFiDisplayMediaServiceImpl::~WiFiDisplayMediaServiceImpl() {}
void WiFiDisplayMediaServiceImpl::SetDesinationPoint( void WiFiDisplayMediaServiceImpl::SetDestinationPoint(
const std::string& ip_address, const net::IPEndPoint& ip_end_point,
int32_t port, const SetDestinationPointCallback& callback) {
const SetDesinationPointCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
net::IPAddress address;
if (!address.AssignFromIPLiteral(std::string(ip_address))) {
DVLOG(1) << "Failed to parse IP address from " << ip_address;
callback.Run(false);
return;
}
net::IPEndPoint end_point(address, static_cast<uint16_t>(port));
rtp_socket_.reset(new net::UDPSocket(net::DatagramSocket::DEFAULT_BIND, rtp_socket_.reset(new net::UDPSocket(net::DatagramSocket::DEFAULT_BIND,
net::RandIntCallback(), nullptr, net::RandIntCallback(), nullptr,
net::NetLogSource())); net::NetLogSource()));
if (rtp_socket_->Open(end_point.GetFamily()) != net::OK || if (rtp_socket_->Open(ip_end_point.GetFamily()) != net::OK ||
rtp_socket_->Connect(end_point) != net::OK) { rtp_socket_->Connect(ip_end_point) != net::OK) {
DVLOG(1) << "Could not connect to " << end_point.ToString(); DVLOG(1) << "Could not connect to " << ip_end_point.ToString();
callback.Run(false); callback.Run(false);
rtp_socket_.reset(); rtp_socket_.reset();
return; return;
......
...@@ -26,9 +26,9 @@ class WiFiDisplayMediaServiceImpl : public mojom::WiFiDisplayMediaService { ...@@ -26,9 +26,9 @@ class WiFiDisplayMediaServiceImpl : public mojom::WiFiDisplayMediaService {
static void BindToRequest(mojom::WiFiDisplayMediaServiceRequest request, static void BindToRequest(mojom::WiFiDisplayMediaServiceRequest request,
content::RenderFrameHost* render_frame_host); content::RenderFrameHost* render_frame_host);
void SetDesinationPoint(const std::string& ip_address, void SetDestinationPoint(
int32_t port, const net::IPEndPoint& ip_end_point,
const SetDesinationPointCallback& callback) override; const SetDestinationPointCallback& callback) override;
void SendMediaPacket(mojom::WiFiDisplayMediaPacketPtr packet) override; void SendMediaPacket(mojom::WiFiDisplayMediaPacketPtr packet) override;
private: private:
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
module extensions.mojom; module extensions.mojom;
import "services/network/public/mojom/ip_address.mojom";
import "services/network/public/mojom/ip_endpoint.mojom";
struct WiFiDisplayMediaPacket { struct WiFiDisplayMediaPacket {
array<uint8> data; array<uint8> data;
}; };
...@@ -29,7 +32,8 @@ interface WiFiDisplaySessionService { ...@@ -29,7 +32,8 @@ interface WiFiDisplaySessionService {
interface WiFiDisplaySessionServiceClient { interface WiFiDisplaySessionServiceClient {
// Notification of a successfull connection to a sink. // Notification of a successfull connection to a sink.
OnConnected(string local_ip_address, string sink_ip_address); OnConnected(network.mojom.IPAddress local_ip_address,
network.mojom.IPAddress sink_ip_address);
// Notification of a handled connection request. // Notification of a handled connection request.
OnConnectRequestHandled(bool success, string error_message); OnConnectRequestHandled(bool success, string error_message);
...@@ -54,7 +58,7 @@ interface WiFiDisplaySessionServiceClient { ...@@ -54,7 +58,7 @@ interface WiFiDisplaySessionServiceClient {
// connected sink. // connected sink.
interface WiFiDisplayMediaService { interface WiFiDisplayMediaService {
// Sets the destination point for sending media stream. // Sets the destination point for sending media stream.
SetDesinationPoint(string ip_address, int32 port) => (bool success); SetDestinationPoint(network.mojom.IPEndPoint ip_end_point) => (bool success);
// Sends media packet to the destination point. // Sends media packet to the destination point.
SendMediaPacket(WiFiDisplayMediaPacket packet); SendMediaPacket(WiFiDisplayMediaPacket packet);
......
...@@ -87,7 +87,7 @@ class WiFiDisplayVideoSink : public content::MediaStreamVideoSink { ...@@ -87,7 +87,7 @@ class WiFiDisplayVideoSink : public content::MediaStreamVideoSink {
WiFiDisplayMediaManager::WiFiDisplayMediaManager( WiFiDisplayMediaManager::WiFiDisplayMediaManager(
const blink::WebMediaStreamTrack& video_track, const blink::WebMediaStreamTrack& video_track,
const blink::WebMediaStreamTrack& audio_track, const blink::WebMediaStreamTrack& audio_track,
const std::string& sink_ip_address, const net::IPAddress& sink_ip_address,
service_manager::InterfaceProvider* interface_provider, service_manager::InterfaceProvider* interface_provider,
const ErrorCallback& error_callback) const ErrorCallback& error_callback)
: video_track_(video_track), : video_track_(video_track),
......
...@@ -34,7 +34,7 @@ class WiFiDisplayMediaManager : public wds::SourceMediaManager { ...@@ -34,7 +34,7 @@ class WiFiDisplayMediaManager : public wds::SourceMediaManager {
WiFiDisplayMediaManager( WiFiDisplayMediaManager(
const blink::WebMediaStreamTrack& video_track, const blink::WebMediaStreamTrack& video_track,
const blink::WebMediaStreamTrack& audio_track, const blink::WebMediaStreamTrack& audio_track,
const std::string& sink_ip_address, const net::IPAddress& sink_ip_address,
service_manager::InterfaceProvider* interface_provider, service_manager::InterfaceProvider* interface_provider,
const ErrorCallback& error_callback); const ErrorCallback& error_callback);
...@@ -79,7 +79,7 @@ class WiFiDisplayMediaManager : public wds::SourceMediaManager { ...@@ -79,7 +79,7 @@ class WiFiDisplayMediaManager : public wds::SourceMediaManager {
std::unique_ptr<WiFiDisplayVideoSink> video_sink_; std::unique_ptr<WiFiDisplayVideoSink> video_sink_;
service_manager::InterfaceProvider* interface_provider_; service_manager::InterfaceProvider* interface_provider_;
std::string sink_ip_address_; net::IPAddress sink_ip_address_;
std::pair<int, int> sink_rtp_ports_; std::pair<int, int> sink_rtp_ports_;
wds::H264VideoFormat optimal_video_format_; wds::H264VideoFormat optimal_video_format_;
wds::AudioCodec optimal_audio_codec_; wds::AudioCodec optimal_audio_codec_;
......
...@@ -23,26 +23,25 @@ WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline( ...@@ -23,26 +23,25 @@ WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline(
wds::SessionType type, wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters, const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
const wds::AudioCodec& audio_codec, const wds::AudioCodec& audio_codec,
const std::string& sink_ip_address, const net::IPAddress& sink_ip_address,
const std::pair<int, int>& sink_rtp_ports, const std::pair<int, int>& sink_rtp_ports,
const RegisterMediaServiceCallback& service_callback, const RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback) const ErrorCallback& error_callback)
: type_(type), : type_(type),
video_parameters_(video_parameters), video_parameters_(video_parameters),
audio_codec_(audio_codec), audio_codec_(audio_codec),
sink_ip_address_(sink_ip_address), sink_ip_address_(sink_ip_address),
sink_rtp_ports_(sink_rtp_ports), sink_rtp_ports_(sink_rtp_ports),
service_callback_(service_callback), service_callback_(service_callback),
error_callback_(error_callback), error_callback_(error_callback),
weak_factory_(this) { weak_factory_(this) {}
}
// static // static
std::unique_ptr<WiFiDisplayMediaPipeline> WiFiDisplayMediaPipeline::Create( std::unique_ptr<WiFiDisplayMediaPipeline> WiFiDisplayMediaPipeline::Create(
wds::SessionType type, wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters, const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
const wds::AudioCodec& audio_codec, const wds::AudioCodec& audio_codec,
const std::string& sink_ip_address, const net::IPAddress& sink_ip_address,
const std::pair<int, int>& sink_rtp_ports, const std::pair<int, int>& sink_rtp_ports,
const RegisterMediaServiceCallback& service_callback, const RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback) { const ErrorCallback& error_callback) {
...@@ -206,9 +205,9 @@ void WiFiDisplayMediaPipeline::OnMediaServiceRegistered( ...@@ -206,9 +205,9 @@ void WiFiDisplayMediaPipeline::OnMediaServiceRegistered(
DCHECK(media_service_); DCHECK(media_service_);
auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia); auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia);
media_service_.set_connection_error_handler(error_callback); media_service_.set_connection_error_handler(error_callback);
media_service_->SetDesinationPoint( media_service_->SetDestinationPoint(
sink_ip_address_, net::IPEndPoint(sink_ip_address_,
static_cast<int32_t>(sink_rtp_ports_.first), static_cast<uint16_t>(sink_rtp_ports_.first)),
callback); callback);
} }
......
...@@ -40,7 +40,7 @@ class WiFiDisplayMediaPipeline { ...@@ -40,7 +40,7 @@ class WiFiDisplayMediaPipeline {
wds::SessionType type, wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters, const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
const wds::AudioCodec& audio_codec, const wds::AudioCodec& audio_codec,
const std::string& sink_ip_address, const net::IPAddress& sink_ip_address,
const std::pair<int, int>& sink_rtp_ports, const std::pair<int, int>& sink_rtp_ports,
const RegisterMediaServiceCallback& service_callback, const RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback); const ErrorCallback& error_callback);
...@@ -63,7 +63,7 @@ class WiFiDisplayMediaPipeline { ...@@ -63,7 +63,7 @@ class WiFiDisplayMediaPipeline {
wds::SessionType type, wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters, const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
const wds::AudioCodec& audio_codec, const wds::AudioCodec& audio_codec,
const std::string& sink_ip_address, const net::IPAddress& sink_ip_address,
const std::pair<int, int>& sink_rtp_ports, const std::pair<int, int>& sink_rtp_ports,
const RegisterMediaServiceCallback& service_callback, const RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback); const ErrorCallback& error_callback);
...@@ -93,7 +93,7 @@ class WiFiDisplayMediaPipeline { ...@@ -93,7 +93,7 @@ class WiFiDisplayMediaPipeline {
wds::SessionType type_; wds::SessionType type_;
WiFiDisplayVideoEncoder::InitParameters video_parameters_; WiFiDisplayVideoEncoder::InitParameters video_parameters_;
wds::AudioCodec audio_codec_; wds::AudioCodec audio_codec_;
std::string sink_ip_address_; net::IPAddress sink_ip_address_;
std::pair<int, int> sink_rtp_ports_; std::pair<int, int> sink_rtp_ports_;
RegisterMediaServiceCallback service_callback_; RegisterMediaServiceCallback service_callback_;
......
...@@ -72,8 +72,8 @@ void WiFiDisplaySession::Terminate(const CompletionCallback& callback) { ...@@ -72,8 +72,8 @@ void WiFiDisplaySession::Terminate(const CompletionCallback& callback) {
teminate_completion_callback_ = callback; teminate_completion_callback_ = callback;
} }
void WiFiDisplaySession::OnConnected(const std::string& local_ip_address, void WiFiDisplaySession::OnConnected(const net::IPAddress& local_ip_address,
const std::string& sink_ip_address) { const net::IPAddress& sink_ip_address) {
DCHECK_EQ(DisplaySourceSession::Established, state_); DCHECK_EQ(DisplaySourceSession::Established, state_);
local_ip_address_ = local_ip_address; local_ip_address_ = local_ip_address;
media_manager_.reset( media_manager_.reset(
...@@ -124,7 +124,7 @@ void WiFiDisplaySession::OnMessage(const std::string& data) { ...@@ -124,7 +124,7 @@ void WiFiDisplaySession::OnMessage(const std::string& data) {
} }
std::string WiFiDisplaySession::GetLocalIPAddress() const { std::string WiFiDisplaySession::GetLocalIPAddress() const {
return local_ip_address_; return local_ip_address_.ToString();
} }
int WiFiDisplaySession::GetNextCSeq(int* initial_peer_cseq) const { int WiFiDisplaySession::GetNextCSeq(int* initial_peer_cseq) const {
......
...@@ -41,8 +41,8 @@ class WiFiDisplaySession : public DisplaySourceSession, ...@@ -41,8 +41,8 @@ class WiFiDisplaySession : public DisplaySourceSession,
void Terminate(const CompletionCallback& callback) override; void Terminate(const CompletionCallback& callback) override;
// WiFiDisplaySessionServiceClient overrides. // WiFiDisplaySessionServiceClient overrides.
void OnConnected(const std::string& local_ip_address, void OnConnected(const net::IPAddress& local_ip_address,
const std::string& sink_ip_address) override; const net::IPAddress& sink_ip_address) override;
void OnConnectRequestHandled(bool success, const std::string& error) override; void OnConnectRequestHandled(bool success, const std::string& error) override;
void OnTerminated() override; void OnTerminated() override;
void OnDisconnectRequestHandled(bool success, void OnDisconnectRequestHandled(bool success,
...@@ -77,7 +77,7 @@ class WiFiDisplaySession : public DisplaySourceSession, ...@@ -77,7 +77,7 @@ class WiFiDisplaySession : public DisplaySourceSession,
std::unique_ptr<WiFiDisplayMediaManager> media_manager_; std::unique_ptr<WiFiDisplayMediaManager> media_manager_;
mojo::Remote<mojom::WiFiDisplaySessionService> service_; mojo::Remote<mojom::WiFiDisplaySessionService> service_;
mojo::Receiver<WiFiDisplaySessionServiceClient> receiver_{this}; mojo::Receiver<WiFiDisplaySessionServiceClient> receiver_{this};
std::string local_ip_address_; net::IPAddress local_ip_address_;
std::map<int, std::unique_ptr<base::RepeatingTimer>> timers_; std::map<int, std::unique_ptr<base::RepeatingTimer>> timers_;
DisplaySourceSessionParams params_; DisplaySourceSessionParams params_;
......
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