1/*
2 * Copyright (c) 2004,2008,2011 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// SDDLSession.h - DL session for security server CSP/DL.
27//
28#ifndef _H_SDDLSESSION
29#define _H_SDDLSESSION
30
31#include <security_cdsa_plugin/DLsession.h>
32#include <security_cdsa_utilities/u32handleobject.h>
33#include <securityd_client/ssclient.h>
34
35class SDCSPDLPlugin;
36class SDCSPDLSession;
37
38class SDDLSession : public DLPluginSession
39{
40public:
41	SDCSPDLSession &mSDCSPDLSession;
42
43	SDDLSession(CSSM_MODULE_HANDLE handle,
44				SDCSPDLPlugin &plug,
45				const CSSM_VERSION &version,
46				uint32 subserviceId,
47				CSSM_SERVICE_TYPE subserviceType,
48				CSSM_ATTACH_FLAGS attachFlags,
49				const CSSM_UPCALLS &upcalls,
50				DatabaseManager &databaseManager,
51				SDCSPDLSession &ssCSPDLSession);
52	~SDDLSession();
53
54	SecurityServer::ClientSession &clientSession()
55	{ return mClientSession; }
56    void GetDbNames(CSSM_NAME_LIST_PTR &NameList);
57    void FreeNameList(CSSM_NAME_LIST &NameList);
58    void DbDelete(const char *DbName,
59                  const CSSM_NET_ADDRESS *DbLocation,
60                  const AccessCredentials *AccessCred);
61    void DbCreate(const char *DbName,
62                  const CSSM_NET_ADDRESS *DbLocation,
63                  const CSSM_DBINFO &DBInfo,
64                  CSSM_DB_ACCESS_TYPE AccessRequest,
65                  const CSSM_RESOURCE_CONTROL_CONTEXT *CredAndAclEntry,
66                  const void *OpenParameters,
67                  CSSM_DB_HANDLE &DbHandle);
68    void DbOpen(const char *DbName,
69                const CSSM_NET_ADDRESS *DbLocation,
70                CSSM_DB_ACCESS_TYPE AccessRequest,
71                const AccessCredentials *AccessCred,
72                const void *OpenParameters,
73                CSSM_DB_HANDLE &DbHandle);
74    void DbClose(CSSM_DB_HANDLE DBHandle);
75    void CreateRelation(CSSM_DB_HANDLE DBHandle,
76                        CSSM_DB_RECORDTYPE RelationID,
77                        const char *RelationName,
78                        uint32 NumberOfAttributes,
79                        const CSSM_DB_SCHEMA_ATTRIBUTE_INFO *pAttributeInfo,
80                        uint32 NumberOfIndexes,
81                        const CSSM_DB_SCHEMA_INDEX_INFO &pIndexInfo);
82    void DestroyRelation(CSSM_DB_HANDLE DBHandle,
83                         CSSM_DB_RECORDTYPE RelationID);
84
85    void Authenticate(CSSM_DB_HANDLE DBHandle,
86                      CSSM_DB_ACCESS_TYPE AccessRequest,
87                      const AccessCredentials &AccessCred);
88    void GetDbAcl(CSSM_DB_HANDLE DBHandle,
89                  const CSSM_STRING *SelectionTag,
90                  uint32 &NumberOfAclInfos,
91                  CSSM_ACL_ENTRY_INFO_PTR &AclInfos);
92    void ChangeDbAcl(CSSM_DB_HANDLE DBHandle,
93                     const AccessCredentials &AccessCred,
94                     const CSSM_ACL_EDIT &AclEdit);
95    void GetDbOwner(CSSM_DB_HANDLE DBHandle,
96                    CSSM_ACL_OWNER_PROTOTYPE &Owner);
97    void ChangeDbOwner(CSSM_DB_HANDLE DBHandle,
98                       const AccessCredentials &AccessCred,
99                       const CSSM_ACL_OWNER_PROTOTYPE &NewOwner);
100    void GetDbNameFromHandle(CSSM_DB_HANDLE DBHandle,
101                             char **DbName);
102    void DataInsert(CSSM_DB_HANDLE DBHandle,
103                    CSSM_DB_RECORDTYPE RecordType,
104                    const CSSM_DB_RECORD_ATTRIBUTE_DATA *Attributes,
105                    const CssmData *Data,
106                    CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
107    void DataDelete(CSSM_DB_HANDLE DBHandle,
108                    const CSSM_DB_UNIQUE_RECORD &UniqueRecordIdentifier);
109    void DataModify(CSSM_DB_HANDLE DBHandle,
110                    CSSM_DB_RECORDTYPE RecordType,
111                    CSSM_DB_UNIQUE_RECORD &UniqueRecordIdentifier,
112                    const CSSM_DB_RECORD_ATTRIBUTE_DATA *AttributesToBeModified,
113                    const CssmData *DataToBeModified,
114                    CSSM_DB_MODIFY_MODE ModifyMode);
115    CSSM_HANDLE DataGetFirst(CSSM_DB_HANDLE DBHandle,
116                             const CssmQuery *Query,
117                             CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
118                             CssmData *Data,
119                             CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
120    bool DataGetNext(CSSM_DB_HANDLE DBHandle,
121                     CSSM_HANDLE ResultsHandle,
122                     CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
123                     CssmData *Data,
124                     CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
125    void DataAbortQuery(CSSM_DB_HANDLE DBHandle,
126                        CSSM_HANDLE ResultsHandle);
127    void DataGetFromUniqueRecordId(CSSM_DB_HANDLE DBHandle,
128                                   const CSSM_DB_UNIQUE_RECORD &UniqueRecord,
129                                   CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
130                                   CssmData *Data);
131    void FreeUniqueRecord(CSSM_DB_HANDLE DBHandle,
132                          CSSM_DB_UNIQUE_RECORD &UniqueRecord);
133    void PassThrough(CSSM_DB_HANDLE DBHandle,
134                     uint32 PassThroughId,
135                     const void *InputParams,
136                     void **OutputParams);
137
138	Allocator &allocator() { return *static_cast<DatabaseSession *>(this); }
139
140protected:
141	void postGetRecord(SecurityServer::RecordHandle record, U32HandleObject::Handle resultsHandle,
142					   CSSM_DB_HANDLE db,
143					   CssmDbRecordAttributeData *pAttributes,
144					   CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
145					   CssmData *inoutData, SecurityServer::KeyHandle hKey);
146
147	CSSM_DB_UNIQUE_RECORD_PTR makeDbUniqueRecord(SecurityServer::RecordHandle recordHandle);
148	CSSM_HANDLE findDbUniqueRecord(const CSSM_DB_UNIQUE_RECORD &inUniqueRecord);
149	void freeDbUniqueRecord(CSSM_DB_UNIQUE_RECORD &inUniqueRecord);
150
151	SecurityServer::ClientSession mClientSession;
152    //SecurityServer::AttachmentHandle mAttachment;
153};
154
155
156#endif // _H_SDDLSESSION
157