--- /dev/null
+/*
+ * 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_ */