1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "user_idm_callback_service.h"
17
18 #include "callback_manager.h"
19 #include "iam_logger.h"
20 #include "iam_ptr.h"
21
22 #define LOG_TAG "USER_IDM_SDK"
23
24 namespace OHOS {
25 namespace UserIam {
26 namespace UserAuth {
IdmCallbackService(const std::shared_ptr<UserIdmClientCallback> & impl)27 IdmCallbackService::IdmCallbackService(const std::shared_ptr<UserIdmClientCallback> &impl)
28 : idmClientCallback_(impl),
29 iamHitraceHelper_(Common::MakeShared<UserIam::UserAuth::IamHitraceHelper>("IDM InnerKit"))
30 {
31 CallbackManager::CallbackAction action = [impl]() {
32 if (impl != nullptr) {
33 IAM_LOGI("user idm service death, return default result to caller");
34 Attributes extraInfo;
35 impl->OnResult(GENERAL_ERROR, extraInfo);
36 }
37 };
38 CallbackManager::GetInstance().AddCallback(reinterpret_cast<uintptr_t>(this), action);
39 }
40
~IdmCallbackService()41 IdmCallbackService::~IdmCallbackService()
42 {
43 CallbackManager::GetInstance().RemoveCallback(reinterpret_cast<uintptr_t>(this));
44 }
45
OnResult(int32_t resultCode,const std::vector<uint8_t> & extraInfo)46 int32_t IdmCallbackService::OnResult(int32_t resultCode, const std::vector<uint8_t> &extraInfo)
47 {
48 IAM_LOGI("start, result:%{public}d", resultCode);
49 iamHitraceHelper_ = nullptr;
50 if (idmClientCallback_ == nullptr) {
51 IAM_LOGE("idm client callback is nullptr");
52 return GENERAL_ERROR;
53 }
54 Attributes attribute(extraInfo);
55 idmClientCallback_->OnResult(resultCode, attribute);
56 return SUCCESS;
57 }
58
OnAcquireInfo(int32_t module,int32_t acquireInfo,const std::vector<uint8_t> & extraInfo)59 int32_t IdmCallbackService::OnAcquireInfo(int32_t module, int32_t acquireInfo, const std::vector<uint8_t> &extraInfo)
60 {
61 IAM_LOGI("start, module:%{public}d acquireInfo:%{public}d", module, acquireInfo);
62 if (idmClientCallback_ == nullptr) {
63 IAM_LOGE("idm client callback is nullptr");
64 return GENERAL_ERROR;
65 }
66 Attributes attribute(extraInfo);
67 idmClientCallback_->OnAcquireInfo(module, static_cast<uint32_t>(acquireInfo), attribute);
68 return SUCCESS;
69 }
70
CallbackEnter(uint32_t code)71 int32_t IdmCallbackService::CallbackEnter([[maybe_unused]] uint32_t code)
72 {
73 IAM_LOGI("start, code:%{public}u", code);
74 return SUCCESS;
75 }
76
CallbackExit(uint32_t code,int32_t result)77 int32_t IdmCallbackService::CallbackExit([[maybe_unused]] uint32_t code, [[maybe_unused]] int32_t result)
78 {
79 IAM_LOGI("leave, code:%{public}u, result:%{public}d", code, result);
80 return SUCCESS;
81 }
82
IdmGetCredInfoCallbackService(const std::shared_ptr<GetCredentialInfoCallback> & impl)83 IdmGetCredInfoCallbackService::IdmGetCredInfoCallbackService(
84 const std::shared_ptr<GetCredentialInfoCallback> &impl) : getCredInfoCallback_(impl)
85 {
86 CallbackManager::CallbackAction action = [impl]() {
87 if (impl != nullptr) {
88 IAM_LOGI("user idm service death, return default cred info result to caller");
89 std::vector<CredentialInfo> infoList;
90 impl->OnCredentialInfo(GENERAL_ERROR, infoList);
91 }
92 };
93 CallbackManager::GetInstance().AddCallback(reinterpret_cast<uintptr_t>(this), action);
94 }
95
~IdmGetCredInfoCallbackService()96 IdmGetCredInfoCallbackService::~IdmGetCredInfoCallbackService()
97 {
98 CallbackManager::GetInstance().RemoveCallback(reinterpret_cast<uintptr_t>(this));
99 }
100
OnCredentialInfos(int32_t resultCode,const std::vector<IpcCredentialInfo> & ipcCredInfoList)101 int32_t IdmGetCredInfoCallbackService::OnCredentialInfos(int32_t resultCode,
102 const std::vector<IpcCredentialInfo> &ipcCredInfoList)
103 {
104 IAM_LOGD("start, cred info vector size:%{public}zu", ipcCredInfoList.size());
105 if (getCredInfoCallback_ == nullptr) {
106 IAM_LOGE("getCredInfoCallback is nullptr");
107 return GENERAL_ERROR;
108 }
109
110 std::vector<CredentialInfo> credInfoList;
111 for (auto &iter : ipcCredInfoList) {
112 CredentialInfo credentialInfo;
113 credentialInfo.authType = static_cast<AuthType>(iter.authType);
114 credentialInfo.pinType = static_cast<PinSubType>(iter.pinType);
115 credentialInfo.credentialId = iter.credentialId;
116 credentialInfo.templateId = iter.templateId;
117 credentialInfo.isAbandoned = iter.isAbandoned;
118 credentialInfo.validityPeriod = iter.validityPeriod;
119 credInfoList.push_back(credentialInfo);
120 }
121 getCredInfoCallback_->OnCredentialInfo(resultCode, credInfoList);
122 return SUCCESS;
123 }
124
CallbackEnter(uint32_t code)125 int32_t IdmGetCredInfoCallbackService::CallbackEnter([[maybe_unused]] uint32_t code)
126 {
127 IAM_LOGI("start, code:%{public}u", code);
128 return SUCCESS;
129 }
130
CallbackExit(uint32_t code,int32_t result)131 int32_t IdmGetCredInfoCallbackService::CallbackExit([[maybe_unused]] uint32_t code, [[maybe_unused]] int32_t result)
132 {
133 IAM_LOGI("leave, code:%{public}u, result:%{public}d", code, result);
134 return SUCCESS;
135 }
136
IdmGetSecureUserInfoCallbackService(const std::shared_ptr<GetSecUserInfoCallback> & impl)137 IdmGetSecureUserInfoCallbackService::IdmGetSecureUserInfoCallbackService(
138 const std::shared_ptr<GetSecUserInfoCallback> &impl) : getSecInfoCallback_(impl)
139 {
140 CallbackManager::CallbackAction action = [impl]() {
141 if (impl != nullptr) {
142 IAM_LOGI("user idm service death, return default secure info to caller");
143 SecUserInfo info = {};
144 impl->OnSecUserInfo(GENERAL_ERROR, info);
145 }
146 };
147 CallbackManager::GetInstance().AddCallback(reinterpret_cast<uintptr_t>(this), action);
148 }
149
~IdmGetSecureUserInfoCallbackService()150 IdmGetSecureUserInfoCallbackService::~IdmGetSecureUserInfoCallbackService()
151 {
152 CallbackManager::GetInstance().RemoveCallback(reinterpret_cast<uintptr_t>(this));
153 }
154
OnSecureUserInfo(int32_t resultCode,const IpcSecUserInfo & ipcSecUserInfo)155 int32_t IdmGetSecureUserInfoCallbackService::OnSecureUserInfo(int32_t resultCode, const IpcSecUserInfo &ipcSecUserInfo)
156 {
157 IAM_LOGI("start, enrolled info vector size:%{public}zu", ipcSecUserInfo.enrolledInfo.size());
158 if (getSecInfoCallback_ == nullptr) {
159 IAM_LOGE("getSecInfoCallback_ is nullptr");
160 return GENERAL_ERROR;
161 }
162
163 SecUserInfo secUserInfo = {};
164 secUserInfo.secureUid = ipcSecUserInfo.secureUid;
165 for (auto &iter : ipcSecUserInfo.enrolledInfo) {
166 EnrolledInfo enrolledInfo;
167 enrolledInfo.authType = static_cast<AuthType>(iter.authType);
168 enrolledInfo.enrolledId = iter.enrolledId;
169 secUserInfo.enrolledInfo.push_back(enrolledInfo);
170 }
171 getSecInfoCallback_->OnSecUserInfo(resultCode, secUserInfo);
172 return SUCCESS;
173 }
174
CallbackEnter(uint32_t code)175 int32_t IdmGetSecureUserInfoCallbackService::CallbackEnter([[maybe_unused]] uint32_t code)
176 {
177 IAM_LOGI("start, code:%{public}u", code);
178 return SUCCESS;
179 }
180
CallbackExit(uint32_t code,int32_t result)181 int32_t IdmGetSecureUserInfoCallbackService::CallbackExit([[maybe_unused]] uint32_t code,
182 [[maybe_unused]] int32_t result)
183 {
184 IAM_LOGI("leave, code:%{public}u, result:%{public}d", code, result);
185 return SUCCESS;
186 }
187 } // namespace UserAuth
188 } // namespace UserIam
189 } // namespace OHOS