Title: [248592] trunk/Source
Revision
248592
Author
[email protected]
Date
2019-08-13 01:54:27 -0700 (Tue, 13 Aug 2019)

Log Message

User Agent and SessionID should be given to NetworkRTCProvider to set up the correct proxy information
https://bugs.webkit.org/show_bug.cgi?id=200583

Reviewed by Eric Carlson.

Source/ThirdParty/libwebrtc:

Export of some symbols.

* Configurations/libwebrtc.iOS.exp:
* Configurations/libwebrtc.iOSsim.exp:
* Configurations/libwebrtc.mac.exp:

Source/WebCore:

Use a socket factory that is specific to the user agent and session ID.
This factory is stored in the media endpoint.
Not testable without proxy infrastructure.

* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::setConfiguration):
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
* platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:
(WebCore::LibWebRTCProvider::createPeerConnection):
* platform/mediastream/libwebrtc/LibWebRTCProvider.h:

Source/WebKit:

Pass session id and user agent whenever creating a TCP client socket.
Use this information to get the proxy information from NetworkSession and pass it to libwebrtc socket creation.

* NetworkProcess/cocoa/NetworkSessionCocoa.h:
* NetworkProcess/webrtc/NetworkRTCProvider.cpp:
(WebKit::NetworkRTCProvider::proxyInfoFromSession):
(WebKit::NetworkRTCProvider::createClientTCPSocket):
* NetworkProcess/webrtc/NetworkRTCProvider.h:
* NetworkProcess/webrtc/NetworkRTCProvider.messages.in:
* WebKit.xcodeproj/project.pbxproj:
* NetworkProcess/webrtc/NetworkRTCProvider.mm: Added.
(WebKit::NetworkRTCProvider::proxyInfoFromSession):
* WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
(WebKit::LibWebRTCProvider::createPeerConnection):
(WebKit::LibWebRTCProvider::createSocketFactory):
* WebProcess/Network/webrtc/LibWebRTCProvider.h:
* WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:
(WebKit::LibWebRTCSocketFactory::createServerTcpSocket):
(WebKit::LibWebRTCSocketFactory::createUdpSocket):
(WebKit::LibWebRTCSocketFactory::createClientTcpSocket):
(WebKit::LibWebRTCSocketFactory::createAsyncResolver):
* WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (248591 => 248592)


--- trunk/Source/ThirdParty/libwebrtc/ChangeLog	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog	2019-08-13 08:54:27 UTC (rev 248592)
@@ -1,3 +1,16 @@
+2019-08-13  Youenn Fablet  <[email protected]>
+
+        User Agent and SessionID should be given to NetworkRTCProvider to set up the correct proxy information
+        https://bugs.webkit.org/show_bug.cgi?id=200583
+
+        Reviewed by Eric Carlson.
+
+        Export of some symbols.
+
+        * Configurations/libwebrtc.iOS.exp:
+        * Configurations/libwebrtc.iOSsim.exp:
+        * Configurations/libwebrtc.mac.exp:
+
 2019-08-02  Youenn Fablet  <[email protected]>
 
         Add build check for libwebrtc ObjectiveC names

Modified: trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp (248591 => 248592)


--- trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -248,3 +248,8 @@
 __ZN6webrtc16RtpRtxParametersD1Ev
 __ZN3rtc10LogMessage12SetLogOutputENS_15LoggingSeverityEPFvS1_PKcE
 __ZN6webrtc13CryptoOptions5NoGcmEv
+__ZTVN3rtc23InsecureCryptStringImplE
+__ZN3rtc11CryptStringC1ERKNS_15CryptStringImplE
+__ZN3rtc13SocketAddressC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi
+__ZN3rtc11CryptStringD1Ev
+__ZN3rtc11CryptStringC1ERKS0_

Modified: trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp (248591 => 248592)


--- trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -249,3 +249,8 @@
 __ZN6webrtc16RtpRtxParametersD1Ev
 __ZN3rtc10LogMessage12SetLogOutputENS_15LoggingSeverityEPFvS1_PKcE
 __ZN6webrtc13CryptoOptions5NoGcmEv
+__ZTVN3rtc23InsecureCryptStringImplE
+__ZN3rtc11CryptStringC1ERKNS_15CryptStringImplE
+__ZN3rtc13SocketAddressC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi
+__ZN3rtc11CryptStringD1Ev
+__ZN3rtc11CryptStringC1ERKS0_

Modified: trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp (248591 => 248592)


--- trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -249,3 +249,8 @@
 __ZN6webrtc16RtpRtxParametersD1Ev
 __ZN3rtc10LogMessage12SetLogOutputENS_15LoggingSeverityEPFvS1_PKcE
 __ZN6webrtc13CryptoOptions5NoGcmEv
+__ZTVN3rtc23InsecureCryptStringImplE
+__ZN3rtc11CryptStringC1ERKNS_15CryptStringImplE
+__ZN3rtc13SocketAddressC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi
+__ZN3rtc11CryptStringD1Ev
+__ZN3rtc11CryptStringC1ERKS0_

Modified: trunk/Source/WebCore/ChangeLog (248591 => 248592)


--- trunk/Source/WebCore/ChangeLog	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebCore/ChangeLog	2019-08-13 08:54:27 UTC (rev 248592)
@@ -1,3 +1,21 @@
+2019-08-13  Youenn Fablet  <[email protected]>
+
+        User Agent and SessionID should be given to NetworkRTCProvider to set up the correct proxy information
+        https://bugs.webkit.org/show_bug.cgi?id=200583
+
+        Reviewed by Eric Carlson.
+
+        Use a socket factory that is specific to the user agent and session ID.
+        This factory is stored in the media endpoint.
+        Not testable without proxy infrastructure.
+
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::setConfiguration):
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
+        * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:
+        (WebCore::LibWebRTCProvider::createPeerConnection):
+        * platform/mediastream/libwebrtc/LibWebRTCProvider.h:
+
 2019-08-12  Ryosuke Niwa  <[email protected]>
 
         FrameLoader::open can execute scritps via style recalc in Frame::setDocument

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (248591 => 248592)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -86,7 +86,11 @@
         configuration.sdp_semantics = webrtc::SdpSemantics::kUnifiedPlan;
 
     if (!m_backend) {
-        m_backend = client.createPeerConnection(*this, WTFMove(configuration));
+        if (!m_rtcSocketFactory) {
+            auto& document = downcast<Document>(*m_peerConnectionBackend.connection().scriptExecutionContext());
+            m_rtcSocketFactory = client.createSocketFactory(document.sessionID(), document.userAgent(document.url()));
+        }
+        m_backend = client.createPeerConnection(*this, m_rtcSocketFactory.get(), WTFMove(configuration));
         return !!m_backend;
     }
     auto oldConfiguration = m_backend->GetConfiguration();

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h (248591 => 248592)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h	2019-08-13 08:54:27 UTC (rev 248592)
@@ -198,6 +198,7 @@
 
     HashMap<String, rtc::scoped_refptr<webrtc::MediaStreamInterface>> m_localStreams;
 
+    std::unique_ptr<rtc::PacketSocketFactory> m_rtcSocketFactory;
 #if !RELEASE_LOG_DISABLED
     int64_t m_statsFirstDeliveredTimestamp { 0 };
     Ref<const Logger> m_logger;

Modified: trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp (248591 => 248592)


--- trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -281,7 +281,7 @@
     m_enableEnumeratingAllNetworkInterfaces = true;
 }
 
-rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
+rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
 {
     // Default WK1 implementation.
     ASSERT(m_useNetworkThreadWithSocketServer);

Modified: trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h (248591 => 248592)


--- trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h	2019-08-13 08:54:27 UTC (rev 248592)
@@ -91,7 +91,7 @@
     }
 
 #if USE(LIBWEBRTC)
-    virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, webrtc::PeerConnectionInterface::RTCConfiguration&&);
+    virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&);
 
     webrtc::PeerConnectionFactoryInterface* factory();
 
@@ -118,6 +118,8 @@
     void setEnableLogging(bool);
     void setEnableWebRTCEncryption(bool);
 
+    virtual std::unique_ptr<rtc::PacketSocketFactory> createSocketFactory(PAL::SessionID, String&& /* userAgent */) { return nullptr; }
+
 protected:
     LibWebRTCProvider() = default;
 

Modified: trunk/Source/WebKit/ChangeLog (248591 => 248592)


--- trunk/Source/WebKit/ChangeLog	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/ChangeLog	2019-08-13 08:54:27 UTC (rev 248592)
@@ -1,3 +1,33 @@
+2019-08-13  Youenn Fablet  <[email protected]>
+
+        User Agent and SessionID should be given to NetworkRTCProvider to set up the correct proxy information
+        https://bugs.webkit.org/show_bug.cgi?id=200583
+
+        Reviewed by Eric Carlson.
+
+        Pass session id and user agent whenever creating a TCP client socket.
+        Use this information to get the proxy information from NetworkSession and pass it to libwebrtc socket creation.
+
+        * NetworkProcess/cocoa/NetworkSessionCocoa.h:
+        * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
+        (WebKit::NetworkRTCProvider::proxyInfoFromSession):
+        (WebKit::NetworkRTCProvider::createClientTCPSocket):
+        * NetworkProcess/webrtc/NetworkRTCProvider.h:
+        * NetworkProcess/webrtc/NetworkRTCProvider.messages.in:
+        * WebKit.xcodeproj/project.pbxproj:
+        * NetworkProcess/webrtc/NetworkRTCProvider.mm: Added.
+        (WebKit::NetworkRTCProvider::proxyInfoFromSession):
+        * WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
+        (WebKit::LibWebRTCProvider::createPeerConnection):
+        (WebKit::LibWebRTCProvider::createSocketFactory):
+        * WebProcess/Network/webrtc/LibWebRTCProvider.h:
+        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:
+        (WebKit::LibWebRTCSocketFactory::createServerTcpSocket):
+        (WebKit::LibWebRTCSocketFactory::createUdpSocket):
+        (WebKit::LibWebRTCSocketFactory::createClientTcpSocket):
+        (WebKit::LibWebRTCSocketFactory::createAsyncResolver):
+        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
+
 2019-08-12  Chris Dumez  <[email protected]>
 
         Fix bad RELEASE_LOG_ERROR under ProvisionalPageProxy::ProvisionalPageProxy()

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h (248591 => 248592)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h	2019-08-13 08:54:27 UTC (rev 248592)
@@ -81,6 +81,8 @@
     bool allLoadsBlockedByDeviceManagementRestrictionsForTesting() const { return m_allLoadsBlockedByDeviceManagementRestrictionsForTesting; }
     DMFWebsitePolicyMonitor *deviceManagementPolicyMonitor();
 
+    CFDictionaryRef proxyConfiguration() const { return m_proxyConfiguration.get(); }
+
 private:
     void invalidateAndCancel() override;
     void clearCredentials() override;

Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp (248591 => 248592)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -129,10 +129,22 @@
     });
 }
 
-void NetworkRTCProvider::createClientTCPSocket(uint64_t identifier, const RTCNetwork::SocketAddress& localAddress, const RTCNetwork::SocketAddress& remoteAddress, int options)
+#if !PLATFORM(COCOA)
+rtc::ProxyInfo NetworkRTCProvider::proxyInfoFromSession(const RTCNetwork::SocketAddress&, NetworkSession&)
 {
-    callOnRTCNetworkThread([this, identifier, localAddress = RTCNetwork::isolatedCopy(localAddress.value), remoteAddress = RTCNetwork::isolatedCopy(remoteAddress.value), options]() {
-        std::unique_ptr<rtc::AsyncPacketSocket> socket(m_packetSocketFactory->CreateClientTcpSocket(localAddress, remoteAddress, { }, { }, options));
+    return { };
+}
+#endif
+
+void NetworkRTCProvider::createClientTCPSocket(uint64_t identifier, const RTCNetwork::SocketAddress& localAddress, const RTCNetwork::SocketAddress& remoteAddress, PAL::SessionID sessionID, String&& userAgent, int options)
+{
+    auto* session = m_connection->networkProcess().networkSession(sessionID);
+    if (!session) {
+        m_connection->connection().send(Messages::WebRTCSocket::SignalClose(1), identifier);
+        return;
+    }
+    callOnRTCNetworkThread([this, identifier, localAddress = RTCNetwork::isolatedCopy(localAddress.value), remoteAddress = RTCNetwork::isolatedCopy(remoteAddress.value), proxyInfo = proxyInfoFromSession(remoteAddress, *session), userAgent = WTFMove(userAgent).isolatedCopy(), options]() {
+        std::unique_ptr<rtc::AsyncPacketSocket> socket(m_packetSocketFactory->CreateClientTcpSocket(localAddress, remoteAddress, proxyInfo, userAgent.utf8().data(), options));
         createSocket(identifier, WTFMove(socket), LibWebRTCSocketClient::Type::ClientTCP);
     });
 }

Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h (248591 => 248592)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h	2019-08-13 08:54:27 UTC (rev 248592)
@@ -31,6 +31,7 @@
 #include "NetworkRTCMonitor.h"
 #include "RTCNetwork.h"
 #include <WebCore/LibWebRTCMacros.h>
+#include <pal/SessionID.h>
 #include <webrtc/p2p/base/basicpacketsocketfactory.h>
 #include <webrtc/rtc_base/third_party/sigslot/sigslot.h>
 #include <wtf/HashMap.h>
@@ -47,6 +48,7 @@
 class NetworkConnectionToWebProcess;
 class NetworkRTCResolver;
 class NetworkRTCSocket;
+class NetworkSession;
 
 class NetworkRTCProvider : public ThreadSafeRefCounted<NetworkRTCProvider>, public rtc::MessageHandler {
 public:
@@ -75,7 +77,7 @@
     explicit NetworkRTCProvider(NetworkConnectionToWebProcess&);
 
     void createUDPSocket(uint64_t, const RTCNetwork::SocketAddress&, uint16_t, uint16_t);
-    void createClientTCPSocket(uint64_t, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, int);
+    void createClientTCPSocket(uint64_t, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, PAL::SessionID, String&& userAgent, int);
     void createServerTCPSocket(uint64_t, const RTCNetwork::SocketAddress&, uint16_t minPort, uint16_t maxPort, int);
     void wrapNewTCPConnection(uint64_t identifier, uint64_t newConnectionSocketIdentifier);
 
@@ -88,6 +90,8 @@
 
     void OnMessage(rtc::Message*);
 
+    static rtc::ProxyInfo proxyInfoFromSession(const RTCNetwork::SocketAddress&, NetworkSession&);
+
     HashMap<uint64_t, std::unique_ptr<NetworkRTCResolver>> m_resolvers;
     HashMap<uint64_t, std::unique_ptr<LibWebRTCSocketClient>> m_sockets;
     NetworkConnectionToWebProcess* m_connection;

Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in (248591 => 248592)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in	2019-08-13 08:54:27 UTC (rev 248592)
@@ -25,7 +25,7 @@
 messages -> NetworkRTCProvider {
     CreateUDPSocket(int identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort)
     CreateServerTCPSocket(int identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, int options)
-    CreateClientTCPSocket(int identifier, WebKit::RTCNetwork::SocketAddress localAddress, WebKit::RTCNetwork::SocketAddress remoteAddress, int options)
+    CreateClientTCPSocket(int identifier, WebKit::RTCNetwork::SocketAddress localAddress, WebKit::RTCNetwork::SocketAddress remoteAddress, PAL::SessionID sessionID, String userAgent, int options)
     CreateResolver(uint64_t identifier, String address)
     StopResolver(uint64_t identifier)
     WrapNewTCPConnection(uint64_t identifier, uint64_t newConnectionSocketIdentifier)

Added: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.mm (0 => 248592)


--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.mm	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.mm	2019-08-13 08:54:27 UTC (rev 248592)
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NetworkRTCProvider.h"
+
+#if USE(LIBWEBRTC)
+
+#include "NetworkSessionCocoa.h"
+#include <WebCore/LibWebRTCMacros.h>
+#include <webrtc/rtc_base/asyncpacketsocket.h>
+#include <webrtc/rtc_base/logging.h>
+
+namespace WebKit {
+
+static inline bool isEnabled(CFDictionaryRef proxy, CFStringRef key)
+{
+    auto enabled = static_cast<CFNumberRef>(CFDictionaryGetValue(proxy, key));
+
+    if (!enabled)
+        return false;
+
+    int result;
+    return CFNumberGetValue(enabled, kCFNumberIntType, &result);
+    return !!result;
+}
+
+static inline rtc::ProxyInfo createRTCProxy(CFDictionaryRef proxy, rtc::ProxyType type, CFStringRef nameKey, CFStringRef portKey)
+{
+    rtc::ProxyInfo info;
+    info.type = type;
+
+    auto proxyHostName = static_cast<CFStringRef>(CFDictionaryGetValue(proxy, nameKey));
+    if (!proxyHostName)
+        return { };
+    auto portNumber = static_cast<CFNumberRef>(CFDictionaryGetValue(proxy, portKey));
+    if (!portNumber)
+        return { };
+
+    int proxyPort;
+    if (!CFNumberGetValue(portNumber, kCFNumberSInt32Type, &proxyPort))
+        return { };
+
+    info.address = { std::string([(__bridge NSString *)proxyHostName UTF8String]), proxyPort };
+    info.autodetect = false;
+    return info;
+}
+
+rtc::ProxyInfo NetworkRTCProvider::proxyInfoFromSession(const RTCNetwork::SocketAddress&, NetworkSession& session)
+{
+    // FIXME: We should check for kCFNetworkProxiesExceptionsList to decide whether to use proxy or not.
+    // FIXME: We should also get username/password for authentication cases.
+    auto proxyDictionary = static_cast<NetworkSessionCocoa&>(session).proxyConfiguration();
+    if (!proxyDictionary)
+        proxyDictionary = CFNetworkCopySystemProxySettings();
+#if PLATFORM(MAC)
+    if (isEnabled(proxyDictionary, kCFNetworkProxiesHTTPSEnable))
+        return createRTCProxy(proxyDictionary, rtc::PROXY_HTTPS, kCFNetworkProxiesHTTPSProxy, kCFNetworkProxiesHTTPSPort);
+
+    if (isEnabled(proxyDictionary, kCFNetworkProxiesSOCKSEnable))
+        return createRTCProxy(proxyDictionary, rtc::PROXY_SOCKS5, kCFNetworkProxiesSOCKSProxy, kCFNetworkProxiesSOCKSPort);
+#endif
+#if PLATFORM(IOS)
+    if (isEnabled(proxyDictionary, kCFNetworkProxiesHTTPEnable))
+        return createRTCProxy(proxyDictionary, rtc::PROXY_HTTPS, kCFNetworkProxiesHTTPProxy, kCFNetworkProxiesHTTPPort);
+#endif
+    return { };
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (248591 => 248592)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-08-13 08:54:27 UTC (rev 248592)
@@ -883,6 +883,7 @@
 		414DD37A20BF49A5006959FB /* com.cisco.webex.plugin.gpc64.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */; };
 		414DEDD71F9EDDE50047C40D /* ServiceWorkerProcessProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 414DEDD51F9EDDDF0047C40D /* ServiceWorkerProcessProxy.h */; };
 		4157E4B020E2ECDF00A6C0D7 /* com.google.o1dbrowserplugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 4157E4AF20E2EC9800A6C0D7 /* com.google.o1dbrowserplugin.sb */; };
+		4176901422FDD41B00B1576D /* NetworkRTCProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4176901322FDD41B00B1576D /* NetworkRTCProvider.mm */; };
 		417915AF2256BB7500D6F97E /* WebSocketChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 417915AD2256BB7400D6F97E /* WebSocketChannel.h */; };
 		417915B12256C0D600D6F97E /* WebSocketChannelManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 417915B02256C0D600D6F97E /* WebSocketChannelManager.h */; };
 		417915B92257046F00D6F97E /* NetworkSocketChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 417915B62257046E00D6F97E /* NetworkSocketChannel.h */; };
@@ -3127,6 +3128,7 @@
 		4151E5C31FBB90A900E47E2D /* FormDataReference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormDataReference.h; sourceTree = "<group>"; };
 		4157853021276B6F00DD3800 /* copy-webcontent-resources-to-private-headers.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "copy-webcontent-resources-to-private-headers.sh"; sourceTree = "<group>"; };
 		4157E4AF20E2EC9800A6C0D7 /* com.google.o1dbrowserplugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.google.o1dbrowserplugin.sb; sourceTree = "<group>"; };
+		4176901322FDD41B00B1576D /* NetworkRTCProvider.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkRTCProvider.mm; sourceTree = "<group>"; };
 		417915AC2256BB7400D6F97E /* WebSocketChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebSocketChannel.cpp; path = Network/WebSocketChannel.cpp; sourceTree = "<group>"; };
 		417915AD2256BB7400D6F97E /* WebSocketChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebSocketChannel.h; path = Network/WebSocketChannel.h; sourceTree = "<group>"; };
 		417915B02256C0D600D6F97E /* WebSocketChannelManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebSocketChannelManager.h; path = Network/WebSocketChannelManager.h; sourceTree = "<group>"; };
@@ -6550,6 +6552,7 @@
 				41DC45951E3D6E1E00B11F51 /* NetworkRTCProvider.cpp */,
 				41DC45941E3D6E1E00B11F51 /* NetworkRTCProvider.h */,
 				41DC45981E3D6ED600B11F51 /* NetworkRTCProvider.messages.in */,
+				4176901322FDD41B00B1576D /* NetworkRTCProvider.mm */,
 				4112B5471F9FD3AB00E67875 /* NetworkRTCResolver.cpp */,
 				4112B5481F9FD3AC00E67875 /* NetworkRTCResolver.h */,
 				4112B5471F9FD3AB00E67986 /* NetworkRTCResolverCocoa.cpp */,
@@ -11143,6 +11146,7 @@
 				513A163C163088F6005D7D22 /* NetworkProcessProxyMessageReceiver.cpp in Sources */,
 				E152551A17011819003D7ADB /* NetworkResourceLoaderMessageReceiver.cpp in Sources */,
 				51F060E11654318500F3281E /* NetworkRTCMonitorMessageReceiver.cpp in Sources */,
+				4176901422FDD41B00B1576D /* NetworkRTCProvider.mm in Sources */,
 				51F060E11654318500F3282E /* NetworkRTCProviderMessageReceiver.cpp in Sources */,
 				51F060E11654318500F3281D /* NetworkRTCSocketMessageReceiver.cpp in Sources */,
 				31F060E11654318500F3281C /* NetworkSocketChannelMessageReceiver.cpp in Sources */,

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp (248591 => 248592)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -44,9 +44,9 @@
     }
 };
 
-rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
+rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::PacketSocketFactory* socketFactory, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
 {
-    return WebCore::LibWebRTCProvider::createPeerConnection(observer, WebProcess::singleton().libWebRTCNetwork().monitor(), WebProcess::singleton().libWebRTCNetwork().socketFactory(), WTFMove(configuration), std::make_unique<AsyncResolverFactory>());
+    return WebCore::LibWebRTCProvider::createPeerConnection(observer, WebProcess::singleton().libWebRTCNetwork().monitor(), *socketFactory, WTFMove(configuration), std::make_unique<AsyncResolverFactory>());
 }
 
 void LibWebRTCProvider::disableNonLocalhostConnections()
@@ -64,6 +64,47 @@
     WebProcess::singleton().libWebRTCNetwork().mdnsRegister().registerMDNSName(sessionID, documentIdentifier, ipAddress, WTFMove(callback));
 }
 
+class RTCSocketFactory final : public rtc::PacketSocketFactory {
+public:
+    RTCSocketFactory(PAL::SessionID sessionID, String&& userAgent)
+        : m_sessionID(sessionID)
+        , m_userAgent(WTFMove(userAgent))
+    {
+    }
+
+private:
+    rtc::AsyncPacketSocket* CreateUdpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort) final
+    {
+        return factory().createUdpSocket(address, minPort, maxPort);
+    }
+
+    rtc::AsyncPacketSocket* CreateServerTcpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, int options) final
+    {
+        return factory().createServerTcpSocket(address, minPort, maxPort, options);
+    }
+
+    rtc::AsyncPacketSocket* CreateClientTcpSocket(const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, const rtc::ProxyInfo&, const std::string&, int options) final
+    {
+        return factory().createClientTcpSocket(localAddress, remoteAddress, m_sessionID, String { m_userAgent }, options);
+    }
+
+    rtc::AsyncResolverInterface* CreateAsyncResolver() final
+    {
+        return factory().createAsyncResolver();
+    }
+
+    LibWebRTCSocketFactory& factory() { return WebProcess::singleton().libWebRTCNetwork().socketFactory(); }
+
+private:
+    PAL::SessionID m_sessionID;
+    String m_userAgent;
+};
+
+std::unique_ptr<rtc::PacketSocketFactory> LibWebRTCProvider::createSocketFactory(PAL::SessionID sessionID, String&& userAgent)
+{
+    return std::make_unique<RTCSocketFactory>(sessionID, WTFMove(userAgent));
+}
+
 } // namespace WebKit
 
 #endif // USE(LIBWEBRTC)

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h (248591 => 248592)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h	2019-08-13 08:54:27 UTC (rev 248592)
@@ -50,8 +50,10 @@
     LibWebRTCProvider() { m_useNetworkThreadWithSocketServer = false; }
 
 private:
-    rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, webrtc::PeerConnectionInterface::RTCConfiguration&&) final;
+    std::unique_ptr<rtc::PacketSocketFactory> createSocketFactory(PAL::SessionID, String&& /* userAgent */) final;
 
+    rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&) final;
+
     void unregisterMDNSNames(uint64_t documentIdentifier) final;
     void registerMDNSName(PAL::SessionID, uint64_t documentIdentifier, const String& ipAddress, CompletionHandler<void(MDNSNameOrError&&)>&&) final;
     void disableNonLocalhostConnections() final;

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp (248591 => 248592)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp	2019-08-13 08:54:27 UTC (rev 248592)
@@ -48,7 +48,7 @@
     return result;
 }
 
-rtc::AsyncPacketSocket* LibWebRTCSocketFactory::CreateServerTcpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, int options)
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createServerTcpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, int options)
 {
     auto socket = std::make_unique<LibWebRTCSocket>(*this, ++s_uniqueSocketIdentifier, LibWebRTCSocket::Type::ServerTCP, address, rtc::SocketAddress());
     m_sockets.set(socket->identifier(), socket.get());
@@ -64,7 +64,7 @@
     return socket.release();
 }
 
-rtc::AsyncPacketSocket* LibWebRTCSocketFactory::CreateUdpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createUdpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
 {
     auto socket = std::make_unique<LibWebRTCSocket>(*this, ++s_uniqueSocketIdentifier, LibWebRTCSocket::Type::UDP, address, rtc::SocketAddress());
     m_sockets.set(socket->identifier(), socket.get());
@@ -78,14 +78,14 @@
     return socket.release();
 }
 
-rtc::AsyncPacketSocket* LibWebRTCSocketFactory::CreateClientTcpSocket(const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, const rtc::ProxyInfo&, const std::string&, int options)
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createClientTcpSocket(const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, PAL::SessionID sessionID, String&& userAgent, int options)
 {
     auto socket = std::make_unique<LibWebRTCSocket>(*this, ++s_uniqueSocketIdentifier, LibWebRTCSocket::Type::ClientTCP, localAddress, remoteAddress);
     socket->setState(LibWebRTCSocket::STATE_CONNECTING);
     m_sockets.set(socket->identifier(), socket.get());
 
-    callOnMainThread([identifier = socket->identifier(), localAddress = prepareSocketAddress(localAddress, m_disableNonLocalhostConnections), remoteAddress = prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections), options]() {
-        if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, RTCNetwork::SocketAddress(localAddress), RTCNetwork::SocketAddress(remoteAddress), options), 0)) {
+    callOnMainThread([identifier = socket->identifier(), localAddress = prepareSocketAddress(localAddress, m_disableNonLocalhostConnections), remoteAddress = prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections), sessionID, userAgent = WTFMove(userAgent).isolatedCopy(), options]() {
+        if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, RTCNetwork::SocketAddress(localAddress), RTCNetwork::SocketAddress(remoteAddress), sessionID, userAgent, options), 0)) {
             // FIXME: Set error back to socket
             return;
         }
@@ -115,7 +115,7 @@
     m_sockets.remove(socket.identifier());
 }
 
-rtc::AsyncResolverInterface* LibWebRTCSocketFactory::CreateAsyncResolver()
+rtc::AsyncResolverInterface* LibWebRTCSocketFactory::createAsyncResolver()
 {
     auto resolver = std::make_unique<LibWebRTCResolver>(++s_uniqueResolverIdentifier);
     auto* resolverPointer = resolver.get();

Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h (248591 => 248592)


--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h	2019-08-13 05:18:11 UTC (rev 248591)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h	2019-08-13 08:54:27 UTC (rev 248592)
@@ -36,7 +36,7 @@
 
 namespace WebKit {
 
-class LibWebRTCSocketFactory final : public rtc::PacketSocketFactory {
+class LibWebRTCSocketFactory {
 public:
     LibWebRTCSocketFactory() { }
 
@@ -51,13 +51,12 @@
 
     void disableNonLocalhostConnections() { m_disableNonLocalhostConnections = true; }
 
-    rtc::AsyncResolverInterface* createAsyncResolver() { return CreateAsyncResolver(); }
+    rtc::AsyncPacketSocket* createUdpSocket(const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort);
+    rtc::AsyncPacketSocket* createServerTcpSocket(const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, int options);
+    rtc::AsyncPacketSocket* createClientTcpSocket(const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, PAL::SessionID, String&& userAgent, int options);
+    rtc::AsyncResolverInterface* createAsyncResolver();
 
 private:
-    rtc::AsyncPacketSocket* CreateUdpSocket(const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort) final;
-    rtc::AsyncPacketSocket* CreateServerTcpSocket(const rtc::SocketAddress&, uint16_t min_port, uint16_t max_port, int options) final;
-    rtc::AsyncPacketSocket* CreateClientTcpSocket(const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, const rtc::ProxyInfo&, const std::string&, int options);
-    rtc::AsyncResolverInterface* CreateAsyncResolver() final;
 
     // We cannot own sockets, clients of the factory are responsible to free them.
     HashMap<uint64_t, LibWebRTCSocket*> m_sockets;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to