1/*
2 * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19/*
20   File:      MDSAttrParser.h
21
22   Contains:  Classes to parse XML plists and fill in MDS DBs with the
23              attributes found there.
24
25   Copyright (c) 2001,2011,2014 Apple Inc. All Rights Reserved.
26*/
27
28#ifndef _MDS_ATTR_PARSER_H_
29#define _MDS_ATTR_PARSER_H_  1
30
31#include <Security/cssmtype.h>
32#include "MDSSession.h"
33#include "MDSDictionary.h"
34#include "MDSAttrStrings.h"
35#include <CoreFoundation/CoreFoundation.h>
36
37/*
38 * Hard-coded strings, which we attempt to keep to a minimum
39 */
40
41/* extension of a bundle's MDS files */
42#define MDS_INFO_TYPE				"mdsinfo"
43
44/* key in an MDS info file determining whether it's for CSSM, plugin, or
45 * Plugin-specific MDS record type */
46#define MDS_INFO_FILE_TYPE			"MdsFileType"
47
48/* Values for MDS_INFO_FILE_TYPE */
49#define MDS_INFO_FILE_TYPE_CSSM		"CSSM"
50#define MDS_INFO_FILE_TYPE_PLUGIN	"PluginCommon"
51#define MDS_INFO_FILE_TYPE_RECORD	"PluginSpecific"
52
53/* For MDS_INFO_FILE_TYPE_RECORD files, this key is used to find the
54 * CSSM_DB_RECORDTYPE associated with the file's info. */
55#define MDS_INFO_FILE_RECORD_TYPE	"MdsRecordType"
56
57/* key for file description string, for debugging and documentation (since
58 * PropertyListEditor does not support comments) */
59#define MDS_INFO_FILE_DESC			"MdsFileDescription"
60
61
62namespace Security
63{
64
65/*
66 * The purpose of the MDSAttrParser class is to process a set of plist files
67 * in a specified bundle or framework, parsing them to create data which
68 * is written to a pair of open DBs. Each plist file represents the bundle's
69 * entries for one or more MDS relations. Typically a bundle will have
70 * multiple plist files.
71 */
72
73/* base class for all parsers */
74class MDSAttrParser
75{
76public:
77	MDSAttrParser(
78		const char *bundlePath,
79		MDSSession &dl,
80		CSSM_DB_HANDLE objectHand,
81		CSSM_DB_HANDLE cdsaDirHand);
82	virtual ~MDSAttrParser();
83
84	/* the bulk of the work */
85	void parseAttrs(CFStringRef subdir = NULL);
86
87	/* parse a single file, by path URL -- throws on parse error */
88	void parseFile(CFURLRef theFileUrl, CFStringRef subdir = NULL);
89
90	void setDefaults(const MDS_InstallDefaults *defaults) { mDefaults = defaults; }
91
92	const char *guid()  { return mGuid; }
93
94private:
95	void logFileError(
96		const char *op,
97		CFURLRef file,
98		CFStringRef errStr,		// optional if you have it
99		SInt32 *errNo);			// optional if you have it
100
101	/*
102	 * Parse a CSSM info file.
103	 */
104	void parseCssmInfo(
105		MDSDictionary *theDict);
106
107	/*
108	 * Parse a Plugin Common info file.
109	 */
110	void parsePluginCommon(
111		MDSDictionary *theDict);
112
113	/*
114	 * Parse a Plugin-specific file.
115	 */
116	void parsePluginSpecific(
117		MDSDictionary *theDict);
118
119	/*
120	 * Given an open dictionary (representing a parsed XML file), create
121	 * an MDS_OBJECT_RECORDTYPE record and add it to mObjectHand. This is
122	 * used by both parseCssmInfo and parsePluginCommon.
123	 */
124	void parseObjectRecord(
125		MDSDictionary *dict);
126
127	/*
128	 * Given an open dictionary and a RelationInfo defining a schema, fetch all
129	 * attributes associated with the specified schema from the dictionary
130	 * and write them to specified DB.
131	 */
132	void parseMdsRecord(
133		MDSDictionary	 			*mdsDict,
134		const RelationInfo 			*relInfo,
135		CSSM_DB_HANDLE				dbHand);
136
137	/*
138	 * Special case handlers for MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE and
139	 * MDS_CDSADIR_TP_OIDS_RECORDTYPE.
140	 */
141	void parseCspCapabilitiesRecord(
142		MDSDictionary 				*mdsDict);
143	void parseTpPolicyOidsRecord(
144		MDSDictionary 				*mdsDict);
145
146private:
147	/* could be Security.framework or a loadable bundle anywhere */
148	CFBundleRef		mBundle;
149	char			*mPath;
150
151	/* a DL session and two open DBs - one for object directory, one for
152	 * CDSA directory */
153	MDSSession		&mDl;
154	CSSM_DB_HANDLE 	mObjectHand;
155	CSSM_DB_HANDLE 	mCdsaDirHand;
156
157	char 			*mGuid;		// should this be a CFStringRef instead?
158
159	// Guid/SSID defaults
160	const MDS_InstallDefaults *mDefaults;
161};
162
163
164} // end namespace Security
165
166#endif /* _MDS_ATTR_PARSER_H_ */
167