]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_cdsa_plugin/lib/Database.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_cdsa_plugin / lib / Database.h
diff --git a/Security/libsecurity_cdsa_plugin/lib/Database.h b/Security/libsecurity_cdsa_plugin/lib/Database.h
new file mode 100644 (file)
index 0000000..a674243
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2000-2004,2011,2014 Apple Inc. All Rights Reserved.
+ * 
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please obtain
+ * a copy of the License at http://www.apple.com/publicsource and read it before
+ * using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
+ * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
+ * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
+ * specific language governing rights and limitations under the License.
+ */
+
+
+#ifndef _DATABASE_H_
+#define _DATABASE_H_  1
+
+#include <security_cdsa_utilities/cssmacl.h>
+#include <security_utilities/threading.h>
+#include <security_cdsa_utilities/cssmdb.h>
+#include <list>
+#include <map>
+#include <set>
+
+
+// @@@ Should not use using in headers.
+using namespace std;
+
+namespace Security
+{
+
+class Database;
+class DatabaseFactory;
+class DatabaseSession;
+class DbContext;
+
+/* DatabaseManager class.  */
+class DatabaseManager
+{
+       NOCOPY(DatabaseManager)
+public:
+    DatabaseManager ();
+    virtual ~DatabaseManager ();
+
+    // Create and return a new DbContext instance which is owned by us and must be discared by calling dbClose.
+    virtual DbContext &dbOpen(DatabaseSession &inDatabaseSession,
+                              const DbName &inDbName,
+                              CSSM_DB_ACCESS_TYPE inAccessRequest,
+                              const AccessCredentials *inAccessCred,
+                              const void *inOpenParameters);
+    virtual DbContext &dbCreate(DatabaseSession &inDatabaseSession,
+                                const DbName &inDbName,
+                                const CSSM_DBINFO &inDBInfo,
+                                CSSM_DB_ACCESS_TYPE inAccessRequest,
+                                const CSSM_RESOURCE_CONTROL_CONTEXT *inCredAndAclEntry,
+                                const void *inOpenParameters);
+
+    // Delete a DbContext instance created by calling dbOpen or dbCreate.
+    virtual void dbClose(DbContext &inDbContext);
+
+    // Delete a database.
+    virtual void dbDelete(DatabaseSession &inDatabaseSession,
+                          const DbName &inDbName,
+                          const AccessCredentials *inAccessCred);
+
+    // List all available databases.
+    virtual CSSM_NAME_LIST_PTR getDbNames(DatabaseSession &inDatabaseSession);
+    virtual void freeNameList(DatabaseSession &inDatabaseSession,
+                              CSSM_NAME_LIST &inNameList);
+protected:
+    virtual void removeIfUnused(Database &inDatabase);
+    virtual Database *get (const DbName &inDbName); // Get existing instance or make a new one.
+    virtual Database *make (const DbName &inDbName) = 0; // Create a new database instance subclass must implement.
+private:
+    typedef map<DbName, Database *> DatabaseMap;
+    DatabaseMap mDatabaseMap;
+    Mutex mDatabaseMapLock;
+};
+
+
+/* Database is an abstract class.  Each Database subclass should implement all the
+   pure virtual methods listed below.  The constructor for a particular Database
+   subclass should create the Database object.  A subsequent call to dBOpen or
+   dBCreate should be is made.  This returns a DbContext.  All other methods take
+   a DbContext as an argument.
+ */
+class Database
+{
+public:
+    virtual void
+    dbCreate (DbContext &inDbContext, const CSSM_DBINFO &inDBInfo,
+              const CSSM_ACL_ENTRY_INPUT *inInitialAclEntry) = 0;
+
+    // Don't override this method in subclasses.
+    virtual DbContext &
+    _dbCreate(DatabaseSession &inDatabaseSession,
+             const CSSM_DBINFO &inDBInfo,
+             CSSM_DB_ACCESS_TYPE inAccessRequest,
+             const CSSM_RESOURCE_CONTROL_CONTEXT *inCredAndAclEntry,
+             const void *inOpenParameters);
+
+    virtual void
+    dbOpen (DbContext &inDbContext) = 0;
+
+    // Don't override this method in subclasses.
+    virtual DbContext &
+    _dbOpen (DatabaseSession &inDatabaseSession,
+            CSSM_DB_ACCESS_TYPE inAccessRequest,
+            const AccessCredentials *inAccessCred,
+            const void *inOpenParameters);
+
+    virtual void
+    dbClose () = 0;
+
+    // Don't override this method in subclasses.
+    virtual void
+    _dbClose (DbContext &dbContext);
+
+    virtual void
+    dbDelete(DatabaseSession &inDatabaseSession,
+             const AccessCredentials *inAccessCred) = 0;
+
+    virtual void
+    createRelation (DbContext &dbContext,
+                    CSSM_DB_RECORDTYPE inRelationID,
+                    const char *inRelationName,
+                    uint32 inNumberOfAttributes,
+                    const CSSM_DB_SCHEMA_ATTRIBUTE_INFO *inAttributeInfo,
+                    uint32 inNumberOfIndexes,
+                    const CSSM_DB_SCHEMA_INDEX_INFO &inIndexInfo) = 0;
+
+    virtual void
+    destroyRelation (DbContext &dbContext,
+                     CSSM_DB_RECORDTYPE inRelationID) = 0;
+
+    virtual void
+    authenticate(DbContext &dbContext,
+                 CSSM_DB_ACCESS_TYPE inAccessRequest,
+                 const AccessCredentials &inAccessCred) = 0;
+
+    virtual void
+    getDbAcl(DbContext &dbContext,
+             const CSSM_STRING *inSelectionTag,
+             uint32 &outNumberOfAclInfos,
+             CSSM_ACL_ENTRY_INFO_PTR &outAclInfos) = 0;
+
+    virtual void
+    changeDbAcl(DbContext &dbContext,
+                const AccessCredentials &inAccessCred,
+                const CSSM_ACL_EDIT &inAclEdit) = 0;
+
+    virtual void
+    getDbOwner(DbContext &dbContext, CSSM_ACL_OWNER_PROTOTYPE &outOwner) = 0;
+
+    virtual void
+    changeDbOwner(DbContext &dbContext,
+                  const AccessCredentials &inAccessCred,
+                  const CSSM_ACL_OWNER_PROTOTYPE &inNewOwner) = 0;
+
+    virtual char *
+    getDbNameFromHandle (const DbContext &dbContext) const = 0;
+
+    virtual CSSM_DB_UNIQUE_RECORD_PTR
+    dataInsert (DbContext &dbContext,
+                CSSM_DB_RECORDTYPE RecordType,
+                const CSSM_DB_RECORD_ATTRIBUTE_DATA *inAttributes,
+                const CssmData *inData) = 0;
+
+    virtual void
+    dataDelete (DbContext &dbContext,
+                const CSSM_DB_UNIQUE_RECORD &inUniqueRecordIdentifier) = 0;
+
+    virtual void
+    dataModify (DbContext &dbContext,
+                CSSM_DB_RECORDTYPE RecordType,
+                CSSM_DB_UNIQUE_RECORD &inoutUniqueRecordIdentifier,
+                const CSSM_DB_RECORD_ATTRIBUTE_DATA *inAttributesToBeModified,
+                const CssmData *inDataToBeModified,
+                CSSM_DB_MODIFY_MODE ModifyMode) = 0;
+
+    virtual CSSM_HANDLE
+    dataGetFirst (DbContext &dbContext,
+                  const CssmQuery *inQuery,
+                  CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
+                  CssmData *inoutData,
+                  CSSM_DB_UNIQUE_RECORD_PTR &outUniqueRecord) = 0;
+
+    virtual bool
+    dataGetNext (DbContext &dbContext,
+                 CSSM_HANDLE inResultsHandle,
+                 CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
+                 CssmData *inoutData,
+                 CSSM_DB_UNIQUE_RECORD_PTR &outUniqueRecord) = 0;
+
+    virtual void
+    dataAbortQuery (DbContext &dbContext,
+                    CSSM_HANDLE inResultsHandle) = 0;
+
+    virtual void
+    dataGetFromUniqueRecordId (DbContext &dbContext,
+                               const CSSM_DB_UNIQUE_RECORD &inUniqueRecord,
+                               CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
+                               CssmData *inoutData) = 0;
+
+    virtual void
+    freeUniqueRecord (DbContext &dbContext,
+                      CSSM_DB_UNIQUE_RECORD &inUniqueRecord) = 0;
+                                         
+       virtual void
+       passThrough(DbContext &dbContext,
+                               uint32 passThroughId,
+                               const void *inputParams,
+                               void **outputParams) = 0;
+
+    Database (const DbName &inDbName);
+    virtual ~Database ();
+
+    virtual bool hasDbContexts();
+
+    // XXX @@@ Think about consequences of race conditions between DbOpen/DbCreate/DbDelete/DbClose
+    // on databases with the same name at the same time. 
+    //virtual DbContext &insertDbContext();
+    //virtual void removeDbContext(DbContext &inDbContext);
+
+    const DbName mDbName;
+protected:
+    // Subclasses must implement this method.
+    virtual DbContext *makeDbContext(DatabaseSession &inDatabaseSession,
+                                     CSSM_DB_ACCESS_TYPE inAccessRequest,
+                                     const AccessCredentials *inAccessCred,
+                                     const void *inOpenParameters) = 0;
+private:
+    typedef set<DbContext *> DbContextSet;
+    DbContextSet mDbContextSet;
+    Mutex mDbContextSetLock;
+};
+
+} // end namespace Security
+
+#ifdef _CPP_DATABASE
+# pragma export off
+#endif
+
+#endif //_DATABASE_H_