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// DatabaseSession.h - Framework for DL plugin modules
21//
22#ifndef _H_DATABASESESSION
23#define _H_DATABASESESSION
24
25#include <security_cdsa_plugin/DLabstractsession.h>
26
27#include <security_utilities/alloc.h>
28#include <security_utilities/threading.h>
29#include <Security/cssmtype.h>
30#include <map>
31
32namespace Security {
33
34class DatabaseManager;
35class DbContext;
36
37// A class providing some of the base Database (DL and MDS) functionality.
38class DatabaseSession: public DLAbstractPluginSession, public Allocator
39{
40public:
41    DatabaseSession(DatabaseManager &inDatabaseManager);
42    virtual ~DatabaseSession();
43
44    virtual void GetDbNames(CSSM_NAME_LIST_PTR &NameList);
45    virtual void FreeNameList(CSSM_NAME_LIST &NameList);
46    void DbDelete(const char *DbName,
47                  const CSSM_NET_ADDRESS *DbLocation,
48                  const AccessCredentials *AccessCred);
49    void DbCreate(const char *DbName,
50                  const CSSM_NET_ADDRESS *DbLocation,
51                  const CSSM_DBINFO &DBInfo,
52                  CSSM_DB_ACCESS_TYPE AccessRequest,
53                  const CSSM_RESOURCE_CONTROL_CONTEXT *CredAndAclEntry,
54                  const void *OpenParameters,
55                  CSSM_DB_HANDLE &DbHandle);
56    virtual void DbOpen(const char *DbName,
57                const CSSM_NET_ADDRESS *DbLocation,
58                CSSM_DB_ACCESS_TYPE AccessRequest,
59                const AccessCredentials *AccessCred,
60                const void *OpenParameters,
61                CSSM_DB_HANDLE &DbHandle);
62    void DbClose(CSSM_DB_HANDLE DBHandle);
63    void CreateRelation(CSSM_DB_HANDLE DBHandle,
64                        CSSM_DB_RECORDTYPE RelationID,
65                        const char *RelationName,
66                        uint32 NumberOfAttributes,
67                        const CSSM_DB_SCHEMA_ATTRIBUTE_INFO *pAttributeInfo,
68                        uint32 NumberOfIndexes,
69                        const CSSM_DB_SCHEMA_INDEX_INFO &pIndexInfo);
70    void DestroyRelation(CSSM_DB_HANDLE DBHandle,
71                         CSSM_DB_RECORDTYPE RelationID);
72
73    void Authenticate(CSSM_DB_HANDLE DBHandle,
74                      CSSM_DB_ACCESS_TYPE AccessRequest,
75                      const AccessCredentials &AccessCred);
76    void GetDbAcl(CSSM_DB_HANDLE DBHandle,
77                  const CSSM_STRING *SelectionTag,
78                  uint32 &NumberOfAclInfos,
79                  CSSM_ACL_ENTRY_INFO_PTR &AclInfos);
80    void ChangeDbAcl(CSSM_DB_HANDLE DBHandle,
81                     const AccessCredentials &AccessCred,
82                     const CSSM_ACL_EDIT &AclEdit);
83    void GetDbOwner(CSSM_DB_HANDLE DBHandle,
84                    CSSM_ACL_OWNER_PROTOTYPE &Owner);
85    void ChangeDbOwner(CSSM_DB_HANDLE DBHandle,
86                       const AccessCredentials &AccessCred,
87                       const CSSM_ACL_OWNER_PROTOTYPE &NewOwner);
88    void GetDbNameFromHandle(CSSM_DB_HANDLE DBHandle,
89                             char **DbName);
90    void DataInsert(CSSM_DB_HANDLE DBHandle,
91                    CSSM_DB_RECORDTYPE RecordType,
92                    const CSSM_DB_RECORD_ATTRIBUTE_DATA *Attributes,
93                    const CssmData *Data,
94                    CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
95    void DataDelete(CSSM_DB_HANDLE DBHandle,
96                    const CSSM_DB_UNIQUE_RECORD &UniqueRecordIdentifier);
97    void DataModify(CSSM_DB_HANDLE DBHandle,
98                    CSSM_DB_RECORDTYPE RecordType,
99                    CSSM_DB_UNIQUE_RECORD &UniqueRecordIdentifier,
100                    const CSSM_DB_RECORD_ATTRIBUTE_DATA *AttributesToBeModified,
101                    const CssmData *DataToBeModified,
102                    CSSM_DB_MODIFY_MODE ModifyMode);
103    CSSM_HANDLE DataGetFirst(CSSM_DB_HANDLE DBHandle,
104                             const CssmQuery *Query,
105                             CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
106                             CssmData *Data,
107                             CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
108    bool DataGetNext(CSSM_DB_HANDLE DBHandle,
109                     CSSM_HANDLE ResultsHandle,
110                     CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
111                     CssmData *Data,
112                     CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
113    void DataAbortQuery(CSSM_DB_HANDLE DBHandle,
114                        CSSM_HANDLE ResultsHandle);
115    void DataGetFromUniqueRecordId(CSSM_DB_HANDLE DBHandle,
116                                   const CSSM_DB_UNIQUE_RECORD &UniqueRecord,
117                                   CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
118                                   CssmData *Data);
119    void FreeUniqueRecord(CSSM_DB_HANDLE DBHandle,
120                          CSSM_DB_UNIQUE_RECORD &UniqueRecord);
121    void PassThrough(CSSM_DB_HANDLE DBHandle,
122                     uint32 PassThroughId,
123                     const void *InputParams,
124                     void **OutputParams);
125
126    DatabaseManager &mDatabaseManager;
127protected:
128    void closeAll();
129private:
130    CSSM_DB_HANDLE insertDbContext(DbContext &dbContext);
131    DbContext &findDbContext(CSSM_DB_HANDLE inDbHandle);
132
133    typedef std::map<CSSM_DB_HANDLE, DbContext *> DbContextMap;
134    DbContextMap mDbContextMap;
135    Mutex mDbContextMapLock;
136};
137
138} // end namespace Security
139
140#endif //_H_DATABASESESSION
141