Skip to content

Commit

Permalink
Add a flag for storage site validation
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=272420
rdar://126166325

Reviewed by Matthew Finkel and Chris Dumez.

Add a setting on WebsiteDataStore to allow enabling site validation on storage messages. The flag is not in use yet, so
there is no behavior change.

* Source/WebKit/NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::setStorageSiteValidationEnabled):
* Source/WebKit/NetworkProcess/NetworkProcess.h:
* Source/WebKit/NetworkProcess/NetworkProcess.messages.in:
* Source/WebKit/NetworkProcess/NetworkSession.cpp:
(WebKit::createNetworkStorageManager):
* Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h:
* Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.serialization.in:
* Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp:
(WebKit::NetworkStorageManager::create):
(WebKit::NetworkStorageManager::NetworkStorageManager):
(WebKit::NetworkStorageManager::setStorageSiteValidationEnabledInternal):
(WebKit::NetworkStorageManager::setStorageSiteValidationEnabled):
* Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(-[WKWebsiteDataStore _storageSiteValidationEnabled]):
(-[WKWebsiteDataStore _setStorageSiteValidationEnabled:]):
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::setStorageSiteValidationEnabled):
(WebKit::WebsiteDataStore::parameters):
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h:
(WebKit::WebsiteDataStore::storageSiteValidationEnabled const):

Canonical link: https://commits.webkit.org/277334@main
  • Loading branch information
szewai committed Apr 10, 2024
1 parent a922441 commit b9a4cb4
Show file tree
Hide file tree
Showing 12 changed files with 67 additions and 7 deletions.
6 changes: 6 additions & 0 deletions Source/WebKit/NetworkProcess/NetworkProcess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3007,4 +3007,10 @@ void NetworkProcess::setInspectionForServiceWorkersAllowed(PAL::SessionID sessio
session->setInspectionForServiceWorkersAllowed(inspectable);
}

void NetworkProcess::setStorageSiteValidationEnabled(PAL::SessionID sessionID, bool enabled)
{
if (auto* session = networkSession(sessionID))
session->protectedStorageManager()->setStorageSiteValidationEnabled(enabled);
}

} // namespace WebKit
1 change: 1 addition & 0 deletions Source/WebKit/NetworkProcess/NetworkProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,7 @@ class NetworkProcess : public AuxiliaryProcess, private DownloadManager::Client,

void requestBackgroundFetchPermission(PAL::SessionID, const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&);
void setInspectionForServiceWorkersAllowed(PAL::SessionID, bool);
void setStorageSiteValidationEnabled(PAL::SessionID, bool);

private:
// CheckedPtr interface
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/NetworkProcess/NetworkProcess.messages.in
Original file line number Diff line number Diff line change
Expand Up @@ -244,4 +244,5 @@ messages -> NetworkProcess LegacyReceiver {
SetProxyConfigData(PAL::SessionID sessionID, Vector<std::pair<Vector<uint8_t>, WTF::UUID>> proxyConfigurations)
#endif

SetStorageSiteValidationEnabled(PAL::SessionID sessionID, bool enabled)
}
2 changes: 1 addition & 1 deletion Source/WebKit/NetworkProcess/NetworkSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ static Ref<NetworkStorageManager> createNetworkStorageManager(NetworkProcess& ne
String serviceWorkerStorageDirectory;
serviceWorkerStorageDirectory = parameters.serviceWorkerRegistrationDirectory;
SandboxExtension::consumePermanently(parameters.serviceWorkerRegistrationDirectoryExtensionHandle);
return NetworkStorageManager::create(networkProcess, parameters.sessionID, parameters.dataStoreIdentifier, connectionID, parameters.generalStorageDirectory, parameters.localStorageDirectory, parameters.indexedDBDirectory, parameters.cacheStorageDirectory, serviceWorkerStorageDirectory, parameters.perOriginStorageQuota, parameters.originQuotaRatio, parameters.totalQuotaRatio, parameters.standardVolumeCapacity, parameters.volumeCapacityOverride, parameters.unifiedOriginStorageLevel);
return NetworkStorageManager::create(networkProcess, parameters.sessionID, parameters.dataStoreIdentifier, connectionID, parameters.generalStorageDirectory, parameters.localStorageDirectory, parameters.indexedDBDirectory, parameters.cacheStorageDirectory, serviceWorkerStorageDirectory, parameters.perOriginStorageQuota, parameters.originQuotaRatio, parameters.totalQuotaRatio, parameters.standardVolumeCapacity, parameters.volumeCapacityOverride, parameters.unifiedOriginStorageLevel, parameters.storageSiteValidationEnabled);
}

NetworkSession::NetworkSession(NetworkProcess& networkProcess, const NetworkSessionCreationParameters& parameters)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ struct NetworkSessionCreationParameters {
SandboxExtension::Handle serviceWorkerRegistrationDirectoryExtensionHandle;
bool serviceWorkerProcessTerminationDelayEnabled { true };
bool inspectionForServiceWorkersAllowed { true };
bool storageSiteValidationEnabled { false };
#if ENABLE(DECLARATIVE_WEB_PUSH)
bool isDeclarativeWebPushEnabled { false };
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ enum class WebKit::AllowsCellularAccess : bool;
WebKit::SandboxExtensionHandle serviceWorkerRegistrationDirectoryExtensionHandle;
bool serviceWorkerProcessTerminationDelayEnabled;
bool inspectionForServiceWorkersAllowed;
bool storageSiteValidationEnabled;
#if ENABLE(DECLARATIVE_WEB_PUSH)
bool isDeclarativeWebPushEnabled;
#endif
Expand Down
28 changes: 24 additions & 4 deletions Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,12 @@ String NetworkStorageManager::persistedFilePath(const WebCore::ClientOrigin& ori
return FileSystem::pathByAppendingComponent(directory, persistedFileName);
}

Ref<NetworkStorageManager> NetworkStorageManager::create(NetworkProcess& process, PAL::SessionID sessionID, Markable<WTF::UUID> identifier, IPC::Connection::UniqueID connection, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel level)
Ref<NetworkStorageManager> NetworkStorageManager::create(NetworkProcess& process, PAL::SessionID sessionID, Markable<WTF::UUID> identifier, IPC::Connection::UniqueID connection, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel level, bool storageSiteValidationEnabled)
{
return adoptRef(*new NetworkStorageManager(process, sessionID, identifier, connection, path, customLocalStoragePath, customIDBStoragePath, customCacheStoragePath, customServiceWorkerStoragePath, defaultOriginQuota, originQuotaRatio, totalQuotaRatio, standardVolumeCapacity, volumeCapacityOverride, level));
return adoptRef(*new NetworkStorageManager(process, sessionID, identifier, connection, path, customLocalStoragePath, customIDBStoragePath, customCacheStoragePath, customServiceWorkerStoragePath, defaultOriginQuota, originQuotaRatio, totalQuotaRatio, standardVolumeCapacity, volumeCapacityOverride, level, storageSiteValidationEnabled));
}

NetworkStorageManager::NetworkStorageManager(NetworkProcess& process, PAL::SessionID sessionID, Markable<WTF::UUID> identifier, IPC::Connection::UniqueID connection, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel level)
NetworkStorageManager::NetworkStorageManager(NetworkProcess& process, PAL::SessionID sessionID, Markable<WTF::UUID> identifier, IPC::Connection::UniqueID connection, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel level, bool storageSiteValidationEnabled)
: m_process(process)
, m_sessionID(sessionID)
, m_queueName(makeString("com.apple.WebKit.Storage.", sessionID.toUInt64(), ".", static_cast<uint64_t>(identifier->data() >> 64), static_cast<uint64_t>(identifier->data())))
Expand All @@ -172,7 +172,7 @@ NetworkStorageManager::NetworkStorageManager(NetworkProcess& process, PAL::Sessi
}
}

m_queue->dispatch([this, weakThis = ThreadSafeWeakPtr { *this }, path = path.isolatedCopy(), customLocalStoragePath = crossThreadCopy(customLocalStoragePath), customIDBStoragePath = crossThreadCopy(customIDBStoragePath), customCacheStoragePath = crossThreadCopy(customCacheStoragePath), customServiceWorkerStoragePath = crossThreadCopy(customServiceWorkerStoragePath), defaultOriginQuota, originQuotaRatio, totalQuotaRatio, standardVolumeCapacity, volumeCapacityOverride, level]() mutable {
m_queue->dispatch([this, weakThis = ThreadSafeWeakPtr { *this }, path = path.isolatedCopy(), customLocalStoragePath = crossThreadCopy(customLocalStoragePath), customIDBStoragePath = crossThreadCopy(customIDBStoragePath), customCacheStoragePath = crossThreadCopy(customCacheStoragePath), customServiceWorkerStoragePath = crossThreadCopy(customServiceWorkerStoragePath), defaultOriginQuota, originQuotaRatio, totalQuotaRatio, standardVolumeCapacity, volumeCapacityOverride, level, storageSiteValidationEnabled]() mutable {
assertIsCurrent(workQueue());

auto protectedThis = weakThis.get();
Expand All @@ -187,6 +187,7 @@ NetworkStorageManager::NetworkStorageManager(NetworkProcess& process, PAL::Sessi
#if PLATFORM(IOS_FAMILY)
m_backupExclusionPeriod = defaultBackupExclusionPeriod;
#endif
m_storageSiteValidationEnabled = storageSiteValidationEnabled;
m_fileSystemStorageHandleRegistry = makeUnique<FileSystemStorageHandleRegistry>();
m_storageAreaRegistry = makeUnique<StorageAreaRegistry>();
m_idbStorageRegistry = makeUnique<IDBStorageRegistry>();
Expand Down Expand Up @@ -1289,6 +1290,25 @@ void NetworkStorageManager::setBackupExclusionPeriodForTesting(Seconds period, C

#endif

void NetworkStorageManager::setStorageSiteValidationEnabledInternal(bool enabled)
{
assertIsCurrent(workQueue());

m_storageSiteValidationEnabled = enabled;
}


void NetworkStorageManager::setStorageSiteValidationEnabled(bool enabled)
{
ASSERT(RunLoop::isMain());
ASSERT(!m_closed);

m_queue->dispatch([weakThis = ThreadSafeWeakPtr { *this }, enabled]() mutable {
if (RefPtr protectedThis = weakThis.get())
protectedThis->setStorageSiteValidationEnabledInternal(enabled);
});
}

void NetworkStorageManager::connectToStorageArea(IPC::Connection& connection, WebCore::StorageType type, StorageAreaMapIdentifier sourceIdentifier, std::optional<StorageNamespaceIdentifier> namespaceIdentifier, const WebCore::ClientOrigin& origin, CompletionHandler<void(StorageAreaIdentifier, HashMap<String, String>, uint64_t)>&& completionHandler)
{
ASSERT(!RunLoop::isMain());
Expand Down
7 changes: 5 additions & 2 deletions Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class StorageAreaRegistry;
class NetworkStorageManager final : public IPC::WorkQueueMessageReceiver, public CanMakeCheckedPtr<NetworkStorageManager> {
WTF_MAKE_FAST_ALLOCATED;
public:
static Ref<NetworkStorageManager> create(NetworkProcess&, PAL::SessionID, Markable<WTF::UUID>, IPC::Connection::UniqueID, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel);
static Ref<NetworkStorageManager> create(NetworkProcess&, PAL::SessionID, Markable<WTF::UUID>, IPC::Connection::UniqueID, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel, bool storageSiteValidationEnabled);
static bool canHandleTypes(OptionSet<WebsiteDataType>);
static OptionSet<WebsiteDataType> allManagedTypes();

Expand Down Expand Up @@ -126,6 +126,7 @@ class NetworkStorageManager final : public IPC::WorkQueueMessageReceiver, public
#if PLATFORM(IOS_FAMILY)
void setBackupExclusionPeriodForTesting(Seconds, CompletionHandler<void()>&&);
#endif
void setStorageSiteValidationEnabled(bool);

void dispatchTaskToBackgroundFetchManager(const WebCore::ClientOrigin&, Function<void(BackgroundFetchStoreManager*)>&&);
void notifyBackgroundFetchChange(const String&, BackgroundFetchChange);
Expand All @@ -135,7 +136,7 @@ class NetworkStorageManager final : public IPC::WorkQueueMessageReceiver, public
void updateServiceWorkerRegistrations(Vector<WebCore::ServiceWorkerContextData>&&, Vector<WebCore::ServiceWorkerRegistrationKey>&&, CompletionHandler<void(std::optional<Vector<WebCore::ServiceWorkerScripts>>)>&&);

private:
NetworkStorageManager(NetworkProcess&, PAL::SessionID, Markable<WTF::UUID>, IPC::Connection::UniqueID, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel);
NetworkStorageManager(NetworkProcess&, PAL::SessionID, Markable<WTF::UUID>, IPC::Connection::UniqueID, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, const String& customServiceWorkerStoragePath, uint64_t defaultOriginQuota, std::optional<double> originQuotaRatio, std::optional<double> totalQuotaRatio, std::optional<uint64_t> standardVolumeCapacity, std::optional<uint64_t> volumeCapacityOverride, UnifiedOriginStorageLevel, bool storageSiteValidationEnabled);
~NetworkStorageManager();
void writeOriginToFileIfNecessary(const WebCore::ClientOrigin&, StorageAreaBase* = nullptr);
enum class ShouldWriteOriginFile : bool { No, Yes };
Expand Down Expand Up @@ -251,6 +252,7 @@ class NetworkStorageManager final : public IPC::WorkQueueMessageReceiver, public
SuspendableWorkQueue& workQueue() WTF_RETURNS_CAPABILITY(m_queue.get()) { return m_queue; }
OriginQuotaManager::Parameters originQuotaManagerParameters(const WebCore::ClientOrigin&);
WebCore::IDBServer::UniqueIDBDatabaseTransaction* idbTransaction(const WebCore::IDBRequestData&);
void setStorageSiteValidationEnabledInternal(bool);

WeakPtr<NetworkProcess> m_process;
PAL::SessionID m_sessionID;
Expand Down Expand Up @@ -289,6 +291,7 @@ class NetworkStorageManager final : public IPC::WorkQueueMessageReceiver, public
#endif
std::unique_ptr<ServiceWorkerStorageManager> m_sharedServiceWorkerStorageManager WTF_GUARDED_BY_CAPABILITY(workQueue());
HashMap<WebCore::ClientOrigin, WallTime> m_lastModificationTimes WTF_GUARDED_BY_CAPABILITY(workQueue());
bool m_storageSiteValidationEnabled WTF_GUARDED_BY_CAPABILITY(workQueue()) { false };
};

} // namespace WebKit
10 changes: 10 additions & 0 deletions Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,16 @@ - (void)_setPrivateClickMeasurementDebugModeEnabled:(BOOL)enabled
_websiteDataStore->setPrivateClickMeasurementDebugMode(enabled);
}

- (BOOL)_storageSiteValidationEnabled
{
return _websiteDataStore->storageSiteValidationEnabled();
}

- (void)_setStorageSiteValidationEnabled:(BOOL)enabled
{
_websiteDataStore->setStorageSiteValidationEnabled(enabled);
}

- (NSUInteger)_perOriginStorageQuota
{
return 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ typedef NS_ENUM(uint8_t, _WKRestrictedOpenerType) {
@property (nonatomic, setter=_setAllowsCellularAccess:) BOOL _allowsCellularAccess WK_API_DEPRECATED_WITH_REPLACEMENT("_WKWebsiteDataStoreConfiguration.allowsCellularAccess", macos(10.13.4, 10.15.4), ios(11.3, 13.4));
@property (nonatomic, setter=_setProxyConfiguration:) NSDictionary *_proxyConfiguration WK_API_DEPRECATED_WITH_REPLACEMENT("_WKWebsiteDataStoreConfiguration.proxyConfiguration", macos(10.14, 10.15.4), ios(12.0, 13.4));
@property (nonatomic, setter=_setAllowsTLSFallback:) BOOL _allowsTLSFallback WK_API_AVAILABLE(macos(10.15), ios(13.0));
@property (nonatomic, setter=_setStorageSiteValidationEnabled:) BOOL _storageSiteValidationEnabled WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));

- (void)_setResourceLoadStatisticsTimeAdvanceForTesting:(NSTimeInterval)time completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(13.3), ios(16.4));
- (void)_setResourceLoadStatisticsTestingCallback:(nullable void (^)(WKWebsiteDataStore *, NSString *))callback WK_API_AVAILABLE(macos(10.13), ios(11.0));
Expand Down
12 changes: 12 additions & 0 deletions Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1817,6 +1817,17 @@ void WebsiteDataStore::storePrivateClickMeasurement(const WebCore::PrivateClickM
protectedNetworkProcess()->send(Messages::NetworkProcess::StorePrivateClickMeasurement(sessionID(), privateClickMeasurement), 0);
}

void WebsiteDataStore::setStorageSiteValidationEnabled(bool enabled)
{
if (m_storageSiteValidationEnabled == enabled)
return;

m_storageSiteValidationEnabled = enabled;

if (RefPtr networkProcess = networkProcessIfExists())
networkProcess->send(Messages::NetworkProcess::SetStorageSiteValidationEnabled(sessionID(), m_storageSiteValidationEnabled), 0);
}

void WebsiteDataStore::closeDatabases(CompletionHandler<void()>&& completionHandler)
{
Ref callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler));
Expand Down Expand Up @@ -2005,6 +2016,7 @@ WebsiteDataStoreParameters WebsiteDataStore::parameters()
createHandleFromResolvedPathIfPossible(networkSessionParameters.serviceWorkerRegistrationDirectory, networkSessionParameters.serviceWorkerRegistrationDirectoryExtensionHandle);
networkSessionParameters.serviceWorkerProcessTerminationDelayEnabled = m_configuration->serviceWorkerProcessTerminationDelayEnabled();
networkSessionParameters.inspectionForServiceWorkersAllowed = m_inspectionForServiceWorkersAllowed;
networkSessionParameters.storageSiteValidationEnabled = m_storageSiteValidationEnabled;
#if ENABLE(DECLARATIVE_WEB_PUSH)
networkSessionParameters.isDeclarativeWebPushEnabled = m_configuration->isDeclarativeWebPushEnabled();
#endif
Expand Down
4 changes: 4 additions & 0 deletions Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ class WebsiteDataStore : public API::ObjectImpl<API::Object::Type::WebsiteDataSt
void setPrivateClickMeasurementDebugMode(bool);
void storePrivateClickMeasurement(const WebCore::PrivateClickMeasurement&);

bool storageSiteValidationEnabled() const { return m_storageSiteValidationEnabled; }
void setStorageSiteValidationEnabled(bool);

uint64_t perOriginStorageQuota() const { return m_configuration->perOriginStorageQuota(); }
std::optional<double> originQuotaRatio() { return m_configuration->originQuotaRatio(); }

Expand Down Expand Up @@ -607,6 +610,7 @@ class WebsiteDataStore : public API::ObjectImpl<API::Object::Type::WebsiteDataSt
#if HAVE(NW_PROXY_CONFIG)
std::optional<Vector<std::pair<Vector<uint8_t>, WTF::UUID>>> m_proxyConfigData;
#endif
bool m_storageSiteValidationEnabled { false };
};

}

0 comments on commit b9a4cb4

Please sign in to comment.