WebMediaKeyStorageManager.cpp [plain text]
#include "config.h"
#include "WebMediaKeyStorageManager.h"
#include "WebProcessCreationParameters.h"
#include <WebCore/FileSystem.h>
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SecurityOriginData.h>
#include <WebCore/URL.h>
using namespace WebCore;
namespace WebKit {
void WebMediaKeyStorageManager::initialize(const WebProcessCreationParameters ¶meters)
{
ASSERT(!parameters.mediaKeyStorageDirectory.isEmpty());
m_mediaKeyStorageDirectory = parameters.mediaKeyStorageDirectory;
}
const char* WebMediaKeyStorageManager::supplementName()
{
return "WebMediaKeyStorageManager";
}
String WebMediaKeyStorageManager::mediaKeyStorageDirectoryForOrigin(const SecurityOriginData& originData)
{
if (!m_mediaKeyStorageDirectory)
return emptyString();
return pathByAppendingComponent(m_mediaKeyStorageDirectory, originData.databaseIdentifier());
}
Vector<SecurityOriginData> WebMediaKeyStorageManager::getMediaKeyOrigins()
{
Vector<SecurityOriginData> results;
if (m_mediaKeyStorageDirectory.isEmpty())
return results;
Vector<String> originPaths = listDirectory(m_mediaKeyStorageDirectory, "*");
for (const auto& originPath : originPaths) {
URL url;
url.setProtocol(ASCIILiteral("file"));
url.setPath(originPath);
String mediaKeyIdentifier = url.lastPathComponent();
auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(mediaKeyIdentifier);
if (!securityOrigin)
continue;
results.append(*securityOrigin);
}
return results;
}
static void removeAllMediaKeyStorageForOriginPath(const String& originPath, double startDate, double endDate)
{
Vector<String> mediaKeyPaths = listDirectory(originPath, "*");
for (const auto& mediaKeyPath : mediaKeyPaths) {
String mediaKeyFile = pathByAppendingComponent(mediaKeyPath, "SecureStop.plist");
if (!fileExists(mediaKeyFile))
continue;
time_t modTime;
getFileModificationTime(mediaKeyFile, modTime);
if (modTime < startDate || modTime > endDate)
continue;
deleteFile(mediaKeyFile);
deleteEmptyDirectory(mediaKeyPath);
}
deleteEmptyDirectory(originPath);
}
void WebMediaKeyStorageManager::deleteMediaKeyEntriesForOrigin(const SecurityOriginData& originData)
{
if (m_mediaKeyStorageDirectory.isEmpty())
return;
String originPath = mediaKeyStorageDirectoryForOrigin(originData);
removeAllMediaKeyStorageForOriginPath(originPath, std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
}
void WebMediaKeyStorageManager::deleteMediaKeyEntriesModifiedBetweenDates(double startDate, double endDate)
{
if (m_mediaKeyStorageDirectory.isEmpty())
return;
Vector<String> originPaths = listDirectory(m_mediaKeyStorageDirectory, "*");
for (auto& originPath : originPaths)
removeAllMediaKeyStorageForOriginPath(originPath, startDate, endDate);
}
void WebMediaKeyStorageManager::deleteAllMediaKeyEntries()
{
if (m_mediaKeyStorageDirectory.isEmpty())
return;
Vector<String> originPaths = listDirectory(m_mediaKeyStorageDirectory, "*");
for (auto& originPath : originPaths)
removeAllMediaKeyStorageForOriginPath(originPath, std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
}
}