blob: 9ca8fa6ea89d93812fa08047a7f34b9cde2f697d [file] [log] [blame]
/*
* Copyright (C) 2016-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.
*/
#pragma once
OBJC_CLASS DMFWebsitePolicyMonitor;
OBJC_CLASS NSData;
OBJC_CLASS NSURLSession;
OBJC_CLASS NSURLSessionConfiguration;
OBJC_CLASS NSURLSessionDownloadTask;
OBJC_CLASS NSOperationQueue;
OBJC_CLASS WKNetworkSessionDelegate;
OBJC_CLASS WKNetworkSessionWebSocketDelegate;
#include "DownloadID.h"
#include "NetworkDataTaskCocoa.h"
#include "NetworkSession.h"
#include "WebSocketTask.h"
#include <WebCore/NetworkLoadMetrics.h>
#include <WebCore/RegistrableDomain.h>
#include <wtf/HashMap.h>
#include <wtf/Seconds.h>
namespace WebKit {
enum class NegotiatedLegacyTLS : bool;
class LegacyCustomProtocolManager;
class NetworkSessionCocoa;
using HostAndPort = std::pair<String, uint16_t>;
struct SessionWrapper : public CanMakeWeakPtr<SessionWrapper> {
void initialize(NSURLSessionConfiguration *, NetworkSessionCocoa&, WebCore::StoredCredentialsPolicy, NavigatingToAppBoundDomain);
RetainPtr<NSURLSession> session;
RetainPtr<WKNetworkSessionDelegate> delegate;
HashMap<NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*> dataTaskMap;
HashMap<NetworkDataTaskCocoa::TaskIdentifier, DownloadID> downloadMap;
#if HAVE(NSURLSESSION_WEBSOCKET)
HashMap<NetworkDataTaskCocoa::TaskIdentifier, WebSocketTask*> webSocketDataTaskMap;
#endif
};
class NetworkSessionCocoa final : public NetworkSession {
public:
static std::unique_ptr<NetworkSession> create(NetworkProcess&, NetworkSessionCreationParameters&&);
NetworkSessionCocoa(NetworkProcess&, NetworkSessionCreationParameters&&);
~NetworkSessionCocoa();
void initializeEphemeralStatelessSession(NavigatingToAppBoundDomain);
const String& boundInterfaceIdentifier() const;
const String& sourceApplicationBundleIdentifier() const;
const String& sourceApplicationSecondaryIdentifier() const;
#if PLATFORM(IOS_FAMILY)
const String& dataConnectionServiceType() const;
#endif
static bool allowsSpecificHTTPSCertificateForHost(const WebCore::AuthenticationChallenge&);
void continueDidReceiveChallenge(SessionWrapper&, const WebCore::AuthenticationChallenge&, NegotiatedLegacyTLS, NetworkDataTaskCocoa::TaskIdentifier, NetworkDataTaskCocoa*, CompletionHandler<void(WebKit::AuthenticationChallengeDisposition, const WebCore::Credential&)>&&);
SessionWrapper& sessionWrapperForDownloads() { return m_sessionWithCredentialStorage; }
bool fastServerTrustEvaluationEnabled() const { return m_fastServerTrustEvaluationEnabled; }
bool deviceManagementRestrictionsEnabled() const { return m_deviceManagementRestrictionsEnabled; }
bool allLoadsBlockedByDeviceManagementRestrictionsForTesting() const { return m_allLoadsBlockedByDeviceManagementRestrictionsForTesting; }
DMFWebsitePolicyMonitor *deviceManagementPolicyMonitor();
CFDictionaryRef proxyConfiguration() const { return m_proxyConfiguration.get(); }
bool hasIsolatedSession(const WebCore::RegistrableDomain) const override;
void clearIsolatedSessions() override;
bool hasAppBoundSession() const override { return !!m_appBoundSession; }
SessionWrapper& sessionWrapperForTask(const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, Optional<NavigatingToAppBoundDomain>);
void clearAppBoundSession() override;
bool preventsSystemHTTPProxyAuthentication() const { return m_preventsSystemHTTPProxyAuthentication; }
void clientCertificateSuggestedForHost(NetworkDataTaskCocoa::TaskIdentifier, NSURLCredential *, const String& host, uint16_t port);
void taskServerConnectionSucceeded(NetworkDataTaskCocoa::TaskIdentifier);
void taskFailed(NetworkDataTaskCocoa::TaskIdentifier);
NSURLCredential *successfulClientCertificateForHost(const String& host, uint16_t port) const;
private:
void invalidateAndCancel() override;
void clearCredentials() override;
bool shouldLogCookieInformation() const override { return m_shouldLogCookieInformation; }
Seconds loadThrottleLatency() const override { return m_loadThrottleLatency; }
SessionWrapper& isolatedSession(WebCore::StoredCredentialsPolicy, const WebCore::RegistrableDomain, NavigatingToAppBoundDomain);
SessionWrapper& appBoundSession(WebCore::StoredCredentialsPolicy);
Vector<WebCore::SecurityOriginData> hostNamesWithAlternativeServices() const override;
void deleteAlternativeServicesForHostNames(const Vector<String>&) override;
void clearAlternativeServices(WallTime) override;
#if HAVE(NSURLSESSION_WEBSOCKET)
std::unique_ptr<WebSocketTask> createWebSocketTask(NetworkSocketChannel&, const WebCore::ResourceRequest&, const String& protocol) final;
void addWebSocketTask(WebSocketTask&) final;
void removeWebSocketTask(WebSocketTask&) final;
#endif
struct IsolatedSession {
WTF_MAKE_FAST_ALLOCATED;
public:
SessionWrapper sessionWithCredentialStorage;
SessionWrapper sessionWithoutCredentialStorage;
WallTime lastUsed;
};
HashMap<WebCore::RegistrableDomain, std::unique_ptr<IsolatedSession>> m_isolatedSessions;
std::unique_ptr<IsolatedSession> m_appBoundSession;
SessionWrapper m_sessionWithCredentialStorage;
SessionWrapper m_sessionWithoutCredentialStorage;
SessionWrapper m_ephemeralStatelessSession;
String m_boundInterfaceIdentifier;
String m_sourceApplicationBundleIdentifier;
String m_sourceApplicationSecondaryIdentifier;
RetainPtr<CFDictionaryRef> m_proxyConfiguration;
RetainPtr<DMFWebsitePolicyMonitor> m_deviceManagementPolicyMonitor;
bool m_deviceManagementRestrictionsEnabled { false };
bool m_allLoadsBlockedByDeviceManagementRestrictionsForTesting { false };
bool m_shouldLogCookieInformation { false };
Seconds m_loadThrottleLatency;
bool m_fastServerTrustEvaluationEnabled { false };
String m_dataConnectionServiceType;
bool m_preventsSystemHTTPProxyAuthentication { false };
struct SuggestedClientCertificate {
String host;
uint16_t port { 0 };
RetainPtr<NSURLCredential> credential;
};
HashMap<NetworkDataTaskCocoa::TaskIdentifier, SuggestedClientCertificate> m_suggestedClientCertificates;
HashMap<HostAndPort, RetainPtr<NSURLCredential>> m_successfulClientCertificates;
};
} // namespace WebKit