WebMediaKeyStorageManager.cpp [plain text]
#include "config.h"
#include "WebMediaKeyStorageManager.h"
#include "WebProcessDataStoreParameters.h"
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SecurityOriginData.h>
#include <wtf/FileSystem.h>
#include <wtf/URL.h>
namespace WebKit {
using namespace WebCore;
void WebMediaKeyStorageManager::setWebsiteDataStore(const WebProcessDataStoreParameters& parameters)
{
m_mediaKeyStorageDirectory = parameters.mediaKeyStorageDirectory;
}
const char* WebMediaKeyStorageManager::supplementName()
{
return "WebMediaKeyStorageManager";
}
String WebMediaKeyStorageManager::mediaKeyStorageDirectoryForOrigin(const SecurityOriginData& originData)
{
if (!m_mediaKeyStorageDirectory)
return emptyString();
return FileSystem::pathByAppendingComponent(m_mediaKeyStorageDirectory, originData.databaseIdentifier());
}
Vector<SecurityOriginData> WebMediaKeyStorageManager::getMediaKeyOrigins()
{
Vector<SecurityOriginData> results;
if (m_mediaKeyStorageDirectory.isEmpty())
return results;
for (auto& originPath : FileSystem::listDirectory(m_mediaKeyStorageDirectory, "*")) {
auto identifier = URL::fileURLWithFileSystemPath(originPath).lastPathComponent().toString();
if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(identifier))
results.append(*securityOrigin);
}
return results;
}
static void removeAllMediaKeyStorageForOriginPath(const String& originPath, WallTime startDate, WallTime endDate)
{
Vector<String> mediaKeyPaths = FileSystem::listDirectory(originPath, "*");
for (const auto& mediaKeyPath : mediaKeyPaths) {
String mediaKeyFile = FileSystem::pathByAppendingComponent(mediaKeyPath, "SecureStop.plist");
if (!FileSystem::fileExists(mediaKeyFile))
continue;
auto modificationTime = FileSystem::getFileModificationTime(mediaKeyFile);
if (!modificationTime)
continue;
if (modificationTime.value() < startDate || modificationTime.value() > endDate)
continue;
FileSystem::deleteFile(mediaKeyFile);
FileSystem::deleteEmptyDirectory(mediaKeyPath);
}
FileSystem::deleteEmptyDirectory(originPath);
}
void WebMediaKeyStorageManager::deleteMediaKeyEntriesForOrigin(const SecurityOriginData& originData)
{
if (m_mediaKeyStorageDirectory.isEmpty())
return;
String originPath = mediaKeyStorageDirectoryForOrigin(originData);
removeAllMediaKeyStorageForOriginPath(originPath, -WallTime::infinity(), WallTime::infinity());
}
void WebMediaKeyStorageManager::deleteMediaKeyEntriesModifiedBetweenDates(WallTime startDate, WallTime endDate)
{
if (m_mediaKeyStorageDirectory.isEmpty())
return;
Vector<String> originPaths = FileSystem::listDirectory(m_mediaKeyStorageDirectory, "*");
for (auto& originPath : originPaths)
removeAllMediaKeyStorageForOriginPath(originPath, startDate, endDate);
}
void WebMediaKeyStorageManager::deleteAllMediaKeyEntries()
{
if (m_mediaKeyStorageDirectory.isEmpty())
return;
Vector<String> originPaths = FileSystem::listDirectory(m_mediaKeyStorageDirectory, "*");
for (auto& originPath : originPaths)
removeAllMediaKeyStorageForOriginPath(originPath, -WallTime::infinity(), WallTime::infinity());
}
}