2  * Copyright (c) 2011-2013 Apple Inc. All Rights Reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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 
  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. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  26 #include "SecAssessment.h" 
  27 #include <security_utilities/globalizer.h> 
  28 #include <security_utilities/hashing.h> 
  29 #include <security_utilities/sqlite++.h> 
  30 #include <CoreFoundation/CoreFoundation.h> 
  33 namespace CodeSigning 
{ 
  36 namespace SQLite 
= SQLite3
; 
  39 static const char defaultDatabase
[] = "/var/db/SystemPolicy"; 
  40 static const char visibleSecurityFlagFile
[] = "/var/db/.sp_visible"; /* old duchess/emir style configration */ 
  41 static const char prefsFile
[] = "/var/db/SystemPolicy-prefs.plist"; 
  42 static const char lastRejectFile
[] = "/var/db/.LastGKReject"; 
  43 static const char lastApprovedFile
[] = "/var/db/.LastGKApp"; 
  44 static const char rearmTimerFile
[] = "/var/db/.GKRearmTimer"; 
  46 static const char gkeAuthFile
[] = "/var/db/gke.auth"; 
  47 static const char gkeSigsFile
[] = "/var/db/gke.sigs"; 
  48 static const unsigned int gkeCheckInterval 
= 60;        // seconds 
  52 // We use Julian dates in the database, because SQLite understands them well and they convert easily to/from CFAbsoluteTime 
  54 static const double never 
= 5000000;    // canonical "never" julian date (an arbitrary point in the year 8977) 
  55 static const double julianBase 
= 2451910.5;     // julian date of CFAbsoluteTime epoch 
  57 static inline double dateToJulian(CFDateRef time
) 
  58 { return CFDateGetAbsoluteTime(time
) / 86400.0 + julianBase
; } 
  60 static inline CFDateRef 
julianToDate(double julian
) 
  61 { return CFDateCreate(NULL
, (julian 
- julianBase
) * 86400); } 
  64 typedef SHA1::SDigest ObjectHash
; 
  67 typedef uint AuthorityType
; 
  69         kAuthorityInvalid 
= 0,                          // not a valid authority type 
  70         kAuthorityExecute 
= 1,                          // authorizes launch and execution 
  71         kAuthorityInstall 
= 2,                          // authorizes installation 
  72         kAuthorityOpenDoc 
= 3,                          // authorizes opening of documents 
  77 // Defined flags for authority flags column 
  80         kAuthorityFlagVirtual 
= 0x0001, // virtual rule (anchoring object records) 
  81         kAuthorityFlagDefault 
= 0x0002, // rule is part of the original default set 
  82         kAuthorityFlagInhibitCache 
= 0x0004, // never cache outcome of this rule 
  83         kAuthorityFlagWhitelist 
= 0x1000,       // whitelist override 
  84         kAuthorityFlagWhitelistV2 
= 0x2000, // apply "deep" signature to this record 
  89 // Mapping/translation to/from API space 
  91 AuthorityType 
typeFor(CFDictionaryRef context
, AuthorityType type 
= kAuthorityInvalid
); 
  92 CFStringRef 
typeNameFor(AuthorityType type
) 
  97 // An open policy database. 
  98 // Usually read-only, but can be opened for write by privileged callers. 
  99 // This is a translucent wrapper around SQLite::Database; the caller 
 100 // is expected to work with statement rows. 
 102 class PolicyDatabase 
: public SQLite::Database 
{ 
 104         PolicyDatabase(const char *path 
= NULL
, int flags 
= SQLITE_OPEN_READONLY
); 
 105         virtual ~PolicyDatabase(); 
 108         bool checkCache(CFURLRef path
, AuthorityType type
, SecAssessmentFlags flags
, CFMutableDictionaryRef result
); 
 111         void purgeAuthority(); 
 113         void purgeObjects(double priority
);// 
 115         void upgradeDatabase(); 
 116         std::string 
featureLevel(const char *feature
); 
 117         bool hasFeature(const char *feature
) { return !featureLevel(feature
).empty(); } 
 118         void addFeature(const char *feature
, const char *value
, const char *remarks
); 
 119         void simpleFeature(const char *feature
, const char *sql
); 
 120         void simpleFeature(const char *feature
, void (^perform
)()); 
 122         void installExplicitSet(const char *auth
, const char *sigs
); 
 125         time_t mLastExplicitCheck
; 
 130 // Check the system-wide overriding flag file 
 132 bool overrideAssessment(SecAssessmentFlags flags 
= 0); 
 133 void setAssessment(bool masterSwitch
); 
 137 // Reset or query the automatic rearm timer 
 139 void resetRearmTimer(const char *event
); 
 140 bool queryRearmTimer(CFTimeInterval 
&delta
); 
 142 } // end namespace CodeSigning 
 143 } // end namespace Security