]> git.saurik.com Git - apple/security.git/blame - cdsa/mds/MDSPrefs.cpp
Security-177.tar.gz
[apple/security.git] / cdsa / mds / MDSPrefs.cpp
CommitLineData
bac41a7b
A
1/*
2 * Copyright (c) 2000-2001 Apple Computer, 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// MDSPrefs.cpp
21//
22
23#include "MDSPrefs.h"
24#include <CoreFoundation/CFPreferences.h>
25#include <stdlib.h>
26
27// Construct the preferences object and read the current preference settings.
28
29MDSPrefs::MDSPrefs()
30 : mPluginFolders(NULL)
31{
32 if (!readPathFromPrefs() && !readPathFromEnv())
33 useDefaultPath();
34}
35
36// Destroy the preferences object.
37
38MDSPrefs::~MDSPrefs()
39{
40 if (mPluginFolders)
41 CFRelease(mPluginFolders);
42}
43
44// Obtain the plugin path from a preferences file. Returns true on success of false
45// if no prefs could be found.
46
47bool
48MDSPrefs::readPathFromPrefs()
49{
50 static const CFStringRef kPrefsSuite = CFSTR("com.apple.mds");
51 static const CFStringRef kPluginPathKey = CFSTR("securityPluginPath");
52
53 bool result = true;
54
55 CFPreferencesAddSuitePreferencesToApp(kCFPreferencesCurrentApplication, kPrefsSuite);
56
57 CFPropertyListRef value;
58 value = CFPreferencesCopyAppValue(kPluginPathKey, kCFPreferencesCurrentApplication);
59
60 if (CFGetTypeID(value) != CFArrayGetTypeID())
61 // the prefs object is not an array, so fail
62 result = false;
63
64 else {
65 // make sure that all array elements are strings
66
67 CFArrayRef array = (CFArrayRef) value;
68 int numItems = CFArrayGetCount(array);
69 for (int i = 0; i < numItems; i++)
70 if (CFGetTypeID(CFArrayGetValueAtIndex(array, i)) != CFStringGetTypeID()) {
71 result = false;
72 break;
73 }
74 }
75
76 if (result)
77 mPluginFolders = (CFArrayRef) value;
78 else
79 CFRelease(value);
80
81 return result;
82}
83
84bool
85MDSPrefs::readPathFromEnv()
86{
87 static const char *kPluginPathEnv = "MDSPATH";
88 static const CFStringRef kSeparator = CFSTR(":");
89
90 char *envValue = getenv(kPluginPathEnv);
91 if (envValue) {
92 CFStringRef path = CFStringCreateWithCString(NULL, envValue, kCFStringEncodingUTF8);
93
94 mPluginFolders = CFStringCreateArrayBySeparatingStrings(NULL, path, kSeparator);
95
96 CFRelease(path);
97 return true;
98 }
99
100 return false;
101}
102
103void
104MDSPrefs::useDefaultPath()
105{
106 static const CFStringRef kDefaultPluginPath = CFSTR("/System/Library/Security");
107
108 mPluginFolders = CFArrayCreate(NULL, (const void **) &kDefaultPluginPath, 1, &kCFTypeArrayCallBacks);
109}
110
111// Retrieve the elements of the plugin path.
112
113int
114MDSPrefs::getNumberOfPluginFolders() const
115{
116 if (mPluginFolders)
117 return CFArrayGetCount(mPluginFolders);
118
119 return 0;
120}
121
122const char *
123MDSPrefs::getPluginFolder(int index)
124{
125 if (mPluginFolders) {
126 int numValues = CFArrayGetCount(mPluginFolders);
127 if (index >= 0 && index < numValues) {
128 CFStringRef value = (CFStringRef) CFArrayGetValueAtIndex(mPluginFolders, index);
129 if (value) {
130 // we have to copy the string since it may be using a different native
131 // encoding than the one we want. the copy is put in a temporary buffer,
132 // so its lifetime is limited to the next call to getPluginFolder() or to
133 // the destruction of the MDSPrefs object. Very long paths will silently fail.
134
135 if (CFStringGetCString(value, mTempBuffer, kTempBufferSize, kCFStringEncodingUTF8))
136 return mTempBuffer;
137 }
138 }
139 }
140
141 return NULL;
142}
143