InitDataRegistry.cpp [plain text]
#include "config.h"
#include "InitDataRegistry.h"
#if ENABLE(ENCRYPTED_MEDIA)
#include "NotImplemented.h"
#include "SharedBuffer.h"
#include "inspector/InspectorValues.h"
#include <wtf/NeverDestroyed.h>
#include <wtf/text/Base64.h>
using namespace Inspector;
namespace WebCore {
static Vector<Ref<SharedBuffer>> extractKeyIDsKeyids(const SharedBuffer& buffer)
{
String json { buffer.data(), buffer.size() };
RefPtr<InspectorValue> value;
if (!InspectorValue::parseJSON(json, value))
return { };
RefPtr<InspectorObject> object;
if (!value->asObject(object))
return { };
RefPtr<InspectorArray> kidsArray;
if (!object->getArray("kids", kidsArray))
return { };
Vector<Ref<SharedBuffer>> keyIDs;
for (auto& value : *kidsArray) {
String keyID;
if (!value->asString(keyID))
continue;
Vector<char> keyIDData;
if (!WTF::base64URLDecode(keyID, { keyIDData }))
continue;
Ref<SharedBuffer> keyIDBuffer = SharedBuffer::create(WTFMove(keyIDData));
keyIDs.append(WTFMove(keyIDBuffer));
}
return keyIDs;
}
static RefPtr<SharedBuffer> sanitizeKeyids(const SharedBuffer& buffer)
{
Vector<Ref<SharedBuffer>> keyIDBuffer = extractKeyIDsKeyids(buffer);
if (keyIDBuffer.isEmpty())
return nullptr;
auto object = InspectorObject::create();
auto kidsArray = InspectorArray::create();
for (auto& buffer : keyIDBuffer)
kidsArray->pushString(WTF::base64URLEncode(buffer->data(), buffer->size()));
object->setArray("kids", WTFMove(kidsArray));
CString jsonData = object->toJSONString().utf8();
return SharedBuffer::create(jsonData.data(), jsonData.length());
}
static RefPtr<SharedBuffer> sanitizeCenc(const SharedBuffer& buffer)
{
notImplemented();
return buffer.copy();
}
static Vector<Ref<SharedBuffer>> extractKeyIDsCenc(const SharedBuffer&)
{
notImplemented();
return { };
}
static RefPtr<SharedBuffer> sanitizeWebM(const SharedBuffer& buffer)
{
notImplemented();
return buffer.copy();
}
static Vector<Ref<SharedBuffer>> extractKeyIDsWebM(const SharedBuffer&)
{
notImplemented();
return { };
}
InitDataRegistry& InitDataRegistry::shared()
{
static NeverDestroyed<InitDataRegistry> registry;
return registry.get();
}
InitDataRegistry::InitDataRegistry()
{
registerInitDataType("keyids", { sanitizeKeyids, extractKeyIDsKeyids });
registerInitDataType("cenc", { sanitizeCenc, extractKeyIDsCenc });
registerInitDataType("webm", { sanitizeWebM, extractKeyIDsWebM });
}
InitDataRegistry::~InitDataRegistry() = default;
RefPtr<SharedBuffer> InitDataRegistry::sanitizeInitData(const AtomicString& initDataType, const SharedBuffer& buffer)
{
auto iter = m_types.find(initDataType);
if (iter == m_types.end() || !iter->value.sanitizeInitData)
return nullptr;
return iter->value.sanitizeInitData(buffer);
}
Vector<Ref<SharedBuffer>> InitDataRegistry::extractKeyIDs(const AtomicString& initDataType, const SharedBuffer& buffer)
{
auto iter = m_types.find(initDataType);
if (iter == m_types.end() || !iter->value.sanitizeInitData)
return { };
return iter->value.extractKeyIDs(buffer);
}
void InitDataRegistry::registerInitDataType(const AtomicString& initDataType, InitDataTypeCallbacks&& callbacks)
{
ASSERT(!m_types.contains(initDataType));
m_types.set(initDataType, WTFMove(callbacks));
}
}
#endif // ENABLE(ENCRYPTED_MEDIA)