X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/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 index 00000000..16174f69 --- /dev/null +++ b/Security/libsecurity_mds/lib/MDSAttrParser.h @@ -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 +#include "MDSSession.h" +#include "MDSDictionary.h" +#include "MDSAttrStrings.h" +#include + +/* + * 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_ */