X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/libsecurity_utilities/lib/simpleprefs.h diff --git a/Security/libsecurity_utilities/lib/simpleprefs.h b/Security/libsecurity_utilities/lib/simpleprefs.h new file mode 100644 index 00000000..87d7f645 --- /dev/null +++ b/Security/libsecurity_utilities/lib/simpleprefs.h @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2002-2004,2011,2014 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * simpleprefs.h - plist support for a bare bones Preferences implementation, + * using only Darwin-avaialble CoreFoundation classes. + */ + +#ifndef _SECURITY_UTILITIES_SIMPLE_PREFS_H_ +#define _SECURITY_UTILITIES_SIMPLE_PREFS_H_ + +#include +#include +#include +#include + +namespace Security { + +/* + * PropertyList compatible CFDictionary, nonmutable. All keys are CFStringRefs; + * all values are CF objects. + */ +class Dictionary +{ + NOCOPY(Dictionary) + +public: + + /* create from preferences file */ + typedef enum { + US_User, + US_System + } UserOrSystem; + +protected: + /* make blank dictionary */ + Dictionary(); + + /* create from arbitrary file */ + Dictionary( + const char *path); + +public: + // factory functions for the dictionaries + static Dictionary* CreateDictionary(const char* path); + static Dictionary* CreateDictionary(const char* domain, UserOrSystem userSys, bool loose = false); + +public: + + /* create from existing CFDictionary */ + Dictionary( + CFDictionaryRef dict); + + virtual ~Dictionary(); + + /* basic lookup */ + const void *getValue( + CFStringRef key); + + /* lookup, value must be CFString (we check) */ + CFStringRef getStringValue( + CFStringRef key); + + /* lookup, value must be CFData (we check) */ + CFDataRef getDataValue( + CFStringRef key); + + /* lookup, value must be CFDictionary (we check) */ + CFDictionaryRef getDictValue( + CFStringRef key); + + /* + * Lookup, value is a dictionary, we return value as Dictionary + * if found, else return NULL. + */ + Dictionary *copyDictValue( + CFStringRef key); + + /* + * boolean lookup, tolerate many different forms of value. + * Default if value not present is false. + */ + bool getBoolValue( + CFStringRef key); + + /* basic CF level accessors */ + CFDictionaryRef dict() { return mDict; } + CFIndex count(); + +protected: + void setDict( + CFDictionaryRef newDict); + void initFromFile( + const char *path, + bool loose = false); + + /* this might be a CFMutableDictionary...use accessors for proper typing */ + CFDictionaryRef mDict; +}; + +/* + * PropertyList compatible CFDictionary, mutable. + */ +class MutableDictionary : public Dictionary +{ + NOCOPY(MutableDictionary) +public: + /* Create an empty mutable dictionary */ + MutableDictionary(); + +protected: + /* create from arbitrary file */ + MutableDictionary( + const char *filename); + +public: + + static MutableDictionary* CreateMutableDictionary(const char* fileName); + static MutableDictionary* CreateMutableDictionary(const char *domain, UserOrSystem userSys); + + /* + * Create from existing CFDictionary (OR CFMutableDictionary). + * I don't see anyway the CF runtime will let us differentiate an + * immutable from a mutable dictionary here, so caller has to tell us. + */ + MutableDictionary( + CFDictionaryRef dict, + bool isMutable); + + virtual ~MutableDictionary(); + + /* + * Lookup, value must be CFDictionary (we check). We return a + * mutable copy, or if key not found, we return a new mutable dictionary. + * If you want a NULL return if it's not there, use getDictValue(). + */ + CFMutableDictionaryRef getMutableDictValue( + CFStringRef key); + + /* + * Lookup, value is a dictionary, we return a MutableDictionary, even if + * no value found. + */ + MutableDictionary *copyMutableDictValue( + CFStringRef key); + + /* + * Basic setter. Does a "replace if present, add if not present" op. + */ + void setValue( + CFStringRef key, + CFTypeRef val); + + /* + * Set key/value pair, data as CFData in the dictionary but passed + * to us as CSSM_DATA. + */ + void setDataValue( + CFStringRef key, + const void *valData, + CFIndex valLength); + + /* remove key/value, if present; not an error if it's not */ + void removeValue( + CFStringRef key); + + /* write as XML property list, both return true on success */ + bool writePlistToFile( + const char *path); + + /* write XML property list to preferences file */ + bool writePlistToPrefs( + const char *domain, // e.g., com.apple.security + UserOrSystem userSys); // US_User : ~/Library/Preferences/domain.plist + // US_System: /Library/Preferences/domain.plist + + CFMutableDictionaryRef mutableDict() { return (CFMutableDictionaryRef)dict(); } + +private: + /* replace mDict with a mutable copy */ + void makeMutable(); +}; + +} /* end namespace Security */ + +#endif /* _SECURITY_UTILITIES_SIMPLE_PREFS_H_ */