remove all but 2 redundant factory methods in TurnPort

and those will be fixed after I fixed downstream.

Bug: webrtc:10335
Change-Id: Ie824b422b4240fbcdb5d7ee40ae9be91655abae7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256111
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36274}
This commit is contained in:
Jonas Oreland 2022-03-21 07:33:50 +01:00 committed by WebRTC LUCI CQ
parent 60c588d77e
commit f11a04d0f5
6 changed files with 111 additions and 75 deletions

View File

@ -556,11 +556,21 @@ class PortTest : public ::testing::Test, public sigslot::has_slots<> {
ProtocolType int_proto, ProtocolType int_proto,
ProtocolType ext_proto, ProtocolType ext_proto,
const rtc::SocketAddress& server_addr) { const rtc::SocketAddress& server_addr) {
return TurnPort::Create(&main_, socket_factory, MakeNetwork(addr), 0, 0, RelayServerConfig config;
username_, password_, config.credentials = kRelayCredentials;
ProtocolAddress(server_addr, int_proto), ProtocolAddress server_address(server_addr, int_proto);
kRelayCredentials, 0, {}, {}, nullptr, nullptr); CreateRelayPortArgs args;
args.network_thread = &main_;
args.socket_factory = socket_factory;
args.network = MakeNetwork(addr);
args.username = username_;
args.password = password_;
args.server_address = &server_address;
args.config = &config;
return TurnPort::Create(args, 0, 0);
} }
std::unique_ptr<rtc::NATServer> CreateNatServer(const SocketAddress& addr, std::unique_ptr<rtc::NATServer> CreateNatServer(const SocketAddress& addr,
rtc::NATType type) { rtc::NATType type) {
return std::make_unique<rtc::NATServer>(type, ss_.get(), addr, addr, return std::make_unique<rtc::NATServer>(type, ss_.get(), addr, addr,

View File

@ -222,11 +222,16 @@ TurnPort::TurnPort(rtc::Thread* thread,
const ProtocolAddress& server_address, const ProtocolAddress& server_address,
const RelayCredentials& credentials, const RelayCredentials& credentials,
int server_priority, int server_priority,
const std::vector<std::string>& tls_alpn_protocols,
const std::vector<std::string>& tls_elliptic_curves,
webrtc::TurnCustomizer* customizer, webrtc::TurnCustomizer* customizer,
rtc::SSLCertificateVerifier* tls_cert_verifier,
const webrtc::WebRtcKeyValueConfig* field_trials) const webrtc::WebRtcKeyValueConfig* field_trials)
: Port(thread, RELAY_PORT_TYPE, factory, network, username, password), : Port(thread, RELAY_PORT_TYPE, factory, network, username, password),
server_address_(server_address), server_address_(server_address),
tls_cert_verifier_(nullptr), tls_alpn_protocols_(tls_alpn_protocols),
tls_elliptic_curves_(tls_elliptic_curves),
tls_cert_verifier_(tls_cert_verifier),
credentials_(credentials), credentials_(credentials),
socket_(socket), socket_(socket),
error_(0), error_(0),

View File

@ -52,7 +52,60 @@ class TurnPort : public Port {
// packets. // packets.
}; };
static bool Validate(const CreateRelayPortArgs& args) {
// Do basic parameter validation.
if (args.config->credentials.username.size() > kMaxTurnUsernameLength) {
RTC_LOG(LS_ERROR) << "Attempt to use TURN with a too long username "
<< "of length "
<< args.config->credentials.username.size();
return false;
}
// Do not connect to low-numbered ports. The default STUN port is 3478.
if (!AllowedTurnPort(args.server_address->address.port(),
args.field_trials)) {
RTC_LOG(LS_ERROR) << "Attempt to use TURN to connect to port "
<< args.server_address->address.port();
return false;
}
return true;
}
// Create a TURN port using the shared UDP socket, `socket`. // Create a TURN port using the shared UDP socket, `socket`.
static std::unique_ptr<TurnPort> Create(const CreateRelayPortArgs& args,
rtc::AsyncPacketSocket* socket) {
if (!Validate(args)) {
return nullptr;
}
// Using `new` to access a non-public constructor.
return absl::WrapUnique(
new TurnPort(args.network_thread, args.socket_factory, args.network,
socket, args.username, args.password, *args.server_address,
args.config->credentials, args.config->priority,
args.config->tls_alpn_protocols,
args.config->tls_elliptic_curves, args.turn_customizer,
args.config->tls_cert_verifier, args.field_trials));
}
// Create a TURN port that will use a new socket, bound to `network` and
// using a port in the range between `min_port` and `max_port`.
static std::unique_ptr<TurnPort> Create(const CreateRelayPortArgs& args,
int min_port,
int max_port) {
if (!Validate(args)) {
return nullptr;
}
// Using `new` to access a non-public constructor.
return absl::WrapUnique(
new TurnPort(args.network_thread, args.socket_factory, args.network,
min_port, max_port, args.username, args.password,
*args.server_address, args.config->credentials,
args.config->priority, args.config->tls_alpn_protocols,
args.config->tls_elliptic_curves, args.turn_customizer,
args.config->tls_cert_verifier, args.field_trials));
}
// Create a TURN port using the shared UDP socket, `socket`.
// TODO(jonaso) : remove in favor or CreateRelayPortArgs version.
static std::unique_ptr<TurnPort> Create( static std::unique_ptr<TurnPort> Create(
rtc::Thread* thread, rtc::Thread* thread,
rtc::PacketSocketFactory* factory, rtc::PacketSocketFactory* factory,
@ -75,32 +128,15 @@ class TurnPort : public Port {
if (!AllowedTurnPort(server_address.address.port(), field_trials)) { if (!AllowedTurnPort(server_address.address.port(), field_trials)) {
RTC_LOG(LS_ERROR) << "Attempt to use TURN to connect to port " RTC_LOG(LS_ERROR) << "Attempt to use TURN to connect to port "
<< server_address.address.port(); << server_address.address.port();
return nullptr;
} }
// Using `new` to access a non-public constructor. // Using `new` to access a non-public constructor.
return absl::WrapUnique(new TurnPort( return absl::WrapUnique(new TurnPort(thread, factory, network, socket,
thread, factory, network, socket, username, password, server_address, username, password, server_address,
credentials, server_priority, customizer, field_trials)); credentials, server_priority, {}, {},
} customizer, nullptr, field_trials));
// TODO(steveanton): Remove once downstream clients have moved to `Create`.
static std::unique_ptr<TurnPort> CreateUnique(
rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
rtc::Network* network,
rtc::AsyncPacketSocket* socket,
const std::string& username, // ice username.
const std::string& password, // ice password.
const ProtocolAddress& server_address,
const RelayCredentials& credentials,
int server_priority,
webrtc::TurnCustomizer* customizer,
const webrtc::WebRtcKeyValueConfig* field_trials) {
return Create(thread, factory, network, socket, username, password,
server_address, credentials, server_priority, customizer,
field_trials);
} }
// TODO(jonaso) : remove in favor or CreateRelayPortArgs version.
// Create a TURN port that will use a new socket, bound to `network` and // Create a TURN port that will use a new socket, bound to `network` and
// using a port in the range between `min_port` and `max_port`. // using a port in the range between `min_port` and `max_port`.
static std::unique_ptr<TurnPort> Create( static std::unique_ptr<TurnPort> Create(
@ -138,29 +174,6 @@ class TurnPort : public Port {
tls_elliptic_curves, customizer, tls_cert_verifier, field_trials)); tls_elliptic_curves, customizer, tls_cert_verifier, field_trials));
} }
// TODO(steveanton): Remove once downstream clients have moved to `Create`.
static std::unique_ptr<TurnPort> CreateUnique(
rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
rtc::Network* network,
uint16_t min_port,
uint16_t max_port,
const std::string& username, // ice username.
const std::string& password, // ice password.
const ProtocolAddress& server_address,
const RelayCredentials& credentials,
int server_priority,
const std::vector<std::string>& tls_alpn_protocols,
const std::vector<std::string>& tls_elliptic_curves,
webrtc::TurnCustomizer* customizer,
rtc::SSLCertificateVerifier* tls_cert_verifier = nullptr,
const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) {
return Create(thread, factory, network, min_port, max_port, username,
password, server_address, credentials, server_priority,
tls_alpn_protocols, tls_elliptic_curves, customizer,
tls_cert_verifier, field_trials);
}
~TurnPort() override; ~TurnPort() override;
const ProtocolAddress& server_address() const { return server_address_; } const ProtocolAddress& server_address() const { return server_address_; }
@ -269,7 +282,10 @@ class TurnPort : public Port {
const ProtocolAddress& server_address, const ProtocolAddress& server_address,
const RelayCredentials& credentials, const RelayCredentials& credentials,
int server_priority, int server_priority,
const std::vector<std::string>& tls_alpn_protocols,
const std::vector<std::string>& tls_elliptic_curves,
webrtc::TurnCustomizer* customizer, webrtc::TurnCustomizer* customizer,
rtc::SSLCertificateVerifier* tls_cert_verifier = nullptr,
const webrtc::WebRtcKeyValueConfig* field_trials = nullptr); const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
TurnPort(rtc::Thread* thread, TurnPort(rtc::Thread* thread,

View File

@ -292,11 +292,20 @@ class TurnPortTest : public ::testing::Test,
const std::string& username, const std::string& username,
const std::string& password, const std::string& password,
const ProtocolAddress& server_address) { const ProtocolAddress& server_address) {
RelayCredentials credentials(username, password); RelayServerConfig config;
turn_port_ = config.credentials = RelayCredentials(username, password);
TurnPort::Create(&main_, &socket_factory_, network, 0, 0, kIceUfrag1, CreateRelayPortArgs args;
kIcePwd1, server_address, credentials, 0, {}, {}, args.network_thread = &main_;
turn_customizer_.get(), nullptr, &field_trials_); args.socket_factory = &socket_factory_;
args.network = network;
args.username = kIceUfrag1;
args.password = kIcePwd1;
args.server_address = &server_address;
args.config = &config;
args.turn_customizer = turn_customizer_.get();
args.field_trials = &field_trials_;
turn_port_ = TurnPort::Create(args, 0, 0);
if (!turn_port_) { if (!turn_port_) {
return false; return false;
} }
@ -327,11 +336,19 @@ class TurnPortTest : public ::testing::Test,
&TurnPortTest::OnSocketReadPacket); &TurnPortTest::OnSocketReadPacket);
} }
RelayCredentials credentials(username, password); RelayServerConfig config;
turn_port_ = config.credentials = RelayCredentials(username, password);
TurnPort::Create(&main_, &socket_factory_, MakeNetwork(kLocalAddr1), CreateRelayPortArgs args;
socket_.get(), kIceUfrag1, kIcePwd1, server_address, args.network_thread = &main_;
credentials, 0, nullptr, &field_trials_); args.socket_factory = &socket_factory_;
args.network = MakeNetwork(kLocalAddr1);
args.username = kIceUfrag1;
args.password = kIcePwd1;
args.server_address = &server_address;
args.config = &config;
args.turn_customizer = turn_customizer_.get();
args.field_trials = &field_trials_;
turn_port_ = TurnPort::Create(args, socket_.get());
// This TURN port will be the controlling. // This TURN port will be the controlling.
turn_port_->SetIceRole(ICEROLE_CONTROLLING); turn_port_->SetIceRole(ICEROLE_CONTROLLING);
ConnectSignals(); ConnectSignals();

View File

@ -36,7 +36,6 @@ struct RelayServerConfig;
// A struct containing arguments to RelayPortFactory::Create() // A struct containing arguments to RelayPortFactory::Create()
struct CreateRelayPortArgs { struct CreateRelayPortArgs {
CreateRelayPortArgs();
rtc::Thread* network_thread; rtc::Thread* network_thread;
rtc::PacketSocketFactory* socket_factory; rtc::PacketSocketFactory* socket_factory;
rtc::Network* network; rtc::Network* network;
@ -44,12 +43,10 @@ struct CreateRelayPortArgs {
const RelayServerConfig* config; const RelayServerConfig* config;
std::string username; std::string username;
std::string password; std::string password;
webrtc::TurnCustomizer* turn_customizer; webrtc::TurnCustomizer* turn_customizer = nullptr;
const webrtc::WebRtcKeyValueConfig* field_trials = nullptr; const webrtc::WebRtcKeyValueConfig* field_trials = nullptr;
}; };
inline CreateRelayPortArgs::CreateRelayPortArgs() {}
// A factory for creating RelayPort's. // A factory for creating RelayPort's.
class RelayPortFactoryInterface { class RelayPortFactoryInterface {
public: public:

View File

@ -23,11 +23,7 @@ TurnPortFactory::~TurnPortFactory() {}
std::unique_ptr<Port> TurnPortFactory::Create( std::unique_ptr<Port> TurnPortFactory::Create(
const CreateRelayPortArgs& args, const CreateRelayPortArgs& args,
rtc::AsyncPacketSocket* udp_socket) { rtc::AsyncPacketSocket* udp_socket) {
auto port = TurnPort::CreateUnique( auto port = TurnPort::Create(args, udp_socket);
args.network_thread, args.socket_factory, args.network, udp_socket,
args.username, args.password, *args.server_address,
args.config->credentials, args.config->priority, args.turn_customizer,
args.field_trials);
if (!port) if (!port)
return nullptr; return nullptr;
port->SetTlsCertPolicy(args.config->tls_cert_policy); port->SetTlsCertPolicy(args.config->tls_cert_policy);
@ -38,12 +34,7 @@ std::unique_ptr<Port> TurnPortFactory::Create(
std::unique_ptr<Port> TurnPortFactory::Create(const CreateRelayPortArgs& args, std::unique_ptr<Port> TurnPortFactory::Create(const CreateRelayPortArgs& args,
int min_port, int min_port,
int max_port) { int max_port) {
auto port = TurnPort::CreateUnique( auto port = TurnPort::Create(args, min_port, max_port);
args.network_thread, args.socket_factory, args.network, min_port,
max_port, args.username, args.password, *args.server_address,
args.config->credentials, args.config->priority,
args.config->tls_alpn_protocols, args.config->tls_elliptic_curves,
args.turn_customizer, args.config->tls_cert_verifier, args.field_trials);
if (!port) if (!port)
return nullptr; return nullptr;
port->SetTlsCertPolicy(args.config->tls_cert_policy); port->SetTlsCertPolicy(args.config->tls_cert_policy);