+/*
+ * 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 <CoreFoundation/CFDictionary.h>
+#include <CoreFoundation/CFString.h>
+#include <security_utilities/utilities.h>
+#include <string>
+
+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_ */