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 "userauth_adapter.h"
17 #include <cinttypes>
18 #include "auth_attributes.h"
19 #include "co_auth.h"
20 #include "userauth_datamgr.h"
21 #include "userauth_excallback_impl.h"
22 #include "userauth_hilog_wrapper.h"
23 #include "userauth_info.h"
24 #include "useridm_client.h"
25 #include "useridm_info.h"
26
27 namespace OHOS {
28 namespace UserIAM {
29 namespace UserAuth {
30 const int g_userAuthVersion = 0;
GetInstance()31 UserAuthAdapter &UserAuthAdapter::GetInstance()
32 {
33 static UserAuthAdapter instance;
34 return instance;
35 }
36
GetAuthTrustLevel(int32_t userId,uint32_t authType,uint32_t & authTrustLevel)37 int32_t UserAuthAdapter::GetAuthTrustLevel(int32_t userId, uint32_t authType, uint32_t &authTrustLevel)
38 {
39 USERAUTH_HILOGI(MODULE_SERVICE, "GetAuthTrustLevel start");
40 int32_t ret = OHOS::UserIAM::UserAuth::GetAuthTrustLevel(userId, authType, authTrustLevel);
41 if (ret != SUCCESS) {
42 USERAUTH_HILOGE(MODULE_SERVICE, "GetAuthTrustLevel failed");
43 }
44
45 return ret;
46 }
47
GetPropAuthInfo(int32_t userId,uint64_t callerUid,std::string pkgName,GetPropertyRequest requset,sptr<IUserAuthCallback> & callback)48 void UserAuthAdapter::GetPropAuthInfo(int32_t userId, uint64_t callerUid, std::string pkgName,
49 GetPropertyRequest requset, sptr<IUserAuthCallback> &callback)
50 {
51 USERAUTH_HILOGI(MODULE_SERVICE, "GetPropAuthInfo start");
52 using namespace UserIDM;
53 std::shared_ptr<GetInfoCallback> getInfoCallback =
54 std::make_shared<UserAuthCallbackImplIDMGetPorp>(callback, requset, callerUid, pkgName);
55 int32_t ret = UserIDMClient::GetInstance().GetAuthInfo(userId, static_cast<UserIDM::AuthType>(requset.authType),
56 getInfoCallback);
57 if (ret != SUCCESS) {
58 USERAUTH_HILOGE(MODULE_SERVICE, "GetAuthInfo failed");
59 }
60 USERAUTH_HILOGI(MODULE_SERVICE, "GetPropAuthInfo end");
61 }
62
SetPropAuthInfo(CallerInfo callerInfo,int32_t resultCode,UserAuthToken authToken,SetPropertyRequest requset,std::vector<uint64_t> templateIds)63 void UserAuthAdapter::SetPropAuthInfo(CallerInfo callerInfo, int32_t resultCode,
64 UserAuthToken authToken, SetPropertyRequest requset, std::vector<uint64_t> templateIds)
65 {
66 USERAUTH_HILOGI(MODULE_SERVICE, "SetPropAuthInfo start");
67 using namespace AuthResPool;
68 FreezInfo freezInfo;
69 freezInfo.callerID = callerInfo.callerUID;
70 freezInfo.authType = requset.authType;
71 freezInfo.pkgName = callerInfo.pkgName;
72 freezInfo.resultCode = resultCode;
73
74 std::shared_ptr<CoAuth::SetPropCallback> setPropCallback =
75 std::make_shared<UserAuthCallbackImplSetPropFreez>(templateIds, authToken, freezInfo);
76 if (setPropCallback == nullptr) {
77 USERAUTH_HILOGE(MODULE_SERVICE, "SetPropAuthInfo setPropCallback nullptr");
78 return;
79 }
80 AuthAttributes authAttributes;
81 int32_t ret = SetProPropAuthInfo(authAttributes, callerInfo, requset, templateIds, setPropCallback);
82 if (ret != SUCCESS) {
83 return;
84 }
85 CoAuth::CoAuth::GetInstance().SetExecutorProp(authAttributes, setPropCallback);
86 USERAUTH_HILOGI(MODULE_SERVICE, "SetPropAuthInfo end");
87 }
88
SetProPropAuthInfo(OHOS::UserIAM::AuthResPool::AuthAttributes & authAttributes,CallerInfo callerInfo,SetPropertyRequest requset,std::vector<uint64_t> templateIds,std::shared_ptr<CoAuth::SetPropCallback> & setPropCallback)89 int32_t UserAuthAdapter::SetProPropAuthInfo(OHOS::UserIAM::AuthResPool::AuthAttributes &authAttributes,
90 CallerInfo callerInfo, SetPropertyRequest requset, std::vector<uint64_t> templateIds,
91 std::shared_ptr<CoAuth::SetPropCallback> &setPropCallback)
92 {
93 uint32_t value;
94 int32_t ret = authAttributes.SetUint32Value(AUTH_TYPE, requset.authType);
95 if (ret != SUCCESS) {
96 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_TYPE failed");
97 std::vector<uint8_t> extraInfo;
98 setPropCallback->OnResult(ret, extraInfo);
99 return ret;
100 }
101 value = requset.key == SetPropertyType::FREEZE_TEMPLATE
102 ? static_cast<uint32_t>(AuthPropertyMode::PROPERMODE_FREEZE)
103 : static_cast<uint32_t>(AuthPropertyMode::PROPERMODE_UNFREEZE);
104 ret = authAttributes.SetUint32Value(AUTH_PROPERTY_MODE, value);
105 if (ret != SUCCESS) {
106 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_PROPERTY_MODE failed");
107 std::vector<uint8_t> extraInfo;
108 setPropCallback->OnResult(ret, extraInfo);
109 return ret;
110 }
111 ret = authAttributes.SetUint64Value(AUTH_CALLER_UID, callerInfo.callerUID);
112 if (ret != SUCCESS) {
113 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_CALLER_UID failed");
114 std::vector<uint8_t> extraInfo;
115 setPropCallback->OnResult(ret, extraInfo);
116 return ret;
117 }
118 std::vector<uint8_t> pkgNameValue;
119 callerInfo.pkgName.resize(callerInfo.pkgName.size());
120 pkgNameValue.clear();
121 pkgNameValue.assign(callerInfo.pkgName.begin(), callerInfo.pkgName.end());
122 ret = authAttributes.SetUint8ArrayValue(AUTH_CALLER_NAME, pkgNameValue);
123 if (ret != SUCCESS) {
124 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_CALLER_NAME failed");
125 std::vector<uint8_t> extraInfo;
126 setPropCallback->OnResult(ret, extraInfo);
127 return ret;
128 }
129 ret = authAttributes.SetUint64ArrayValue(AUTH_TEMPLATE_ID_LIST, templateIds);
130 if (ret != SUCCESS) {
131 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_TEMPLATE_ID_LIST failed");
132 std::vector<uint8_t> extraInfo;
133 setPropCallback->OnResult(ret, extraInfo);
134 return ret;
135 }
136 return ret;
137 }
138
GetPropAuthInfoCoauth(CallerInfo callerInfo,int32_t resultCode,UserAuthToken authToken,GetPropertyRequest requset,sptr<IUserAuthCallback> & callback)139 void UserAuthAdapter::GetPropAuthInfoCoauth(CallerInfo callerInfo, int32_t resultCode,
140 UserAuthToken authToken, GetPropertyRequest requset, sptr<IUserAuthCallback> &callback)
141 {
142 USERAUTH_HILOGI(MODULE_SERVICE, "GetPropAuthInfoCoauth start");
143 using namespace UserIDM;
144 std::shared_ptr<GetInfoCallback> getInfoCallback = std::make_shared<UserAuthCallbackImplIDMGetPorpCoauth>(callback,
145 callerInfo.callerUID, callerInfo.pkgName, resultCode, authToken, requset);
146 int32_t ret = UserIDMClient::GetInstance().GetAuthInfo(callerInfo.userID,
147 static_cast<UserIDM::AuthType>(requset.authType), getInfoCallback);
148 if (ret != SUCCESS) {
149 USERAUTH_HILOGE(MODULE_SERVICE, "GetAuthInfo failed");
150 }
151 USERAUTH_HILOGI(MODULE_SERVICE, "GetPropAuthInfoCoauth end");
152 }
153
CoauthSetPropAuthInfo(CallerInfo callerInfo,int32_t resultCode,UserAuthToken authToken,SetPropertyRequest requset)154 void UserAuthAdapter::CoauthSetPropAuthInfo(CallerInfo callerInfo, int32_t resultCode,
155 UserAuthToken authToken, SetPropertyRequest requset)
156 {
157 USERAUTH_HILOGI(MODULE_SERVICE, "CoauthSetPropAuthInfo start");
158 using namespace UserIDM;
159 std::shared_ptr<GetInfoCallback> setPropCallback = std::make_shared<UserAuthCallbackImplIDMCothGetPorpFreez>(
160 callerInfo.callerUID, callerInfo.pkgName, resultCode, authToken, requset);
161 int32_t ret = UserIDMClient::GetInstance().GetAuthInfo(callerInfo.userID,
162 static_cast<UserIDM::AuthType>(requset.authType), setPropCallback);
163 if (ret != SUCCESS) {
164 USERAUTH_HILOGE(MODULE_SERVICE, "GetAuthInfo failed");
165 }
166 USERAUTH_HILOGI(MODULE_SERVICE, "CoauthSetPropAuthInfo end");
167 }
168
GenerateSolution(AuthSolution param,std::vector<uint64_t> & sessionIds)169 int32_t UserAuthAdapter::GenerateSolution(AuthSolution param, std::vector<uint64_t> &sessionIds)
170 {
171 USERAUTH_HILOGI(MODULE_SERVICE, "UserAuth GenerateSolution start");
172 int32_t ret = OHOS::UserIAM::UserAuth::GenerateSolution(param, sessionIds);
173 if (ret != SUCCESS) {
174 USERAUTH_HILOGE(MODULE_SERVICE, "GenerateSolution failed");
175 }
176 return ret;
177 }
178
RequestAuthResult(uint64_t contextId,std::vector<uint8_t> scheduleToken,UserAuthToken & authToken,std::vector<uint64_t> & sessionIds)179 int32_t UserAuthAdapter::RequestAuthResult(uint64_t contextId, std::vector<uint8_t> scheduleToken,
180 UserAuthToken &authToken, std::vector<uint64_t> &sessionIds)
181 {
182 USERAUTH_HILOGI(MODULE_SERVICE, "RequestAuthResult start");
183 int32_t ret = OHOS::UserIAM::UserAuth::RequestAuthResult(contextId, scheduleToken, authToken, sessionIds);
184 if (ret != SUCCESS) {
185 USERAUTH_HILOGE(MODULE_SERVICE, "RequestAuthResult failed");
186 }
187 USERAUTH_HILOGI(MODULE_SERVICE, "RequestAuthResult end");
188 return ret;
189 }
190
CancelContext(uint64_t contextId,std::vector<uint64_t> & sessionIds)191 int32_t UserAuthAdapter::CancelContext(uint64_t contextId, std::vector<uint64_t> &sessionIds)
192 {
193 USERAUTH_HILOGI(MODULE_SERVICE, "CancelContext start");
194 int32_t ret = OHOS::UserIAM::UserAuth::CancelContext(contextId, sessionIds);
195 if (ret != SUCCESS) {
196 USERAUTH_HILOGE(MODULE_SERVICE, "CancelContext failed");
197 }
198 return ret;
199 }
200
Cancel(uint64_t sessionId)201 int32_t UserAuthAdapter::Cancel(uint64_t sessionId)
202 {
203 USERAUTH_HILOGI(MODULE_SERVICE, "Cancel start");
204 int32_t ret = CoAuth::CoAuth::GetInstance().Cancel(sessionId);
205 if (ret != SUCCESS) {
206 USERAUTH_HILOGE(MODULE_SERVICE, "Cancel failed");
207 }
208 return ret;
209 }
210
GetVersion()211 int32_t UserAuthAdapter::GetVersion()
212 {
213 USERAUTH_HILOGI(MODULE_SERVICE, "GetVersion start");
214 int32_t version = g_userAuthVersion;
215
216 return version;
217 }
218
GetExecutorProp(uint64_t callerUid,std::string pkgName,uint64_t templateId,GetPropertyRequest requset,ExecutorProperty & result)219 int32_t UserAuthAdapter::GetExecutorProp(uint64_t callerUid, std::string pkgName, uint64_t templateId,
220 GetPropertyRequest requset, ExecutorProperty &result)
221 {
222 USERAUTH_HILOGI(MODULE_SERVICE, "GetExecutorProp start");
223 using namespace AuthResPool;
224 uint32_t value;
225
226 auto pAuthAttributes(std::make_shared<AuthAttributes>());
227 AuthAttributes cAuthAttributes;
228 int32_t ret = cAuthAttributes.SetUint32Value(AUTH_TYPE, requset.authType);
229 if (ret != SUCCESS) {
230 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_TYPE failed");
231 return ret;
232 }
233 ret = cAuthAttributes.SetUint32Value(AUTH_PROPERTY_MODE, PROPERMODE_GET);
234 if (ret != SUCCESS) {
235 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_PROPERTY_MODE failed");
236 result.result = ret;
237 return ret;
238 }
239 ret = cAuthAttributes.SetUint64Value(AUTH_TEMPLATE_ID, templateId);
240 if (ret != SUCCESS) {
241 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_TEMPLATE_ID failed");
242 result.result = ret;
243 return ret;
244 }
245 ret = cAuthAttributes.SetUint64Value(AUTH_CALLER_UID, callerUid);
246 if (ret != SUCCESS) {
247 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_CALLER_UID failed");
248 return ret;
249 }
250 std::vector<uint8_t> pkgNameValue;
251 pkgName.resize(pkgName.size());
252 pkgNameValue.clear();
253 pkgNameValue.assign(pkgName.begin(), pkgName.end());
254 ret = cAuthAttributes.SetUint8ArrayValue(AUTH_CALLER_NAME, pkgNameValue);
255 if (ret != SUCCESS) {
256 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_CALLER_NAME failed");
257 result.result = ret;
258 return ret;
259 }
260 ret = CoAuth::CoAuth::GetInstance().GetExecutorProp(cAuthAttributes, pAuthAttributes);
261 if (ret != SUCCESS) {
262 USERAUTH_HILOGE(MODULE_SERVICE, "GetExecutorProp failed");
263 result.result = ret;
264 return ret;
265 }
266 if (GetEachExecutorProp(requset, result, value, pAuthAttributes) != SUCCESS) {
267 return ret;
268 }
269 result.result = SUCCESS;
270 return ret;
271 }
272
GetEachExecutorProp(GetPropertyRequest & requset,ExecutorProperty & result,uint32_t & value,std::shared_ptr<OHOS::UserIAM::AuthResPool::AuthAttributes> pAuthAttributes)273 int32_t UserAuthAdapter::GetEachExecutorProp(GetPropertyRequest &requset, ExecutorProperty &result, uint32_t &value,
274 std::shared_ptr<OHOS::UserIAM::AuthResPool::AuthAttributes> pAuthAttributes)
275 {
276 uint64_t tmpValue;
277 int32_t ret = SUCCESS;
278
279 result.freezingTime = 0;
280 result.remainTimes = 0;
281 result.authSubType = UserAuth::PIN_SIX;
282 for (auto const &item : requset.keys) {
283 switch (item) {
284 case AUTH_SUB_TYPE:
285 ret = pAuthAttributes->GetUint64Value(AUTH_SUBTYPE, tmpValue);
286 if (ret != SUCCESS) {
287 USERAUTH_HILOGE(MODULE_SERVICE, "Get AUTH_SUBTYPE failed");
288 result.result = ret;
289 return ret;
290 }
291 result.authSubType = static_cast<AuthSubType>(tmpValue);
292 break;
293 case REMAIN_TIMES:
294 ret = pAuthAttributes->GetUint32Value(AUTH_REMAIN_COUNT, result.remainTimes);
295 if (ret != SUCCESS) {
296 USERAUTH_HILOGE(MODULE_SERVICE, "Get AUTH_REMAIN_COUNT failed");
297 result.result = ret;
298 return ret;
299 }
300 break;
301 case FREEZING_TIME:
302 ret = pAuthAttributes->GetUint32Value(AUTH_REMAIN_TIME, result.freezingTime);
303 if (ret != SUCCESS) {
304 USERAUTH_HILOGE(MODULE_SERVICE, "Get AUTH_REMAIN_TIME failed");
305 result.result = ret;
306 return ret;
307 }
308 break;
309 default:
310 USERAUTH_HILOGE(MODULE_SERVICE, "The key to get ExecutorProp is invalid.");
311 result.result = INVALID_PARAMETERS;
312 return INVALID_PARAMETERS;
313 }
314 }
315 USERAUTH_HILOGI(MODULE_SERVICE, "UserAuthAdapter::GetEachExecutorProp %{public}" PRIu64 ":%{public}u:%{public}u",
316 result.authSubType, result.remainTimes, result.freezingTime);
317 return ret;
318 }
319
SetExecutorProp(uint64_t callerUid,std::string pkgName,SetPropertyRequest requset,sptr<IUserAuthCallback> & callback)320 int32_t UserAuthAdapter::SetExecutorProp(uint64_t callerUid, std::string pkgName, SetPropertyRequest requset,
321 sptr<IUserAuthCallback> &callback)
322 {
323 USERAUTH_HILOGI(MODULE_SERVICE, "SetExecutorProp start");
324 using namespace AuthResPool;
325 uint32_t value;
326
327 std::shared_ptr<CoAuth::SetPropCallback> setPropCallback = std::make_shared<UserAuthCallbackImplSetProp>(callback);
328 AuthAttributes authAttributes;
329 value = requset.key == SetPropertyType::INIT_ALGORITHM
330 ? static_cast<uint32_t>(AuthPropertyMode::PROPERMODE_INIT_ALGORITHM)
331 : static_cast<uint32_t>(AuthPropertyMode::PROPERMODE_RELEASE_ALGORITHM);
332 int32_t ret = authAttributes.SetUint32Value(AUTH_PROPERTY_MODE, value);
333 if (ret != SUCCESS) {
334 USERAUTH_HILOGE(MODULE_SERVICE, "Set SET_AUTH_PROPERTY_MODE failed");
335 return ret;
336 }
337 ret = authAttributes.SetUint64Value(AUTH_CALLER_UID, callerUid);
338 if (ret != SUCCESS) {
339 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_CALLER_UID failed");
340 return ret;
341 }
342 std::vector<uint8_t> pkgNameValue;
343 pkgName.resize(pkgName.size());
344 pkgNameValue.clear();
345 pkgNameValue.assign(pkgName.begin(), pkgName.end());
346 ret = authAttributes.SetUint8ArrayValue(AUTH_CALLER_NAME, pkgNameValue);
347 if (ret != SUCCESS) {
348 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_CALLER_NAME failed");
349 return ret;
350 }
351 ret = authAttributes.SetUint32Value(AUTH_TYPE, requset.authType);
352 if (ret != SUCCESS) {
353 USERAUTH_HILOGE(MODULE_SERVICE, "Set AUTH_TYPE failed");
354 return ret;
355 }
356 ret = authAttributes.SetUint8ArrayValue(ALGORITHM_INFO, requset.setInfo);
357 if (ret != SUCCESS) {
358 USERAUTH_HILOGE(MODULE_SERVICE, "Set ALGORITHM_INFO failed");
359 return ret;
360 }
361 CoAuth::CoAuth::GetInstance().SetExecutorProp(authAttributes, setPropCallback);
362 return ret;
363 }
364
CoAuth(CoAuthInfo coAuthInfo,sptr<IUserAuthCallback> & callback)365 int32_t UserAuthAdapter::CoAuth(CoAuthInfo coAuthInfo, sptr<IUserAuthCallback> &callback)
366 {
367 USERAUTH_HILOGI(MODULE_SERVICE, "CoAuth start");
368
369 std::shared_ptr<CoAuth::CoAuthCallback> coAuthCallback =
370 std::make_shared<UserAuthCallbackImplCoAuth>(callback, coAuthInfo, false);
371 OHOS::UserIAM::CoAuth::AuthInfo authInfo;
372 int32_t ret = authInfo.SetPkgName(coAuthInfo.pkgName);
373 if (ret != SUCCESS) {
374 USERAUTH_HILOGE(MODULE_SERVICE, "SetPkgName failed");
375 return ret;
376 }
377 ret = authInfo.SetCallerUid(coAuthInfo.callerID);
378 if (ret != SUCCESS) {
379 USERAUTH_HILOGE(MODULE_SERVICE, "SetCallerUid failed");
380 return ret;
381 }
382
383 ret = UserAuthCallbackImplCoAuth::SaveCoauthCallback(coAuthInfo.contextID, coAuthCallback);
384 if (ret != SUCCESS) {
385 USERAUTH_HILOGE(MODULE_SERVICE, "SaveCoauthCallback failed");
386 return ret;
387 }
388 for (auto const &item : coAuthInfo.sessionIds) {
389 CoAuth::CoAuth::GetInstance().BeginSchedule(item, authInfo, coAuthCallback);
390 }
391
392 return SUCCESS;
393 }
394 } // namespace UserAuth
395 } // namespace UserIAM
396 } // namespace OHOS
397