]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_mds/lib/MDSDictionary.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_mds / lib / MDSDictionary.h
diff --git a/Security/libsecurity_mds/lib/MDSDictionary.h b/Security/libsecurity_mds/lib/MDSDictionary.h
new file mode 100644 (file)
index 0000000..2583952
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved.
+ * 
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please obtain
+ * a copy of the License at http://www.apple.com/publicsource and read it before
+ * using this file.
+ * 
+ * This 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.
+ */
+
+
+/*
+   File:      MDSDictionary.h
+
+   Contains:  Internal representation of one MDS info file.  
+
+   Copyright (c) 2001,2011,2014 Apple Inc. All Rights Reserved.
+*/
+
+#ifndef _MDS_DICTIONARY_H_
+#define _MDS_DICTIONARY_H_  1
+
+#include <Security/cssmtype.h>
+#include "MDSSession.h"
+#include "MDSAttrStrings.h"
+#include <CoreFoundation/CoreFoundation.h>
+
+namespace Security
+{
+
+class MDSDictionary
+{
+public:
+       /* heavyweight constructor from file */
+       MDSDictionary(
+               CFURLRef fileUrl,
+               CFStringRef subdir,
+               const char *fullPath);
+
+       /* lightweight constructor from existing CFDictionary */
+       MDSDictionary(
+               CFDictionaryRef theDict);
+       
+       ~MDSDictionary();
+       
+       /* 
+        * Lookup by either C string or CFStringRef. Optionally checks for
+        * CFTypeID of resulting value. Both return NULL on error (either key not
+        * found or wrong CFTypeID).
+        */
+       const void *lookup(
+               const char *key,
+               bool checkType = false,         // since we really don't know if 0 is a valid type
+               CFTypeID type = 0);
+       const void *lookup(
+               CFStringRef key,
+               bool checkType = false,
+               CFTypeID type = 0);
+       
+       /*
+        * Common means to perform a lookup in a dictionary given a C-string key and
+        * placing the value - if present - in a CSSM_DB_ATTRIBUTE_DATA. Any errors
+        * are only logged via MPDebug. Returns true if the value was found and 
+        * successfully placed in supplied CSSM_DB_ATTRIBUTE_DATA.
+        *
+        * For now we assume that the key in the dictionary is the same as the key
+        * in the DB to which we're writing. 
+        *
+        * A MDSNameValuePair array may be specified to facilitate conversion of 
+        * values which appears in the dictionary as strings but which are stored 
+        * in the DB as integers.
+        *
+        * We're also assuming that all DB keys are of format 
+        * CSSM_DB_ATTRIBUTE_NAME_AS_STRING.
+        */
+       bool lookupToDbAttr(
+               const char *key,
+               CSSM_DB_ATTRIBUTE_DATA &attr,
+               CSSM_DB_ATTRIBUTE_FORMAT attrFormat,
+               const MDSNameValuePair *nameValues = NULL);
+
+       /*
+        * Given a RelationInfo and an array of CSSM_DB_ATTRIBUTE_DATAs, fill in 
+        * the CSSM_DB_ATTRIBUTE_DATA array with as many fields as we can find in 
+        * the dictionary. All fields are treated as optional. 
+        */
+       void lookupAttributes(
+               const RelationInfo                      *relInfo,
+               CSSM_DB_ATTRIBUTE_DATA_PTR      outAttrs,               // filled in on return
+               uint32                                          &numAttrs);             // RETURNED
+               
+               CFDictionaryRef         dict()          { return mDict; }
+               const char                      *urlPath()      { return mUrlPath; }
+               const char                      *fileDesc() { return mFileDesc; }
+
+       /*
+        * Lookup with file-based indirection. Allows multiple mdsinfo file to share 
+        * commmon info from a separate plist file.
+        */
+       const CFPropertyListRef lookupWithIndirect(
+               const char *key,
+               CFBundleRef bundle,
+               CFTypeID        desiredType,
+               bool            &fetchedFromDisk);      // true --> caller must CFRelease the returned
+                                                                               //     value
+                                                                               // false -> it's part of this dictionary
+       
+       void setDefaults(const MDS_InstallDefaults *defaults);
+       
+private:
+       CFDictionaryRef         mDict;
+       bool                            mWeOwnDict;
+       char                            *mUrlPath;
+       char                            *mFileDesc;
+       CFStringRef                     mSubdir;
+       
+       // default GUID/SSID to apply to all records as needed
+       const MDS_InstallDefaults *mDefaults;
+};
+
+} // end namespace Security
+
+#endif /* _MDS_DICTIONARY_H_ */