From ec0decd2f62ebfb95491ebbeeea513aa212d6f4e Mon Sep 17 00:00:00 2001 From: tangjunyuan Date: Mon, 9 Feb 2026 16:13:28 +0800 Subject: [PATCH] optimization ipc callback Signed-off-by: tangjunyuan --- frameworks/inc/ipc_sdk_defines.h | 8 +- frameworks/inc/lite/ipc_adapt.h | 20 +- frameworks/inc/lite/ipc_callback_proxy.h | 2 +- frameworks/inc/lite/ipc_dev_auth_stub.h | 2 +- frameworks/inc/standard/ipc_adapt.h | 28 +- frameworks/inc/standard/ipc_callback_proxy.h | 4 +- frameworks/inc/standard/ipc_callback_stub.h | 4 +- frameworks/inc/standard/ipc_dev_auth_stub.h | 2 +- frameworks/inc/standard/ipc_iface.h | 4 +- .../sa_load_on_demand/inc/sa_load_on_demand.h | 8 - .../src/mock/sa_load_on_demand_mock.cpp | 18 - .../src/sa_load_on_demand.cpp | 238 +--- frameworks/src/identity_service_ipc_sdk.c | 19 +- frameworks/src/ipc_sdk.c | 82 +- frameworks/src/ipc_service_common.c | 97 +- frameworks/src/lite/ipc_adapt.c | 938 +++++++++----- frameworks/src/lite/ipc_callback_proxy.c | 3 +- frameworks/src/lite/ipc_callback_stub.c | 13 +- frameworks/src/lite/ipc_dev_auth_stub.c | 4 +- frameworks/src/standard/ipc_adapt.cpp | 1131 +++++++++++------ .../src/standard/ipc_callback_proxy.cpp | 3 +- frameworks/src/standard/ipc_callback_stub.cpp | 13 +- frameworks/src/standard/ipc_dev_auth_stub.cpp | 4 +- interfaces/inner_api/device_auth_defines.h | 1 + .../devauthinterface_fuzzer.cpp | 8 +- .../authdevice_fuzzer/authdevice_fuzzer.cpp | 2 + .../processauthdata_fuzzer.cpp | 2 + .../addmember_fuzzer/addmember_fuzzer.cpp | 2 + .../creategroup_fuzzer/creategroup_fuzzer.cpp | 2 + .../deletegroup_fuzzer/deletegroup_fuzzer.cpp | 2 + .../deletemember_fuzzer.cpp | 2 + .../saloadondemand_fuzzer.cpp | 177 +-- .../source/deviceauth_interface_test.cpp | 10 +- .../deviceauth/source/ipc_adapt_test.cpp | 132 +- 34 files changed, 1649 insertions(+), 1336 deletions(-) diff --git a/frameworks/inc/ipc_sdk_defines.h b/frameworks/inc/ipc_sdk_defines.h index 54086a96..c3133ab4 100644 --- a/frameworks/inc/ipc_sdk_defines.h +++ b/frameworks/inc/ipc_sdk_defines.h @@ -38,6 +38,10 @@ typedef struct { SaStatusChangeCallbackFunc onReceivedSaRemoved; } SaStatusChangeCallback; +typedef int32_t (*RegCallbackFunc)(const char *appId, const DeviceAuthCallback *callback, bool needCache); +typedef int32_t (*RegDataChangeListenerFunc)(const char *appId, const DataChangeListener *listener, bool needCache); +typedef int32_t (*RegCredChangeListenerFunc)(const char *appId, CredChangeListener *listener, bool needCache); + #define IPC_CALL_BACK_STUB_AUTH_ID 0 #define IPC_CALL_BACK_STUB_BIND_ID 1 #define IPC_CALL_BACK_STUB_DIRECT_AUTH_ID 2 @@ -47,10 +51,6 @@ typedef struct { #define IPC_CALL_CONTEXT_INIT 0x0 -#define DEVAUTH_CALLBACK 1 -#define GROUP_CHANGE_LISTENER 2 -#define CRED_CHANGE_LISTENER 3 - /* params type for ipc call */ #define PARAM_TYPE_APPID 1 #define PARAM_TYPE_DEV_AUTH_CB 2 diff --git a/frameworks/inc/lite/ipc_adapt.h b/frameworks/inc/lite/ipc_adapt.h index 998cba4b..6c238ddb 100755 --- a/frameworks/inc/lite/ipc_adapt.h +++ b/frameworks/inc/lite/ipc_adapt.h @@ -56,6 +56,11 @@ enum { CB_ID_ON_DEV_UNTRUSTED, CB_ID_ON_LAST_GROUP_DELETED, CB_ID_ON_TRUST_DEV_NUM_CHANGED, + CB_ID_ON_TRANS_TMP, + CB_ID_SESS_KEY_DONE_TMP, + CB_ID_ON_FINISH_TMP, + CB_ID_ON_ERROR_TMP, + CB_ID_ON_REQUEST_TMP, }; typedef int32_t (*IpcServiceCall)(const IpcDataInfo *, int32_t, uintptr_t); @@ -79,14 +84,13 @@ int32_t InitIpcCallBackList(void); void DeInitIpcCallBackList(void); void InitDeviceAuthCbCtx(DeviceAuthCallback *ctx, int32_t type); void InitDevAuthListenerCbCtx(DataChangeListener *ctx); -int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t cbSz, int32_t type); +int32_t AddIpcCallBackByAppId(const char *appId, int32_t type); void DelIpcCallBackByAppId(const char *appId, int32_t type); -int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, int32_t type); +int32_t AddIpcCallBackByReqId(int64_t reqId, int32_t type); void DelIpcCallBackByReqId(int64_t reqId, int32_t type, bool withLock); int32_t DecodeIpcData(uintptr_t data, int32_t *type, uint8_t **val, int32_t *valSz); -void ProcCbHook(int32_t callbackId, uintptr_t cbHook, - const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx); +void ProcCbHook(int32_t callbackId, const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx); int32_t GetIpcRequestParamByType(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t type, uint8_t *paramCache, int32_t *cacheLen); @@ -116,6 +120,14 @@ int32_t GetAndValSizeCbParam(const IpcDataInfo *ipcParams, int32_t GetAndValNullParam(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t paramType, uint8_t *param, int32_t *paramSize); +int32_t InitSdkIpcCallBackList(void); +void DeInitSdkIpcCallBackList(void); +int32_t AddSdkCallBackByAppId(const char *appId, uint8_t cbType, uint8_t *val, int32_t valSize); +void RemoveSdkCallBackByAppId(const char *appId, uint8_t cbType); +int32_t AddSdkCallBackByRequestId(int64_t requestId, uint8_t cbType, uint8_t *val, int32_t valSize); +void RemoveSdkCallBackByRequestId(int64_t requestId, uint8_t cbType); +int32_t AddRequestIdByAppId(const char *appId, int64_t requestId); + #ifdef __cplusplus } #endif diff --git a/frameworks/inc/lite/ipc_callback_proxy.h b/frameworks/inc/lite/ipc_callback_proxy.h index 905e1e60..b65cc293 100755 --- a/frameworks/inc/lite/ipc_callback_proxy.h +++ b/frameworks/inc/lite/ipc_callback_proxy.h @@ -24,7 +24,7 @@ extern "C" { #endif -void CbProxySendRequest(SvcIdentity sid, int32_t callbackId, uintptr_t cbHook, IpcIo *data, IpcIo *reply); +void CbProxySendRequest(SvcIdentity sid, int32_t callbackId, IpcIo *data, IpcIo *reply); #ifdef __cplusplus } diff --git a/frameworks/inc/lite/ipc_dev_auth_stub.h b/frameworks/inc/lite/ipc_dev_auth_stub.h index d472a04c..b97744b3 100755 --- a/frameworks/inc/lite/ipc_dev_auth_stub.h +++ b/frameworks/inc/lite/ipc_dev_auth_stub.h @@ -40,7 +40,7 @@ int32_t SetCallMap(IpcServiceCall method, int32_t methodId); int32_t SetRemoteObject(const SvcIdentity *object); void AddCbDeathRecipient(int32_t cbStubIdx, int32_t cbDataIdx); void ResetRemoteObject(int32_t idx); -void ActCallback(int32_t objIdx, int32_t callbackId, uintptr_t cbHook, IpcIo *dataParcel, IpcIo *reply); +void ActCallback(int32_t objIdx, int32_t callbackId, IpcIo *dataParcel, IpcIo *reply); int32_t OnRemoteInvoke(IServerProxy *iProxy, int32_t reqId, void *origin, IpcIo *req, IpcIo *reply); #ifdef __cplusplus diff --git a/frameworks/inc/standard/ipc_adapt.h b/frameworks/inc/standard/ipc_adapt.h index 546f2760..aa409d01 100755 --- a/frameworks/inc/standard/ipc_adapt.h +++ b/frameworks/inc/standard/ipc_adapt.h @@ -18,6 +18,7 @@ #include #include "device_auth.h" +#include "ipc_sdk_defines.h" #ifdef __cplusplus extern "C" { @@ -53,6 +54,16 @@ enum { CB_ID_ON_CRED_ADD, CB_ID_ON_CRED_DELETE, CB_ID_ON_CRED_UPDATE, + CB_ID_ON_TRANS_TMP, + CB_ID_SESS_KEY_DONE_TMP, + CB_ID_ON_FINISH_TMP, + CB_ID_ON_ERROR_TMP, + CB_ID_ON_REQUEST_TMP, + CB_ID_ON_TRANS_CRED, + CB_ID_SESS_KEY_DONE_CRED, + CB_ID_ON_FINISH_CRED, + CB_ID_ON_ERROR_CRED, + CB_ID_ON_REQUEST_CRED, }; typedef int32_t (*IpcServiceCall)(const IpcDataInfo *, int32_t, uintptr_t); @@ -76,14 +87,13 @@ int32_t InitIpcCallBackList(void); void DeInitIpcCallBackList(void); void InitDeviceAuthCbCtx(DeviceAuthCallback *ctx, int32_t type); void InitDevAuthListenerCbCtx(DataChangeListener *ctx); -int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t cbSz, int32_t type); +int32_t AddIpcCallBackByAppId(const char *appId, int32_t type); void DelIpcCallBackByAppId(const char *appId, int32_t type); -int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, int32_t type); +int32_t AddIpcCallBackByReqId(int64_t reqId, int32_t type); void DelIpcCallBackByReqId(int64_t reqId, int32_t type, bool withLock); int32_t DecodeIpcData(uintptr_t data, int32_t *type, uint8_t **val, int32_t *valSz); -void ProcCbHook(int32_t callbackId, uintptr_t cbHook, - const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx); +void ProcCbHook(int32_t callbackId, const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx); int32_t GetIpcRequestParamByType(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t type, uint8_t *paramCache, int32_t *cacheLen); @@ -110,6 +120,16 @@ int32_t GetAndValSizeCbParam(const IpcDataInfo *ipcParams, int32_t GetAndValNullParam(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t paramType, uint8_t *param, int32_t *paramSize); +int32_t InitSdkIpcCallBackList(void); +void DeInitSdkIpcCallBackList(void); +int32_t AddSdkCallBackByAppId(const char *appId, uint8_t cbType, uint8_t *val, int32_t valSize); +void RemoveSdkCallBackByAppId(const char *appId, uint8_t cbType); +int32_t AddSdkCallBackByRequestId(int64_t requestId, uint8_t cbType, uint8_t *val, int32_t valSize); +void RemoveSdkCallBackByRequestId(int64_t requestId, uint8_t cbType); +int32_t AddRequestIdByAppId(const char *appId, int64_t requestId); +void RegisterSdkCallBack(RegCallbackFunc regCallbackFunc, RegDataChangeListenerFunc regDataChangeListenerFunc, + RegCredChangeListenerFunc regCredChangeListenerFunc); + #ifdef __cplusplus } #endif diff --git a/frameworks/inc/standard/ipc_callback_proxy.h b/frameworks/inc/standard/ipc_callback_proxy.h index 456133b2..84efd7c9 100755 --- a/frameworks/inc/standard/ipc_callback_proxy.h +++ b/frameworks/inc/standard/ipc_callback_proxy.h @@ -24,8 +24,8 @@ class ProxyDevAuthCb : public IRemoteProxy { public: explicit ProxyDevAuthCb(const sptr &impl); ~ProxyDevAuthCb(); - void DoCallBack(int32_t callbackId, uintptr_t cbHook, - MessageParcel &dataParcel, MessageParcel &reply, MessageOption &option) override; + void DoCallBack(int32_t callbackId, MessageParcel &dataParcel, MessageParcel &reply, + MessageOption &option) override; private: static inline BrokerDelegator delegator_; }; diff --git a/frameworks/inc/standard/ipc_callback_stub.h b/frameworks/inc/standard/ipc_callback_stub.h index 294f98aa..e2b5040a 100755 --- a/frameworks/inc/standard/ipc_callback_stub.h +++ b/frameworks/inc/standard/ipc_callback_stub.h @@ -26,8 +26,8 @@ public: ~StubDevAuthCb(); int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; - void DoCallBack(int32_t callbackId, uintptr_t cbHook, - MessageParcel &dataParcel, MessageParcel &reply, MessageOption &option) override; + void DoCallBack(int32_t callbackId, MessageParcel &dataParcel, MessageParcel &reply, + MessageOption &option) override; }; } diff --git a/frameworks/inc/standard/ipc_dev_auth_stub.h b/frameworks/inc/standard/ipc_dev_auth_stub.h index eb8f53af..b8d13dd8 100755 --- a/frameworks/inc/standard/ipc_dev_auth_stub.h +++ b/frameworks/inc/standard/ipc_dev_auth_stub.h @@ -42,7 +42,7 @@ public: static void AddCbDeathRecipient(int32_t cbStubIdx, int32_t cbDataIdx); static void ResetRemoteObject(int32_t idx); static void ActCallback(int32_t objIdx, int32_t callbackId, bool sync, - uintptr_t cbHook, MessageParcel &dataParcel, MessageParcel &reply); + MessageParcel &dataParcel, MessageParcel &reply); protected: int32_t HandleRestoreCall(MessageParcel &data, MessageParcel &reply); diff --git a/frameworks/inc/standard/ipc_iface.h b/frameworks/inc/standard/ipc_iface.h index 5b426685..98fb9f5a 100755 --- a/frameworks/inc/standard/ipc_iface.h +++ b/frameworks/inc/standard/ipc_iface.h @@ -31,8 +31,8 @@ public: class ICommIpcCallback : public IRemoteBroker { public: DECLARE_INTERFACE_DESCRIPTOR(u"deviceauth.ICommIpcCallback"); - virtual void DoCallBack(int32_t callbackId, uintptr_t cbHook, - MessageParcel &dataParcel, MessageParcel &reply, MessageOption &option) = 0; + virtual void DoCallBack(int32_t callbackId, MessageParcel &dataParcel, MessageParcel &reply, + MessageOption &option) = 0; }; const int32_t DEV_AUTH_CALL_WAIT_TIME = 30; /* second */ diff --git a/frameworks/sdk/sa_load_on_demand/inc/sa_load_on_demand.h b/frameworks/sdk/sa_load_on_demand/inc/sa_load_on_demand.h index e9add49c..10047e72 100644 --- a/frameworks/sdk/sa_load_on_demand/inc/sa_load_on_demand.h +++ b/frameworks/sdk/sa_load_on_demand/inc/sa_load_on_demand.h @@ -25,14 +25,6 @@ extern "C" { #endif -typedef int32_t (*RegCallbackFunc)(const char *appId, const DeviceAuthCallback *callback, bool needCache); -typedef int32_t (*RegDataChangeListenerFunc)(const char *appId, const DataChangeListener *listener, bool needCache); -typedef int32_t (*RegCredChangeListenerFunc)(const char *appId, CredChangeListener *listener, bool needCache); - -int32_t AddCallbackInfoToList(const char *appId, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *listener, int32_t callbackType); -int32_t RemoveCallbackInfoFromList(const char *appId, int32_t callbackType); - void SetRegCallbackFunc(RegCallbackFunc regCallbackFunc); void SetRegDataChangeListenerFunc(RegDataChangeListenerFunc regDataChangeListenerFunc); void SetRegCredChangeListenerFunc(RegCredChangeListenerFunc regCredChangeListenerFunc); diff --git a/frameworks/sdk/sa_load_on_demand/src/mock/sa_load_on_demand_mock.cpp b/frameworks/sdk/sa_load_on_demand/src/mock/sa_load_on_demand_mock.cpp index e39166d3..c68baa79 100644 --- a/frameworks/sdk/sa_load_on_demand/src/mock/sa_load_on_demand_mock.cpp +++ b/frameworks/sdk/sa_load_on_demand/src/mock/sa_load_on_demand_mock.cpp @@ -16,24 +16,6 @@ #include "sa_load_on_demand.h" #include "common_defs.h" -int32_t AddCallbackInfoToList(const char *appId, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *credChangeListener, int32_t callbackType) -{ - (void)appId; - (void)callback; - (void)dataChangeListener; - (void)credChangeListener; - (void)callbackType; - return HC_SUCCESS; -} - -int32_t RemoveCallbackInfoFromList(const char *appId, int32_t callbackType) -{ - (void)appId; - (void)callbackType; - return HC_SUCCESS; -} - void SetRegCallbackFunc(RegCallbackFunc regCallbackFunc) { (void)regCallbackFunc; diff --git a/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp b/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp index 42ead7a4..2954e13e 100644 --- a/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp +++ b/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp @@ -19,19 +19,16 @@ #include "hc_log.h" #include "hc_types.h" #include "iservice_registry.h" -#include "hc_vector.h" #include "securec.h" #include "system_ability_definition.h" #include "parameter.h" #include "sa_listener.h" #include "string_util.h" +#include "ipc_adapt.h" static OHOS::sptr g_saListener = nullptr; static std::recursive_mutex g_devAuthCallbackMutex; -DECLARE_HC_VECTOR(DevAuthCallbackInfoVec, DevAuthCallbackInfo) -IMPLEMENT_HC_VECTOR(DevAuthCallbackInfoVec, DevAuthCallbackInfo, 1) -static DevAuthCallbackInfoVec g_devAuthCallbackList; static bool g_devAuthSaIsActive = false; static bool volatile g_devAuthInitStatus = false; @@ -39,193 +36,9 @@ static RegCallbackFunc g_regCallback; static RegDataChangeListenerFunc g_regDataChangeListener; static RegCredChangeListenerFunc g_regCredChangeListener; -static int32_t DoBuildDevAuthCallback(DevAuthCallbackInfo *callbackInfo, const DeviceAuthCallback *callback) -{ - DeviceAuthCallback *copyCallback = (DeviceAuthCallback *)HcMalloc(sizeof(DeviceAuthCallback), 0); - if (copyCallback == nullptr) { - LOGE("[SDK]: Failed to malloc callback memory."); - return HC_ERR_ALLOC_MEMORY; - } - if (memcpy_s(copyCallback, sizeof(DeviceAuthCallback), callback, sizeof(DeviceAuthCallback)) != HC_SUCCESS) { - LOGE("[SDK]: Failed to copy callback."); - HcFree(copyCallback); - return HC_ERR_MEMORY_COPY; - } - callbackInfo->callback.deviceAuthCallback = copyCallback; - return HC_SUCCESS; -} - -static int32_t DoBuildGroupChangeListener(DevAuthCallbackInfo *callbackInfo, - const DataChangeListener *dataChangeListener) -{ - DataChangeListener *copyListener = (DataChangeListener *)HcMalloc(sizeof(DataChangeListener), 0); - if (copyListener == nullptr) { - LOGE("[SDK]: Failed to malloc copyListener memory."); - return HC_ERR_ALLOC_MEMORY; - } - if (memcpy_s(copyListener, sizeof(DataChangeListener), dataChangeListener, sizeof(DataChangeListener)) - != HC_SUCCESS) { - LOGE("[SDK]: Failed to copy dataChangeListener."); - HcFree(copyListener); - return HC_ERR_MEMORY_COPY; - } - callbackInfo->callback.dataChangeListener = copyListener; - return HC_SUCCESS; -} - -static int32_t DoBuildCredChangeListener(DevAuthCallbackInfo *callbackInfo, - const CredChangeListener *credChangeListener) -{ - CredChangeListener *copyListener = (CredChangeListener *)HcMalloc(sizeof(CredChangeListener), 0); - if (copyListener == nullptr) { - LOGE("[SDK]: Failed to malloc credChangeListener memory."); - return HC_ERR_ALLOC_MEMORY; - } - if (memcpy_s(copyListener, sizeof(CredChangeListener), credChangeListener, sizeof(CredChangeListener)) - != HC_SUCCESS) { - LOGE("[SDK]: Failed to copy copyListener."); - HcFree(copyListener); - return HC_ERR_MEMORY_COPY; - } - callbackInfo->callback.credChangeListener = copyListener; - return HC_SUCCESS; -} - -static void FreeCallbackByType(DevAuthCallbackInfo *entry) -{ - switch (entry->callbackType) { - case DEVAUTH_CALLBACK: - HcFree(entry->callback.deviceAuthCallback); - entry->callback.deviceAuthCallback = nullptr; - break; - case GROUP_CHANGE_LISTENER: - HcFree(entry->callback.dataChangeListener); - entry->callback.dataChangeListener = nullptr; - break; - case CRED_CHANGE_LISTENER: - HcFree(entry->callback.credChangeListener); - entry->callback.credChangeListener = nullptr; - break; - default: - LOGE("invalid callback type."); - break; - } -} - -static int32_t CreateCallbackByType(DevAuthCallbackInfo *entry, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *listener) -{ - int32_t ret = HC_ERR_IPC_CALLBACK_TYPE; - switch (entry->callbackType) { - case DEVAUTH_CALLBACK: - ret = DoBuildDevAuthCallback(entry, callback); - break; - case GROUP_CHANGE_LISTENER: - ret = DoBuildGroupChangeListener(entry, dataChangeListener); - break; - case CRED_CHANGE_LISTENER: - ret = DoBuildCredChangeListener(entry, listener); - break; - default: - LOGE("invalid callback type."); - break; - } - return ret; -} - -static int32_t BuildCallbackInfo(DevAuthCallbackInfo *callbackInfo, const char *appId, - const DeviceAuthCallback *callback, const DataChangeListener *dataChangeListener, CredChangeListener *listener) -{ - uint32_t appIdLen = HcStrlen(appId) + 1; - char *copyAppId = static_cast(HcMalloc(appIdLen, 0)); - if (copyAppId == nullptr) { - LOGE("[SDK]: Failed to malloc appId."); - return HC_ERR_ALLOC_MEMORY; - } - if (strcpy_s(copyAppId, appIdLen, appId) != HC_SUCCESS) { - LOGE("[SDK]: Failed to copy appId."); - HcFree(copyAppId); - return HC_ERR_ALLOC_MEMORY; - } - callbackInfo->appId = copyAppId; - int32_t ret = CreateCallbackByType(callbackInfo, callback, dataChangeListener, listener); - if (ret != HC_SUCCESS) { - LOGE("[SDK]: Do build callback failed."); - HcFree(copyAppId); - } - return ret; -} - -static void ClearCallbackInfo(DevAuthCallbackInfo *callbackInfo) -{ - HcFree(callbackInfo->appId); - FreeCallbackByType(callbackInfo); -} - -static bool UpdateCallback(DevAuthCallbackInfo *callbackInfo, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *listener) -{ - DevAuthCallbackInfo tmpCallbackInfo; - tmpCallbackInfo.callbackType = callbackInfo->callbackType; - tmpCallbackInfo.callback = callbackInfo->callback; - if (CreateCallbackByType(callbackInfo, callback, dataChangeListener, listener) != HC_SUCCESS) { - LOGE("[SDK]: Update callback failed."); - return false; - } - FreeCallbackByType(&tmpCallbackInfo); - return true; -} - -static bool UpdateCallbackInfoIfExist(const char *appId, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *listener, int32_t callbackType) -{ - uint32_t index; - DevAuthCallbackInfo *entry = nullptr; - std::lock_guard autoLock(g_devAuthCallbackMutex); - FOR_EACH_HC_VECTOR(g_devAuthCallbackList, index, entry) { - if (entry == nullptr || entry->appId == nullptr) { - continue; - } - if (IsStrEqual(entry->appId, appId) && entry->callbackType == callbackType) { - LOGI("[SDK]:start to update callback, appId: %" LOG_PUB "s, callbackType: %" LOG_PUB "d", - appId, callbackType); - bool ret = UpdateCallback(entry, callback, dataChangeListener, listener); - return ret; - } - } - return false; -} - static void RegisterDevAuthCallback() { - uint32_t index; - DevAuthCallbackInfo *callbackInfo = nullptr; - int32_t ret = HC_SUCCESS; - std::lock_guard autoLock(g_devAuthCallbackMutex); - LOGI("[SDK]: cache list size: %" LOG_PUB "d", g_devAuthCallbackList.size(&g_devAuthCallbackList)); - FOR_EACH_HC_VECTOR(g_devAuthCallbackList, index, callbackInfo) { - if (callbackInfo == nullptr || callbackInfo->appId == nullptr) { - continue; - } - switch (callbackInfo->callbackType) { - case DEVAUTH_CALLBACK: - LOGI("regCallback."); - ret = g_regCallback(callbackInfo->appId, callbackInfo->callback.deviceAuthCallback, false); - break; - case GROUP_CHANGE_LISTENER: - LOGI("regDataChangeListener."); - ret = g_regDataChangeListener(callbackInfo->appId, callbackInfo->callback.dataChangeListener, false); - break; - case CRED_CHANGE_LISTENER: - LOGI("regCredChangeListener."); - ret = g_regCredChangeListener(callbackInfo->appId, callbackInfo->callback.credChangeListener, false); - break; - default: - LOGE("invalid callback type: %" LOG_PUB "d.", callbackInfo->callbackType); - break; - } - LOGI("register result: %" LOG_PUB "d.", ret); - } + RegisterSdkCallBack(g_regCallback, g_regDataChangeListener, g_regCredChangeListener); } static void OnReceivedDevAuthAdded() @@ -243,51 +56,6 @@ static void OnReceivedDevAuthRemoved() g_devAuthSaIsActive = false; } -int32_t AddCallbackInfoToList(const char *appId, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *listener, int32_t callbackType) -{ - if (UpdateCallbackInfoIfExist(appId, callback, dataChangeListener, listener, callbackType)) { - LOGI("[SDK]:Callback info exist, update successfully."); - return HC_SUCCESS; - } - DevAuthCallbackInfo callbackInfo; - callbackInfo.callbackType = callbackType; - int32_t ret = BuildCallbackInfo(&callbackInfo, appId, callback, dataChangeListener, listener); - if (ret != HC_SUCCESS) { - return ret; - } - std::lock_guard autoLock(g_devAuthCallbackMutex); - if (g_devAuthCallbackList.pushBack(&g_devAuthCallbackList, &callbackInfo) == nullptr) { - LOGE("[SDK]: Failed to add callbackInfo."); - ClearCallbackInfo(&callbackInfo); - return HC_ERR_ALLOC_MEMORY; - } - LOGI("[SDK]: Add callback info successfully, cache list size: %" LOG_PUB "d.", - g_devAuthCallbackList.size(&g_devAuthCallbackList)); - return HC_SUCCESS; -} - -int32_t RemoveCallbackInfoFromList(const char *appId, int32_t callbackType) -{ - uint32_t index; - DevAuthCallbackInfo *entry = nullptr; - int32_t ret = HC_SUCCESS; - std::lock_guard autoLock(g_devAuthCallbackMutex); - FOR_EACH_HC_VECTOR(g_devAuthCallbackList, index, entry) { - if (entry == nullptr || entry->appId == nullptr) { - continue; - } - if (IsStrEqual(entry->appId, appId) && entry->callbackType == callbackType) { - LOGW("[SDK]: start to remove callbackInfo."); - DevAuthCallbackInfo deleteCallbackInfo; - HC_VECTOR_POPELEMENT(&g_devAuthCallbackList, &deleteCallbackInfo, index); - ClearCallbackInfo(&deleteCallbackInfo); - return ret; - } - } - return ret; -} - void SetRegCallbackFunc(RegCallbackFunc regCallbackFunc) { g_regCallback = regCallbackFunc; @@ -361,7 +129,6 @@ void UnSubscribeDeviceAuthSa(void) int32_t InitLoadOnDemand(void) { - g_devAuthCallbackList = CREATE_HC_VECTOR(DevAuthCallbackInfoVec); g_devAuthInitStatus = true; return HC_SUCCESS; } @@ -369,5 +136,4 @@ int32_t InitLoadOnDemand(void) void DeInitLoadOnDemand(void) { g_devAuthInitStatus = false; - DESTROY_HC_VECTOR(DevAuthCallbackInfoVec, &g_devAuthCallbackList); } \ No newline at end of file diff --git a/frameworks/src/identity_service_ipc_sdk.c b/frameworks/src/identity_service_ipc_sdk.c index 192b2828..39562257 100644 --- a/frameworks/src/identity_service_ipc_sdk.c +++ b/frameworks/src/identity_service_ipc_sdk.c @@ -169,10 +169,13 @@ static int32_t IpcCmRegChangeListenerInner(const char *appId, CredChangeListener BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); AddIpcCliCallbackCtx(appId, 0, &g_ipcCredListenerCbList); if (needCache) { - ret = AddCallbackInfoToList(appId, NULL, NULL, listener, CRED_CHANGE_LISTENER); + ret = AddSdkCallBackByAppId(appId, CB_TYPE_CRED_LISTENER, (uint8_t *)listener, sizeof(CredChangeListener)); } } while (0); DESTROY_IPC_CTX(callCtx); + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByAppId(appId, CB_TYPE_CRED_LISTENER); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -199,7 +202,7 @@ static int32_t IpcCmUnRegChangeListener(const char *appId) DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); DelIpcCliCallbackCtx(appId, &g_ipcCredListenerCbList); - ret = RemoveCallbackInfoFromList(appId, CRED_CHANGE_LISTENER); + RemoveSdkCallBackByAppId(appId, CB_TYPE_CRED_LISTENER); } while (0); DESTROY_IPC_CTX(callCtx); @@ -499,18 +502,21 @@ static int32_t IpcCmAuthCredential(int32_t osAccountId, int64_t authReqId, const RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(authParams) || (caCallback == NULL))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(authReqId, CB_TYPE_CRED_DEV_AUTH, (uint8_t *)caCallback, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &authReqId, sizeof(authReqId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_AUTH_PARAMS, authParams, HcStrlen(authParams) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, caCallback, sizeof(*caCallback)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_AUTH_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_CA_AUTH_CREDENTIAL, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(authReqId, CB_TYPE_CRED_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); - DestroyCallCtx(&callCtx); return ret; } @@ -525,6 +531,8 @@ static int32_t IpcCmProcessCredData(int64_t authReqId, const uint8_t *data, uint RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED(!IS_COMM_DATA_VALID(data, dataLen) || (callback == NULL)); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(authReqId, CB_TYPE_CRED_DEV_AUTH, (uint8_t *)callback, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &authReqId, sizeof(authReqId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_COMM_DATA, data, dataLen); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, callback, sizeof(*callback)); @@ -534,6 +542,9 @@ static int32_t IpcCmProcessCredData(int64_t authReqId, const uint8_t *data, uint BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(authReqId, CB_TYPE_CRED_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } diff --git a/frameworks/src/ipc_sdk.c b/frameworks/src/ipc_sdk.c index ad7eb993..ecb5b51c 100644 --- a/frameworks/src/ipc_sdk.c +++ b/frameworks/src/ipc_sdk.c @@ -135,6 +135,27 @@ static void GetIpcReplyByType(const IpcDataInfo *ipcData, return; } +static int32_t BindRequestIdWithAppId(const uint8_t *data, uint32_t dataLen) +{ + CJson *dataJson = NULL; + int32_t ret = CreateJsonFromData(data, dataLen, &dataJson); + if (ret != HC_SUCCESS) { + LOGE("Failed to create json from data!"); + return ret; + } + const char *appId = GetStringFromJson(dataJson, FIELD_APP_ID); + if (appId == NULL) { + LOGE("failed to get appId from json object!"); + FreeJson(dataJson); + return HC_ERR_JSON_GET; + } + int64_t requestId = -1; + (void)GetInt64FromJson(dataJson, FIELD_REQUEST_ID, &requestId); + ret = AddRequestIdByAppId(appId, requestId); + FreeJson(dataJson); + return ret; +} + static int32_t IpcGmRegCallbackInner(const char *appId, const DeviceAuthCallback *callback, bool needCache) { uintptr_t callCtx = 0x0; @@ -146,14 +167,13 @@ static int32_t IpcGmRegCallbackInner(const char *appId, const DeviceAuthCallback RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_APPID, appId, HcStrlen(appId) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, callback, sizeof(*callback)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_BIND_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_REG_CB, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); AddIpcCliCallbackCtx(appId, 0, &g_ipcProxyCbList); if (needCache) { - ret = AddCallbackInfoToList(appId, callback, NULL, NULL, DEVAUTH_CALLBACK); + ret = AddSdkCallBackByAppId(appId, CB_TYPE_DEV_AUTH, (uint8_t *)callback, sizeof(DeviceAuthCallback)); } } while (0); DESTROY_IPC_CTX(callCtx); @@ -184,7 +204,7 @@ static int32_t IpcGmUnRegCallback(const char *appId) DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); DelIpcCliCallbackCtx(appId, &g_ipcProxyCbList); - ret = RemoveCallbackInfoFromList(appId, DEVAUTH_CALLBACK); + RemoveSdkCallBackByAppId(appId, CB_TYPE_DEV_AUTH); } while (0); DESTROY_IPC_CTX(callCtx); @@ -203,14 +223,13 @@ static int32_t IpcGmRegDataChangeListenerInner(const char *appId, const DataChan RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_APPID, appId, HcStrlen(appId) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_LISTENER, listener, sizeof(*listener)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_BIND_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_REG_LISTENER, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); AddIpcCliCallbackCtx(appId, 0, &g_ipcListenerCbList); if (needCache) { - ret = AddCallbackInfoToList(appId, NULL, listener, NULL, GROUP_CHANGE_LISTENER); + ret = AddSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)listener, sizeof(DataChangeListener)); } } while (0); DESTROY_IPC_CTX(callCtx); @@ -241,7 +260,7 @@ static int32_t IpcGmUnRegDataChangeListener(const char *appId) DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); DelIpcCliCallbackCtx(appId, &g_ipcListenerCbList); - ret = RemoveCallbackInfoFromList(appId, GROUP_CHANGE_LISTENER); + RemoveSdkCallBackByAppId(appId, CB_TYPE_LISTENER); } while (0); DESTROY_IPC_CTX(callCtx); @@ -261,6 +280,7 @@ static int32_t IpcGmCreateGroup(int32_t osAccountId, int64_t requestId, const ch RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(appId) || IsStrInvalid(createParams))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddRequestIdByAppId(appId, requestId); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_APPID, appId, HcStrlen(appId) + 1); @@ -287,6 +307,7 @@ static int32_t IpcGmDeleteGroup(int32_t osAccountId, int64_t requestId, const ch RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(appId) || IsStrInvalid(delParams))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddRequestIdByAppId(appId, requestId); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_APPID, appId, HcStrlen(appId) + 1); @@ -313,6 +334,7 @@ static int32_t IpcGmAddMemberToGroup(int32_t osAccountId, int64_t requestId, con RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(appId) || IsStrInvalid(addParams))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddRequestIdByAppId(appId, requestId); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_APPID, appId, HcStrlen(appId) + 1); @@ -339,6 +361,7 @@ static int32_t IpcGmDelMemberFromGroup(int32_t osAccountId, int64_t requestId, c RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(appId) || IsStrInvalid(delParams))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddRequestIdByAppId(appId, requestId); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_APPID, appId, HcStrlen(appId) + 1); @@ -415,6 +438,7 @@ static int32_t IpcGmProcessData(int64_t requestId, const uint8_t *data, uint32_t RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((!IS_COMM_DATA_VALID(data, dataLen))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = BindRequestIdWithAppId(data, dataLen); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_COMM_DATA, data, dataLen); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_GM_PROC_DATA, true); @@ -803,16 +827,19 @@ static int32_t IpcGaProcessData(int64_t authReqId, RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((!IS_COMM_DATA_VALID(data, dataLen) || (callback == NULL))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(authReqId, CB_TYPE_TMP_DEV_AUTH, (uint8_t *)callback, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &authReqId, sizeof(authReqId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_COMM_DATA, data, dataLen); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, callback, sizeof(*callback)); SetCbCtxToDataCtx(callCtx, 0x0); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_GA_PROC_DATA, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); - + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(authReqId, CB_TYPE_TMP_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -830,17 +857,20 @@ static int32_t IpcGaAuthDevice(int32_t osAccountId, int64_t authReqId, const cha RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(authParams) || (callback == NULL))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(authReqId, CB_TYPE_TMP_DEV_AUTH, (uint8_t *)callback, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &authReqId, sizeof(authReqId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_AUTH_PARAMS, authParams, HcStrlen(authParams) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, callback, sizeof(*callback)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_AUTH_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_AUTH_DEVICE, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); - + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(authReqId, CB_TYPE_TMP_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -1161,17 +1191,20 @@ static int32_t IpcLaStartLightAccountAuth(int32_t osAccountId, int64_t requestId RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(serviceId) || laCallBack == NULL)); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH, (uint8_t *)laCallBack, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_SERVICE_ID, serviceId, HcStrlen(serviceId) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, laCallBack, sizeof(*laCallBack)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_LIGHT_AUTH_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_LA_START_LIGHT_ACCOUNT_AUTH, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); - + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -1188,17 +1221,20 @@ static int32_t IpcLaProcessLightAccountAuth(int32_t osAccountId, int64_t request RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((!IS_COMM_DATA_VALID(inMsg->data, inMsg->length) || (laCallBack == NULL))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH, (uint8_t *)laCallBack, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_OS_ACCOUNT_ID, &osAccountId, sizeof(osAccountId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_COMM_DATA, inMsg->data, inMsg->length); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, laCallBack, sizeof(*laCallBack)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_LIGHT_AUTH_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_LA_PROCESS_LIGHT_ACCOUNT_AUTH, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); - + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -1250,16 +1286,19 @@ DEVICE_AUTH_API_PUBLIC int32_t ProcessAuthDevice( RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(authParams) || (callback == NULL))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH, (uint8_t *)callback, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &requestId, sizeof(requestId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_AUTH_PARAMS, authParams, HcStrlen(authParams) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, callback, sizeof(*callback)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_DIRECT_AUTH_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_DA_PROC_DATA, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); - + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -1276,16 +1315,19 @@ DEVICE_AUTH_API_PUBLIC int32_t StartAuthDevice( RETURN_INT_IF_CHECK_IPC_PARAMS_FAILED((IsStrInvalid(authParams) || (callback == NULL))); RETURN_INT_IF_CREATE_IPC_CTX_FAILED(callCtx); do { + ret = AddSdkCallBackByRequestId(authReqId, CB_TYPE_TMP_DEV_AUTH, (uint8_t *)callback, + sizeof(DeviceAuthCallback)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_REQID, &authReqId, sizeof(authReqId)); BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_AUTH_PARAMS, authParams, HcStrlen(authParams) + 1); - BREAK_IF_SET_IPC_PARAM_FAILED(callCtx, PARAM_TYPE_DEV_AUTH_CB, callback, sizeof(*callback)); SetCbCtxToDataCtx(callCtx, IPC_CALL_BACK_STUB_DIRECT_AUTH_ID); BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_DA_AUTH_DEVICE, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); } while (0); DESTROY_IPC_CTX(callCtx); - + if (ret != HC_SUCCESS) { + RemoveSdkCallBackByRequestId(authReqId, CB_TYPE_TMP_DEV_AUTH); + } LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -1306,9 +1348,9 @@ DEVICE_AUTH_API_PUBLIC int32_t CancelAuthRequest(int64_t requestId, const char * BREAK_IF_DO_IPC_CALL_FAILED(callCtx, IPC_CALL_ID_DA_CANCEL_REQUEST, true); DecodeCallReply(callCtx, replyCache, REPLAY_CACHE_NUM(replyCache)); BREAK_IF_CHECK_IPC_RESULT_FAILED(replyCache, ret); + RemoveSdkCallBackByRequestId(requestId, CB_TYPE_TMP_DEV_AUTH); } while (0); DESTROY_IPC_CTX(callCtx); - LOGI("process done, ret: %" LOG_PUB "d", ret); return ret; } @@ -1340,6 +1382,7 @@ DEVICE_AUTH_API_PUBLIC int InitDeviceAuthService(void) DestroyHcMutex(&g_ipcMutex); return ret; } + (void)InitSdkIpcCallBackList(); g_devAuthServiceStatus = true; SetRegCallbackFunc(IpcGmRegCallbackInner); SetRegDataChangeListenerFunc(IpcGmRegDataChangeListenerInner); @@ -1350,6 +1393,7 @@ DEVICE_AUTH_API_PUBLIC int InitDeviceAuthService(void) DEVICE_AUTH_API_PUBLIC void DestroyDeviceAuthService(void) { UnSubscribeDeviceAuthSa(); + DeInitSdkIpcCallBackList(); UnInitProxyAdapt(); DeInitISIpc(); DeInitLoadOnDemand(); diff --git a/frameworks/src/ipc_service_common.c b/frameworks/src/ipc_service_common.c index 78eb359e..28c23d97 100644 --- a/frameworks/src/ipc_service_common.c +++ b/frameworks/src/ipc_service_common.c @@ -68,7 +68,6 @@ int32_t IpcServiceGmRegCallback(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t callRet; int32_t ret; const char *appId = NULL; - const DeviceAuthCallback *callback = NULL; int32_t cbObjIdx = -1; int32_t inOutLen; ret = GetAndValNullParam(ipcParams, paramNum, PARAM_TYPE_APPID, (uint8_t *)&appId, NULL); @@ -76,12 +75,7 @@ int32_t IpcServiceGmRegCallback(const IpcDataInfo *ipcParams, int32_t paramNum, LOGE("IpcServiceGmRegCallback failed, get app id error."); return HC_ERR_IPC_BAD_PARAM; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&callback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } - ret = AddIpcCallBackByAppId(appId, (const uint8_t *)callback, sizeof(DeviceAuthCallback), CB_TYPE_DEV_AUTH); + ret = AddIpcCallBackByAppId(appId, CB_TYPE_DEV_AUTH); if (ret != HC_SUCCESS) { LOGE("add ipc callback failed"); return HC_ERROR; @@ -125,7 +119,6 @@ int32_t IpcServiceGmRegDataChangeListener(const IpcDataInfo *ipcParams, int32_t int32_t callRet; int32_t ret; const char *appId = NULL; - const DataChangeListener *callback = NULL; static int32_t registered = 0; int32_t cbObjIdx = -1; int32_t inOutLen; @@ -134,13 +127,7 @@ int32_t IpcServiceGmRegDataChangeListener(const IpcDataInfo *ipcParams, int32_t LOGE("IpcServiceGmRegDataChangeListener failed, get app id error."); return HC_ERR_IPC_BAD_PARAM; } - inOutLen = sizeof(DataChangeListener); - ret = GetIpcRequestParamByType(ipcParams, paramNum, PARAM_TYPE_LISTENER, (uint8_t *)&callback, &inOutLen); - if ((ret != HC_SUCCESS) || (inOutLen != sizeof(DataChangeListener))) { - LOGE("get param error, type %" LOG_PUB "d", PARAM_TYPE_LISTENER); - return HC_ERR_IPC_BAD_PARAM; - } - ret = AddIpcCallBackByAppId(appId, (const uint8_t *)callback, sizeof(DataChangeListener), CB_TYPE_LISTENER); + ret = AddIpcCallBackByAppId(appId, CB_TYPE_LISTENER); if (ret != HC_SUCCESS) { LOGE("IpcServiceGmRegDataChangeListener failed, add ipc callback failed."); return HC_ERROR; @@ -149,7 +136,7 @@ int32_t IpcServiceGmRegDataChangeListener(const IpcDataInfo *ipcParams, int32_t ret = GetIpcRequestParamByType(ipcParams, paramNum, PARAM_TYPE_CB_OBJECT, (uint8_t *)&cbObjIdx, &inOutLen); if (ret != HC_SUCCESS) { LOGE("IpcServiceGmRegDataChangeListener failed, get cb object error."); - DelIpcCallBackByAppId(appId, CB_TYPE_DEV_AUTH); + DelIpcCallBackByAppId(appId, CB_TYPE_LISTENER); return HC_ERR_IPC_BAD_PARAM; } AddIpcCbObjByAppId(appId, cbObjIdx, CB_TYPE_LISTENER); @@ -879,7 +866,6 @@ int32_t IpcServiceLaStartLightAccountAuth(const IpcDataInfo *ipcParams, int32_t int32_t osAccountId; int64_t requestId; const char *serviceId = NULL; - const DeviceAuthCallback *laCallBack = NULL; inOutLen = sizeof(int32_t); ret = GetAndValSize32Param(ipcParams, paramNum, PARAM_TYPE_OS_ACCOUNT_ID, (uint8_t *)&osAccountId, &inOutLen); if (ret != HC_SUCCESS) { @@ -894,14 +880,8 @@ int32_t IpcServiceLaStartLightAccountAuth(const IpcDataInfo *ipcParams, int32_t if (ret != HC_SUCCESS) { return ret; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&laCallBack, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } /* add call back */ - ret = AddIpcCallBackByReqId(requestId, (const uint8_t *)laCallBack, - sizeof(DeviceAuthCallback), CB_TYPE_TMP_DEV_AUTH); + ret = AddIpcCallBackByReqId(requestId, CB_TYPE_TMP_DEV_AUTH); if (ret != HC_SUCCESS) { return ret; } @@ -928,7 +908,6 @@ int32_t IpcServiceLaProcessLightAccountAuth(const IpcDataInfo *ipcParams, int32_ int32_t cbObjIdx = -1; int32_t osAccountId; int64_t requestId; - const DeviceAuthCallback *laCallBack = NULL; inOutLen = sizeof(int32_t); ret = GetAndValSize32Param(ipcParams, paramNum, PARAM_TYPE_OS_ACCOUNT_ID, (uint8_t *)&osAccountId, &inOutLen); if (ret != HC_SUCCESS) { @@ -947,14 +926,8 @@ int32_t IpcServiceLaProcessLightAccountAuth(const IpcDataInfo *ipcParams, int32_ return HC_ERR_IPC_BAD_PARAM; } DataBuff inMsgBuff = { (uint8_t *)msgVal, (uint32_t)msgLen }; - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&laCallBack, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } /* add call back */ - ret = AddIpcCallBackByReqId(requestId, (const uint8_t *)laCallBack, - sizeof(DeviceAuthCallback), CB_TYPE_TMP_DEV_AUTH); + ret = AddIpcCallBackByReqId(requestId, CB_TYPE_TMP_DEV_AUTH); if (ret != HC_SUCCESS) { return ret; } @@ -1005,7 +978,6 @@ int32_t IpcServiceGmIsDeviceInGroup(const IpcDataInfo *ipcParams, int32_t paramN LOGE("IpcServiceGmIsDeviceInGroup failed, get group id error."); return ret; } - bRet = g_devGroupMgrMethod.isDeviceInGroup(osAccountId, appId, groupId, udid); callRet = ((bRet == true) ? HC_SUCCESS : HC_ERROR); ret = IpcEncodeCallReply(outCache, PARAM_TYPE_IPC_RESULT, (const uint8_t *)&callRet, sizeof(int32_t)); @@ -1039,7 +1011,6 @@ int32_t IpcServiceGaProcessData(const IpcDataInfo *ipcParams, int32_t paramNum, { int32_t callRet; int32_t ret; - const DeviceAuthCallback *gaCallback = NULL; int64_t reqId = 0; uint8_t *data = NULL; uint32_t dataLen = 0; @@ -1056,13 +1027,8 @@ int32_t IpcServiceGaProcessData(const IpcDataInfo *ipcParams, int32_t paramNum, LOGE("IpcServiceGaProcessData failed, get comm data error."); return HC_ERR_IPC_BAD_PARAM; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&gaCallback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } /* add call back */ - ret = AddIpcCallBackByReqId(reqId, (const uint8_t *)gaCallback, sizeof(DeviceAuthCallback), CB_TYPE_TMP_DEV_AUTH); + ret = AddIpcCallBackByReqId(reqId, CB_TYPE_TMP_DEV_AUTH); if (ret != HC_SUCCESS) { LOGE("add ipc callback failed"); return ret; @@ -1086,7 +1052,6 @@ int32_t IpcServiceGaProcessData(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t IpcServiceGaAuthDevice(const IpcDataInfo *ipcParams, int32_t paramNum, uintptr_t outCache) { int32_t ret; - DeviceAuthCallback *gaCallback = NULL; int32_t osAccountId; int64_t reqId = 0; const char *authParams = NULL; @@ -1107,14 +1072,9 @@ int32_t IpcServiceGaAuthDevice(const IpcDataInfo *ipcParams, int32_t paramNum, u if (ret != HC_SUCCESS) { return ret; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&gaCallback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } /* add call back */ - ret = AddIpcCallBackByReqId(reqId, (const uint8_t *)gaCallback, sizeof(DeviceAuthCallback), CB_TYPE_TMP_DEV_AUTH); + ret = AddIpcCallBackByReqId(reqId, CB_TYPE_TMP_DEV_AUTH); if (ret != HC_SUCCESS) { return ret; } @@ -1254,7 +1214,6 @@ int32_t IpcServiceDaProcessData(const IpcDataInfo *ipcParams, int32_t paramNum, { int32_t callRet; int32_t ret; - const DeviceAuthCallback *callback = NULL; int64_t authReqId = 0; const char *authParams = NULL; int32_t inOutLen; @@ -1269,13 +1228,7 @@ int32_t IpcServiceDaProcessData(const IpcDataInfo *ipcParams, int32_t paramNum, if (ret != HC_SUCCESS) { return ret; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&callback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } - ret = AddIpcCallBackByReqId( - authReqId, (const uint8_t *)callback, sizeof(DeviceAuthCallback), CB_TYPE_TMP_DEV_AUTH); + ret = AddIpcCallBackByReqId(authReqId, CB_TYPE_TMP_DEV_AUTH); if (ret != HC_SUCCESS) { return ret; } @@ -1301,7 +1254,6 @@ int32_t IpcServiceDaAuthDevice(const IpcDataInfo *ipcParams, int32_t paramNum, u { int32_t callRet; int32_t ret; - DeviceAuthCallback *callback = NULL; int64_t authReqId = 0; const char *authParams = NULL; int32_t inOutLen; @@ -1317,13 +1269,7 @@ int32_t IpcServiceDaAuthDevice(const IpcDataInfo *ipcParams, int32_t paramNum, u LOGE("IpcServiceDaAuthDevice failed, get auth params error."); return ret; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&callback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } - ret = AddIpcCallBackByReqId( - authReqId, (const uint8_t *)callback, sizeof(DeviceAuthCallback), CB_TYPE_TMP_DEV_AUTH); + ret = AddIpcCallBackByReqId(authReqId, CB_TYPE_TMP_DEV_AUTH); if (ret != HC_SUCCESS) { LOGE("add ipc callback failed"); return ret; @@ -1407,7 +1353,6 @@ int32_t IpcServiceCmRegCredChangeListener(const IpcDataInfo *ipcParams, int32_t int32_t callRet; int32_t ret; const char *appId = NULL; - const CredChangeListener *listener = NULL; static int32_t registered = 0; int32_t cbObjIdx = -1; int32_t inOutLen = sizeof(int32_t); @@ -1416,13 +1361,7 @@ int32_t IpcServiceCmRegCredChangeListener(const IpcDataInfo *ipcParams, int32_t LOGE("IpcServiceCmRegCredChangeListener failed, get app id error."); return HC_ERR_IPC_BAD_PARAM; } - inOutLen = sizeof(CredChangeListener); - ret = GetIpcRequestParamByType(ipcParams, paramNum, PARAM_TYPE_LISTENER, (uint8_t *)&listener, &inOutLen); - if ((ret != HC_SUCCESS) || (inOutLen != sizeof(CredChangeListener))) { - LOGE("IpcServiceCmRegCredChangeListener failed, get listener error."); - return HC_ERR_IPC_BAD_PARAM; - } - ret = AddIpcCallBackByAppId(appId, (const uint8_t *)listener, sizeof(CredChangeListener), CB_TYPE_CRED_LISTENER); + ret = AddIpcCallBackByAppId(appId, CB_TYPE_CRED_LISTENER); if (ret != HC_SUCCESS) { LOGE("add ipc listener failed"); return HC_ERROR; @@ -1728,7 +1667,6 @@ int32_t IpcServiceCmBatchUpdateCredentials(const IpcDataInfo *ipcParams, int32_t int32_t IpcServiceCaAuthCredential(const IpcDataInfo *ipcParams, int32_t paramNum, uintptr_t outCache) { int32_t ret; - DeviceAuthCallback *caCallback = NULL; int32_t osAccountId; int64_t reqId = 0; const char *authParams = NULL; @@ -1750,13 +1688,8 @@ int32_t IpcServiceCaAuthCredential(const IpcDataInfo *ipcParams, int32_t paramNu if (ret != HC_SUCCESS) { return ret; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&caCallback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } /* add call back */ - ret = AddIpcCallBackByReqId(reqId, (const uint8_t *)caCallback, sizeof(DeviceAuthCallback), CB_TYPE_CRED_DEV_AUTH); + ret = AddIpcCallBackByReqId(reqId, CB_TYPE_CRED_DEV_AUTH); if (ret != HC_SUCCESS) { return ret; } @@ -1781,7 +1714,6 @@ int32_t IpcServiceCaProcessCredData(const IpcDataInfo *ipcParams, int32_t paramN { int32_t callRet; int32_t ret; - const DeviceAuthCallback *caCallback = NULL; int64_t reqId = 0; uint8_t *data = NULL; uint32_t dataLen = 0; @@ -1797,13 +1729,8 @@ int32_t IpcServiceCaProcessCredData(const IpcDataInfo *ipcParams, int32_t paramN LOGE("IpcServiceCaProcessCredData failed, get comm data error."); return HC_ERR_IPC_BAD_PARAM; } - inOutLen = sizeof(DeviceAuthCallback); - ret = GetAndValSizeCbParam(ipcParams, paramNum, PARAM_TYPE_DEV_AUTH_CB, (uint8_t *)&caCallback, &inOutLen); - if (ret != HC_SUCCESS) { - return ret; - } /* add call back */ - ret = AddIpcCallBackByReqId(reqId, (const uint8_t *)caCallback, sizeof(DeviceAuthCallback), CB_TYPE_CRED_DEV_AUTH); + ret = AddIpcCallBackByReqId(reqId, CB_TYPE_CRED_DEV_AUTH); if (ret != HC_SUCCESS) { LOGE("add ipc callback failed"); return ret; diff --git a/frameworks/src/lite/ipc_adapt.c b/frameworks/src/lite/ipc_adapt.c index ff969510..cdcfe05b 100644 --- a/frameworks/src/lite/ipc_adapt.c +++ b/frameworks/src/lite/ipc_adapt.c @@ -18,6 +18,7 @@ #include "device_auth_defines.h" #include "hc_log.h" #include "hc_types.h" +#include "hc_vector.h" #include "hc_mutex.h" #include "ipc_callback_stub.h" #include "ipc_dev_auth_proxy.h" @@ -36,7 +37,7 @@ extern "C" { #define IPC_CALL_BACK_MAX_NODES 64 typedef struct { - uintptr_t cbHook; + int32_t callbackId; const IpcDataInfo *cbDataCache; int32_t cacheNum; IpcIo *reply; @@ -44,10 +45,6 @@ typedef struct { typedef void (*CallbackStub)(CallbackParams params); typedef struct { - union { - DeviceAuthCallback devAuth; - DataChangeListener listener; - } cbCtx; int64_t requestId; char appId[BUFF_MAX_SZ]; int32_t cbType; @@ -61,12 +58,273 @@ static struct { IpcCallBackNode *ctx; int32_t nodeCnt; } g_ipcCallBackList = {NULL, 0}; + +typedef struct { + char appId[BUFF_MAX_SZ]; + uint8_t type; + bool delCallBack; + int64_t requestId; + union { + DeviceAuthCallback devAuth; + DataChangeListener listener; + } callback; +} SdkIpcCallBackNode; + +DECLARE_HC_VECTOR(SdkIpcCallBackList, SdkIpcCallBackNode) +IMPLEMENT_HC_VECTOR(SdkIpcCallBackList, SdkIpcCallBackNode, 1) +static SdkIpcCallBackList g_sdkIpcCallBackList; + static HcMutex g_cbListLock; +static HcMutex g_cbSdkListLock; static StubDevAuthCb g_sdkCbStub; static IClientProxy *g_proxyInstance = NULL; static IpcObjectStub g_objectStub; +int32_t InitSdkIpcCallBackList(void) +{ + g_sdkIpcCallBackList = CREATE_HC_VECTOR(SdkIpcCallBackList); + (void)InitHcMutex(&g_cbSdkListLock, false); + return HC_SUCCESS; +} + +void DeInitSdkIpcCallBackList(void) +{ + DestroyHcMutex(&g_cbSdkListLock); + DESTROY_HC_VECTOR(SdkIpcCallBackList, &g_sdkIpcCallBackList); +} + +int32_t AddSdkCallBackByAppId(const char *appId, uint8_t cbType, uint8_t *val, int32_t valSize) +{ + (void)LockHcMutex(&g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = NULL; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == cbType) { + LOGW("start to update callback, appId: %" LOG_PUB "s, cbType: %" LOG_PUB "u", appId, cbType); + if (memcpy_s(&entry->callback, sizeof(entry->callback), val, valSize) != EOK) { + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_MEMORY_COPY; + } + UnlockHcMutex(&g_cbSdkListLock); + return HC_SUCCESS; + } + } + SdkIpcCallBackNode node; + if (memcpy_s(&node.callback, sizeof(node.callback), val, valSize) != EOK) { + UnlockHcMutex(&g_cbSdkListLock); + LOGE("copy callback failed."); + return HC_ERR_MEMORY_COPY; + } + if (memcpy_s(&node.appId, sizeof(node.appId), appId, HcStrlen(appId) + 1) != EOK) { + memset_s(&node, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + UnlockHcMutex(&g_cbSdkListLock); + LOGE("copy appId failed."); + return HC_ERR_MEMORY_COPY; + } + node.delCallBack = false; + node.type = cbType; + if (g_sdkIpcCallBackList.pushBack(&g_sdkIpcCallBackList, &node) == NULL) { + memset_s(&node, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + UnlockHcMutex(&g_cbSdkListLock); + LOGE("Failed ot add callback node"); + return HC_ERR_ALLOC_MEMORY; + } + UnlockHcMutex(&g_cbSdkListLock); + LOGI("AddSdkCallBackByAppId successfully, size: %" LOG_PUB "d, appId: %" LOG_PUB "s, cbType: %" LOG_PUB "u", + g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList), appId, cbType); + return HC_SUCCESS; +} + +int32_t AddSdkCallBackByRequestId(int64_t requestId, uint8_t cbType, uint8_t *val, int32_t valSize) +{ + (void)LockHcMutex(&g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = NULL; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL) { + continue; + } + if (entry->requestId == requestId && entry->type == cbType) { + LOGW("start to update callback, requestId: %" LOG_PUB PRId64 ", cbType: %" LOG_PUB "u", requestId, cbType); + if (memcpy_s(&entry->callback, sizeof(entry->callback), val, valSize) != EOK) { + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_MEMORY_COPY; + } + UnlockHcMutex(&g_cbSdkListLock); + return HC_SUCCESS; + } + } + SdkIpcCallBackNode node; + if (memcpy_s(&node.callback, sizeof(node.callback), val, valSize) != EOK) { + LOGE("copy callback failed."); + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_MEMORY_COPY; + } + node.type = cbType; + node.requestId = requestId; + node.delCallBack = true; + if (g_sdkIpcCallBackList.pushBack(&g_sdkIpcCallBackList, &node) == NULL) { + memset_s(&node, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGE("Failed to add callback node"); + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_ALLOC_MEMORY; + } + LOGI("AddSdkCallBackByRequestId successfully, size: %" LOG_PUB "d, requestId: %" LOG_PUB PRId64 "," + "cbType: %" LOG_PUB "u", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList), requestId, cbType); + UnlockHcMutex(&g_cbSdkListLock); + return HC_SUCCESS; +} + +static uint8_t GetCbType(int32_t callbackId) +{ + if (callbackId >= CB_ID_ON_TRANS && callbackId <= CB_ID_ON_REQUEST) { + return CB_TYPE_DEV_AUTH; + } else if (callbackId >= CB_ID_ON_TRANS_TMP && callbackId <= CB_ID_ON_REQUEST_TMP) { + return CB_TYPE_TMP_DEV_AUTH; + } + return 0; +} + +static int32_t GetSdkCallBackByRequestId(int64_t callbackId, int64_t requestId, uint8_t *val, int32_t valSize) +{ + LOGI("requestId: %" LOG_PUB PRId64 ", callbackId: %" LOG_PUB PRId64 ".", requestId, callbackId); + uint8_t cbType = GetCbType(callbackId); + if (cbType == 0) { + return HC_ERR_IPC_CALLBACK_NOT_MATCH; + } + uint32_t index; + (void)LockHcMutex(&g_cbSdkListLock); + SdkIpcCallBackNode *entry = NULL; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL) { + continue; + } + if (entry->requestId == requestId && entry->type == cbType) { + if (memcpy_s(val, valSize, &entry->callback, valSize) != EOK) { + LOGE("copy callback failed."); + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_MEMORY_COPY; + } + UnlockHcMutex(&g_cbSdkListLock); + return HC_SUCCESS; + } + } + LOGE("callback not found."); + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_IPC_CALLBACK_NOT_MATCH; +} + +static int32_t GetSdkCallBackByAppId(const char *appId, uint8_t cbType, uint8_t *val, int32_t valSize) +{ + (void)LockHcMutex(&g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = NULL; + LOGI("appId: %" LOG_PUB "s, cbType: %" LOG_PUB "u", appId, cbType); + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == cbType) { + if (memcpy_s(val, valSize, &entry->callback, valSize) != EOK) { + UnlockHcMutex(&g_cbSdkListLock); + LOGE("copy callback failed."); + return HC_ERR_MEMORY_COPY; + } + UnlockHcMutex(&g_cbSdkListLock); + return HC_SUCCESS; + } + } + LOGW("callback not found, cbType: %" LOG_PUB "u", cbType); + UnlockHcMutex(&g_cbSdkListLock); + return HC_ERR_IPC_CALLBACK_NOT_MATCH; +} + +static void RemoveSdkCallBackByCallBackId(int64_t callbackId, int64_t requestId) +{ + LOGI("requestId: %" LOG_PUB PRId64 ", callbackId: %" LOG_PUB PRId64 "", requestId, callbackId); + uint8_t cbType = GetCbType(callbackId); + if (cbType == 0) { + return; + } + RemoveSdkCallBackByRequestId(requestId, cbType); +} + +int32_t AddRequestIdByAppId(const char *appId, int64_t requestId) +{ + (void)LockHcMutex(&g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = NULL; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == CB_TYPE_DEV_AUTH) { + LOGI("AddRequestIdByAppId successfully, requestId: %" LOG_PUB PRId64 ", appId: %" LOG_PUB "s", + requestId, appId); + entry->requestId = requestId; + UnlockHcMutex(&g_cbSdkListLock); + return HC_SUCCESS; + } + } + UnlockHcMutex(&g_cbSdkListLock); + LOGE("callback not found."); + return HC_ERR_IPC_CALLBACK_NOT_MATCH; +} + +void RemoveSdkCallBackByAppId(const char *appId, uint8_t cbType) +{ + (void)LockHcMutex(&g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = NULL; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == cbType) { + SdkIpcCallBackNode deleteNode; + HC_VECTOR_POPELEMENT(&g_sdkIpcCallBackList, &deleteNode, index); + LOGI("deleteNode appId : %" LOG_PUB "s, requestId : %" LOG_PUB PRId64 ", cbType : %" LOG_PUB "u", + deleteNode.appId, deleteNode.requestId, cbType); + (void)memset_s(&deleteNode, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGI("g_sdkIpcCallBackList size : %" LOG_PUB "d", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList)); + UnlockHcMutex(&g_cbSdkListLock); + return; + } + } + LOGW("callback not found."); + UnlockHcMutex(&g_cbSdkListLock); + return; +} + +void RemoveSdkCallBackByRequestId(int64_t requestId, uint8_t cbType) +{ + (void)LockHcMutex(&g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = NULL; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == NULL) { + continue; + } + if (entry->requestId == requestId && entry->type == cbType && entry->delCallBack) { + SdkIpcCallBackNode deleteNode; + HC_VECTOR_POPELEMENT(&g_sdkIpcCallBackList, &deleteNode, index); + LOGI("deleteNode appId : %" LOG_PUB "s, requestId : %" LOG_PUB PRId64 ", cbType : %" LOG_PUB "u", + deleteNode.appId, requestId, cbType); + (void)memset_s(&deleteNode, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGI("g_sdkIpcCallBackList size : %" LOG_PUB "d", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList)); + UnlockHcMutex(&g_cbSdkListLock); + return; + } + } + LOGW("callback not fuond."); + UnlockHcMutex(&g_cbSdkListLock); + return; +} + int32_t GetAndValSize32Param(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t paramType, uint8_t *param, int32_t *paramSize) { @@ -264,7 +522,7 @@ void AddIpcCbObjByAppId(const char *appId, int32_t objIdx, int32_t type) return; } -int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t cbSz, int32_t type) +int32_t AddIpcCallBackByAppId(const char *appId, int32_t type) { if (g_ipcCallBackList.ctx == NULL) { LOGE("list not inited"); @@ -280,11 +538,6 @@ int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t c IpcCallBackNode *node = GetIpcCallBackByAppId(appId, type); if (node != NULL) { - if (memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz) != EOK) { - LOGE("callback context memory copy failed"); - UnLockCallbackList(); - return HC_ERR_MEMORY_COPY; - } if (node->proxyId >= 0) { ResetRemoteObject(node->proxyId); node->proxyId = -1; @@ -306,12 +559,6 @@ int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t c LOGE("appid memory copy failed"); return HC_ERROR; } - if (memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz) != EOK) { - ResetIpcCallBackNode(node); - UnLockCallbackList(); - LOGE("callback context memory copy failed"); - return HC_ERROR; - } node->proxyId = -1; g_ipcCallBackList.nodeCnt++; UnLockCallbackList(); @@ -398,10 +645,8 @@ void AddIpcCbObjByReqId(int64_t reqId, int32_t objIdx, int32_t type) return; } -int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, int32_t type) +int32_t AddIpcCallBackByReqId(int64_t reqId, int32_t type) { - errno_t eno; - if (g_ipcCallBackList.ctx == NULL) { LOGE("list is full"); return HC_ERROR; @@ -416,12 +661,6 @@ int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, IpcCallBackNode *node = GetIpcCallBackByReqId(reqId, type); if (node != NULL) { - eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz); - if (eno != EOK) { - UnLockCallbackList(); - LOGE("callback context memory copy failed"); - return HC_ERROR; - } if (node->proxyId >= 0) { ResetRemoteObject(node->proxyId); node->proxyId = -1; @@ -438,13 +677,6 @@ int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, } node->cbType = type; node->requestId = reqId; - eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz); - if (eno != EOK) { - UnLockCallbackList(); - ResetIpcCallBackNode(node); - LOGE("callback context memory copy failed"); - return HC_ERROR; - } node->delOnFni = 1; node->proxyId = -1; g_ipcCallBackList.nodeCnt++; @@ -487,15 +719,25 @@ static void OnTransmitStub(CallbackParams params) uint8_t *data = NULL; uint32_t dataLen = 0u; bool bRet = false; - bool (*onTransmitHook)(int64_t, uint8_t *, uint32_t) = (bool (*)(int64_t, uint8_t *, uint32_t))(params.cbHook); + DeviceAuthCallback callback; + int32_t ret; (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, (uint8_t *)(&requestId), &inOutLen); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_COMM_DATA, (uint8_t *)&data, (int32_t *)(&dataLen)); - - bRet = onTransmitHook(requestId, data, dataLen); - (bRet == true) ? WriteInt32(params.reply, HC_SUCCESS) : WriteInt32(params.reply, HC_ERROR); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, (uint8_t *)(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + WriteInt32(params.reply, ret); + return; + } + if (callback.onTransmit != NULL) { + bRet = callback.onTransmit(requestId, data, dataLen); + LOGI("onTransmit successfully."); + (bRet == true) ? WriteInt32(params.reply, HC_SUCCESS) : WriteInt32(params.reply, HC_ERROR); + } return; } @@ -505,15 +747,24 @@ static void OnSessKeyStub(CallbackParams params) int32_t inOutLen = sizeof(requestId); uint8_t *keyData = NULL; uint32_t dataLen = 0u; - void (*onSessKeyHook)(int64_t, uint8_t *, uint32_t) = (void (*)(int64_t, uint8_t *, uint32_t))(params.cbHook); + int32_t ret; + DeviceAuthCallback callback; (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, (uint8_t *)(&requestId), &inOutLen); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_SESS_KEY, (uint8_t *)(&keyData), (int32_t *)(&dataLen)); - - onSessKeyHook(requestId, keyData, dataLen); - WriteInt32(params.reply, HC_SUCCESS); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, (uint8_t *)(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + return; + } + if (callback.onSessionKeyReturned != NULL) { + callback.onSessionKeyReturned(requestId, keyData, dataLen); + WriteInt32(params.reply, HC_SUCCESS); + LOGI("onSessionKeyReturned successfully."); + } return; } @@ -523,7 +774,8 @@ static void OnFinishStub(CallbackParams params) int32_t opCode = 0; int32_t inOutLen; char *data = NULL; - void (*onFinishHook)(int64_t, int32_t, char *) = (void (*)(int64_t, int32_t, char *))(params.cbHook); + DeviceAuthCallback callback; + int32_t ret; inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, @@ -532,9 +784,18 @@ static void OnFinishStub(CallbackParams params) (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE, (uint8_t *)(&opCode), &inOutLen); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_COMM_DATA, (uint8_t *)(&data), NULL); - - onFinishHook(requestId, opCode, data); - WriteInt32(params.reply, HC_SUCCESS); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, (uint8_t *)(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + return; + } + if (callback.onFinish != NULL) { + callback.onFinish(requestId, opCode, data); + RemoveSdkCallBackByCallBackId(params.callbackId, requestId); + WriteInt32(params.reply, HC_SUCCESS); + LOGI("onFinish successfully."); + } return; } @@ -545,8 +806,8 @@ static void OnErrorStub(CallbackParams params) int32_t errCode = 0; int32_t inOutLen; char *errInfo = NULL; - void (*onErrorHook)(int64_t, int32_t, int32_t, char *) = - (void (*)(int64_t, int32_t, int32_t, char *))(params.cbHook); + int32_t ret; + DeviceAuthCallback callback; inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, @@ -558,9 +819,19 @@ static void OnErrorStub(CallbackParams params) (uint8_t *)(&errCode), &inOutLen); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_ERR_INFO, (uint8_t *)(&errInfo), NULL); - - onErrorHook(requestId, opCode, errCode, errInfo); - WriteInt32(params.reply, HC_SUCCESS); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, (uint8_t *)(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + WriteInt32(params.reply, ret); + return; + } + if (callback.onError != NULL) { + callback.onError(requestId, opCode, errCode, errInfo); + RemoveSdkCallBackByCallBackId(params.callbackId, requestId); + LOGI("onError successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } @@ -571,7 +842,8 @@ static void OnRequestStub(CallbackParams params) int32_t inOutLen; char *reqParams = NULL; char *reqResult = NULL; - char *(*onReqHook)(int64_t, int32_t, char *) = (char *(*)(int64_t, int32_t, char *))(params.cbHook); + int32_t ret; + DeviceAuthCallback callback; inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, @@ -582,136 +854,212 @@ static void OnRequestStub(CallbackParams params) (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQ_INFO, (uint8_t *)(&reqParams), NULL); - reqResult = onReqHook(requestId, opCode, reqParams); - if (reqResult == NULL) { - WriteInt32(params.reply, HC_ERROR); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, (uint8_t *)(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + WriteInt32(params.reply, ret); return; } - WriteInt32(params.reply, HC_SUCCESS); - WriteString(params.reply, (const char *)(reqResult)); - HcFree(reqResult); - reqResult = NULL; + if (callback.onRequest != NULL) { + reqResult = callback.onRequest(requestId, opCode, reqParams); + if (reqResult == NULL) { + WriteInt32(params.reply, HC_ERROR); + return; + } + LOGI("onRequest successfully."); + WriteInt32(params.reply, HC_SUCCESS); + WriteString(params.reply, (const char *)(reqResult)); + HcFree(reqResult); + reqResult = NULL; + } return; } static void OnGroupCreatedStub(CallbackParams params) { const char *groupInfo = NULL; - void (*onGroupCreatedHook)(const char *) = (void (*)(const char *))(params.cbHook); + const char *appId = NULL; + DataChangeListener callback; (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); - onGroupCreatedHook(groupInfo); - WriteInt32(params.reply, HC_SUCCESS); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onGroupCreated != NULL) { + callback.onGroupCreated(groupInfo); + LOGI("onGroupCreated successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } static void OnGroupDeletedStub(CallbackParams params) { const char *groupInfo = NULL; - void (*onDelGroupHook)(const char *) = (void (*)(const char *))(params.cbHook); + const char *appId = NULL; + DataChangeListener callback; (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL); - - onDelGroupHook(groupInfo); - WriteInt32(params.reply, HC_SUCCESS); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onGroupDeleted != NULL) { + callback.onGroupDeleted(groupInfo); + LOGI("onGroupDeleted successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } static void OnDevBoundStub(CallbackParams params) { const char *groupInfo = NULL; + const char *appId = NULL; + DataChangeListener callback; const char *udid = NULL; - void (*onDevBoundHook)(const char *, const char *) = (void (*)(const char *, const char *))(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL); - - onDevBoundHook(udid, groupInfo); - WriteInt32(params.reply, HC_SUCCESS); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onDeviceBound != NULL) { + callback.onDeviceBound(udid, groupInfo); + LOGI("onDeviceBound successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } static void OnDevUnboundStub(CallbackParams params) { const char *groupInfo = NULL; + const char *appId = NULL; + DataChangeListener callback; const char *udid = NULL; - void (*onDevUnBoundHook)(const char *, const char *) = (void (*)(const char *, const char *))(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL); - - onDevUnBoundHook(udid, groupInfo); - WriteInt32(params.reply, HC_SUCCESS); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onDeviceUnBound != NULL) { + callback.onDeviceUnBound(udid, groupInfo); + LOGI("onDeviceUnBound successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } static void OnDevUnTrustStub(CallbackParams params) { + const char *appId = NULL; + DataChangeListener callback; const char *udid = NULL; - void (*onDevUnTrustHook)(const char *) = (void (*)(const char *))(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL); - - onDevUnTrustHook(udid); - WriteInt32(params.reply, HC_SUCCESS); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onDeviceNotTrusted != NULL) { + callback.onDeviceNotTrusted(udid); + LOGI("onDeviceNotTrusted successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } static void OnDelLastGroupStub(CallbackParams params) { + const char *appId = NULL; + DataChangeListener callback; const char *udid = NULL; int32_t groupType = 0; - int32_t inOutLen; - void (*onDelLastGroupHook)(const char *, int32_t) = (void (*)(const char *, int32_t))(params.cbHook); - + int32_t inOutLen = 0; (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL); inOutLen = sizeof(groupType); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_TYPE, (uint8_t *)(&groupType), &inOutLen); - - onDelLastGroupHook(udid, groupType); - WriteInt32(params.reply, HC_SUCCESS); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onLastGroupDeleted != NULL) { + callback.onLastGroupDeleted(udid, groupType); + LOGI("onLastGroupDeleted successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } static void OnTrustDevNumChangedStub(CallbackParams params) { + const char *appId = NULL; + DataChangeListener callback; int32_t devNum = 0; - int32_t inOutLen = sizeof(devNum); - void (*onTrustDevNumChangedHook)(int32_t) = (void (*)(int32_t))(params.cbHook); + int32_t inOutLen = 0; (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_DATA_NUM, (uint8_t *)(&devNum), &inOutLen); - - onTrustDevNumChangedHook(devNum); - WriteInt32(params.reply, HC_SUCCESS); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + (uint8_t *)(&appId), NULL); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, (uint8_t *)(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onTrustedDeviceNumChanged != NULL) { + callback.onTrustedDeviceNumChanged(devNum); + LOGI("onTrustedDeviceNumChanged successfully."); + WriteInt32(params.reply, HC_SUCCESS); + } return; } -void ProcCbHook(int32_t callbackId, uintptr_t cbHook, - const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx) +void ProcCbHook(int32_t callbackId, const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx) { CallbackStub stubTable[] = { OnTransmitStub, OnSessKeyStub, OnFinishStub, OnErrorStub, OnRequestStub, OnGroupCreatedStub, OnGroupDeletedStub, OnDevBoundStub, - OnDevUnboundStub, OnDevUnTrustStub, OnDelLastGroupStub, OnTrustDevNumChangedStub + OnDevUnboundStub, OnDevUnTrustStub, OnDelLastGroupStub, OnTrustDevNumChangedStub, + OnTransmitStub, OnSessKeyStub, OnFinishStub, OnErrorStub, OnRequestStub, }; IpcIo *reply = (IpcIo *)(replyCtx); - if ((callbackId < CB_ID_ON_TRANS) || (callbackId > CB_ID_ON_TRUST_DEV_NUM_CHANGED)) { + if ((callbackId < CB_ID_ON_TRANS) || (callbackId > CB_ID_ON_REQUEST_TMP)) { LOGE("Invalid call back id"); return; } - if (cbHook == 0x0) { - LOGE("Invalid call back hook"); - return; - } LOGI("call service callback start. CbId: %" LOG_PUB "d", callbackId); - CallbackParams params = { cbHook, cbDataCache, cacheNum, reply }; + CallbackParams params = { callbackId, cbDataCache, cacheNum, reply }; stubTable[callbackId - 1](params); LOGI("call service callback end"); return; @@ -737,7 +1085,8 @@ static uint32_t EncodeCallData(IpcIo *dataParcel, int32_t type, const uint8_t *p } /* group auth callback adapter */ -static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint32_t dataLen, int32_t type) +static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint32_t dataLen, int32_t type, + int32_t callbackId) { uint32_t ret; IpcIo *dataParcel = NULL; @@ -767,7 +1116,7 @@ static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint3 LOGE("build trans data failed"); return false; } - ActCallback(node->proxyId, CB_ID_ON_TRANS, (uintptr_t)(node->cbCtx.devAuth.onTransmit), dataParcel, &reply); + ActCallback(node->proxyId, callbackId, dataParcel, &reply); UnLockCallbackList(); HcFree((void *)dataParcel); LOGI("process done, request id: %" LOG_PUB PRId64, requestId); @@ -781,15 +1130,16 @@ static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint3 static bool IpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { - return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_DEV_AUTH); + return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_DEV_AUTH, CB_ID_ON_TRANS); } static bool TmpIpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { - return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_TMP_DEV_AUTH); + return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_TMP_DEV_AUTH, CB_ID_ON_TRANS_TMP); } -static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen, int32_t type) +static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen, int32_t type, + int32_t callbackId) { uint32_t ret; IpcIo *dataParcel = NULL; @@ -816,8 +1166,7 @@ static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKe LOGE("build trans data failed"); return; } - ActCallback(node->proxyId, CB_ID_SESS_KEY_DONE, - (uintptr_t)(node->cbCtx.devAuth.onSessionKeyReturned), dataParcel, NULL); + ActCallback(node->proxyId, callbackId, dataParcel, NULL); UnLockCallbackList(); HcFree((void *)dataParcel); LOGI("process done, request id: %" LOG_PUB PRId64, requestId); @@ -826,17 +1175,18 @@ static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKe static void IpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen) { - GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_DEV_AUTH); + GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_DEV_AUTH, CB_ID_SESS_KEY_DONE); return; } static void TmpIpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen) { - GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_TMP_DEV_AUTH); + GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_TMP_DEV_AUTH, CB_ID_SESS_KEY_DONE_TMP); return; } -static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const char *returnData, int32_t type) +static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const char *returnData, int32_t type, + int32_t callbackId) { uint32_t ret; IpcIo *dataParcel = NULL; @@ -867,7 +1217,7 @@ static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const LOGE("build trans data failed"); return; } - ActCallback(node->proxyId, CB_ID_ON_FINISH, (uintptr_t)(node->cbCtx.devAuth.onFinish), dataParcel, NULL); + ActCallback(node->proxyId, callbackId, dataParcel, NULL); /* delete request id */ DelIpcCallBackByReqId(requestId, type, false); UnLockCallbackList(); @@ -878,13 +1228,13 @@ static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const static void IpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData) { - GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_DEV_AUTH); + GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_DEV_AUTH, CB_ID_ON_FINISH); return; } static void TmpIpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData) { - GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_TMP_DEV_AUTH); + GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_TMP_DEV_AUTH, CB_ID_ON_FINISH_TMP); return; } @@ -921,7 +1271,12 @@ static void GaCbOnErrorWithType(int64_t requestId, int32_t operationCode, LOGE("build trans data failed"); return; } - ActCallback(node->proxyId, CB_ID_ON_ERROR, (uintptr_t)(node->cbCtx.devAuth.onError), dataParcel, NULL); + if (type == CB_TYPE_DEV_AUTH) { + ActCallback(node->proxyId, CB_ID_ON_ERROR, dataParcel, NULL); + } + if (type == CB_TYPE_TMP_DEV_AUTH) { + ActCallback(node->proxyId, CB_ID_ON_ERROR_TMP, dataParcel, NULL); + } /* delete request id */ DelIpcCallBackByReqId(requestId, type, false); UnLockCallbackList(); @@ -942,7 +1297,8 @@ static void TmpIpcGaCbOnError(int64_t requestId, int32_t operationCode, int32_t return; } -static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, const char *reqParams, int32_t type) +static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, const char *reqParams, int32_t type, + int32_t callbackId) { int32_t ret; uint32_t uRet; @@ -978,7 +1334,7 @@ static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, con return NULL; } - ActCallback(node->proxyId, CB_ID_ON_REQUEST, (uintptr_t)(node->cbCtx.devAuth.onRequest), dataParcel, &reply); + ActCallback(node->proxyId, callbackId, dataParcel, &reply); UnLockCallbackList(); HcFree((void *)dataParcel); ReadInt32(&reply, &ret); @@ -1018,21 +1374,16 @@ static char *IpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const ch return NULL; } } - return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_DEV_AUTH); + return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_DEV_AUTH, CB_ID_ON_REQUEST); } static char *TmpIpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams) { - return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_TMP_DEV_AUTH); + return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_TMP_DEV_AUTH, CB_ID_ON_REQUEST_TMP); } void IpcOnGroupCreated(const char *groupInfo) { - int32_t i; - uint32_t ret; - IpcIo *dataParcel = NULL; - DataChangeListener *listener = NULL; - if (groupInfo == NULL) { LOGE("IpcOnGroupCreated, params error"); return; @@ -1044,43 +1395,36 @@ void IpcOnGroupCreated(const char *groupInfo) LOGE("IpcCallBackList not initialized."); return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - UnLockCallbackList(); - LOGE("Failed to InitIpcDataCache."); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("IpcGaCbOnRequest, build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onGroupCreated == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED, - (uintptr_t)(listener->onGroupCreated), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } void IpcOnGroupDeleted(const char *groupInfo) { - int32_t i; - uint32_t ret; - IpcIo *dataParcel = NULL; - DataChangeListener *listener = NULL; - if (groupInfo == NULL) { LOGE("GroupInfo is NULL, params error."); return; @@ -1092,43 +1436,36 @@ void IpcOnGroupDeleted(const char *groupInfo) UnLockCallbackList(); return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - LOGE("Failed to init IpcDataCache."); - UnLockCallbackList(); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("IpcGaCbOnRequest, build trans data failed."); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onGroupDeleted == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED, - (uintptr_t)(listener->onGroupDeleted), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } void IpcOnDeviceBound(const char *peerUdid, const char *groupInfo) { - int32_t i; - uint32_t ret; - IpcIo *dataParcel = NULL; - DataChangeListener *listener = NULL; - if ((peerUdid == NULL) || (groupInfo == NULL)) { LOGE("Param is NULL."); return; @@ -1140,44 +1477,38 @@ void IpcOnDeviceBound(const char *peerUdid, const char *groupInfo) UnLockCallbackList(); return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - LOGE("Init ipc data cache occur error."); - UnLockCallbackList(); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("Encode trans data failed."); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onDeviceBound == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND, - (uintptr_t)(listener->onDeviceBound), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), + HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } void IpcOnDeviceUnBound(const char *peerUdid, const char *groupInfo) { - int32_t i; - uint32_t ret; - IpcIo *dataParcel = NULL; - DataChangeListener *listener = NULL; - if ((peerUdid == NULL) || (groupInfo == NULL)) { LOGE("Argument Error"); return; @@ -1189,44 +1520,38 @@ void IpcOnDeviceUnBound(const char *peerUdid, const char *groupInfo) LOGE("CallBackList ctx is not initialized!"); return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - LOGE("Ipc data cache is not init."); - UnLockCallbackList(); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onDeviceUnBound == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND, - (uintptr_t)(listener->onDeviceUnBound), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), + HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } void IpcOnDeviceNotTrusted(const char *peerUdid) { - int32_t i; - uint32_t ret; - IpcIo *dataParcel = NULL; - DataChangeListener *listener = NULL; - if (peerUdid == NULL) { LOGE("Invalid Params!"); return; @@ -1238,42 +1563,36 @@ void IpcOnDeviceNotTrusted(const char *peerUdid) LOGE("IpcCallBackList uninitialized!"); return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - UnLockCallbackList(); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onDeviceNotTrusted == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED, - (uintptr_t)(listener->onDeviceNotTrusted), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), + HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } void IpcOnLastGroupDeleted(const char *peerUdid, int32_t groupType) { - int32_t i; - uint32_t ret; - IpcIo *dataParcel = NULL; - DataChangeListener *listener = NULL; - if (peerUdid == NULL) { LOGE("Error occurs, peerUdid is NULL."); return; @@ -1285,44 +1604,38 @@ void IpcOnLastGroupDeleted(const char *peerUdid, int32_t groupType) LOGE("IpcCallBackList node is not initialized."); return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - LOGE("Error occurs, Ipc data init failed."); - UnLockCallbackList(); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, (const uint8_t *)(&groupType), sizeof(groupType)); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onLastGroupDeleted == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED, - (uintptr_t)(listener->onLastGroupDeleted), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), + HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, + (const uint8_t *)(groupType), sizeof(groupType)); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } void IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum) { - IpcIo *dataParcel = NULL; - int32_t i; - DataChangeListener *listener = NULL; - uint32_t ret; - LockCallbackList(); if (g_ipcCallBackList.ctx == NULL) { LOGE("IpcCallBackList un-initialized"); @@ -1330,33 +1643,30 @@ void IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum) return; } - dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); - if (dataParcel == NULL) { - LOGE("data parcel is NULL."); - UnLockCallbackList(); - return; - } - ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM, - (const uint8_t *)(&curTrustedDeviceNum), sizeof(curTrustedDeviceNum)); - if (ret != HC_SUCCESS) { - UnLockCallbackList(); - HcFree((void *)dataParcel); - LOGE("IpcOnTrustedDeviceNumChanged, build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onTrustedDeviceNumChanged == NULL) { - continue; - } - ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED, - (uintptr_t)(listener->onTrustedDeviceNumChanged), dataParcel, NULL); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + IpcIo *dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ); + if (dataParcel == NULL) { + UnLockCallbackList(); + LOGE("Failed to InitIpcDataCache."); + continue; + } + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM, (const uint8_t *)(&curTrustedDeviceNum), + sizeof(curTrustedDeviceNum)); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, (const uint8_t *)(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + UnLockCallbackList(); + HcFree((void *)dataParcel); + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED, dataParcel, NULL); + HcFree((void *)dataParcel); } UnLockCallbackList(); - HcFree((void *)dataParcel); return; } diff --git a/frameworks/src/lite/ipc_callback_proxy.c b/frameworks/src/lite/ipc_callback_proxy.c index 3586d610..027fd1fb 100644 --- a/frameworks/src/lite/ipc_callback_proxy.c +++ b/frameworks/src/lite/ipc_callback_proxy.c @@ -46,7 +46,7 @@ static void CbProxyFormReplyData(int32_t reqRetVal, IpcIo *replyDst, const IpcIo return; } -void CbProxySendRequest(SvcIdentity sid, int32_t callbackId, uintptr_t cbHook, IpcIo *data, IpcIo *reply) +void CbProxySendRequest(SvcIdentity sid, int32_t callbackId, IpcIo *data, IpcIo *reply) { int32_t ret; IpcIo *reqData = NULL; @@ -60,7 +60,6 @@ void CbProxySendRequest(SvcIdentity sid, int32_t callbackId, uintptr_t cbHook, I return; } WriteInt32(reqData, callbackId); - WritePointer(reqData, cbHook); dataSz = GetIpcIoDataLength((const IpcIo *)data); LOGI("to form callback params data length(%" LOG_PUB "d)", dataSz); if (dataSz > 0) { diff --git a/frameworks/src/lite/ipc_callback_stub.c b/frameworks/src/lite/ipc_callback_stub.c index 4052a0fc..ad51fcef 100644 --- a/frameworks/src/lite/ipc_callback_stub.c +++ b/frameworks/src/lite/ipc_callback_stub.c @@ -26,17 +26,12 @@ extern "C" { #endif -static void DoCallBack(int32_t callbackId, uintptr_t cbHook, IpcIo *data, IpcIo *reply) +static void DoCallBack(int32_t callbackId, IpcIo *data, IpcIo *reply) { int32_t ret; int32_t i; IpcDataInfo cbDataCache[MAX_REQUEST_PARAMS_NUM] = { { 0 } }; - if (cbHook == 0x0) { - LOGE("Invalid call back hook"); - return; - } - uint32_t len = 0; ReadUint32(data, &len); /* skip flat object length information */ for (i = 0; i < MAX_REQUEST_PARAMS_NUM; i++) { @@ -47,7 +42,7 @@ static void DoCallBack(int32_t callbackId, uintptr_t cbHook, IpcIo *data, IpcIo return; } } - ProcCbHook(callbackId, cbHook, cbDataCache, MAX_REQUEST_PARAMS_NUM, (uintptr_t)(reply)); + ProcCbHook(callbackId, cbDataCache, MAX_REQUEST_PARAMS_NUM, (uintptr_t)(reply)); return; } @@ -55,7 +50,6 @@ int32_t CbStubOnRemoteRequest(uint32_t code, IpcIo *data, IpcIo *reply, MessageO { (void)option; int32_t callbackId; - uintptr_t cbHook = 0x0; LOGI("enter invoking callback..."); if (data == NULL) { @@ -67,8 +61,7 @@ int32_t CbStubOnRemoteRequest(uint32_t code, IpcIo *data, IpcIo *reply, MessageO switch (code) { case DEV_AUTH_CALLBACK_REQUEST: ReadInt32(data, &callbackId); - cbHook = ReadPointer(data); - DoCallBack(callbackId, cbHook, data, reply); + DoCallBack(callbackId, data, reply); break; default: LOGE("Invoke callback cmd code(%" LOG_PUB "u) error", code); diff --git a/frameworks/src/lite/ipc_dev_auth_stub.c b/frameworks/src/lite/ipc_dev_auth_stub.c index d2cf8734..bc6eeaff 100644 --- a/frameworks/src/lite/ipc_dev_auth_stub.c +++ b/frameworks/src/lite/ipc_dev_auth_stub.c @@ -345,7 +345,7 @@ void ResetRemoteObject(int32_t idx) return; } -void ActCallback(int32_t objIdx, int32_t callbackId, uintptr_t cbHook, IpcIo *dataParcel, IpcIo *reply) +void ActCallback(int32_t objIdx, int32_t callbackId, IpcIo *dataParcel, IpcIo *reply) { if ((objIdx < 0) || (objIdx >= MAX_CBSTUB_SIZE) || (!g_cbStub[objIdx].inUse)) { LOGW("nothing to do, callback id %" LOG_PUB "d, remote object id %" LOG_PUB "d", callbackId, objIdx); @@ -354,7 +354,7 @@ void ActCallback(int32_t objIdx, int32_t callbackId, uintptr_t cbHook, IpcIo *da ShowIpcSvcInfo(&g_cbStub[objIdx].cbStub); LockCbStubTable(); - CbProxySendRequest(g_cbStub[objIdx].cbStub, callbackId, cbHook, dataParcel, reply); + CbProxySendRequest(g_cbStub[objIdx].cbStub, callbackId, dataParcel, reply); UnLockCbStubTable(); return; } diff --git a/frameworks/src/standard/ipc_adapt.cpp b/frameworks/src/standard/ipc_adapt.cpp index 394a9879..f34bea5c 100644 --- a/frameworks/src/standard/ipc_adapt.cpp +++ b/frameworks/src/standard/ipc_adapt.cpp @@ -17,17 +17,16 @@ #include "common_defs.h" #include "hc_log.h" #include "hc_types.h" +#include "hc_vector.h" #include "ipc_callback_proxy.h" #include "ipc_callback_stub.h" #include "ipc_dev_auth_proxy.h" #include "ipc_dev_auth_stub.h" -#include "ipc_sdk_defines.h" #include "ipc_skeleton.h" #include "iservice_registry.h" #include "securec.h" #include "system_ability_definition.h" #include "parameter.h" -#include "sa_load_on_demand.h" #include "string_util.h" using namespace std; @@ -44,7 +43,7 @@ namespace { static sptr g_sdkCbStub[IPC_CALL_BACK_STUB_NODES] = { nullptr, nullptr, nullptr, nullptr }; typedef struct { - uintptr_t cbHook; + int32_t callbackId; const IpcDataInfo *cbDataCache; int32_t cacheNum; MessageParcel &reply; @@ -52,11 +51,6 @@ typedef struct { typedef void (*CallbackStub)(CallbackParams params); typedef struct { - union { - DeviceAuthCallback devAuth; - DataChangeListener listener; - CredChangeListener credListener; - } cbCtx; int64_t requestId; char appId[BUFF_MAX_SZ]; int32_t cbType; @@ -70,7 +64,284 @@ static struct { IpcCallBackNode *ctx; int32_t nodeCnt; } g_ipcCallBackList = {nullptr, 0}; + +typedef struct { + char appId[BUFF_MAX_SZ]; + uint8_t type; + bool delCallBack; + int64_t requestId; + union { + DeviceAuthCallback devAuth; + DataChangeListener listener; + CredChangeListener credListener; + } callback; +} SdkIpcCallBackNode; + +DECLARE_HC_VECTOR(SdkIpcCallBackList, SdkIpcCallBackNode) +IMPLEMENT_HC_VECTOR(SdkIpcCallBackList, SdkIpcCallBackNode, 1) +static SdkIpcCallBackList g_sdkIpcCallBackList; + static std::mutex g_cbListLock; +static std::mutex g_cbSdkListLock; + +int32_t InitSdkIpcCallBackList(void) +{ + g_sdkIpcCallBackList = CREATE_HC_VECTOR(SdkIpcCallBackList); + return HC_SUCCESS; +} + +void DeInitSdkIpcCallBackList(void) +{ + DESTROY_HC_VECTOR(SdkIpcCallBackList, &g_sdkIpcCallBackList); + return; +} + +int32_t AddSdkCallBackByAppId(const char *appId, uint8_t cbType, uint8_t *val, int32_t valSize) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == cbType) { + LOGW("start to update callback, appId: %" LOG_PUB "s, cbType: %" LOG_PUB "u", appId, cbType); + if (memcpy_s(&entry->callback, sizeof(entry->callback), val, valSize) != EOK) { + return HC_ERR_MEMORY_COPY; + } + return HC_SUCCESS; + } + } + SdkIpcCallBackNode node; + if (memcpy_s(&node.callback, sizeof(node.callback), val, valSize) != EOK) { + LOGE("copy callback failed."); + return HC_ERR_MEMORY_COPY; + } + if (memcpy_s(&node.appId, sizeof(node.appId), appId, HcStrlen(appId) + 1) != EOK) { + memset_s(&node, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGE("copy appId failed."); + return HC_ERR_MEMORY_COPY; + } + node.delCallBack = false; + node.type = cbType; + if (g_sdkIpcCallBackList.pushBack(&g_sdkIpcCallBackList, &node) == nullptr) { + memset_s(&node, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGE("Failed to add callback node"); + return HC_ERR_ALLOC_MEMORY; + } + LOGI("AddSdkCallBackByAppId successfully, size: %" LOG_PUB "d, appId: %" LOG_PUB "s, cbType: %" LOG_PUB "u", + g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList), appId, cbType); + return HC_SUCCESS; +} + +int32_t AddSdkCallBackByRequestId(int64_t requestId, uint8_t cbType, uint8_t *val, int32_t valSize) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr) { + continue; + } + if (entry->requestId == requestId && entry->type == cbType) { + LOGW("start to update callback, requestId: %" LOG_PUB "lld, cbType: %" LOG_PUB "u", + static_cast(requestId), cbType); + if (memcpy_s(&entry->callback, sizeof(entry->callback), val, valSize) != EOK) { + return HC_ERR_MEMORY_COPY; + } + return HC_SUCCESS; + } + } + SdkIpcCallBackNode node; + if (memcpy_s(&node.callback, sizeof(node.callback), val, valSize) != EOK) { + LOGE("copy callback failed."); + return HC_ERR_MEMORY_COPY; + } + node.type = cbType; + node.requestId = requestId; + node.delCallBack = true; + if (g_sdkIpcCallBackList.pushBack(&g_sdkIpcCallBackList, &node) == nullptr) { + memset_s(&node, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGE("Failed to add callback node"); + return HC_ERR_ALLOC_MEMORY; + } + LOGI("AddSdkCallBackByRequestId successfully, size: %" LOG_PUB "d, requestId: %" LOG_PUB "lld, " + "cbType: %" LOG_PUB "u", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList), + static_cast(requestId), cbType); + return HC_SUCCESS; +} + +static uint8_t GetCbType(int32_t callbackId) +{ + if (callbackId >= CB_ID_ON_TRANS && callbackId <= CB_ID_ON_REQUEST) { + return CB_TYPE_DEV_AUTH; + } else if (callbackId >= CB_ID_ON_TRANS_TMP && callbackId <= CB_ID_ON_REQUEST_TMP) { + return CB_TYPE_TMP_DEV_AUTH; + } else if (callbackId >= CB_ID_ON_TRANS_CRED && callbackId <= CB_ID_ON_REQUEST_CRED) { + return CB_TYPE_CRED_DEV_AUTH; + } + return 0; +} + +static int32_t GetSdkCallBackByRequestId(int64_t callbackId, int64_t requestId, uint8_t *val, int32_t valSize) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + LOGI("requestId: %" LOG_PUB "lld, callbackId: %" LOG_PUB "lld", static_cast(requestId), + static_cast(callbackId)); + uint8_t cbType = GetCbType(callbackId); + if (cbType == 0) { + return HC_ERR_IPC_CALLBACK_NOT_MATCH; + } + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr) { + continue; + } + if (entry->requestId == requestId && entry->type == cbType) { + if (memcpy_s(val, valSize, &entry->callback, valSize) != EOK) { + LOGE("copy callback failed."); + return HC_ERR_MEMORY_COPY; + } + return HC_SUCCESS; + } + } + LOGE("callback not found."); + return HC_ERR_IPC_CALLBACK_NOT_MATCH; +} + +static int32_t GetSdkCallBackByAppId(const char *appId, uint8_t cbType, uint8_t *val, int32_t valSize) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + LOGI("appId: %" LOG_PUB "s, cbType: %" LOG_PUB "u", appId, cbType); + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == cbType) { + if (memcpy_s(val, valSize, &entry->callback, valSize) != EOK) { + LOGE("copy callback failed."); + return HC_ERR_MEMORY_COPY; + } + return HC_SUCCESS; + } + } + LOGE("callback not found."); + return HC_ERR_IPC_CALLBACK_NOT_MATCH; +} + +static void RemoveSdkCallBackByCallBackId(int64_t callbackId, int64_t requestId) +{ + LOGI("requestId: %" LOG_PUB "lld, callbackId: %" LOG_PUB "lld", static_cast(requestId), + static_cast(callbackId)); + uint8_t cbType = GetCbType(callbackId); + if (cbType == 0) { + return; + } + RemoveSdkCallBackByRequestId(requestId, cbType); +} + +int32_t AddRequestIdByAppId(const char *appId, int64_t requestId) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == CB_TYPE_DEV_AUTH) { + LOGI("AddRequestIdByAppId successfully, requestId: %" LOG_PUB "lld, appId: %" LOG_PUB "s", + static_cast(requestId), appId); + entry->requestId = requestId; + return HC_SUCCESS; + } + } + LOGE("callback not found."); + return HC_ERR_IPC_CALLBACK_NOT_MATCH; +} + +void RemoveSdkCallBackByAppId(const char *appId, uint8_t cbType) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr || entry->appId[0] == 0) { + continue; + } + if (IsStrEqual(entry->appId, appId) && entry->type == cbType) { + SdkIpcCallBackNode deleteNode; + HC_VECTOR_POPELEMENT(&g_sdkIpcCallBackList, &deleteNode, index); + LOGI("deleteNode appId : %" LOG_PUB "s, requestId : %" LOG_PUB "lld, cbType : %" LOG_PUB "u", + deleteNode.appId, static_cast(deleteNode.requestId), cbType); + (void)memset_s(&deleteNode, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGI("g_sdkIpcCallBackList size : %" LOG_PUB "d", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList)); + return; + } + } + LOGW("callback not found."); + return; +} + +void RemoveSdkCallBackByRequestId(int64_t requestId, uint8_t cbType) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr) { + continue; + } + if (entry->requestId == requestId && entry->type == cbType && entry->delCallBack) { + SdkIpcCallBackNode deleteNode; + HC_VECTOR_POPELEMENT(&g_sdkIpcCallBackList, &deleteNode, index); + LOGI("deleteNode appId : %" LOG_PUB "s, requestId : %" LOG_PUB "lld, cbType : %" LOG_PUB "u", + deleteNode.appId, static_cast(requestId), cbType); + (void)memset_s(&deleteNode, sizeof(SdkIpcCallBackNode), 0, sizeof(SdkIpcCallBackNode)); + LOGI("g_sdkIpcCallBackList size : %" LOG_PUB "d", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList)); + return; + } + } + LOGW("callback not found, cbType: %" LOG_PUB "u", cbType); + return; +} + +void RegisterSdkCallBack(RegCallbackFunc regCallbackFunc, RegDataChangeListenerFunc regDataChangeListenerFunc, + RegCredChangeListenerFunc regCredChangeListenerFunc) +{ + std::lock_guard autoLock(g_cbSdkListLock); + uint32_t index; + SdkIpcCallBackNode *entry = nullptr; + int32_t ret = HC_SUCCESS; + LOGI("g_sdkIpcCallBackList size: %" LOG_PUB "d", g_sdkIpcCallBackList.size(&g_sdkIpcCallBackList)); + FOR_EACH_HC_VECTOR(g_sdkIpcCallBackList, index, entry) { + if (entry == nullptr || entry->appId[0] == 0) { + continue; + } + switch (entry->type) { + case CB_TYPE_DEV_AUTH: + LOGI("regCallback."); + ret = regCallbackFunc(entry->appId, &entry->callback.devAuth, false); + break; + case CB_TYPE_LISTENER: + LOGI("regDataChangeListener."); + ret = regDataChangeListenerFunc(entry->appId, &entry->callback.listener, false); + break; + case CB_TYPE_CRED_LISTENER: + LOGI("regCredChangeListener."); + ret = regCredChangeListenerFunc(entry->appId, &entry->callback.credListener, false); + break; + default: + LOGE("invalid callback type: %" LOG_PUB "d.", entry->type); + break; + } + LOGI("register result: %" LOG_PUB "d.", ret); + } +} int32_t GetAndValSize32Param(const IpcDataInfo *ipcParams, int32_t paramNum, int32_t paramType, uint8_t *param, int32_t *paramSize) @@ -111,12 +382,12 @@ int32_t GetAndValNullParam(const IpcDataInfo *ipcParams, (void)paramSize; int32_t size = 0; int32_t ret = GetIpcRequestParamByType(ipcParams, paramNum, paramType, param, &size); - if ((ret != HC_SUCCESS) || (param == NULL) || (size <= 0)) { + if ((ret != HC_SUCCESS) || (param == nullptr) || (size <= 0)) { LOGE("get param error, type %" LOG_PUB "d", paramType); return HC_ERR_IPC_BAD_PARAM; } char *str = (*(char **)param); - if ((str == NULL) || (str[size - 1] != '\0')) { + if ((str == nullptr) || (str[size - 1] != '\0')) { LOGE("The input parameter is not a valid string type."); return HC_ERR_IPC_BAD_PARAM; } @@ -265,7 +536,7 @@ void AddIpcCbObjByAppId(const char *appId, int32_t objIdx, int32_t type) return; } -int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t cbSz, int32_t type) +int32_t AddIpcCallBackByAppId(const char *appId, int32_t type) { IpcCallBackNode *node = nullptr; errno_t eno; @@ -283,11 +554,6 @@ int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t c node = GetIpcCallBackByAppId(appId, type); if (node != nullptr) { - eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz); - if (eno != EOK) { - LOGE("Callback context memory copy failed"); - return HC_ERROR; - } if (node->proxyId >= 0) { ServiceDevAuth::ResetRemoteObject(node->proxyId); node->proxyId = DEFAULT_CALLBACK_PROXY_ID; @@ -308,12 +574,6 @@ int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t c LOGE("appid memory copy failed"); return HC_ERROR; } - eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz); - if (eno != EOK) { - ResetIpcCallBackNode(*node); - LOGE("callback context memory copy failed"); - return HC_ERROR; - } node->proxyId = DEFAULT_CALLBACK_PROXY_ID; g_ipcCallBackList.nodeCnt++; LOGI("callback add success, appid: %" LOG_PUB "s, type %" LOG_PUB "d", node->appId, node->cbType); @@ -395,10 +655,9 @@ void AddIpcCbObjByReqId(int64_t reqId, int32_t objIdx, int32_t type) return; } -int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, int32_t type) +int32_t AddIpcCallBackByReqId(int64_t reqId, int32_t type) { IpcCallBackNode *node = nullptr; - errno_t eno; std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { @@ -413,11 +672,6 @@ int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, node = GetIpcCallBackByReqId(reqId, type); if (node != nullptr) { - eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz); - if (eno != EOK) { - LOGE("callback context memory copy failed"); - return HC_ERROR; - } if (node->proxyId >= 0) { ServiceDevAuth::ResetRemoteObject(node->proxyId); node->proxyId = DEFAULT_CALLBACK_PROXY_ID; @@ -436,12 +690,6 @@ int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, } node->cbType = type; node->requestId = reqId; - eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz); - if (eno != EOK) { - ResetIpcCallBackNode(*node); - LOGE("callback context memory copy failed"); - return HC_ERROR; - } node->delOnFni = 1; node->proxyId = DEFAULT_CALLBACK_PROXY_ID; g_ipcCallBackList.nodeCnt++; @@ -484,16 +732,26 @@ __attribute__((no_sanitize("cfi"))) static void OnTransmitStub(CallbackParams pa uint8_t *data = nullptr; uint32_t dataLen = 0u; bool bRet = false; - bool (*onTransmitHook)(int64_t, uint8_t *, uint32_t) = nullptr; + DeviceAuthCallback callback; + int32_t ret; - onTransmitHook = reinterpret_cast(params.cbHook); inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, reinterpret_cast(&requestId), &inOutLen); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_COMM_DATA, reinterpret_cast(&data), reinterpret_cast(&dataLen)); - bRet = onTransmitHook(requestId, data, dataLen); - (bRet == true) ? params.reply.WriteInt32(HC_SUCCESS) : params.reply.WriteInt32(HC_ERROR); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, reinterpret_cast(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + params.reply.WriteInt32(ret); + return; + } + if (callback.onTransmit != nullptr) { + bRet = callback.onTransmit(requestId, data, dataLen); + LOGI("onTransmit successfully."); + (bRet == true) ? params.reply.WriteInt32(HC_SUCCESS) : params.reply.WriteInt32(HC_ERROR); + } return; } @@ -503,16 +761,25 @@ __attribute__((no_sanitize("cfi"))) static void OnSessKeyStub(CallbackParams par int32_t inOutLen = 0; uint8_t *keyData = nullptr; uint32_t dataLen = 0u; - void (*onSessKeyHook)(int64_t, uint8_t *, uint32_t) = nullptr; + int32_t ret; + DeviceAuthCallback callback; (void)params.reply; - onSessKeyHook = reinterpret_cast(params.cbHook); inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, reinterpret_cast(&requestId), &inOutLen); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_SESS_KEY, reinterpret_cast(&keyData), reinterpret_cast(&dataLen)); - onSessKeyHook(requestId, keyData, dataLen); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, reinterpret_cast(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + return; + } + if (callback.onSessionKeyReturned != nullptr) { + callback.onSessionKeyReturned(requestId, keyData, dataLen); + LOGI("onSessionKeyReturned successfully."); + } return; } @@ -522,10 +789,10 @@ __attribute__((no_sanitize("cfi"))) static void OnFinishStub(CallbackParams para int32_t opCode = 0; int32_t inOutLen = 0; char *data = nullptr; - void (*onFinishHook)(int64_t, int32_t, char *) = nullptr; + DeviceAuthCallback callback; + int32_t ret; (void)params.reply; - onFinishHook = reinterpret_cast(params.cbHook); inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, reinterpret_cast(&requestId), &inOutLen); @@ -534,7 +801,17 @@ __attribute__((no_sanitize("cfi"))) static void OnFinishStub(CallbackParams para reinterpret_cast(&opCode), &inOutLen); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_COMM_DATA, reinterpret_cast(&data), nullptr); - onFinishHook(requestId, opCode, data); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, reinterpret_cast(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + return; + } + if (callback.onFinish != nullptr) { + callback.onFinish(requestId, opCode, data); + RemoveSdkCallBackByCallBackId(params.callbackId, requestId); + LOGI("onFinish successfully."); + } return; } @@ -544,10 +821,10 @@ __attribute__((no_sanitize("cfi"))) static void OnErrorStub(CallbackParams param int32_t opCode = 0; int32_t errCode = 0; int32_t inOutLen = 0; + int32_t ret; char *errInfo = nullptr; - void (*onErrorHook)(int64_t, int32_t, int32_t, char *) = nullptr; + DeviceAuthCallback callback; - onErrorHook = reinterpret_cast(params.cbHook); inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, reinterpret_cast(&requestId), &inOutLen); @@ -558,7 +835,18 @@ __attribute__((no_sanitize("cfi"))) static void OnErrorStub(CallbackParams param reinterpret_cast(&errCode), &inOutLen); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_ERR_INFO, reinterpret_cast(&errInfo), nullptr); - onErrorHook(requestId, opCode, errCode, errInfo); + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, reinterpret_cast(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + params.reply.WriteInt32(ret); + return; + } + if (callback.onError != nullptr) { + callback.onError(requestId, opCode, errCode, errInfo); + RemoveSdkCallBackByCallBackId(params.callbackId, requestId); + LOGI("onError successfully."); + } return; } @@ -569,9 +857,9 @@ __attribute__((no_sanitize("cfi"))) static void OnRequestStub(CallbackParams par int32_t inOutLen = 0; char *reqParams = nullptr; char *reqResult = nullptr; - char *(*onReqHook)(int64_t, int32_t, char *) = nullptr; + int32_t ret; + DeviceAuthCallback callback; - onReqHook = reinterpret_cast(params.cbHook); inOutLen = sizeof(requestId); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID, reinterpret_cast(&requestId), &inOutLen); @@ -580,179 +868,288 @@ __attribute__((no_sanitize("cfi"))) static void OnRequestStub(CallbackParams par reinterpret_cast(&opCode), &inOutLen); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQ_INFO, reinterpret_cast(&reqParams), nullptr); - reqResult = onReqHook(requestId, opCode, reqParams); - if (reqResult == nullptr) { - params.reply.WriteInt32(HC_ERROR); + + ret = GetSdkCallBackByRequestId(params.callbackId, requestId, reinterpret_cast(&callback), + sizeof(DeviceAuthCallback)); + if (ret != HC_SUCCESS) { + LOGE("GetSdkCallBackByRequestId failed, ret: %" LOG_PUB "d", ret); + params.reply.WriteInt32(ret); return; } - params.reply.WriteInt32(HC_SUCCESS); - params.reply.WriteCString(const_cast(reqResult)); - HcFree(reqResult); - reqResult = nullptr; + if (callback.onRequest != nullptr) { + reqResult = callback.onRequest(requestId, opCode, reqParams); + if (reqResult == nullptr) { + params.reply.WriteInt32(HC_ERROR); + return; + } + LOGI("onRequest successfully."); + params.reply.WriteInt32(HC_SUCCESS); + params.reply.WriteCString(const_cast(reqResult)); + HcFree(reqResult); + reqResult = nullptr; + } return; } __attribute__((no_sanitize("cfi"))) static void OnGroupCreatedStub(CallbackParams params) { const char *groupInfo = nullptr; - void (*onGroupCreatedHook)(const char *) = nullptr; + const char *appId = nullptr; + DataChangeListener callback; - onGroupCreatedHook = reinterpret_cast(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, reinterpret_cast(&groupInfo), nullptr); - onGroupCreatedHook(groupInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onGroupCreated != nullptr) { + callback.onGroupCreated(groupInfo); + LOGI("onGroupCreated successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnGroupDeletedStub(CallbackParams params) { const char *groupInfo = nullptr; - void (*onDelGroupHook)(const char *) = nullptr; + const char *appId = nullptr; + DataChangeListener callback; - onDelGroupHook = reinterpret_cast(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, reinterpret_cast(&groupInfo), nullptr); - onDelGroupHook(groupInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onGroupDeleted != nullptr) { + callback.onGroupDeleted(groupInfo); + LOGI("onGroupDeleted successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnDevBoundStub(CallbackParams params) { const char *groupInfo = nullptr; + const char *appId = nullptr; + DataChangeListener callback; const char *udid = nullptr; - void (*onDevBoundHook)(const char *, const char *) = nullptr; - onDevBoundHook = reinterpret_cast(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, reinterpret_cast(&udid), nullptr); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, reinterpret_cast(&groupInfo), nullptr); - onDevBoundHook(udid, groupInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onDeviceBound != nullptr) { + callback.onDeviceBound(udid, groupInfo); + LOGI("onDeviceBound successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnDevUnboundStub(CallbackParams params) { const char *groupInfo = nullptr; + const char *appId = nullptr; + DataChangeListener callback; const char *udid = nullptr; - void (*onDevUnBoundHook)(const char *, const char *) = nullptr; - onDevUnBoundHook = reinterpret_cast(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, reinterpret_cast(&udid), nullptr); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_INFO, reinterpret_cast(&groupInfo), nullptr); - onDevUnBoundHook(udid, groupInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onDeviceUnBound != nullptr) { + callback.onDeviceUnBound(udid, groupInfo); + LOGI("onDeviceUnBound successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnDevUnTrustStub(CallbackParams params) { + const char *appId = nullptr; + DataChangeListener callback; const char *udid = nullptr; - void (*onDevUnTrustHook)(const char *) = nullptr; - onDevUnTrustHook = reinterpret_cast(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, reinterpret_cast(&udid), nullptr); - onDevUnTrustHook(udid); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onDeviceNotTrusted != nullptr) { + callback.onDeviceNotTrusted(udid); + LOGI("onDeviceNotTrusted successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnDelLastGroupStub(CallbackParams params) { + const char *appId = nullptr; + DataChangeListener callback; const char *udid = nullptr; int32_t groupType = 0; int32_t inOutLen = 0; - void (*onDelLastGroupHook)(const char *, int32_t) = nullptr; - onDelLastGroupHook = reinterpret_cast(params.cbHook); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, reinterpret_cast(&udid), nullptr); inOutLen = sizeof(groupType); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_GROUP_TYPE, reinterpret_cast(&groupType), &inOutLen); - onDelLastGroupHook(udid, groupType); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onLastGroupDeleted != nullptr) { + callback.onLastGroupDeleted(udid, groupType); + LOGI("onLastGroupDeleted successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnTrustDevNumChangedStub(CallbackParams params) { + const char *appId = nullptr; + DataChangeListener callback; int32_t devNum = 0; int32_t inOutLen = 0; - void (*onTrustDevNumChangedHook)(int32_t) = nullptr; - onTrustDevNumChangedHook = reinterpret_cast(params.cbHook); inOutLen = sizeof(devNum); (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_DATA_NUM, reinterpret_cast(&devNum), &inOutLen); - onTrustDevNumChangedHook(devNum); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_LISTENER, reinterpret_cast(&callback), + sizeof(DataChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onTrustedDeviceNumChanged != nullptr) { + callback.onTrustedDeviceNumChanged(devNum); + LOGI("onTrustedDeviceNumChanged successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnCredAddStub(CallbackParams params) { char *credId = nullptr; + const char *appId = nullptr; char *credInfo = nullptr; - void (*onCredAddHook)(char *, char *) = nullptr; - onCredAddHook = reinterpret_cast(params.cbHook); + CredChangeListener callback; (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_CRED_ID, reinterpret_cast(&credId), nullptr); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_CRED_INFO, reinterpret_cast(&credInfo), nullptr); - onCredAddHook(credId, credInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_CRED_LISTENER, reinterpret_cast(&callback), + sizeof(CredChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onCredAdd != nullptr) { + callback.onCredAdd(credId, credInfo); + LOGI("onCredAdd successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnCredDeleteStub(CallbackParams params) { char *credId = nullptr; + const char *appId = nullptr; char *credInfo = nullptr; - void (*onCredDeleteHook)(char *, char *) = nullptr; - onCredDeleteHook = reinterpret_cast(params.cbHook); + CredChangeListener callback; (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_CRED_ID, reinterpret_cast(&credId), nullptr); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_CRED_INFO, reinterpret_cast(&credInfo), nullptr); - onCredDeleteHook(credId, credInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_CRED_LISTENER, reinterpret_cast(&callback), + sizeof(CredChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onCredDelete != nullptr) { + callback.onCredDelete(credId, credInfo); + LOGI("onCredDelete successfully."); + } return; } __attribute__((no_sanitize("cfi"))) static void OnCredUpdateStub(CallbackParams params) { char *credId = nullptr; + const char *appId = nullptr; char *credInfo = nullptr; - void (*onCredUpdateHook)(char *, char *) = nullptr; - onCredUpdateHook = reinterpret_cast(params.cbHook); + CredChangeListener callback; (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_CRED_ID, reinterpret_cast(&credId), nullptr); (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_CRED_INFO, reinterpret_cast(&credInfo), nullptr); - onCredUpdateHook(credId, credInfo); + (void)GetAndValNullParam(params.cbDataCache, params.cacheNum, PARAM_TYPE_APPID, + reinterpret_cast(&appId), nullptr); + if (GetSdkCallBackByAppId(appId, CB_TYPE_CRED_LISTENER, reinterpret_cast(&callback), + sizeof(CredChangeListener)) != HC_SUCCESS) { + LOGE("GetSdkCallBackByAppId failed."); + return; + } + if (callback.onCredUpdate != nullptr) { + callback.onCredUpdate(credId, credInfo); + LOGI("onCredUpdate successfully."); + } return; } -void ProcCbHook(int32_t callbackId, uintptr_t cbHook, - const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx) +void ProcCbHook(int32_t callbackId, const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx) { CallbackStub stubTable[] = { OnTransmitStub, OnSessKeyStub, OnFinishStub, OnErrorStub, OnRequestStub, OnGroupCreatedStub, OnGroupDeletedStub, OnDevBoundStub, OnDevUnboundStub, OnDevUnTrustStub, OnDelLastGroupStub, OnTrustDevNumChangedStub, - OnCredAddStub, OnCredDeleteStub, OnCredUpdateStub, + OnCredAddStub, OnCredDeleteStub, OnCredUpdateStub, OnTransmitStub, OnSessKeyStub, + OnFinishStub, OnErrorStub, OnRequestStub, OnTransmitStub, OnSessKeyStub, + OnFinishStub, OnErrorStub, OnRequestStub, }; MessageParcel *reply = reinterpret_cast(replyCtx); - if ((callbackId < CB_ID_ON_TRANS) || (callbackId > CB_ID_ON_CRED_UPDATE)) { + if ((callbackId < CB_ID_ON_TRANS) || (callbackId > CB_ID_ON_REQUEST_CRED)) { LOGE("Invalid call back id"); return; } - if (cbHook == 0x0) { - LOGE("Invalid call back hook"); - return; - } - CallbackParams params = { cbHook, cbDataCache, cacheNum, *reply }; + CallbackParams params = { callbackId, cbDataCache, cacheNum, *reply }; stubTable[callbackId - 1](params); return; } @@ -775,7 +1172,8 @@ static uint32_t EncodeCallData(MessageParcel &dataParcel, int32_t type, const ui } /* group or cred auth callback adapter */ -static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint32_t dataLen, int32_t type) +static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint32_t dataLen, int32_t type, + int32_t callbackId) { int32_t ret = -1; uint32_t uRet; @@ -794,11 +1192,10 @@ static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint3 reinterpret_cast(&requestId), sizeof(requestId)); uRet |= EncodeCallData(dataParcel, PARAM_TYPE_COMM_DATA, data, dataLen); if (uRet != HC_SUCCESS) { - LOGE("build trans data failed"); + LOGE("Error occurs, encode trans data failed."); return false; } - ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_TRANS, true, - reinterpret_cast(node->cbCtx.devAuth.onTransmit), dataParcel, reply); + ServiceDevAuth::ActCallback(node->proxyId, callbackId, true, dataParcel, reply); LOGI("process done, request id: %" LOG_PUB "lld", static_cast(requestId)); if (reply.ReadInt32(ret) && (ret == HC_SUCCESS)) { return true; @@ -808,20 +1205,21 @@ static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint3 static bool IpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { - return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_DEV_AUTH); + return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_DEV_AUTH, CB_ID_ON_TRANS); } static bool TmpIpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { - return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_TMP_DEV_AUTH); + return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_TMP_DEV_AUTH, CB_ID_ON_TRANS_TMP); } static bool IpcCaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { - return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_CRED_DEV_AUTH); + return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_CRED_DEV_AUTH, CB_ID_ON_TRANS_CRED); } -static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen, int32_t type) +static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen, int32_t type, + int32_t callbackId) { uint32_t ret; MessageParcel dataParcel; @@ -839,34 +1237,34 @@ static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKe ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, reinterpret_cast(&requestId), sizeof(requestId)); ret |= EncodeCallData(dataParcel, PARAM_TYPE_SESS_KEY, sessKey, sessKeyLen); if (ret != HC_SUCCESS) { - LOGE("build trans data failed"); + LOGE("Error occurs, encode trans data failed."); return; } - ServiceDevAuth::ActCallback(node->proxyId, CB_ID_SESS_KEY_DONE, false, - reinterpret_cast(node->cbCtx.devAuth.onSessionKeyReturned), dataParcel, reply); + ServiceDevAuth::ActCallback(node->proxyId, callbackId, false, dataParcel, reply); LOGI("process done, request id: %" LOG_PUB "lld", static_cast(requestId)); return; } static void IpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen) { - GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_DEV_AUTH); + GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_DEV_AUTH, CB_ID_SESS_KEY_DONE); return; } static void TmpIpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen) { - GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_TMP_DEV_AUTH); + GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_TMP_DEV_AUTH, CB_ID_SESS_KEY_DONE_TMP); return; } static void IpcCaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen) { - GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_CRED_DEV_AUTH); + GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_CRED_DEV_AUTH, CB_ID_SESS_KEY_DONE_CRED); return; } -static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const char *returnData, int32_t type) +static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const char *returnData, int32_t type, + int32_t callbackId) { uint32_t ret; MessageParcel dataParcel; @@ -888,11 +1286,10 @@ static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const reinterpret_cast(returnData), HcStrlen(returnData) + 1); } if (ret != HC_SUCCESS) { - LOGE("build trans data failed"); + LOGE("Error occurs, encode trans data failed."); return; } - ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_FINISH, false, - reinterpret_cast(node->cbCtx.devAuth.onFinish), dataParcel, reply); + ServiceDevAuth::ActCallback(node->proxyId, callbackId, false, dataParcel, reply); /* delete request id */ DelIpcCallBackByReqId(requestId, type, false); LOGI("process done, request id: %" LOG_PUB "lld", static_cast(requestId)); @@ -901,19 +1298,19 @@ static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const static void IpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData) { - GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_DEV_AUTH); + GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_DEV_AUTH, CB_ID_ON_FINISH); return; } static void TmpIpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData) { - GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_TMP_DEV_AUTH); + GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_TMP_DEV_AUTH, CB_ID_ON_FINISH_TMP); return; } static void IpcCaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData) { - GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_CRED_DEV_AUTH); + GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_CRED_DEV_AUTH, CB_ID_ON_FINISH_CRED); return; } @@ -941,11 +1338,18 @@ static void GaCbOnErrorWithType(int64_t requestId, int32_t operationCode, reinterpret_cast(errorReturn), HcStrlen(errorReturn) + 1); } if (ret != HC_SUCCESS) { - LOGE("build trans data failed"); + LOGE("Error occurs, encode trans data failed."); return; } - ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_ERROR, false, - reinterpret_cast(node->cbCtx.devAuth.onError), dataParcel, reply); + if (type == CB_TYPE_DEV_AUTH) { + ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_ERROR, false, dataParcel, reply); + } + if (type == CB_TYPE_TMP_DEV_AUTH) { + ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_ERROR_TMP, false, dataParcel, reply); + } + if (type == CB_TYPE_CRED_DEV_AUTH) { + ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_ERROR_CRED, false, dataParcel, reply); + } /* delete request id */ DelIpcCallBackByReqId(requestId, type, false); LOGI("process done, request id: %" LOG_PUB "lld", static_cast(requestId)); @@ -970,7 +1374,8 @@ static void IpcCaCbOnError(int64_t requestId, int32_t operationCode, int32_t err return; } -static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, const char *reqParams, int32_t type) +static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, const char *reqParams, int32_t type, + int32_t callbackId) { int32_t ret = -1; uint32_t uRet; @@ -995,12 +1400,10 @@ static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, con reinterpret_cast(reqParams), HcStrlen(reqParams) + 1); } if (uRet != HC_SUCCESS) { - LOGE("build trans data failed"); + LOGE("Error occurs, encode trans data failed."); return nullptr; } - - ServiceDevAuth::ActCallback(node->proxyId, CB_ID_ON_REQUEST, true, - reinterpret_cast(node->cbCtx.devAuth.onRequest), dataParcel, reply); + ServiceDevAuth::ActCallback(node->proxyId, callbackId, true, dataParcel, reply); if (reply.ReadInt32(ret) && (ret == HC_SUCCESS)) { if (reply.GetReadableBytes() == 0) { LOGE("onRequest has no data, but success"); @@ -1041,12 +1444,12 @@ static char *IpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const ch return nullptr; } } - return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_DEV_AUTH); + return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_DEV_AUTH, CB_ID_ON_REQUEST); } static char *TmpIpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams) { - return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_TMP_DEV_AUTH); + return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_TMP_DEV_AUTH, CB_ID_ON_REQUEST_TMP); } static char *IpcCaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams) @@ -1069,56 +1472,49 @@ static char *IpcCaCbOnRequest(int64_t requestId, int32_t operationCode, const ch return nullptr; } } - return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_CRED_DEV_AUTH); + return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_CRED_DEV_AUTH, CB_ID_ON_REQUEST_CRED); } namespace { void IpcOnGroupCreated(const char *groupInfo) { - int32_t i; - uint32_t ret; - MessageParcel reply; - MessageParcel dataParcel; - DataChangeListener *listener = nullptr; - + if (groupInfo == nullptr) { + LOGE("IpcOnGroupCreated, params error"); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("IpcCallBackList is not initialized"); return; } - if (groupInfo == nullptr) { - LOGE("IpcOnGroupCreated, params error"); - return; - } - - ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, - reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("Error occurs, IpcOnGroupCreated build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onGroupCreated == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED, - false, reinterpret_cast(listener->onGroupCreated), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED, false, + dataParcel, reply); } return; } void IpcOnGroupDeleted(const char *groupInfo) { - int32_t i; - uint32_t ret; - MessageParcel dataParcel; - MessageParcel reply; - DataChangeListener *listener = nullptr; + if (groupInfo == nullptr) { + LOGE("IpcOnGroupDeleted, params error"); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { @@ -1126,340 +1522,289 @@ void IpcOnGroupDeleted(const char *groupInfo) return; } - if (groupInfo == nullptr) { - LOGE("IpcOnGroupDeleted, params error"); - return; - } - - ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, - reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("IpcOnGroupDeleted, build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onGroupDeleted == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED, - false, reinterpret_cast(listener->onGroupDeleted), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED, false, dataParcel, reply); } return; } void IpcOnDeviceBound(const char *peerUdid, const char *groupInfo) { + if ((peerUdid == nullptr) || (groupInfo == nullptr)) { + LOGE("Error occurs, param is nullptr."); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("CallBackList un-initialized."); return; } - if ((peerUdid == nullptr) || (groupInfo == nullptr)) { - LOGE("Error occurs, param is nullptr."); - return; - } - - MessageParcel dataParcel; - uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, - reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, - reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("build transmit data failed."); - return; - } - - MessageParcel reply; - DataChangeListener *listener = nullptr; - int32_t i; - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onDeviceBound == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND, - false, reinterpret_cast(listener->onDeviceBound), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, + reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND, false, + dataParcel, reply); } return; } void IpcOnDeviceUnBound(const char *peerUdid, const char *groupInfo) { + if ((peerUdid == nullptr) || (groupInfo == nullptr)) { + LOGE("peerUdid is nullptr or groupInfo is nullptr."); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("CallBackList ctx is nullptr."); return; } - if ((peerUdid == nullptr) || (groupInfo == nullptr)) { - LOGE("peerUdid is nullptr or groupInfo is nullptr."); - return; - } - - uint32_t ret; - MessageParcel dataParcel; - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, - reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, - reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("build trans data failed."); - return; - } - - int32_t i; - MessageParcel reply; - DataChangeListener *listener = nullptr; - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onDeviceUnBound == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND, - false, reinterpret_cast(listener->onDeviceUnBound), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, + reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, + reinterpret_cast(groupInfo), HcStrlen(groupInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND, false, + dataParcel, reply); } return; } void IpcOnDeviceNotTrusted(const char *peerUdid) { - int32_t i; - uint32_t ret; - MessageParcel dataParcel; - MessageParcel reply; - DataChangeListener *listener = nullptr; - + if (peerUdid == nullptr) { + LOGE("Error occurs, peerUdid is nullptr."); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("Error occurs, callBackList ctx is nullptr."); return; } - - if (peerUdid == nullptr) { - LOGE("Error occurs, peerUdid is nullptr."); - return; - } - - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, - reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); - if (ret != HC_SUCCESS) { - LOGE("Error occurs, encode trans data failed."); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onDeviceNotTrusted == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED, - false, reinterpret_cast(listener->onDeviceNotTrusted), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, + reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED, false, + dataParcel, reply); } return; } void IpcOnLastGroupDeleted(const char *peerUdid, int32_t groupType) { - int32_t i; - uint32_t ret; - MessageParcel dataParcel; - MessageParcel reply; - DataChangeListener *listener = nullptr; - + if (peerUdid == nullptr) { + LOGE("Error occurs, param is nullptr."); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("Error occurs, callBackList ctx is uninitialized."); return; } - - if (peerUdid == nullptr) { - LOGE("Error occurs, param is nullptr."); - return; - } - - ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, - reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, - reinterpret_cast(&groupType), sizeof(groupType)); - if (ret != HC_SUCCESS) { - LOGE("Encode call data failed."); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onLastGroupDeleted == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED, - false, reinterpret_cast(listener->onLastGroupDeleted), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, + reinterpret_cast(peerUdid), HcStrlen(peerUdid) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, + reinterpret_cast(&groupType), sizeof(groupType)); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED, false, + dataParcel, reply); } return; } void IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum) { - int32_t i; - uint32_t ret; - MessageParcel reply; - std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("IpcCallBackList un-initialized"); return; } - - MessageParcel dataParcel; - ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM, - reinterpret_cast(&curTrustedDeviceNum), sizeof(curTrustedDeviceNum)); - if (ret != HC_SUCCESS) { - LOGE("IpcOnTrustedDeviceNumChanged, build trans data failed"); - return; - } - - DataChangeListener *listener = nullptr; - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener); - if (listener->onTrustedDeviceNumChanged == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED, - false, reinterpret_cast(listener->onTrustedDeviceNumChanged), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM, + reinterpret_cast(&curTrustedDeviceNum), sizeof(curTrustedDeviceNum)); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED, false, + dataParcel, reply); } return; } void IpcOnCredAdd(const char *credId, const char *credInfo) { - int32_t i; - uint32_t ret; - MessageParcel reply; - CredChangeListener *listener = nullptr; + if (credId == nullptr) { + LOGE("IpcOnCredAdd failed, params error."); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("IpcOnCredAdd failed, callBackList is un-initialized."); return; } - - if (credId == nullptr) { - LOGE("IpcOnCredAdd failed, params error."); - return; - } - MessageParcel dataParcel; - ret = EncodeCallData(dataParcel, PARAM_TYPE_CRED_ID, - reinterpret_cast(credId), HcStrlen(credId) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_CRED_INFO, - reinterpret_cast(credInfo), HcStrlen(credInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("IpcOnCredAdd, build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_CRED_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.credListener); - if (listener->onCredAdd == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_CRED_ADD, - false, reinterpret_cast(listener->onCredAdd), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_CRED_LISTENER) { + continue; } + MessageParcel reply; + MessageParcel dataParcel; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_CRED_ID, + reinterpret_cast(credId), HcStrlen(credId) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_CRED_INFO, + reinterpret_cast(credInfo), HcStrlen(credInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_CRED_ADD, false, + dataParcel, reply); } return; } void IpcOnCredDelete(const char *credId, const char *credInfo) { - int32_t i; - uint32_t ret; - MessageParcel dataParcel; - MessageParcel reply; - CredChangeListener *listener = nullptr; + if (credId == nullptr) { + LOGE("IpcOnCredDelete failed, credId is nullptr."); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("IpcOnCredDelete failed, CallBackList un-initialized"); return; } - - if (credId == nullptr) { - LOGE("IpcOnCredDelete failed, credId is nullptr."); - return; - } - - ret = EncodeCallData(dataParcel, PARAM_TYPE_CRED_ID, - reinterpret_cast(credId), HcStrlen(credId) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_CRED_INFO, - reinterpret_cast(credInfo), HcStrlen(credInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("IpcOnCredDelete build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_CRED_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.credListener); - if (listener->onCredDelete == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_CRED_DELETE, - false, reinterpret_cast(listener->onCredDelete), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_CRED_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_CRED_ID, + reinterpret_cast(credId), HcStrlen(credId) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_CRED_INFO, + reinterpret_cast(credInfo), HcStrlen(credInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_CRED_DELETE, false, + dataParcel, reply); } return; } void IpcOnCredUpdate(const char *credId, const char *credInfo) { - int32_t i; - uint32_t ret; - MessageParcel dataParcel; - MessageParcel reply; - CredChangeListener *listener = nullptr; + if (credId == nullptr) { + LOGE("IpcOnCredUpdate failed, params error"); + return; + } std::lock_guard autoLock(g_cbListLock); if (g_ipcCallBackList.ctx == nullptr) { LOGE("IpcOnCredUpdate failed, IpcCallBackList un-initialized"); return; } - - if (credId == nullptr) { - LOGE("IpcOnCredUpdate failed, params error"); - return; - } - - ret = EncodeCallData(dataParcel, PARAM_TYPE_CRED_ID, - reinterpret_cast(credId), HcStrlen(credId) + 1); - ret |= EncodeCallData(dataParcel, PARAM_TYPE_CRED_INFO, - reinterpret_cast(credInfo), HcStrlen(credInfo) + 1); - if (ret != HC_SUCCESS) { - LOGE("IpcOnCredUpdate build trans data failed"); - return; - } - - for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { - if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_CRED_LISTENER) { - listener = &(g_ipcCallBackList.ctx[i].cbCtx.credListener); - if (listener->onCredUpdate == nullptr) { - continue; - } - ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_CRED_UPDATE, - false, reinterpret_cast(listener->onCredUpdate), dataParcel, reply); + for (int32_t i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) { + if (g_ipcCallBackList.ctx[i].cbType != CB_TYPE_CRED_LISTENER) { + continue; } + MessageParcel dataParcel; + MessageParcel reply; + uint32_t ret = EncodeCallData(dataParcel, PARAM_TYPE_CRED_ID, + reinterpret_cast(credId), HcStrlen(credId) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_CRED_INFO, + reinterpret_cast(credInfo), HcStrlen(credInfo) + 1); + ret |= EncodeCallData(dataParcel, PARAM_TYPE_APPID, + reinterpret_cast(g_ipcCallBackList.ctx[i].appId), + HcStrlen(g_ipcCallBackList.ctx[i].appId) + 1); + if (ret != HC_SUCCESS) { + LOGE("Error occurs, encode trans data failed, appId: %" LOG_PUB "s", g_ipcCallBackList.ctx[i].appId); + continue; + } + ServiceDevAuth::ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_CRED_UPDATE, false, + dataParcel, reply); } return; } diff --git a/frameworks/src/standard/ipc_callback_proxy.cpp b/frameworks/src/standard/ipc_callback_proxy.cpp index 317d4e54..8661129c 100644 --- a/frameworks/src/standard/ipc_callback_proxy.cpp +++ b/frameworks/src/standard/ipc_callback_proxy.cpp @@ -25,7 +25,7 @@ ProxyDevAuthCb::ProxyDevAuthCb(const sptr &impl) : IRemoteProxy 0) { (void)data.WriteBuffer(reinterpret_cast(dataParcel.GetData()), dataParcel.GetDataSize()); } diff --git a/frameworks/src/standard/ipc_callback_stub.cpp b/frameworks/src/standard/ipc_callback_stub.cpp index 4fa29cb5..a81accad 100644 --- a/frameworks/src/standard/ipc_callback_stub.cpp +++ b/frameworks/src/standard/ipc_callback_stub.cpp @@ -27,7 +27,7 @@ StubDevAuthCb::StubDevAuthCb() StubDevAuthCb::~StubDevAuthCb() {} -void StubDevAuthCb::DoCallBack(int32_t callbackId, uintptr_t cbHook, +void StubDevAuthCb::DoCallBack(int32_t callbackId, MessageParcel &dataParcel, MessageParcel &reply, MessageOption &option) { int32_t ret; @@ -35,11 +35,6 @@ void StubDevAuthCb::DoCallBack(int32_t callbackId, uintptr_t cbHook, MessageParcel retParcel; IpcDataInfo cbDataCache[MAX_REQUEST_PARAMS_NUM] = { { 0 } }; - if (cbHook == 0x0) { - LOGE("Invalid call back hook"); - return; - } - for (i = 0; i < MAX_REQUEST_PARAMS_NUM; i++) { ret = DecodeIpcData(reinterpret_cast(&dataParcel), &(cbDataCache[i].type), &(cbDataCache[i].val), &(cbDataCache[i].valSz)); @@ -48,7 +43,7 @@ void StubDevAuthCb::DoCallBack(int32_t callbackId, uintptr_t cbHook, return; } } - ProcCbHook(callbackId, cbHook, cbDataCache, MAX_REQUEST_PARAMS_NUM, reinterpret_cast(&reply)); + ProcCbHook(callbackId, cbDataCache, MAX_REQUEST_PARAMS_NUM, reinterpret_cast(&reply)); return; } @@ -60,7 +55,6 @@ int32_t StubDevAuthCb::OnRemoteRequest(uint32_t code, return -1; } int32_t callbackId; - uintptr_t cbHook = 0x0; switch (code) { case static_cast(DevAuthCbInterfaceCode::DEV_AUTH_CALLBACK_REQUEST): @@ -69,8 +63,7 @@ int32_t StubDevAuthCb::OnRemoteRequest(uint32_t code, return -1; } callbackId = data.ReadInt32(); - cbHook = data.ReadPointer(); - StubDevAuthCb::DoCallBack(callbackId, cbHook, data, reply, option); + StubDevAuthCb::DoCallBack(callbackId, data, reply, option); break; default: LOGE("Invoke call back cmd id error, %" LOG_PUB "u", code); diff --git a/frameworks/src/standard/ipc_dev_auth_stub.cpp b/frameworks/src/standard/ipc_dev_auth_stub.cpp index 4ddf8305..0a073dc2 100644 --- a/frameworks/src/standard/ipc_dev_auth_stub.cpp +++ b/frameworks/src/standard/ipc_dev_auth_stub.cpp @@ -423,7 +423,7 @@ void ServiceDevAuth::ResetRemoteObject(int32_t idx) } void ServiceDevAuth::ActCallback(int32_t objIdx, int32_t callbackId, bool sync, - uintptr_t cbHook, MessageParcel &dataParcel, MessageParcel &reply) + MessageParcel &dataParcel, MessageParcel &reply) { std::lock_guard autoLock(g_cBMutex); if ((objIdx < 0) || (objIdx >= MAX_CBSTUB_SIZE) || (!g_cbStub[objIdx].inUse)) { @@ -435,7 +435,7 @@ void ServiceDevAuth::ActCallback(int32_t objIdx, int32_t callbackId, bool sync, option.SetFlags(MessageOption::TF_ASYNC); } sptr proxy = iface_cast(g_cbStub[objIdx].cbStub); - proxy->DoCallBack(callbackId, cbHook, dataParcel, reply, option); + proxy->DoCallBack(callbackId, dataParcel, reply, option); return; } diff --git a/interfaces/inner_api/device_auth_defines.h b/interfaces/inner_api/device_auth_defines.h index 881ce418..b40eb85b 100644 --- a/interfaces/inner_api/device_auth_defines.h +++ b/interfaces/inner_api/device_auth_defines.h @@ -81,6 +81,7 @@ enum { HC_ERR_IPC_GET_SAMGR_FAILED = 0x00003016, // 12310 HC_ERR_IPC_LOAD_SA_FAILED = 0x00003017, // 12311 HC_ERR_IPC_SA_IS_UNLOADING = 0x00003018, // 12312 + HC_ERR_IPC_CALLBACK_NOT_MATCH = 0x00003019, // 12313 /* error code for module , 0x00004000 ~ 0x00004FFF */ HC_ERR_MODULE_NOT_FOUNT = 0x00004001, // 16385 diff --git a/test/fuzztest/devauthinterface_fuzzer/devauthinterface_fuzzer.cpp b/test/fuzztest/devauthinterface_fuzzer/devauthinterface_fuzzer.cpp index 60bbacdb..b3c94387 100644 --- a/test/fuzztest/devauthinterface_fuzzer/devauthinterface_fuzzer.cpp +++ b/test/fuzztest/devauthinterface_fuzzer/devauthinterface_fuzzer.cpp @@ -361,9 +361,9 @@ static void DevAuthInterfaceTestCase005() (void)InitIpcCallBackList(); AddIpcCbObjByAppId(TEST_APP_ID, 0, 0); DeInitIpcCallBackList(); - AddIpcCallBackByAppId(TEST_APP_ID, nullptr, 0, 0); + AddIpcCallBackByAppId(TEST_APP_ID, 0); (void)InitIpcCallBackList(); - AddIpcCallBackByAppId(TEST_APP_ID, nullptr, 0, 0); + AddIpcCallBackByAppId(TEST_APP_ID, 0); DeInitIpcCallBackList(); DelIpcCallBackByAppId(TEST_APP_ID, 0); (void)InitIpcCallBackList(); @@ -377,9 +377,9 @@ static void DevAuthInterfaceTestCase005() (void)InitIpcCallBackList(); AddIpcCbObjByReqId(TEST_REQ_ID, 0, 0); DeInitIpcCallBackList(); - (void)AddIpcCallBackByReqId(TEST_REQ_ID, nullptr, 0, 0); + (void)AddIpcCallBackByReqId(TEST_REQ_ID, 0); (void)InitIpcCallBackList(); - (void)AddIpcCallBackByReqId(TEST_REQ_ID, nullptr, 0, 0); + (void)AddIpcCallBackByReqId(TEST_REQ_ID, 0); DeInitIpcCallBackList(); DelIpcCallBackByReqId(TEST_REQ_ID, 0, true); DelIpcCallBackByReqId(TEST_REQ_ID, 0, false); diff --git a/test/fuzztest/group_auth/authdevice_fuzzer/authdevice_fuzzer.cpp b/test/fuzztest/group_auth/authdevice_fuzzer/authdevice_fuzzer.cpp index c55e1591..348b24bf 100644 --- a/test/fuzztest/group_auth/authdevice_fuzzer/authdevice_fuzzer.cpp +++ b/test/fuzztest/group_auth/authdevice_fuzzer/authdevice_fuzzer.cpp @@ -57,6 +57,7 @@ namespace OHOS { bool FuzzDoAuthDevice(const uint8_t* data, size_t size) { + (void)InitDeviceAuthService(); const GroupAuthManager *gaInstance = GetGaInstance(); if (gaInstance == nullptr) { return false; @@ -78,6 +79,7 @@ namespace OHOS { gaCallback.onTransmit = OnTransmit; gaCallback.onRequest = OnRequest; gaInstance->authDevice(osAccountId, authReqId, authParams.c_str(), &gaCallback); + DestroyDeviceAuthService(); return true; } } diff --git a/test/fuzztest/group_auth/processauthdata_fuzzer/processauthdata_fuzzer.cpp b/test/fuzztest/group_auth/processauthdata_fuzzer/processauthdata_fuzzer.cpp index f6d4fa7e..738d5c1e 100644 --- a/test/fuzztest/group_auth/processauthdata_fuzzer/processauthdata_fuzzer.cpp +++ b/test/fuzztest/group_auth/processauthdata_fuzzer/processauthdata_fuzzer.cpp @@ -57,6 +57,7 @@ namespace OHOS { bool FuzzDoProcessData(const uint8_t* data, size_t size) { + (void)InitDeviceAuthService(); const GroupAuthManager *gaInstance = GetGaInstance(); if (gaInstance == nullptr) { return false; @@ -76,6 +77,7 @@ namespace OHOS { gaCallback.onTransmit = OnTransmit; gaCallback.onRequest = OnRequest; gaInstance->processData(authReqId, data, (uint32_t)size, &gaCallback); + DestroyDeviceAuthService(); return true; } } diff --git a/test/fuzztest/group_manage/addmember_fuzzer/addmember_fuzzer.cpp b/test/fuzztest/group_manage/addmember_fuzzer/addmember_fuzzer.cpp index 6e0c5c0f..dac0cd92 100644 --- a/test/fuzztest/group_manage/addmember_fuzzer/addmember_fuzzer.cpp +++ b/test/fuzztest/group_manage/addmember_fuzzer/addmember_fuzzer.cpp @@ -19,6 +19,7 @@ namespace OHOS { bool FuzzDoAddMemberToGroup(const uint8_t* data, size_t size) { + (void)InitDeviceAuthService(); const DeviceGroupManager *gmInstance = GetGmInstance(); if (gmInstance == nullptr) { return false; @@ -37,6 +38,7 @@ namespace OHOS { std::string appId(fdp.ConsumeBytesAsString(appIdLen)); std::string addParams(fdp.ConsumeBytesAsString(addParamsLen)); gmInstance->addMemberToGroup(osAccountId, requestId, appId.c_str(), addParams.c_str()); + DestroyDeviceAuthService(); return true; } } diff --git a/test/fuzztest/group_manage/creategroup_fuzzer/creategroup_fuzzer.cpp b/test/fuzztest/group_manage/creategroup_fuzzer/creategroup_fuzzer.cpp index 876e8524..3d047ba9 100644 --- a/test/fuzztest/group_manage/creategroup_fuzzer/creategroup_fuzzer.cpp +++ b/test/fuzztest/group_manage/creategroup_fuzzer/creategroup_fuzzer.cpp @@ -19,6 +19,7 @@ namespace OHOS { bool FuzzDoCreateGroup(const uint8_t* data, size_t size) { + (void)InitDeviceAuthService(); const DeviceGroupManager *gmInstance = GetGmInstance(); if (gmInstance == nullptr) { return false; @@ -37,6 +38,7 @@ namespace OHOS { std::string appId(fdp.ConsumeBytesAsString(appIdLen)); std::string createParams(fdp.ConsumeBytesAsString(createParamsLen)); gmInstance->createGroup(osAccountId, requestId, appId.c_str(), createParams.c_str()); + DestroyDeviceAuthService(); return true; } } diff --git a/test/fuzztest/group_manage/deletegroup_fuzzer/deletegroup_fuzzer.cpp b/test/fuzztest/group_manage/deletegroup_fuzzer/deletegroup_fuzzer.cpp index 2ae2d2c7..6248d790 100644 --- a/test/fuzztest/group_manage/deletegroup_fuzzer/deletegroup_fuzzer.cpp +++ b/test/fuzztest/group_manage/deletegroup_fuzzer/deletegroup_fuzzer.cpp @@ -19,6 +19,7 @@ namespace OHOS { bool FuzzDoDeleteGroup(const uint8_t* data, size_t size) { + (void)InitDeviceAuthService(); const DeviceGroupManager *gmInstance = GetGmInstance(); if (gmInstance == nullptr) { return false; @@ -37,6 +38,7 @@ namespace OHOS { std::string appId(fdp.ConsumeBytesAsString(appIdLen)); std::string deleteParams(fdp.ConsumeBytesAsString(createParamsLen)); gmInstance->deleteGroup(osAccountId, requestId, appId.c_str(), deleteParams.c_str()); + DestroyDeviceAuthService(); return true; } } diff --git a/test/fuzztest/group_manage/deletemember_fuzzer/deletemember_fuzzer.cpp b/test/fuzztest/group_manage/deletemember_fuzzer/deletemember_fuzzer.cpp index 28b41a90..8a3b1a14 100644 --- a/test/fuzztest/group_manage/deletemember_fuzzer/deletemember_fuzzer.cpp +++ b/test/fuzztest/group_manage/deletemember_fuzzer/deletemember_fuzzer.cpp @@ -19,6 +19,7 @@ namespace OHOS { bool FuzzDoDeleteMember(const uint8_t* data, size_t size) { + (void)InitDeviceAuthService(); const DeviceGroupManager *gmInstance = GetGmInstance(); if (gmInstance == nullptr) { return false; @@ -37,6 +38,7 @@ namespace OHOS { std::string appId(fdp.ConsumeBytesAsString(appIdLen)); std::string deleteParams(fdp.ConsumeBytesAsString(deleteParamsLen)); gmInstance->deleteMemberFromGroup(osAccountId, requestId, appId.c_str(), deleteParams.c_str()); + DestroyDeviceAuthService(); return true; } } diff --git a/test/fuzztest/saloadondemand_fuzzer/saloadondemand_fuzzer.cpp b/test/fuzztest/saloadondemand_fuzzer/saloadondemand_fuzzer.cpp index 86b2929a..a1fff6db 100644 --- a/test/fuzztest/saloadondemand_fuzzer/saloadondemand_fuzzer.cpp +++ b/test/fuzztest/saloadondemand_fuzzer/saloadondemand_fuzzer.cpp @@ -25,127 +25,6 @@ #include "base/security/device_auth/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp" namespace OHOS { -#define TEST_APP_ID "TestUserId" -#define TEST_APP_ID_1 "TestUserId1" - -static void OnError(int64_t requestId, int operationCode, int errorCode, const char *errorReturn) -{ - (void)requestId; - (void)operationCode; - (void)errorCode; - (void)errorReturn; -} - -static void OnFinish(int64_t requestId, int operationCode, const char *authReturn) -{ - (void)requestId; - (void)operationCode; - (void)authReturn; -} - -static void OnSessionKeyReturned(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen) -{ - (void)requestId; - (void)sessionKey; - (void)sessionKeyLen; -} - -static bool OnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) -{ - (void)requestId; - (void)data; - (void)dataLen; - return true; -} - -static char *OnRequest(int64_t requestId, int operationCode, const char *reqParam) -{ - (void)requestId; - (void)operationCode; - (void)reqParam; - return nullptr; -} - - -static void OnGroupCreated(const char *groupInfo) -{ - (void)groupInfo; -} - -static void OnGroupDeleted(const char *groupInfo) -{ - (void)groupInfo; -} - -static void OnDeviceBound(const char *peerUdid, const char *groupInfo) -{ - (void)peerUdid; - (void)groupInfo; -} - -static void OnDeviceUnBound(const char *peerUdid, const char *groupInfo) -{ - (void)peerUdid; - (void)groupInfo; -} - -static void OnDeviceNotTrusted(const char *peerUdid) -{ - (void)peerUdid; -} - -static void OnLastGroupDeleted(const char *peerUdid, int groupType) -{ - (void)peerUdid; - (void)groupType; -} - -static void OnTrustedDeviceNumChanged(int curTrustedDeviceNum) -{ - (void)curTrustedDeviceNum; -} - -static void TestOnCredAdd(const char *credId, const char *credInfo) -{ - (void)credId; - (void)credInfo; -} - -static void TestOnCredUpdate(const char *credId, const char *credInfo) -{ - (void)credId; - (void)credInfo; -} - -static void TestOnCredDelete(const char *credId, const char *credInfo) -{ - (void)credId; - (void)credInfo; -} - -static DeviceAuthCallback g_gmCallback = { - .onTransmit = OnTransmit, - .onSessionKeyReturned = OnSessionKeyReturned, - .onFinish = OnFinish, - .onError = OnError, - .onRequest = OnRequest, -}; - -static DataChangeListener g_listener = { - .onGroupCreated = OnGroupCreated, - .onGroupDeleted = OnGroupDeleted, - .onDeviceBound = OnDeviceBound, - .onDeviceUnBound = OnDeviceUnBound, - .onDeviceNotTrusted = OnDeviceNotTrusted, - .onLastGroupDeleted = OnLastGroupDeleted, - .onTrustedDeviceNumChanged = OnTrustedDeviceNumChanged, -}; - -static CredChangeListener g_credChangeListener = { - .onCredAdd = TestOnCredAdd, - .onCredDelete = TestOnCredDelete, - .onCredUpdate = TestOnCredUpdate, -}; static int32_t regCallbackMock(const char *appId, const DeviceAuthCallback *callback, bool needCache) { @@ -179,69 +58,17 @@ static void SaLoadOnDemandFuzz001(void) RegisterDevAuthCallbackIfNeed(); } -static void SaLoadOnDemandFuzz002(void) -{ - SetRegCallbackFunc(regCallbackMock); - SetRegDataChangeListenerFunc(regDataChangeListenerMock); - SetRegCredChangeListenerFunc(regCredChangeListenerMock); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, DEVAUTH_CALLBACK); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, GROUP_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, CRED_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, DEVAUTH_CALLBACK); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, GROUP_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, CRED_CHANGE_LISTENER); -} - -static void SaLoadOnDemandFuzz003(void) -{ - SetRegCallbackFunc(regCallbackMock); - SetRegDataChangeListenerFunc(regDataChangeListenerMock); - SetRegCredChangeListenerFunc(regCredChangeListenerMock); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, DEVAUTH_CALLBACK); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, DEVAUTH_CALLBACK); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, GROUP_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, GROUP_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, CRED_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, CRED_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, DEVAUTH_CALLBACK); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, GROUP_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, CRED_CHANGE_LISTENER); -} - -static void SaLoadOnDemandFuzz004(void) -{ - SetRegCallbackFunc(regCallbackMock); - SetRegDataChangeListenerFunc(regDataChangeListenerMock); - SetRegCredChangeListenerFunc(regCredChangeListenerMock); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, DEVAUTH_CALLBACK); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, GROUP_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID, &g_gmCallback, &g_listener, &g_credChangeListener, CRED_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID_1, &g_gmCallback, &g_listener, &g_credChangeListener, DEVAUTH_CALLBACK); - (void)AddCallbackInfoToList(TEST_APP_ID_1, &g_gmCallback, &g_listener, &g_credChangeListener, - GROUP_CHANGE_LISTENER); - (void)AddCallbackInfoToList(TEST_APP_ID_1, &g_gmCallback, &g_listener, &g_credChangeListener, - CRED_CHANGE_LISTENER); - RegisterDevAuthCallback(); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, DEVAUTH_CALLBACK); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, GROUP_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID, CRED_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID_1, DEVAUTH_CALLBACK); - (void)RemoveCallbackInfoFromList(TEST_APP_ID_1, GROUP_CHANGE_LISTENER); - (void)RemoveCallbackInfoFromList(TEST_APP_ID_1, CRED_CHANGE_LISTENER); -} - bool FuzzDoSaLoadOnDemandFuzz(const uint8_t* data, size_t size) { (void)data; (void)size; (void)InitLoadOnDemand(); + (void)InitSdkIpcCallBackList(); SubscribeDeviceAuthSa(); SaLoadOnDemandFuzz001(); - SaLoadOnDemandFuzz002(); - SaLoadOnDemandFuzz003(); - SaLoadOnDemandFuzz004(); UnSubscribeDeviceAuthSa(); DeInitLoadOnDemand(); + DeInitSdkIpcCallBackList(); return true; } } diff --git a/test/unittest/deviceauth/source/deviceauth_interface_test.cpp b/test/unittest/deviceauth/source/deviceauth_interface_test.cpp index 3ecf949e..e0be6559 100644 --- a/test/unittest/deviceauth/source/deviceauth_interface_test.cpp +++ b/test/unittest/deviceauth/source/deviceauth_interface_test.cpp @@ -433,9 +433,9 @@ HWTEST_F(DeviceAuthInterfaceTest, DeviceAuthInterfaceTest005, TestSize.Level0) (void)InitIpcCallBackList(); AddIpcCbObjByAppId(TEST_APP_ID, 0, 0); DeInitIpcCallBackList(); - AddIpcCallBackByAppId(TEST_APP_ID, nullptr, 0, 0); + AddIpcCallBackByAppId(TEST_APP_ID, 0); (void)InitIpcCallBackList(); - AddIpcCallBackByAppId(TEST_APP_ID, nullptr, 0, 0); + AddIpcCallBackByAppId(TEST_APP_ID, 0); DeInitIpcCallBackList(); DelIpcCallBackByAppId(TEST_APP_ID, 0); (void)InitIpcCallBackList(); @@ -451,11 +451,11 @@ HWTEST_F(DeviceAuthInterfaceTest, DeviceAuthInterfaceTest005, TestSize.Level0) (void)InitIpcCallBackList(); AddIpcCbObjByReqId(123, 0, 0); DeInitIpcCallBackList(); - res = AddIpcCallBackByReqId(123, nullptr, 0, 0); + res = AddIpcCallBackByReqId(123, 0); ASSERT_NE(res, HC_SUCCESS); (void)InitIpcCallBackList(); - res = AddIpcCallBackByReqId(123, nullptr, 0, 0); - ASSERT_NE(res, HC_SUCCESS); + res = AddIpcCallBackByReqId(123, 0); + ASSERT_EQ(res, HC_SUCCESS); DeInitIpcCallBackList(); DelIpcCallBackByReqId(123, 0, true); DelIpcCallBackByReqId(123, 0, false); diff --git a/test/unittest/deviceauth/source/ipc_adapt_test.cpp b/test/unittest/deviceauth/source/ipc_adapt_test.cpp index ac1ae5ac..305ba0f7 100644 --- a/test/unittest/deviceauth/source/ipc_adapt_test.cpp +++ b/test/unittest/deviceauth/source/ipc_adapt_test.cpp @@ -21,6 +21,10 @@ using namespace testing::ext; namespace { +#define TEST_APP_ID "TestUserId" +#define TEST_APP_ID_1 "TestUserId1" +#define TEST_REQUEST_ID 121231231 + class IpcAdaptParamTest : public testing::Test { public: IpcAdaptParamTest() = default; // 显式声明默认构造函数 @@ -291,21 +295,8 @@ void IpcDevAuthCredListenerTest::TearDown() // 添加凭据监听器回调 static void AddCredListenerCallback() { - CredChangeListener credListener = { - .onCredAdd = nullptr, - .onCredDelete = nullptr, - .onCredUpdate = nullptr - }; - - IpcDataInfo testParams[1]; - testParams[0].type = CB_TYPE_CRED_LISTENER; - testParams[0].val = reinterpret_cast(&credListener); - testParams[0].valSz = sizeof(credListener); - testParams[0].idx = 0; - // 添加凭据监听器 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); } // 测试 InitDevAuthCredListenerCbCtx 函数 @@ -335,8 +326,7 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredAdd_Valid, TestSize.Level InitDevAuthCredListenerCbCtx(&credListener); // 更新回调 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); // 添加回调对象 AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); @@ -359,8 +349,7 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredAdd_NullCredId, TestSize. InitDevAuthCredListenerCbCtx(&credListener); // 更新回调 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); // 添加回调对象 AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); @@ -382,8 +371,7 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredDelete_Valid, TestSize.Le InitDevAuthCredListenerCbCtx(&credListener); // 更新回调 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); // 添加回调对象 AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); @@ -406,8 +394,7 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredDelete_NullCredId, TestSi InitDevAuthCredListenerCbCtx(&credListener); // 更新回调 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); // 添加回调对象 AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); @@ -429,8 +416,7 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredUpdate_Valid, TestSize.Le InitDevAuthCredListenerCbCtx(&credListener); // 更新回调 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); // 添加回调对象 AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); @@ -453,8 +439,7 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredUpdate_NullCredId, TestSi InitDevAuthCredListenerCbCtx(&credListener); // 更新回调 - ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), - sizeof(credListener), CB_TYPE_CRED_LISTENER)); + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", CB_TYPE_CRED_LISTENER)); // 添加回调对象 AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); @@ -464,4 +449,99 @@ HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredUpdate_NullCredId, TestSi credListener.onCredUpdate(nullptr, "test_cred_info"); } } + + +static void OnError(int64_t requestId, int operationCode, int errorCode, const char *errorReturn) +{ + (void)requestId; + (void)operationCode; + (void)errorCode; + (void)errorReturn; +} + +static void OnFinish(int64_t requestId, int operationCode, const char *authReturn) +{ + (void)requestId; + (void)operationCode; + (void)authReturn; +} + +static void OnSessionKeyReturned(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen) +{ + (void)requestId; + (void)sessionKey; + (void)sessionKeyLen; +} + +static bool OnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) +{ + (void)requestId; + (void)data; + (void)dataLen; + return true; +} + +static char *OnRequest(int64_t requestId, int operationCode, const char *reqParam) +{ + (void)requestId; + (void)operationCode; + (void)reqParam; + return nullptr; +} + +static DeviceAuthCallback g_gmCallback = { + .onTransmit = OnTransmit, + .onSessionKeyReturned = OnSessionKeyReturned, + .onFinish = OnFinish, + .onError = OnError, + .onRequest = OnRequest, +}; + +class SdkIpcDevAuthCredListenerTest : public testing::Test { +public: + SdkIpcDevAuthCredListenerTest() = default; // 显式声明默认构造函数 + ~SdkIpcDevAuthCredListenerTest() = default; // 显式声明默认析构函数 + void SetUp(); + void TearDown(); +}; + +void SdkIpcDevAuthCredListenerTest::SetUp() +{ + // 初始化回调列表 + ASSERT_EQ(HC_SUCCESS, InitSdkIpcCallBackList()); +} + +void SdkIpcDevAuthCredListenerTest::TearDown() +{ + // 清理回调列表 + DeInitSdkIpcCallBackList(); +} + +// 测试 InitDevAuthCredListenerCbCtx 函数 +HWTEST_F(SdkIpcDevAuthCredListenerTest, InitDevAuthCredListenerCbCtx_Valid, TestSize.Level0) +{ + int32_t ret = AddSdkCallBackByAppId(TEST_APP_ID, CB_TYPE_DEV_AUTH, reinterpret_cast(&g_gmCallback), + sizeof(DeviceAuthCallback)); + EXPECT_EQ(ret, HC_SUCCESS); + ret = AddSdkCallBackByAppId(TEST_APP_ID, CB_TYPE_DEV_AUTH, reinterpret_cast(&g_gmCallback), + sizeof(DeviceAuthCallback)); + EXPECT_EQ(ret, HC_SUCCESS); + ret = AddSdkCallBackByRequestId(TEST_REQUEST_ID, CB_TYPE_DEV_AUTH, reinterpret_cast(&g_gmCallback), + sizeof(DeviceAuthCallback)); + EXPECT_EQ(ret, HC_SUCCESS); + ret = AddSdkCallBackByRequestId(TEST_REQUEST_ID, CB_TYPE_DEV_AUTH, reinterpret_cast(&g_gmCallback), + sizeof(DeviceAuthCallback)); + EXPECT_EQ(ret, HC_SUCCESS); + (void)RemoveSdkCallBackByAppId(TEST_APP_ID, CB_TYPE_DEV_AUTH); + + ret = AddSdkCallBackByAppId(TEST_APP_ID_1, CB_TYPE_DEV_AUTH, reinterpret_cast(&g_gmCallback), + sizeof(DeviceAuthCallback)); + EXPECT_EQ(ret, HC_SUCCESS); + ret = AddRequestIdByAppId(TEST_APP_ID, TEST_REQUEST_ID); + EXPECT_NE(ret, HC_SUCCESS); + ret = AddRequestIdByAppId(TEST_APP_ID_1, TEST_REQUEST_ID); + EXPECT_EQ(ret, HC_SUCCESS); + (void)RemoveSdkCallBackByAppId(TEST_APP_ID_1, CB_TYPE_DEV_AUTH); + (void)RemoveSdkCallBackByRequestId(TEST_REQUEST_ID, CB_TYPE_DEV_AUTH); +} } \ No newline at end of file