extern "C" void CMIOInitPreferencesOnce() { // this code only executes once CACFArray keyArray( CFPreferencesCopyKeyList(CFSTR("com.apple.cmio"), kCFPreferencesCurrentUser, kCFPreferencesAnyHost), true ); if ( keyArray.GetCFArray() ) sCMIOPrefsCache = CFPreferencesCopyMultiple( keyArray.GetCFArray(), CFSTR("com.apple.cmio"), kCFPreferencesCurrentUser, kCFPreferencesAnyHost); #if !USE_DTRACE_LOGGING if ( sCMIOPrefsCache ) { CACFDictionary(sCMIOPrefsCache, false).GetBool(CFSTR("Debug"), sCMIODebug); } #endif }
void genOSXDomainPrefs(const CFStringRef& username, const CFStringRef& domain, bool current_host, QueryData& results) { const auto* user = (username != nullptr) ? &username : (isUserAdmin()) ? &kCFPreferencesAnyUser : &kCFPreferencesCurrentUser; const auto* host = (current_host) ? &kCFPreferencesCurrentHost : &kCFPreferencesAnyHost; auto keys = CFPreferencesCopyKeyList(domain, *user, *host); if (keys == nullptr) { return; } auto values = CFPreferencesCopyMultiple(keys, domain, *user, *host); if (values == nullptr) { CFRelease(keys); return; } std::string username_string; if (username != nullptr) { username_string = stringFromCFString(username); } // Iterate over each preference domain's preference name. for (CFIndex j = 0; j < CFArrayGetCount(keys); ++j) { Row r; r["username"] = username_string; r["host"] = (current_host) ? "current" : "any"; r["domain"] = stringFromCFString(domain); auto key = static_cast<CFStringRef>(CFArrayGetValueAtIndex(keys, j)); if (CFStringGetTypeID() != CFGetTypeID(key)) { continue; } // Interesting results/behavior from Microsoft products. r["key"] = stringFromCFString(key); if (r.at("key").find('>') != std::string::npos || r.at("key").find('<') != std::string::npos || r.at("key").size() == 0) { continue; } // Check if the preference key is managed by a profile. auto forced = CFPreferencesAppValueIsForced(key, domain); r["forced"] = (forced) ? '1' : '0'; CFTypeRef value = nullptr; if (forced) { value = static_cast<CFTypeRef>(CFPreferencesCopyAppValue(key, domain)); } else { // Check the key and key type (which may be any CF type). value = static_cast<CFTypeRef>(CFDictionaryGetValue(values, key)); } genOSXPrefValues(value, r, results, 0); if (forced) { CFRelease(value); } } CFRelease(values); CFRelease(keys); }