/ OSX / libsecurity_mds / lib / MDSModule.cpp
MDSModule.cpp
  1  /*
  2   * Copyright (c) 2000-2001,2011,2013-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  #include "MDSModule.h"
 20  #include "MDSSession.h"
 21  #include <Security/mds_schema.h>
 22  #include <memory>
 23  
 24  namespace Security
 25  {
 26  
 27  ModuleNexus<MDSModule> MDSModule::mModuleNexus;
 28  
 29  // Names and IDs of tables used in the MDS databases
 30  
 31  #define TABLE(t) { t, #t }
 32  
 33  /*
 34   * For now, to allow compatibility with AppleFileDL, we use the same record IDs
 35   * it uses when constructing an AppleDatabaseManager. See Radar 2817921 for details. 
 36   * The fix requires that AppleDatabase be able to fetch its meta-table relationIDs 
 37   * from an existing DB at DbOpen time; I'm not sure that's possible. 
 38   */
 39  #define USE_FILE_DL_TABLES		1
 40  
 41  static const AppleDatabaseTableName kTableNames[] = {
 42      // the meta-tables. the parsing module is not used by MDS, but is required
 43      // by the implementation of the database
 44  	#if USE_FILE_DL_TABLES
 45      TABLE(CSSM_DL_DB_SCHEMA_INFO),
 46      TABLE(CSSM_DL_DB_SCHEMA_ATTRIBUTES),
 47      TABLE(CSSM_DL_DB_SCHEMA_INDEXES),
 48  	#else
 49      TABLE(MDS_CDSADIR_MDS_SCHEMA_RELATIONS),
 50      TABLE(MDS_CDSADIR_MDS_SCHEMA_ATTRIBUTES),
 51      TABLE(MDS_CDSADIR_MDS_SCHEMA_INDEXES),
 52  	#endif
 53      TABLE(CSSM_DL_DB_SCHEMA_PARSING_MODULE),
 54  	
 55      // the MDS-specific tables
 56      TABLE(MDS_OBJECT_RECORDTYPE),
 57      TABLE(MDS_CDSADIR_CSSM_RECORDTYPE),
 58      TABLE(MDS_CDSADIR_KRMM_RECORDTYPE),
 59      TABLE(MDS_CDSADIR_EMM_RECORDTYPE),
 60      TABLE(MDS_CDSADIR_COMMON_RECORDTYPE),
 61      TABLE(MDS_CDSADIR_CSP_PRIMARY_RECORDTYPE),
 62      TABLE(MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE),
 63      TABLE(MDS_CDSADIR_CSP_ENCAPSULATED_PRODUCT_RECORDTYPE),
 64      TABLE(MDS_CDSADIR_CSP_SC_INFO_RECORDTYPE),
 65      TABLE(MDS_CDSADIR_DL_PRIMARY_RECORDTYPE),
 66      TABLE(MDS_CDSADIR_DL_ENCAPSULATED_PRODUCT_RECORDTYPE),
 67      TABLE(MDS_CDSADIR_CL_PRIMARY_RECORDTYPE),
 68      TABLE(MDS_CDSADIR_CL_ENCAPSULATED_PRODUCT_RECORDTYPE),
 69      TABLE(MDS_CDSADIR_TP_PRIMARY_RECORDTYPE),
 70      TABLE(MDS_CDSADIR_TP_OIDS_RECORDTYPE),
 71      TABLE(MDS_CDSADIR_TP_ENCAPSULATED_PRODUCT_RECORDTYPE),
 72      TABLE(MDS_CDSADIR_EMM_PRIMARY_RECORDTYPE),
 73      TABLE(MDS_CDSADIR_AC_PRIMARY_RECORDTYPE),
 74      TABLE(MDS_CDSADIR_KR_PRIMARY_RECORDTYPE),
 75  	
 76      // marker for the end of the list
 77      { ~0U, NULL }
 78  };
 79  
 80  MDSModule &
 81  MDSModule::get ()
 82  {
 83      return mModuleNexus ();
 84  }
 85  
 86  MDSModule::MDSModule ()
 87      :	mDatabaseManager(kTableNames),
 88  	    mLastScanTime((time_t)0),
 89  		mServerMode(false)
 90  {
 91  	mDbPath[0] = '\0';
 92  }
 93  
 94  /*
 95   * Called upon unload or process death by CleanModuleNexus.
 96   */
 97  MDSModule::~MDSModule ()
 98  {
 99  	/* TBD - close all DBs */
100  }
101  
102  void MDSModule::lastScanIsNow()
103  {
104  	mLastScanTime = Time::now();
105  }
106  
107  double MDSModule::timeSinceLastScan()
108  {
109  	Time::Interval delta = Time::now() - mLastScanTime;
110  	return delta.seconds();
111  }
112  
113  void MDSModule::getDbPath(
114  	char *path)
115  {
116  	StLock<Mutex> _(mDbPathLock);
117  	strcpy(path, mDbPath);
118  }
119  
120  void MDSModule::setDbPath(const char *path)
121  {
122  	StLock<Mutex> _(mDbPathLock);
123  	/* caller assures this, and this is private to this module */
124  	assert(strlen(path) <= MAXPATHLEN);
125  	strcpy(mDbPath, path);
126  }
127  
128  void MDSModule::setServerMode()
129  {
130  	secinfo("MDSModule", "setting global server mode");
131  	mServerMode = true;
132  }
133  
134  } // end namespace Security