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"
37 using namespace KeychainCore
;
39 void KCEventNotifier::PostKeychainEvent(SecKeychainEvent whichEvent
, const Keychain
&keychain
, const Item
&kcItem
)
41 DLDbIdentifier dlDbIdentifier
;
42 PrimaryKey primaryKey
;
45 dlDbIdentifier
= keychain
->dLDbIdentifier();
48 primaryKey
= kcItem
->primaryKey();
50 PostKeychainEvent(whichEvent
, dlDbIdentifier
, primaryKey
);
54 void KCEventNotifier::PostKeychainEvent(SecKeychainEvent whichEvent
,
55 const DLDbIdentifier
&dlDbIdentifier
,
56 const PrimaryKey
&primaryKey
)
58 CFRef
<CFMutableDictionaryRef
> mutableDict(::CFDictionaryCreateMutable(kCFAllocatorDefault
,0,
59 &kCFTypeDictionaryKeyCallBacks
, &kCFTypeDictionaryValueCallBacks
));
60 KCThrowIfMemFail_(CFMutableDictionaryRef(mutableDict
));
62 SInt32 theEvent
= SInt32(whichEvent
);
63 CFRef
<CFNumberRef
> theEventData(CFNumberCreate(kCFAllocatorDefault
, kCFNumberSInt32Type
, &theEvent
));
64 KCThrowIfMemFail_(CFNumberRef(theEventData
));
65 CFDictionarySetValue(mutableDict
, kSecEventTypeKey
, theEventData
);
69 CFRef
<CFDictionaryRef
> dict(DLDbListCFPref::dlDbIdentifierToCFDictionaryRef(dlDbIdentifier
));
70 KCThrowIfMemFail_(CFDictionaryRef(dict
));
71 CFDictionarySetValue(mutableDict
, kSecEventKeychainKey
, dict
);
76 CFRef
<CFDataRef
> data(CFDataCreate(kCFAllocatorDefault
, primaryKey
->Data
, primaryKey
->Length
));
77 KCThrowIfMemFail_(CFDataRef(data
));
78 CFDictionarySetValue(mutableDict
, kSecEventItemKey
, data
);
81 // 'name' has to be globally unique (could be KCLockEvent, etc.)
82 // 'object' is just information or a context that can be used.
83 // 'userInfo' has info on event (i.e. which DL/DB(kc - see John's Dict), the event,
84 // item(cssmdbuniqueRec))
85 CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),
86 kSecEventNotificationName
, NULL
, mutableDict
, false);