--- /dev/null
+/*
+ * 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 <security_cdsa_utilities/cssmbridge.h>
+#include <memory>
+#include <security_utilities/globalizer.h>
+#include <security_utilities/threading.h>
+
+#define MSApiDebug(args...) secdebug("MDS_API", ## args)
+
+/* Protects access to AppleDataBase */
+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)
+{
+ 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<MDSSession> aMDSSession (&HandleObject::findAndKill<MDSSession> (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<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)
+}
+
+
+//
+// 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<MDSSession>(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<MDSSession>(inMDSHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE).removeSubservice(guid, ssid);
+ END_API(MDS)
+}