KCEventNotifier.cpp [plain text]
#include "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;
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 (CssmAllocator::standard(), CssmAllocator::standard());
cs.postNotification (Listener::databaseNotifications, whichEvent, data);
secdebug("kcnotify", "KCEventNotifier::PostKeychainEvent posted event %u", (unsigned int) whichEvent);
free (data.data ());
}