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 @@
#include "base/task/post_task.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "net/base/ip_address.h"
#include "net/base/net_errors.h"
#include "net/log/net_log_source.h"
#include "net/socket/udp_socket.h"
......@@ -65,9 +66,9 @@ class MockDisplaySourceConnectionDelegate
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;
......@@ -366,12 +367,12 @@ MockDisplaySourceConnectionDelegate::GetConnectedSink() const {
void MockDisplaySourceConnectionDelegate::StopWatchingAvailableSinks() {}
std::string MockDisplaySourceConnectionDelegate::GetLocalAddress() const {
return "127.0.0.1";
net::IPAddress MockDisplaySourceConnectionDelegate::GetLocalAddress() const {
return net::IPAddress::IPv4Localhost();
}
std::string MockDisplaySourceConnectionDelegate::GetSinkAddress() const {
return "127.0.0.1";
net::IPAddress MockDisplaySourceConnectionDelegate::GetSinkAddress() const {
return net::IPAddress::IPv4Localhost();
}
void MockDisplaySourceConnectionDelegate::SendMessage(
......
......@@ -9,6 +9,7 @@
#include "base/observer_list.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/common/api/display_source.h"
#include "net/base/ip_address.h"
namespace extensions {
......@@ -34,10 +35,10 @@ class DisplaySourceConnectionDelegate : public KeyedService {
virtual const DisplaySourceSinkInfo& GetConnectedSink() const = 0;
// 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.
virtual std::string GetSinkAddress() const = 0;
virtual net::IPAddress GetSinkAddress() const = 0;
// Sends a control message to the connected sink.
// If an error occurs 'Observer::OnConnectionError' is invoked.
......
......@@ -66,25 +66,16 @@ WiFiDisplayMediaServiceImpl::WiFiDisplayMediaServiceImpl()
WiFiDisplayMediaServiceImpl::~WiFiDisplayMediaServiceImpl() {}
void WiFiDisplayMediaServiceImpl::SetDesinationPoint(
const std::string& ip_address,
int32_t port,
const SetDesinationPointCallback& callback) {
void WiFiDisplayMediaServiceImpl::SetDestinationPoint(
const net::IPEndPoint& ip_end_point,
const SetDestinationPointCallback& callback) {
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,
net::RandIntCallback(), nullptr,
net::NetLogSource()));
if (rtp_socket_->Open(end_point.GetFamily()) != net::OK ||
rtp_socket_->Connect(end_point) != net::OK) {
DVLOG(1) << "Could not connect to " << end_point.ToString();
if (rtp_socket_->Open(ip_end_point.GetFamily()) != net::OK ||
rtp_socket_->Connect(ip_end_point) != net::OK) {
DVLOG(1) << "Could not connect to " << ip_end_point.ToString();
callback.Run(false);
rtp_socket_.reset();
return;
......
......@@ -26,9 +26,9 @@ class WiFiDisplayMediaServiceImpl : public mojom::WiFiDisplayMediaService {
static void BindToRequest(mojom::WiFiDisplayMediaServiceRequest request,
content::RenderFrameHost* render_frame_host);
void SetDesinationPoint(const std::string& ip_address,
int32_t port,
const SetDesinationPointCallback& callback) override;
void SetDestinationPoint(
const net::IPEndPoint& ip_end_point,
const SetDestinationPointCallback& callback) override;
void SendMediaPacket(mojom::WiFiDisplayMediaPacketPtr packet) override;
private:
......
......@@ -4,6 +4,9 @@
module extensions.mojom;
import "services/network/public/mojom/ip_address.mojom";
import "services/network/public/mojom/ip_endpoint.mojom";
struct WiFiDisplayMediaPacket {
array<uint8> data;
};
......@@ -29,7 +32,8 @@ interface WiFiDisplaySessionService {
interface WiFiDisplaySessionServiceClient {
// 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.
OnConnectRequestHandled(bool success, string error_message);
......@@ -54,7 +58,7 @@ interface WiFiDisplaySessionServiceClient {
// connected sink.
interface WiFiDisplayMediaService {
// 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.
SendMediaPacket(WiFiDisplayMediaPacket packet);
......
......@@ -87,7 +87,7 @@ class WiFiDisplayVideoSink : public content::MediaStreamVideoSink {
WiFiDisplayMediaManager::WiFiDisplayMediaManager(
const blink::WebMediaStreamTrack& video_track,
const blink::WebMediaStreamTrack& audio_track,
const std::string& sink_ip_address,
const net::IPAddress& sink_ip_address,
service_manager::InterfaceProvider* interface_provider,
const ErrorCallback& error_callback)
: video_track_(video_track),
......
......@@ -34,7 +34,7 @@ class WiFiDisplayMediaManager : public wds::SourceMediaManager {
WiFiDisplayMediaManager(
const blink::WebMediaStreamTrack& video_track,
const blink::WebMediaStreamTrack& audio_track,
const std::string& sink_ip_address,
const net::IPAddress& sink_ip_address,
service_manager::InterfaceProvider* interface_provider,
const ErrorCallback& error_callback);
......@@ -79,7 +79,7 @@ class WiFiDisplayMediaManager : public wds::SourceMediaManager {
std::unique_ptr<WiFiDisplayVideoSink> video_sink_;
service_manager::InterfaceProvider* interface_provider_;
std::string sink_ip_address_;
net::IPAddress sink_ip_address_;
std::pair<int, int> sink_rtp_ports_;
wds::H264VideoFormat optimal_video_format_;
wds::AudioCodec optimal_audio_codec_;
......
......@@ -23,26 +23,25 @@ WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline(
wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
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 RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback)
: type_(type),
video_parameters_(video_parameters),
audio_codec_(audio_codec),
sink_ip_address_(sink_ip_address),
sink_rtp_ports_(sink_rtp_ports),
service_callback_(service_callback),
error_callback_(error_callback),
weak_factory_(this) {
}
: type_(type),
video_parameters_(video_parameters),
audio_codec_(audio_codec),
sink_ip_address_(sink_ip_address),
sink_rtp_ports_(sink_rtp_ports),
service_callback_(service_callback),
error_callback_(error_callback),
weak_factory_(this) {}
// static
std::unique_ptr<WiFiDisplayMediaPipeline> WiFiDisplayMediaPipeline::Create(
wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
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 RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback) {
......@@ -206,9 +205,9 @@ void WiFiDisplayMediaPipeline::OnMediaServiceRegistered(
DCHECK(media_service_);
auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia);
media_service_.set_connection_error_handler(error_callback);
media_service_->SetDesinationPoint(
sink_ip_address_,
static_cast<int32_t>(sink_rtp_ports_.first),
media_service_->SetDestinationPoint(
net::IPEndPoint(sink_ip_address_,
static_cast<uint16_t>(sink_rtp_ports_.first)),
callback);
}
......
......@@ -40,7 +40,7 @@ class WiFiDisplayMediaPipeline {
wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
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 RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback);
......@@ -63,7 +63,7 @@ class WiFiDisplayMediaPipeline {
wds::SessionType type,
const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
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 RegisterMediaServiceCallback& service_callback,
const ErrorCallback& error_callback);
......@@ -93,7 +93,7 @@ class WiFiDisplayMediaPipeline {
wds::SessionType type_;
WiFiDisplayVideoEncoder::InitParameters video_parameters_;
wds::AudioCodec audio_codec_;
std::string sink_ip_address_;
net::IPAddress sink_ip_address_;
std::pair<int, int> sink_rtp_ports_;
RegisterMediaServiceCallback service_callback_;
......
......@@ -72,8 +72,8 @@ void WiFiDisplaySession::Terminate(const CompletionCallback& callback) {
teminate_completion_callback_ = callback;
}
void WiFiDisplaySession::OnConnected(const std::string& local_ip_address,
const std::string& sink_ip_address) {
void WiFiDisplaySession::OnConnected(const net::IPAddress& local_ip_address,
const net::IPAddress& sink_ip_address) {
DCHECK_EQ(DisplaySourceSession::Established, state_);
local_ip_address_ = local_ip_address;
media_manager_.reset(
......@@ -124,7 +124,7 @@ void WiFiDisplaySession::OnMessage(const std::string& data) {
}
std::string WiFiDisplaySession::GetLocalIPAddress() const {
return local_ip_address_;
return local_ip_address_.ToString();
}
int WiFiDisplaySession::GetNextCSeq(int* initial_peer_cseq) const {
......
......@@ -41,8 +41,8 @@ class WiFiDisplaySession : public DisplaySourceSession,
void Terminate(const CompletionCallback& callback) override;
// WiFiDisplaySessionServiceClient overrides.
void OnConnected(const std::string& local_ip_address,
const std::string& sink_ip_address) override;
void OnConnected(const net::IPAddress& local_ip_address,
const net::IPAddress& sink_ip_address) override;
void OnConnectRequestHandled(bool success, const std::string& error) override;
void OnTerminated() override;
void OnDisconnectRequestHandled(bool success,
......@@ -77,7 +77,7 @@ class WiFiDisplaySession : public DisplaySourceSession,
std::unique_ptr<WiFiDisplayMediaManager> media_manager_;
mojo::Remote<mojom::WiFiDisplaySessionService> service_;
mojo::Receiver<WiFiDisplaySessionServiceClient> receiver_{this};
std::string local_ip_address_;
net::IPAddress local_ip_address_;
std::map<int, std::unique_ptr<base::RepeatingTimer>> timers_;
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