2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 File: KCEventNotifier.cpp
22 Contains: OS X CF Notifier for Keychain Events
24 Written by: Craig Mortensen
26 Copyright: 2000 by Apple Computer, Inc., All rights reserved.
28 Change History (most recent first):
33 #include "KCEventNotifier.h"
34 #include "KCExceptions.h"
35 #include "Keychains.h"
36 #include <Security/cfutilities.h>
38 using namespace KeychainCore
;
40 void KCEventNotifier::PostKeychainEvent(SecKeychainEvent whichEvent
, const Keychain
&keychain
, const Item
&kcItem
)
42 DLDbIdentifier dlDbIdentifier
;
43 PrimaryKey primaryKey
;
46 dlDbIdentifier
= keychain
->dLDbIdentifier();
49 primaryKey
= kcItem
->primaryKey();
51 PostKeychainEvent(whichEvent
, dlDbIdentifier
, primaryKey
);
55 void KCEventNotifier::PostKeychainEvent(SecKeychainEvent whichEvent
,
56 const DLDbIdentifier
&dlDbIdentifier
,
57 const PrimaryKey
&primaryKey
)
59 CFRef
<CFMutableDictionaryRef
> mutableDict(::CFDictionaryCreateMutable(kCFAllocatorDefault
,0,
60 &kCFTypeDictionaryKeyCallBacks
, &kCFTypeDictionaryValueCallBacks
));
61 KCThrowIfMemFail_(CFMutableDictionaryRef(mutableDict
));
63 SInt32 theEvent
= SInt32(whichEvent
);
64 CFRef
<CFNumberRef
> theEventData(CFNumberCreate(kCFAllocatorDefault
, kCFNumberSInt32Type
, &theEvent
));
65 KCThrowIfMemFail_(CFNumberRef(theEventData
));
66 CFDictionarySetValue(mutableDict
, kSecEventTypeKey
, theEventData
);
68 pid_t thePid
= getpid();
69 CFRef
<CFNumberRef
> thePidData(CFNumberCreate(kCFAllocatorDefault
, kCFNumberSInt32Type
, &thePid
));
70 KCThrowIfMemFail_(CFNumberRef(thePidData
));
71 CFDictionarySetValue(mutableDict
, kSecEventPidKey
, thePidData
);
75 CFRef
<CFDictionaryRef
> dict(DLDbListCFPref::dlDbIdentifierToCFDictionaryRef(dlDbIdentifier
));
76 KCThrowIfMemFail_(CFDictionaryRef(dict
));
77 CFDictionarySetValue(mutableDict
, kSecEventKeychainKey
, dict
);
82 CFRef
<CFDataRef
> data(CFDataCreate(kCFAllocatorDefault
, primaryKey
->Data
, primaryKey
->Length
));
83 KCThrowIfMemFail_(CFDataRef(data
));
84 CFDictionarySetValue(mutableDict
, kSecEventItemKey
, data
);
88 // 'name' has to be globally unique (could be KCLockEvent, etc.)
89 // 'object' is just information or a context that can be used.
90 // 'userInfo' has info on event (i.e. which DL/DB(kc - see John's Dict), the event,
91 // item(cssmdbuniqueRec))
92 CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),
93 kSecEventNotificationName
, NULL
, mutableDict
, false);