SecItemShimProxy.cpp [plain text]
#include "config.h"
#include "SecItemShimProxy.h"
#if ENABLE(SEC_ITEM_SHIM)
#include "SecItemRequestData.h"
#include "SecItemResponseData.h"
#include "SecItemShimMessages.h"
#include "SecItemShimProxyMessages.h"
#include <Security/SecBase.h>
#include <Security/SecItem.h>
namespace WebKit {
SecItemShimProxy& SecItemShimProxy::shared()
{
static SecItemShimProxy* proxy;
static dispatch_once_t once;
dispatch_once(&once, ^{
proxy = adoptRef(new SecItemShimProxy).leakRef();
});
return *proxy;
}
SecItemShimProxy::SecItemShimProxy()
: m_queue(WorkQueue::create("com.apple.WebKit.SecItemShimProxy"))
{
}
void SecItemShimProxy::initializeConnection(IPC::Connection* connection)
{
connection->addWorkQueueMessageReceiver(Messages::SecItemShimProxy::messageReceiverName(), m_queue.get(), this);
}
void SecItemShimProxy::secItemRequest(IPC::Connection* connection, uint64_t requestID, const SecItemRequestData& request)
{
SecItemResponseData response;
switch (request.type()) {
case SecItemRequestData::Invalid:
LOG_ERROR("SecItemShimProxy::secItemRequest received an invalid data request. Please file a bug if you know how you caused this.");
response = SecItemResponseData(errSecParam, nullptr);
break;
case SecItemRequestData::CopyMatching: {
CFTypeRef resultObject = 0;
OSStatus resultCode = SecItemCopyMatching(request.query(), &resultObject);
response = SecItemResponseData(resultCode, adoptCF(resultObject).get());
break;
}
case SecItemRequestData::Add: {
CFTypeRef resultObject = 0;
OSStatus resultCode = SecItemAdd(request.query(), &resultObject);
response = SecItemResponseData(resultCode, adoptCF(resultObject).get());
break;
}
case SecItemRequestData::Update: {
OSStatus resultCode = SecItemUpdate(request.query(), request.attributesToMatch());
response = SecItemResponseData(resultCode, 0);
break;
}
case SecItemRequestData::Delete: {
OSStatus resultCode = SecItemDelete(request.query());
response = SecItemResponseData(resultCode, 0);
break;
}
}
connection->send(Messages::SecItemShim::SecItemResponse(requestID, response), 0);
}
}
#endif // ENABLE(SEC_ITEM_SHIM)