KCEventNotifier.cpp [plain text]
#include <securityd_client/ssclient.h>
#include "KCEventNotifier.h"
#include "KCExceptions.h"
#include "Keychains.h"
using namespace KeychainCore;
void KCEventNotifier::PostKeychainEvent(SecKeychainEvent whichEvent, const Keychain &keychain, const Item &kcItem)
{
DLDbIdentifier dlDbIdentifier;
PrimaryKey primaryKey;
if (keychain)
dlDbIdentifier = keychain->dlDbIdentifier();
if (kcItem)
primaryKey = kcItem->primaryKey();
PostKeychainEvent(whichEvent, dlDbIdentifier, primaryKey);
}
void KCEventNotifier::PostKeychainEvent(SecKeychainEvent whichEvent,
const DLDbIdentifier &dlDbIdentifier,
const PrimaryKey &primaryKey)
{
NameValueDictionary nvd;
Endian<pid_t> thePid = getpid();
nvd.Insert (new NameValuePair (PID_KEY, CssmData (reinterpret_cast<void*>(&thePid), sizeof (pid_t))));
if (dlDbIdentifier)
{
NameValueDictionary::MakeNameValueDictionaryFromDLDbIdentifier (dlDbIdentifier, nvd);
}
CssmData* pKey = primaryKey;
if (primaryKey)
{
nvd.Insert (new NameValuePair (ITEM_KEY, *pKey));
}
CssmData data;
nvd.Export (data);
SecurityServer::ClientSession cs (Allocator::standard(), Allocator::standard());
cs.postNotification (SecurityServer::kNotificationDomainDatabase, whichEvent, data);
secdebug("kcnotify", "KCEventNotifier::PostKeychainEvent posted event %u", (unsigned int) whichEvent);
free (data.data ());
}