Changeset 280523 in webkit


Ignore:
Timestamp:
Aug 1, 2021 9:02:21 AM (12 months ago)
Author:
youenn@apple.com
Message:

Introduce an experimental feature to toggle WebRTC socket proxying
https://bugs.webkit.org/show_bug.cgi?id=228681

Reviewed by Eric Carlson.

Source/WebKit:

Decide whether to disable proxying based on experimental feature in WebProcess.
Send the disable relay value from WebProcess to NetworkProcess for TCP sockets.
Manually tested.

  • NetworkProcess/webrtc/NetworkRTCProvider.cpp:

(WebKit::NetworkRTCProvider::createClientTCPSocket):

  • NetworkProcess/webrtc/NetworkRTCProvider.h:
  • NetworkProcess/webrtc/NetworkRTCProvider.messages.in:
  • NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.h:
  • NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.mm:

(WebKit::NetworkRTCTCPSocketCocoa::createClientTCPSocket):
(WebKit::NetworkRTCTCPSocketCocoa::NetworkRTCTCPSocketCocoa):

  • WebProcess/Network/webrtc/LibWebRTCProvider.cpp:

(WebKit::RTCSocketFactory::CreateClientTcpSocket):
(WebKit::LibWebRTCProvider::createSocketFactory):

  • WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:

(WebKit::LibWebRTCSocketFactory::createClientTcpSocket):

  • WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:

Source/WTF:

  • Scripts/Preferences/WebPreferencesExperimental.yaml:
Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r280520 r280523  
     12021-08-01  Youenn Fablet  <youenn@apple.com>
     2
     3        Introduce an experimental feature to toggle WebRTC socket proxying
     4        https://bugs.webkit.org/show_bug.cgi?id=228681
     5
     6        Reviewed by Eric Carlson.
     7
     8        * Scripts/Preferences/WebPreferencesExperimental.yaml:
     9
    1102021-07-31  Yusuke Suzuki  <ysuzuki@apple.com>
    211
  • trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml

    r280509 r280523  
    13581358      default: false
    13591359
     1360WebRTCSocketsProxyingEnabled:
     1361  type: bool
     1362  humanReadableName: "WebRTC Sockets Proxying"
     1363  humanReadableDescription: "Enable WebRTC Sockets Proxying"
     1364  condition: ENABLE(WEB_RTC)
     1365  defaultValue:
     1366    WebKitLegacy:
     1367      default: false
     1368    WebKit:
     1369      default: false
     1370    WebCore:
     1371      default: false
     1372
    13601373WebRTCVP9Profile0CodecEnabled:
    13611374  type: bool
  • trunk/Source/WebKit/ChangeLog

    r280518 r280523  
     12021-08-01  Youenn Fablet  <youenn@apple.com>
     2
     3        Introduce an experimental feature to toggle WebRTC socket proxying
     4        https://bugs.webkit.org/show_bug.cgi?id=228681
     5
     6        Reviewed by Eric Carlson.
     7
     8        Decide whether to disable proxying based on experimental feature in WebProcess.
     9        Send the disable relay value from WebProcess to NetworkProcess for TCP sockets.
     10        Manually tested.
     11
     12        * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
     13        (WebKit::NetworkRTCProvider::createClientTCPSocket):
     14        * NetworkProcess/webrtc/NetworkRTCProvider.h:
     15        * NetworkProcess/webrtc/NetworkRTCProvider.messages.in:
     16        * NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.h:
     17        * NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.mm:
     18        (WebKit::NetworkRTCTCPSocketCocoa::createClientTCPSocket):
     19        (WebKit::NetworkRTCTCPSocketCocoa::NetworkRTCTCPSocketCocoa):
     20        * WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
     21        (WebKit::RTCSocketFactory::CreateClientTcpSocket):
     22        (WebKit::LibWebRTCProvider::createSocketFactory):
     23        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:
     24        (WebKit::LibWebRTCSocketFactory::createClientTcpSocket):
     25        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
     26
    1272021-07-31  Youenn Fablet  <youenn@apple.com>
    228
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp

    r280481 r280523  
    178178#endif
    179179
    180 void NetworkRTCProvider::createClientTCPSocket(LibWebRTCSocketIdentifier identifier, const RTCNetwork::SocketAddress& localAddress, const RTCNetwork::SocketAddress& remoteAddress, String&& userAgent, int options)
    181 {
    182     callOnMainRunLoop([this, protectedThis = makeRef(*this), identifier, localAddress, remoteAddress, userAgent = WTFMove(userAgent).isolatedCopy(), options]() mutable {
     180void NetworkRTCProvider::createClientTCPSocket(LibWebRTCSocketIdentifier identifier, const RTCNetwork::SocketAddress& localAddress, const RTCNetwork::SocketAddress& remoteAddress, String&& userAgent, int options, bool isRelayDisabled)
     181{
     182    callOnMainRunLoop([this, protectedThis = makeRef(*this), identifier, localAddress, remoteAddress, userAgent = WTFMove(userAgent).isolatedCopy(), options, isRelayDisabled]() mutable {
    183183        if (!m_connection)
    184184            return;
     
    189189            return;
    190190        }
    191         callOnRTCNetworkThread([this, identifier, localAddress = RTCNetwork::isolatedCopy(localAddress.value), remoteAddress = RTCNetwork::isolatedCopy(remoteAddress.value), proxyInfo = proxyInfoFromSession(remoteAddress, *session), userAgent = WTFMove(userAgent).isolatedCopy(), options]() mutable {
     191        callOnRTCNetworkThread([this, identifier, localAddress = RTCNetwork::isolatedCopy(localAddress.value), remoteAddress = RTCNetwork::isolatedCopy(remoteAddress.value), proxyInfo = proxyInfoFromSession(remoteAddress, *session), userAgent = WTFMove(userAgent).isolatedCopy(), options, isRelayDisabled]() mutable {
    192192#if PLATFORM(COCOA)
    193193            if (m_platformTCPSocketsEnabled) {
    194                 if (auto socket = NetworkRTCTCPSocketCocoa::createClientTCPSocket(identifier, *this, remoteAddress, options, m_ipcConnection.copyRef())) {
     194                if (auto socket = NetworkRTCTCPSocketCocoa::createClientTCPSocket(identifier, *this, remoteAddress, options, isRelayDisabled, m_ipcConnection.copyRef())) {
    195195                    addSocket(identifier, WTFMove(socket));
    196196                    return;
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h

    r280481 r280523  
    115115
    116116    void createUDPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, uint16_t, uint16_t, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain&&);
    117     void createClientTCPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, String&& userAgent, int);
     117    void createClientTCPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, String&& userAgent, int, bool isRelayDisabled);
    118118    void createServerTCPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, uint16_t minPort, uint16_t maxPort, int);
    119119    void wrapNewTCPConnection(WebCore::LibWebRTCSocketIdentifier identifier, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier);
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in

    r279483 r280523  
    2626    CreateUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain domain)
    2727    CreateServerTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, int options)
    28     CreateClientTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, WebKit::RTCNetwork::SocketAddress remoteAddress, String userAgent, int options)
     28    CreateClientTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, WebKit::RTCNetwork::SocketAddress remoteAddress, String userAgent, int options, bool isRelayDisabled)
    2929    WrapNewTCPConnection(WebCore::LibWebRTCSocketIdentifier identifier, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier)
    3030
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.h

    r279461 r280523  
    4040    WTF_MAKE_FAST_ALLOCATED;
    4141public:
    42     static std::unique_ptr<NetworkRTCProvider::Socket> createClientTCPSocket(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, int options, Ref<IPC::Connection>&&);
     42    static std::unique_ptr<NetworkRTCProvider::Socket> createClientTCPSocket(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, int options, bool isRelayDisabled, Ref<IPC::Connection>&&);
    4343
    44     NetworkRTCTCPSocketCocoa(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, int options, Ref<IPC::Connection>&&);
     44    NetworkRTCTCPSocketCocoa(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, int options, bool isRelayDisabled, Ref<IPC::Connection>&&);
    4545
    4646private:
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.mm

    r280481 r280523  
    5151}
    5252
    53 std::unique_ptr<NetworkRTCProvider::Socket> NetworkRTCTCPSocketCocoa::createClientTCPSocket(LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& remoteAddress, int tcpOptions, Ref<IPC::Connection>&& connection)
     53std::unique_ptr<NetworkRTCProvider::Socket> NetworkRTCTCPSocketCocoa::createClientTCPSocket(LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& remoteAddress, int tcpOptions, bool isRelayDisabled, Ref<IPC::Connection>&& connection)
    5454{
    5555    // FIXME: We should migrate ssltcp candidates, maybe support OPT_TLS_INSECURE as well.
    5656    if ((tcpOptions & rtc::PacketSocketFactory::OPT_TLS_FAKE) || (tcpOptions & rtc::PacketSocketFactory::OPT_TLS_INSECURE))
    5757        return nullptr;
    58     return makeUnique<NetworkRTCTCPSocketCocoa>(identifier, rtcProvider, remoteAddress, tcpOptions, WTFMove(connection));
     58    return makeUnique<NetworkRTCTCPSocketCocoa>(identifier, rtcProvider, remoteAddress, tcpOptions, isRelayDisabled, WTFMove(connection));
    5959}
    6060
     
    8181}
    8282
    83 NetworkRTCTCPSocketCocoa::NetworkRTCTCPSocketCocoa(LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& remoteAddress, int options, Ref<IPC::Connection>&& connection)
     83NetworkRTCTCPSocketCocoa::NetworkRTCTCPSocketCocoa(LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& remoteAddress, int options, bool isRelayDisabled, Ref<IPC::Connection>&& connection)
    8484    : m_identifier(identifier)
    8585    , m_rtcProvider(rtcProvider)
     
    9999    if (auto token = rtcProvider.sourceApplicationAuditToken())
    100100        nw_parameters_set_source_application(tcpTLS.get(), *token);
     101    if (isRelayDisabled)
     102        nw_parameters_set_account_id(tcpTLS.get(), "com.apple.safari.peertopeer");
    101103
    102104    m_nwConnection = adoptNS(nw_connection_create(host.get(), tcpTLS.get()));
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp

    r279483 r280523  
    9191    RTCSocketFactory(String&& userAgent, bool isFirstParty, RegistrableDomain&&);
    9292
     93    void disableRelay() final { m_isRelayDisabled = true; }
     94
    9395private:
    9496    // SuspendableSocketFactory
     
    99101    void suspend() final;
    100102    void resume() final;
    101     void disableRelay() final { m_isRelayDisabled = true; }
    102103
    103104private:
     
    127128rtc::AsyncPacketSocket* RTCSocketFactory::CreateClientTcpSocket(const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, const rtc::ProxyInfo&, const std::string&, const rtc::PacketSocketTcpOptions& options)
    128129{
    129     return WebProcess::singleton().libWebRTCNetwork().socketFactory().createClientTcpSocket(this, localAddress, remoteAddress, String { m_userAgent }, options);
     130    return WebProcess::singleton().libWebRTCNetwork().socketFactory().createClientTcpSocket(this, localAddress, remoteAddress, String { m_userAgent }, options, m_isRelayDisabled);
    130131}
    131132
     
    160161std::unique_ptr<LibWebRTCProvider::SuspendableSocketFactory> LibWebRTCProvider::createSocketFactory(String&& userAgent, bool isFirstParty, RegistrableDomain&& domain)
    161162{
    162     return makeUnique<RTCSocketFactory>(WTFMove(userAgent), isFirstParty, WTFMove(domain));
     163    auto factory = makeUnique<RTCSocketFactory>(WTFMove(userAgent), isFirstParty, WTFMove(domain));
     164
     165    auto* page = m_webPage.corePage();
     166    if (!page || !page->settings().webRTCSocketsProxyingEnabled())
     167        factory->disableRelay();
     168
     169    return factory;
    163170}
    164171
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h

    r279483 r280523  
    6464    void setLoggingLevel(WTFLogLevel) final;
    6565
     66    WebPage& m_webPage;
    6667#if ENABLE(GPU_PROCESS) && PLATFORM(COCOA) && !PLATFORM(MACCATALYST)
    67     WebPage& m_webPage;
    6868    bool m_didInitializeCallback { false };
    6969#endif
     
    7171
    7272inline LibWebRTCProvider::LibWebRTCProvider(WebPage& webPage)
    73 #if ENABLE(GPU_PROCESS) && PLATFORM(COCOA) && !PLATFORM(MACCATALYST)
    7473    : m_webPage(webPage)
    75 #endif
    7674{
    7775    m_useNetworkThreadWithSocketServer = false;
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp

    r279483 r280523  
    105105}
    106106
    107 rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createClientTcpSocket(const void* socketGroup, const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, String&& userAgent, const rtc::PacketSocketTcpOptions& options)
     107rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createClientTcpSocket(const void* socketGroup, const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, String&& userAgent, const rtc::PacketSocketTcpOptions& options, bool isRelayDisabled)
    108108{
    109109    ASSERT(!WTF::isMainRunLoop());
     
    114114    // FIXME: We only transfer options.opts but should also handle other members.
    115115    if (m_connection)
    116         m_connection->send(Messages::NetworkRTCProvider::CreateClientTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, options.opts), 0);
     116        m_connection->send(Messages::NetworkRTCProvider::CreateClientTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, options.opts,  isRelayDisabled), 0);
    117117    else {
    118118        callOnMainRunLoop([] {
    119119            WebProcess::singleton().ensureNetworkProcessConnection();
    120120        });
    121         m_pendingMessageTasks.append([identifier = socket->identifier(), localAddress = RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), remoteAddress = RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, opts = options.opts](auto& connection) {
    122             connection.send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, localAddress, remoteAddress, userAgent, opts), 0);
     121        m_pendingMessageTasks.append([identifier = socket->identifier(), localAddress = RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), remoteAddress = RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, opts = options.opts, isRelayDisabled](auto& connection) {
     122            connection.send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, localAddress, remoteAddress, userAgent, opts, isRelayDisabled), 0);
    123123        });
    124124    }
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h

    r279483 r280523  
    5454    rtc::AsyncPacketSocket* createUdpSocket(const void* socketGroup, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
    5555    rtc::AsyncPacketSocket* createServerTcpSocket(const void* socketGroup, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, int options);
    56     rtc::AsyncPacketSocket* createClientTcpSocket(const void* socketGroup, const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, String&& userAgent, const rtc::PacketSocketTcpOptions&);
     56    rtc::AsyncPacketSocket* createClientTcpSocket(const void* socketGroup, const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, String&& userAgent, const rtc::PacketSocketTcpOptions&, bool isRelayDisabled);
    5757    rtc::AsyncPacketSocket* createNewConnectionSocket(LibWebRTCSocket&, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier, const rtc::SocketAddress&);
    5858
Note: See TracChangeset for help on using the changeset viewer.