- OSStatus status = _SessionSetUserPreferences(session);
- if (noErr == status) {
- CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter();
- // We've succeeded in setting up a static set of prefs, now set up
- CFNotificationCenterAddObserver(center, (void*)session, SessionUserPreferencesChanged, CFSTR("com.apple.Carbon.TISNotifySelectedKeyboardInputSourceChanged"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
- CFNotificationCenterAddObserver(center, (void*)session, SessionUserPreferencesChanged, CFSTR("com.apple.Carbon.TISNotifyEnabledKeyboardInputSourcesChanged"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
- }
- return status;
-}
-
-
-//
-// Modify Authorization rules
-//
-
-//
-// AuthorizationRightGet
-//
-OSStatus AuthorizationRightGet(const char *rightName, CFDictionaryRef *rightDefinition)
-{
- BEGIN_API;
- Required(rightName);
- CssmDataContainer definition(server().returnAllocator);
-
- server().authorizationdbGet(rightName, definition, server().returnAllocator);
- // convert rightDefinition to dictionary
-
- if (rightDefinition)
- {
- CFRef<CFDataRef> data(CFDataCreate(NULL, static_cast<UInt8 *>(definition.data()), definition.length()));
- if (!data)
- CssmError::throwMe(errAuthorizationInternal);
-
- CFRef<CFDictionaryRef> rightDict(static_cast<CFDictionaryRef>(CFPropertyListCreateFromXMLData(NULL, data, kCFPropertyListImmutable, NULL)));
- if (!rightDict
- || CFGetTypeID(rightDict) != CFDictionaryGetTypeID())
- CssmError::throwMe(errAuthorizationInternal);
-
- CFRetain(rightDict);
- *rightDefinition = rightDict;
- }
-
- END_API(CSSM);
-}
-
-//
-// AuthorizationRightSet
-//
-OSStatus AuthorizationRightSet(AuthorizationRef authRef,
- const char *rightName, CFTypeRef rightDefinition,
- CFStringRef descriptionKey, CFBundleRef bundle, CFStringRef tableName)
-{
- BEGIN_API;
- Required(rightName);
- AuthorizationBlob *auth = (AuthorizationBlob *)authRef;
-
- CFRef<CFMutableDictionaryRef> rightDefinitionDict;
- if (rightDefinition && (CFGetTypeID(rightDefinition) == CFStringGetTypeID()))
- {
- rightDefinitionDict = CFDictionaryCreateMutable(NULL, 10, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
- if (!rightDefinitionDict)
- CssmError::throwMe(errAuthorizationInternal);
- CFDictionarySetValue(rightDefinitionDict, CFSTR(kAuthorizationRightRule), rightDefinition);
- }
- else
- if (rightDefinition && (CFGetTypeID(rightDefinition) == CFDictionaryGetTypeID()))
- {
- rightDefinitionDict = CFDictionaryCreateMutableCopy(NULL, 0, static_cast<CFDictionaryRef>(rightDefinition));
- if (!rightDefinitionDict)
- CssmError::throwMe(errAuthorizationInternal);
- }
- else
- CssmError::throwMe(errAuthorizationDenied);
-
- if (rightDefinitionDict)
- CFRelease(rightDefinitionDict); // we just assigned things that were already retained
-
- if (descriptionKey)
- {
- CFRef<CFMutableDictionaryRef> localizedDescriptions(CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
-
- if (!localizedDescriptions)
- CssmError::throwMe(errAuthorizationInternal);
-
- // assigning to perform a retain on either
- CFRef<CFBundleRef> clientBundle; clientBundle = bundle ? bundle : CFBundleGetMainBundle();
-
- // looks like a list of CFStrings: English us_en etc.
- CFRef<CFArrayRef> localizations(CFBundleCopyBundleLocalizations(clientBundle));
-
- if (localizations)
- {
- // for every CFString in localizations do
- CFIndex locIndex, allLocs = CFArrayGetCount(localizations);
- for (locIndex = 0; locIndex < allLocs; locIndex++)
- {
- CFStringRef oneLocalization = static_cast<CFStringRef>(CFArrayGetValueAtIndex(localizations, locIndex));
-
- if (!oneLocalization)
- continue;
-
- // @@@ no way to get "Localized" and "strings" as constants?
- CFRef<CFURLRef> locURL(CFBundleCopyResourceURLForLocalization(clientBundle, tableName ? tableName : CFSTR("Localizable"), CFSTR("strings"), NULL /*subDirName*/, oneLocalization));
-
- if (!locURL)
- continue;
-
- CFDataRef tableData = NULL;
- SInt32 errCode;
- CFStringRef errStr;
- CFPropertyListRef stringTable;
-
- CFURLCreateDataAndPropertiesFromResource(CFGetAllocator(clientBundle), locURL, &tableData, NULL, NULL, &errCode);
-
- if (errCode)
- {
- if (NULL != tableData) {
- CFRelease(tableData);
- }
- continue;
- }
-
- stringTable = CFPropertyListCreateFromXMLData(CFGetAllocator(clientBundle), tableData, kCFPropertyListImmutable, &errStr);
- if (errStr != NULL) {
- CFRelease(errStr);
- errStr = NULL;
- }
- CFRelease(tableData);
-
- CFStringRef value = static_cast<CFStringRef>(CFDictionaryGetValue(static_cast<CFDictionaryRef>(stringTable), descriptionKey));
- if (value == NULL || CFEqual(value, CFSTR(""))) {
- CFRelease(stringTable);
- continue;
- } else {
- // oneLocalization/value into our dictionary
- CFDictionarySetValue(localizedDescriptions, oneLocalization, value);
- CFRelease(stringTable);
- }
- }
- }
-
- // add the description as the default localization into the dictionary
- CFDictionarySetValue(localizedDescriptions, CFSTR(""), descriptionKey);
-
- // stuff localization table into rule definition
- CFDictionarySetValue(rightDefinitionDict, CFSTR(kAuthorizationRuleParameterDefaultPrompt), localizedDescriptions);
-
- }
-
- // serialize cfdictionary with data into rightDefinitionXML
- CFRef<CFDataRef> rightDefinitionXML(CFPropertyListCreateXMLData(NULL, rightDefinitionDict));
-
- server().authorizationdbSet(Required(auth), rightName, CFDataGetLength(rightDefinitionXML), CFDataGetBytePtr(rightDefinitionXML));
-
- END_API(CSSM);
-}
-
-//
-// AuthorizationRightRemove
-//
-OSStatus AuthorizationRightRemove(AuthorizationRef authRef, const char *rightName)
-{
- BEGIN_API;
- Required(rightName);
- AuthorizationBlob *auth = (AuthorizationBlob *)authRef;
- server().authorizationdbRemove(Required(auth), rightName);
- END_API(CSSM);