X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/72a12576750f52947eb043106ba5c12c0d07decf..b1ab9ed8d0e0f1c3b66d7daa8fd5564444c56195:/libsecurity_mds/lib/mdsapi.cpp diff --git a/libsecurity_mds/lib/mdsapi.cpp b/libsecurity_mds/lib/mdsapi.cpp new file mode 100644 index 00000000..5ca45339 --- /dev/null +++ b/libsecurity_mds/lib/mdsapi.cpp @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2000-2001 Apple Computer, 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. + */ + + +/* + + File: mds.h + + Contains: Module Directory Services Data Types and API. + + Copyright: (c) 1999 Apple Computer, Inc., all rights reserved. + + This is the C API wrapper for the C++ MDS implementation. Most of this file + could also be generated by the same perl script that generates the plugin + C wrapper code. + + */ + +#include "MDSSession.h" +#include "mdspriv.h" +#include +#include +#include +#include + +#define MSApiDebug(args...) secdebug("MDS_API", ## args) + +/* Protects access to AppleDataBase */ +ModuleNexus 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 _(adbMutex()); + if (!(Required(ResultsHandle) = HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + HandleObject::find(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 _(adbMutex()); + if (!HandleObject::find(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(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 _(adbMutex()); + HandleObject::find(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(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) +{ + BEGIN_API + Required (outDlFunctions); + Required (outMDSHandle) = (new MDSSession (Guid::optional(inCallerGuid), + Required(inMemoryFunctions)))->handle (); + *outDlFunctions = gMDSFunctionTable; + END_API(MDS) +} + +CSSM_RETURN CSSMAPI +MDS_Terminate (MDS_HANDLE inMDSHandle) +{ + BEGIN_API + auto_ptr aMDSSession (&HandleObject::findAndKill (inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE)); + aMDSSession->terminate (); // Even if terminate throws the MDSSession object will be deleted. + END_API(MDS) +} + +CSSM_RETURN CSSMAPI +MDS_Install (MDS_HANDLE inMDSHandle) +{ + BEGIN_API + HandleObject::find (inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).install (); + END_API(MDS) +} + +CSSM_RETURN CSSMAPI +MDS_Uninstall (MDS_HANDLE inMDSHandle) +{ + BEGIN_API + HandleObject::find (inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).uninstall (); + END_API(MDS) +} + + +// +// Private APIs for subsystem registration (called from securityd as root ONLY) +// +CSSM_RETURN CSSMAPI +MDS_InstallFile(MDS_HANDLE inMDSHandle, const MDS_InstallDefaults *defaults, + const char *bundlePath, const char *subdir, const char *file) // file(s) +{ + BEGIN_API + HandleObject::find(inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).installFile(defaults, bundlePath, subdir, file); + END_API(MDS) +} + + +// +// Remove +CSSM_RETURN CSSMAPI +MDS_RemoveSubservice(MDS_HANDLE inMDSHandle, const char *guid, uint32 ssid) +{ + BEGIN_API + HandleObject::find(inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).removeSubservice(guid, ssid); + END_API(MDS) +}