#include "MDSSession.h"
#include "mdspriv.h"
#include <security_cdsa_utilities/cssmbridge.h>
#include <memory>
#include <security_utilities/globalizer.h>
#include <security_utilities/threading.h>
#define MSApiDebug(args...) secinfo("MDS_API", ## args)
ModuleNexus<Mutex> adbMutex;
using namespace std;
static CSSM_RETURN CSSMAPI mds_DataGetFirst(CSSM_DL_DB_HANDLE DLDBHandle,
const CSSM_QUERY *Query,
CSSM_HANDLE_PTR ResultsHandle,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
CSSM_DATA_PTR Data,
CSSM_DB_UNIQUE_RECORD_PTR *UniqueId)
{
BEGIN_API
MSApiDebug("mds_DataGetFirst");
StLock<Mutex> _(adbMutex());
if (!(Required(ResultsHandle) = HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataGetFirst(DLDBHandle.DBHandle,
CssmQuery::optional(Query),
Attributes,
CssmData::optional(Data),
Required(UniqueId))))
return CSSMERR_DL_ENDOFDATA;
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DataModify(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_DB_RECORDTYPE RecordType,
CSSM_DB_UNIQUE_RECORD_PTR UniqueRecordIdentifier,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *AttributesToBeModified,
const CSSM_DATA *DataToBeModified,
CSSM_DB_MODIFY_MODE ModifyMode)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataModify(DLDBHandle.DBHandle,
RecordType,
Required(UniqueRecordIdentifier),
AttributesToBeModified,
CssmData::optional(DataToBeModified),
ModifyMode);
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_GetDbNameFromHandle(CSSM_DL_DB_HANDLE DLDBHandle,
char **DbName)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).GetDbNameFromHandle(DLDBHandle.DBHandle,
DbName);
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DataAbortQuery(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_HANDLE ResultsHandle)
{
BEGIN_API
MSApiDebug("mds_DataAbortQuery");
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataAbortQuery(DLDBHandle.DBHandle,
ResultsHandle);
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DestroyRelation(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_DB_RECORDTYPE RelationID)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DestroyRelation(DLDBHandle.DBHandle,
RelationID);
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DataDelete(CSSM_DL_DB_HANDLE DLDBHandle,
const CSSM_DB_UNIQUE_RECORD *UniqueRecordIdentifier)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataDelete(DLDBHandle.DBHandle,
Required(UniqueRecordIdentifier));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DataInsert(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_DB_RECORDTYPE RecordType,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *Attributes,
const CSSM_DATA *Data,
CSSM_DB_UNIQUE_RECORD_PTR *UniqueId)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataInsert(DLDBHandle.DBHandle,
RecordType,
Attributes,
CssmData::optional(Data),
Required(UniqueId));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DataGetFromUniqueRecordId(CSSM_DL_DB_HANDLE DLDBHandle,
const CSSM_DB_UNIQUE_RECORD *UniqueRecord,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
CSSM_DATA_PTR Data)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataGetFromUniqueRecordId(DLDBHandle.DBHandle,
Required(UniqueRecord),
Attributes,
CssmData::optional(Data));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_CreateRelation(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_DB_RECORDTYPE RelationID,
const char *RelationName,
uint32 NumberOfAttributes,
const CSSM_DB_SCHEMA_ATTRIBUTE_INFO *pAttributeInfo,
uint32 NumberOfIndexes,
const CSSM_DB_SCHEMA_INDEX_INFO *pIndexInfo)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).CreateRelation(DLDBHandle.DBHandle,
RelationID,
RelationName,
NumberOfAttributes,
pAttributeInfo,
NumberOfIndexes,
Required(pIndexInfo));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_FreeUniqueRecord(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_DB_UNIQUE_RECORD_PTR UniqueRecord)
{
BEGIN_API
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).FreeUniqueRecord(DLDBHandle.DBHandle,
Required(UniqueRecord));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DbOpen(CSSM_DL_HANDLE DLHandle,
const char *DbName,
const CSSM_NET_ADDRESS *DbLocation,
CSSM_DB_ACCESS_TYPE AccessRequest,
const CSSM_ACCESS_CREDENTIALS *AccessCred,
const void *OpenParameters,
CSSM_DB_HANDLE *DbHandle)
{
BEGIN_API
MSApiDebug("mds_DbOpen %s", DbName);
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DbOpen(DbName,
DbLocation,
AccessRequest,
AccessCredentials::optional(AccessCred),
OpenParameters,
Required(DbHandle));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DataGetNext(CSSM_DL_DB_HANDLE DLDBHandle,
CSSM_HANDLE ResultsHandle,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
CSSM_DATA_PTR Data,
CSSM_DB_UNIQUE_RECORD_PTR *UniqueId)
{
BEGIN_API
MSApiDebug("mds_DataGetNext");
StLock<Mutex> _(adbMutex());
if (!HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DataGetNext(DLDBHandle.DBHandle,
ResultsHandle,
Attributes,
CssmData::optional(Data),
Required(UniqueId)))
return CSSMERR_DL_ENDOFDATA;
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_GetDbNames(CSSM_DL_HANDLE DLHandle,
CSSM_NAME_LIST_PTR *NameList)
{
BEGIN_API
HandleObject::find<MDSSession>(DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).GetDbNames(Required(NameList));
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_DbClose(CSSM_DL_DB_HANDLE DLDBHandle)
{
BEGIN_API
MSApiDebug("mds_DbClose");
StLock<Mutex> _(adbMutex());
HandleObject::find<MDSSession>(DLDBHandle.DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).DbClose(DLDBHandle.DBHandle);
END_API(MDS)
}
static CSSM_RETURN CSSMAPI mds_FreeNameList(CSSM_DL_HANDLE DLHandle,
CSSM_NAME_LIST_PTR NameList)
{
BEGIN_API
HandleObject::find<MDSSession>(DLHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).FreeNameList(Required(NameList));
END_API(MDS)
}
static MDS_FUNCS gMDSFunctionTable =
{
mds_DbOpen,
mds_DbClose,
mds_GetDbNames,
mds_GetDbNameFromHandle,
mds_FreeNameList,
mds_DataInsert,
mds_DataDelete,
mds_DataModify,
mds_DataGetFirst,
mds_DataGetNext,
mds_DataAbortQuery,
mds_DataGetFromUniqueRecordId,
mds_FreeUniqueRecord,
mds_CreateRelation,
mds_DestroyRelation,
};
CSSM_RETURN CSSMAPI
MDS_Initialize (const CSSM_GUID *inCallerGuid,
const CSSM_MEMORY_FUNCS *inMemoryFunctions,
MDS_FUNCS_PTR outDlFunctions,
MDS_HANDLE *outMDSHandle)
{
#ifndef __clang_analyzer__
BEGIN_API
Required (outDlFunctions);
Required (outMDSHandle) = (new MDSSession (Guid::optional(inCallerGuid),
Required(inMemoryFunctions)))->handle ();
*outDlFunctions = gMDSFunctionTable;
END_API(MDS)
#endif
}
CSSM_RETURN CSSMAPI
MDS_Terminate (MDS_HANDLE inMDSHandle)
{
BEGIN_API
auto_ptr<MDSSession> aMDSSession (&HandleObject::findAndKill<MDSSession> (inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE));
aMDSSession->terminate (); END_API(MDS)
}
CSSM_RETURN CSSMAPI
MDS_Install (MDS_HANDLE inMDSHandle)
{
BEGIN_API
HandleObject::find<MDSSession> (inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).install ();
END_API(MDS)
}
CSSM_RETURN CSSMAPI
MDS_Uninstall (MDS_HANDLE inMDSHandle)
{
BEGIN_API
HandleObject::find<MDSSession> (inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).uninstall ();
END_API(MDS)
}
CSSM_RETURN CSSMAPI
MDS_InstallFile(MDS_HANDLE inMDSHandle, const MDS_InstallDefaults *defaults,
const char *bundlePath, const char *subdir, const char *file) {
BEGIN_API
HandleObject::find<MDSSession>(inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).installFile(defaults, bundlePath, subdir, file);
END_API(MDS)
}
CSSM_RETURN CSSMAPI
MDS_RemoveSubservice(MDS_HANDLE inMDSHandle, const char *guid, uint32 ssid)
{
BEGIN_API
HandleObject::find<MDSSession>(inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).removeSubservice(guid, ssid);
END_API(MDS)
}