/ OSX / libsecurity_keychain / lib / DLDBListCFPref.h
DLDBListCFPref.h
  1  /*
  2   * Copyright (c) 2000-2004,2011,2014 Apple Inc. All Rights Reserved.
  3   * 
  4   * @APPLE_LICENSE_HEADER_START@
  5   * 
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   * 
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   * 
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  
 25  /*
 26   *  DLDBListCFPref.h
 27   */
 28  #ifndef _SECURITY_DLDBLISTCFPREF_H_
 29  #define _SECURITY_DLDBLISTCFPREF_H_
 30  
 31  #include <Security/SecKeychain.h>
 32  #include <security_utilities/cfutilities.h>
 33  #include <CoreFoundation/CFDictionary.h>
 34  #include <security_cdsa_client/DLDBList.h>
 35  #include <security_cdsa_utilities/cssmdb.h>
 36  #include <stdexcept>
 37  #include <CoreFoundation/CFNumber.h>
 38  #include <CoreFoundation/CFDate.h>
 39  
 40  namespace Security
 41  {
 42  
 43  class PasswordDBLookup
 44  {
 45  protected:
 46      string mDirectory;
 47      string mName;
 48      bool mValid;
 49      uid_t mCurrent;
 50      time_t mTime;
 51  
 52  public:
 53      PasswordDBLookup ();
 54      
 55      void lookupInfoOnUID (uid_t uid);
 56      const string& getDirectory () {return mDirectory;}
 57      const string& getName () {return mName;}
 58  };
 59  
 60  class DLDbListCFPref
 61  {
 62  public:
 63      DLDbListCFPref(SecPreferencesDomain domain = kSecPreferencesDomainUser);
 64      ~DLDbListCFPref();
 65  	
 66  	void set(SecPreferencesDomain domain);
 67      
 68      void save();
 69      vector<DLDbIdentifier>& list() { return mSearchList; }
 70  
 71      static DLDbIdentifier makeDLDbIdentifier (const CSSM_GUID &guid, const CSSM_VERSION &version,
 72  											  uint32 subserviceId, CSSM_SERVICE_TYPE subserviceType,
 73  											  const char* dbName, CSSM_NET_ADDRESS *dbLocation);
 74  
 75  	static DLDbIdentifier cfDictionaryRefToDLDbIdentifier(CFDictionaryRef theDict);
 76      static CF_RETURNS_RETAINED CFDictionaryRef dlDbIdentifierToCFDictionaryRef(const DLDbIdentifier& dldbIdentifier);
 77  	bool revert(bool force);
 78  
 79  	void add(const DLDbIdentifier &);
 80  	void remove(const DLDbIdentifier &);
 81  	void rename(const DLDbIdentifier &oldId, const DLDbIdentifier &newId);
 82  	bool member(const DLDbIdentifier &);
 83  	const vector<DLDbIdentifier> &searchList();
 84  	void searchList(const vector<DLDbIdentifier> &);
 85  	void defaultDLDbIdentifier(const DLDbIdentifier &);
 86  	const DLDbIdentifier &defaultDLDbIdentifier();
 87  	void loginDLDbIdentifier(const DLDbIdentifier &);
 88  	const DLDbIdentifier &loginDLDbIdentifier();
 89  	void forceUserSearchListReread ();
 90  
 91      DLDbIdentifier LoginDLDbIdentifier();
 92      DLDbIdentifier JaguarLoginDLDbIdentifier();
 93  
 94      static string ExpandTildesInPath(const string &inPath);
 95  	static string StripPathStuff(const string &inPath);
 96      static string AbbreviatedPath(const string &inPath);
 97  
 98  protected:
 99  	SecPreferencesDomain mDomain;
100      bool hasChanged() const { return mChanged; }
101      void changed(bool hasChanged) { mChanged = hasChanged; }
102  
103  	enum PwInfoType
104  	{
105  		kHomeDir,
106  		kUsername
107  	};
108      
109      static PasswordDBLookup *mPdbLookup;
110  	static string getPwInfo(PwInfoType type);
111      static void clearPWInfo ();
112  
113      void resetCachedValues();
114  	bool loadPropertyList(bool force);
115  	void writePropertyList();
116  	int testAndFixPropertyList();
117  	
118  	enum ID_Direction
119  	{ 
120  		UNPRIV,
121  		PRIV
122  	};
123  	uid_t	savedEUID;
124  	gid_t	savedEGID;
125  	
126  	void changeIdentity(ID_Direction);
127  	
128  
129  private:
130  	CFAbsoluteTime mPrefsTimeStamp;
131  	struct timespec mTimespec;
132  	CFMutableDictionaryRef mPropertyList;
133  
134  	string mPrefsPath, mHomeDir, mUserName;
135  	vector<DLDbIdentifier> mSearchList;
136  	DLDbIdentifier mDefaultDLDbIdentifier;
137  	DLDbIdentifier mLoginDLDbIdentifier;
138      bool mChanged, mSearchListSet, mDefaultDLDbIdentifierSet, mLoginDLDbIdentifierSet;
139  };
140  
141  class CCFValue
142  {
143  public:
144      template <class T>
145      T cfref() const { return reinterpret_cast<T>(CFTypeRef(mRef)); }
146  
147  	CCFValue() {}
148  	CCFValue(CFTypeRef ref) : mRef(ref) {}
149  	CCFValue &operator =(CFTypeRef ref) { mRef = ref; return *this; }
150  
151      CCFValue &operator = (bool value)
152      {
153          mRef = value?kCFBooleanTrue:kCFBooleanFalse;
154          return *this;
155      }
156  
157  /*
158      CCFValue &operator = (const string &value) { string(value); return *this; }
159  
160      void string(const string &value, CFStringEncoding encoding=kCFStringEncodingMacRoman)
161      {
162          mRef = CFStringCreate();
163  CFStringRef CFStringCreateWithBytes(CFAllocatorRef alloc, const UInt8 *bytes, CFIndex numBytes, CFStringEncoding encoding, Boolean isExternalRepresentation);
164          if (!mRef) throw std::bad_alloc;
165          CFRelease(mRef);
166      }
167  */
168  
169      bool hasValue() const { return mRef; }
170  
171      operator bool() const
172      {
173          if (!mRef) return false;
174          if (::CFGetTypeID(mRef) != ::CFBooleanGetTypeID())
175              throw std::logic_error("wrong type in property list");
176  
177          return ::CFBooleanGetValue(cfref<CFBooleanRef>());
178      }
179  
180      operator sint32() const
181      {
182          if (!mRef) return 0;
183          if (::CFGetTypeID(mRef) != ::CFNumberGetTypeID())
184              throw std::logic_error("wrong type in property list");
185          
186          sint32 val;
187          ::CFNumberGetValue(cfref<CFNumberRef>(),kCFNumberSInt32Type,&val);
188          return val;
189      }
190  
191      operator uint32() const { return uint32(sint32(*this)); }
192  
193      operator const string() const { return getString(); }
194  
195      const string getString(CFStringEncoding encoding=kCFStringEncodingUTF8) const
196      {
197          if (!mRef)
198              throw std::logic_error("missing string in property list");
199          if (::CFGetTypeID(mRef) != ::CFStringGetTypeID())
200              throw std::logic_error("wrong type in property list");
201  
202          const char *tmpStr=::CFStringGetCStringPtr(cfref<CFStringRef>(),encoding);
203          if (tmpStr == NULL)
204          {
205              CFIndex maxLen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfref<CFStringRef>()), encoding);
206              auto_array<char> buffer(maxLen + 1);
207  
208              if (!::CFStringGetCString(cfref<CFStringRef>(),buffer.get(),maxLen + 1,encoding))
209                  throw std::logic_error("could not convert string from property list");
210  
211              tmpStr=buffer.get();
212              return string(tmpStr?tmpStr:"");
213          }
214          return string(tmpStr?tmpStr:"");
215      }
216  private:
217  	CFCopyRef<CFTypeRef>mRef;
218  };
219  
220  } // end namespace Security
221  
222  #endif /* !_SECURITY_DLDBLISTCFPREF_H_ */