• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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