]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_mds/lib/MDSAttrParser.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_mds / lib / MDSAttrParser.h
diff --git a/Security/libsecurity_mds/lib/MDSAttrParser.h b/Security/libsecurity_mds/lib/MDSAttrParser.h
new file mode 100644 (file)
index 0000000..16174f6
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * 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:      MDSAttrParser.h
+
+   Contains:  Classes to parse XML plists and fill in MDS DBs with the
+              attributes found there.  
+
+   Copyright (c) 2001,2011,2014 Apple Inc. All Rights Reserved.
+*/
+
+#ifndef _MDS_ATTR_PARSER_H_
+#define _MDS_ATTR_PARSER_H_  1
+
+#include <Security/cssmtype.h>
+#include "MDSSession.h"
+#include "MDSDictionary.h"
+#include "MDSAttrStrings.h"
+#include <CoreFoundation/CoreFoundation.h>
+
+/*
+ * Hard-coded strings, which we attempt to keep to a minimum
+ */
+/* extension of a bundle's MDS files */
+#define MDS_INFO_TYPE                          "mdsinfo"
+
+/* key in an MDS info file determining whether it's for CSSM, plugin, or
+ * Plugin-specific MDS record type */
+#define MDS_INFO_FILE_TYPE                     "MdsFileType"
+
+/* Values for MDS_INFO_FILE_TYPE */
+#define MDS_INFO_FILE_TYPE_CSSM                "CSSM"
+#define MDS_INFO_FILE_TYPE_PLUGIN      "PluginCommon"
+#define MDS_INFO_FILE_TYPE_RECORD      "PluginSpecific"
+/* For MDS_INFO_FILE_TYPE_RECORD files, this key is used to find the 
+ * CSSM_DB_RECORDTYPE associated with the file's info. */
+#define MDS_INFO_FILE_RECORD_TYPE      "MdsRecordType"
+
+/* key for file description string, for debugging and documentation (since 
+ * PropertyListEditor does not support comments) */
+#define MDS_INFO_FILE_DESC                     "MdsFileDescription"
+
+
+namespace Security
+{
+
+/*
+ * The purpose of the MDSAttrParser class is to process a set of plist files
+ * in a specified bundle or framework, parsing them to create data which 
+ * is written to a pair of open DBs. Each plist file represents the bundle's
+ * entries for one or more MDS relations. Typically a bundle will have 
+ * multiple plist files. 
+ */
+
+/* base class for all parsers */
+class MDSAttrParser
+{
+public:
+       MDSAttrParser(
+               const char *bundlePath,
+               MDSSession &dl,
+               CSSM_DB_HANDLE objectHand,
+               CSSM_DB_HANDLE cdsaDirHand);
+       virtual ~MDSAttrParser();
+       
+       /* the bulk of the work */
+       void parseAttrs(CFStringRef subdir = NULL);
+       
+       /* parse a single file, by path URL -- throws on parse error */
+       void parseFile(CFURLRef theFileUrl, CFStringRef subdir = NULL);
+       
+       void setDefaults(const MDS_InstallDefaults *defaults) { mDefaults = defaults; }
+       
+       const char *guid()  { return mGuid; }
+       
+private:
+       void logFileError(
+               const char *op,
+               CFURLRef file,  
+               CFStringRef errStr,             // optional if you have it
+               SInt32 *errNo);                 // optional if you have it
+               
+       /*
+        * Parse a CSSM info file.
+        */
+       void parseCssmInfo(
+               MDSDictionary *theDict);
+               
+       /*
+        * Parse a Plugin Common info file.
+        */
+       void parsePluginCommon(
+               MDSDictionary *theDict);
+               
+       /*
+        * Parse a Plugin-specific file.
+        */
+       void parsePluginSpecific(
+               MDSDictionary *theDict);
+               
+       /*
+        * Given an open dictionary (representing a parsed XML file), create
+        * an MDS_OBJECT_RECORDTYPE record and add it to mObjectHand. This is
+        * used by both parseCssmInfo and parsePluginCommon.
+        */
+       void parseObjectRecord(
+               MDSDictionary *dict);
+               
+       /*
+        * Given an open dictionary and a RelationInfo defining a schema, fetch all
+        * attributes associated with the specified schema from the dictionary
+        * and write them to specified DB.
+        */
+       void parseMdsRecord(
+               MDSDictionary                           *mdsDict,
+               const RelationInfo                      *relInfo,
+               CSSM_DB_HANDLE                          dbHand);
+
+       /*
+        * Special case handlers for MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE and
+        * MDS_CDSADIR_TP_OIDS_RECORDTYPE.
+        */
+       void parseCspCapabilitiesRecord(
+               MDSDictionary                           *mdsDict);
+       void parseTpPolicyOidsRecord(
+               MDSDictionary                           *mdsDict);
+
+private:
+       /* could be Security.framework or a loadable bundle anywhere */
+       CFBundleRef             mBundle;
+       char                    *mPath;
+       
+       /* a DL session and two open DBs - one for object directory, one for 
+        * CDSA directory */
+       MDSSession              &mDl;
+       CSSM_DB_HANDLE  mObjectHand;
+       CSSM_DB_HANDLE  mCdsaDirHand;
+       
+       char                    *mGuid;         // should this be a CFStringRef instead?
+       
+       // Guid/SSID defaults
+       const MDS_InstallDefaults *mDefaults;
+};
+
+
+} // end namespace Security
+
+#endif /* _MDS_ATTR_PARSER_H_ */