• 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 #include "context_callback_impl.h"
16 
17 #include <sstream>
18 
19 #include "auth_event_listener_manager.h"
20 #include "iam_check.h"
21 #include "iam_common_defines.h"
22 #include "iam_logger.h"
23 #include "iam_mem.h"
24 #include "iam_ptr.h"
25 #include "nlohmann/json.hpp"
26 
27 #define LOG_TAG "USER_AUTH_SA"
28 namespace OHOS {
29 namespace UserIam {
30 namespace UserAuth {
ContextCallbackImpl(sptr<IamCallbackInterface> iamCallback,OperationType operationType)31 ContextCallbackImpl::ContextCallbackImpl(sptr<IamCallbackInterface> iamCallback, OperationType operationType)
32     : iamCallback_(iamCallback)
33 {
34     metaData_.operationType = operationType;
35     metaData_.startTime = std::chrono::steady_clock::now();
36     std::ostringstream ss;
37     ss << "IDM(operation:" << operationType << ")";
38     iamHitraceHelper_ = Common::MakeShared<IamHitraceHelper>(ss.str());
39 }
40 
OnAcquireInfo(ExecutorRole src,int32_t moduleType,const std::vector<uint8_t> & acquireMsg)41 void ContextCallbackImpl::OnAcquireInfo(ExecutorRole src, int32_t moduleType,
42     const std::vector<uint8_t> &acquireMsg)
43 {
44     if (iamCallback_ == nullptr) {
45         IAM_LOGE("iam callback is nullptr");
46         return;
47     }
48     int32_t acquireInfo;
49     Attributes attr(acquireMsg);
50     bool getAcquireInfoRet = attr.GetInt32Value(Attributes::ATTR_TIP_INFO, acquireInfo);
51     IF_FALSE_LOGE_AND_RETURN(getAcquireInfoRet);
52 
53     std::vector<uint8_t> extraInfo;
54     bool getExtraInfoRet = attr.GetUint8ArrayValue(Attributes::ATTR_EXTRA_INFO, extraInfo);
55     if (getExtraInfoRet) {
56         ProcessAuthResult(acquireInfo, extraInfo);
57     }
58 
59     iamCallback_->OnAcquireInfo(moduleType, acquireInfo, attr);
60 }
61 
ProcessAuthResult(int32_t tip,const std::vector<uint8_t> & extraInfo)62 void ContextCallbackImpl::ProcessAuthResult(int32_t tip, const std::vector<uint8_t> &extraInfo)
63 {
64     if (tip != USER_AUTH_TIP_SINGLE_AUTH_RESULT) {
65         return;
66     }
67     if (extraInfo.empty()) {
68         return;
69     }
70     std::string tipJson(reinterpret_cast<const char *>(extraInfo.data()), extraInfo.size());
71     if (!nlohmann::json::accept(tipJson)) {
72         IAM_LOGE("invalid format");
73         return;
74     }
75     IAM_LOGI("tipJson:%{public}s", tipJson.c_str());
76     auto root = nlohmann::json::parse(tipJson.c_str());
77     if (root.is_null() || root.is_discarded()) {
78         IAM_LOGE("root is null");
79         return;
80     }
81     const std::string tipJsonKeyAuthResult = "authResult";
82     int32_t authResult = 0;
83     if (root.find(tipJsonKeyAuthResult) == root.end() || !(root[tipJsonKeyAuthResult].is_number())) {
84         IAM_LOGE("authResult is null or is not number");
85         return;
86     }
87     root.at(tipJsonKeyAuthResult).get_to(authResult);
88     if (authResult == SUCCESS) {
89         IAM_LOGI("authResult is success");
90         return;
91     }
92     metaData_.operationResult = authResult;
93     metaData_.endTime = std::chrono::steady_clock::now();
94     IAM_LOGI("fingerprint single auth result, tip: %{public}d, result: %{public}d", tip, authResult);
95     ContextCallbackNotifyListener::GetInstance().Process(metaData_, TRACE_FLAG_NO_NEED_BEHAVIOR);
96     return;
97 }
98 
OnResult(int32_t resultCode,const Attributes & finalResult)99 void ContextCallbackImpl::OnResult(int32_t resultCode, const Attributes &finalResult)
100 {
101     int32_t remainTime;
102     int32_t freezingTime;
103     metaData_.operationResult = resultCode;
104     if (finalResult.GetInt32Value(Attributes::ATTR_REMAIN_TIMES, remainTime)) {
105         metaData_.remainTime = remainTime;
106     }
107     if (finalResult.GetInt32Value(Attributes::ATTR_FREEZING_TIME, freezingTime)) {
108         metaData_.freezingTime = freezingTime;
109     }
110     metaData_.endTime = std::chrono::steady_clock::now();
111 
112     if (iamCallback_ != nullptr) {
113         iamCallback_->OnResult(resultCode, finalResult);
114     }
115     HandleAuthSuccessResult(resultCode, finalResult);
116 
117     ContextCallbackNotifyListener::GetInstance().Process(metaData_, TRACE_FLAG_DEFAULT);
118     if (stopCallback_ != nullptr) {
119         stopCallback_();
120     }
121 }
122 
HandleAuthSuccessResult(int32_t resultCode,const Attributes & finalResult)123 void ContextCallbackImpl::HandleAuthSuccessResult(int32_t resultCode, const Attributes &finalResult)
124 {
125     if (resultCode != SUCCESS || (metaData_.operationType != TRACE_AUTH_USER_ALL &&
126         metaData_.operationType != TRACE_AUTH_USER_BEHAVIOR)) {
127         return;
128     }
129     if (!metaData_.authType.has_value() || !metaData_.callerType.has_value() || !metaData_.callerName.has_value()) {
130         IAM_LOGE("bad metaData");
131         return;
132     }
133     int32_t userId = INVALID_USER_ID;
134     if (!finalResult.GetInt32Value(Attributes::ATTR_USER_ID, userId)) {
135         IAM_LOGE("get userId failed");
136         return;
137     }
138     AuthEventListenerManager::GetInstance().OnNotifyAuthSuccessEvent(userId,
139         static_cast<AuthType>(metaData_.authType.value()), metaData_.callerType.value(), metaData_.callerName.value());
140 }
141 
SetTraceUserId(int32_t userId)142 void ContextCallbackImpl::SetTraceUserId(int32_t userId)
143 {
144     metaData_.userId = userId;
145 }
146 
SetTraceRemainTime(int32_t remainTime)147 void ContextCallbackImpl::SetTraceRemainTime(int32_t remainTime)
148 {
149     metaData_.remainTime = remainTime;
150 }
151 
SetTraceCallerName(const std::string & callerName)152 void ContextCallbackImpl::SetTraceCallerName(const std::string &callerName)
153 {
154     metaData_.callerName = callerName;
155 }
156 
SetTraceRequestContextId(uint64_t requestContextId)157 void ContextCallbackImpl::SetTraceRequestContextId(uint64_t requestContextId)
158 {
159     metaData_.requestContextId = requestContextId;
160 }
161 
SetTraceAuthContextId(uint64_t authContextId)162 void ContextCallbackImpl::SetTraceAuthContextId(uint64_t authContextId)
163 {
164     metaData_.authContextId = authContextId;
165 }
166 
SetTraceFreezingTime(int32_t freezingTime)167 void ContextCallbackImpl::SetTraceFreezingTime(int32_t freezingTime)
168 {
169     metaData_.freezingTime = freezingTime;
170 }
171 
SetTraceSdkVersion(int32_t version)172 void ContextCallbackImpl::SetTraceSdkVersion(int32_t version)
173 {
174     metaData_.sdkVersion = version;
175 }
176 
SetTraceAuthType(int32_t authType)177 void ContextCallbackImpl::SetTraceAuthType(int32_t authType)
178 {
179     metaData_.authType = authType;
180 }
181 
SetTraceAuthWidgetType(uint32_t authWidgetType)182 void ContextCallbackImpl::SetTraceAuthWidgetType(uint32_t authWidgetType)
183 {
184     metaData_.authWidgetType = authWidgetType;
185 }
186 
SetTraceAuthTrustLevel(AuthTrustLevel atl)187 void ContextCallbackImpl::SetTraceAuthTrustLevel(AuthTrustLevel atl)
188 {
189     metaData_.atl = atl;
190 }
191 
SetTraceCallerType(int32_t callerType)192 void ContextCallbackImpl::SetTraceCallerType(int32_t callerType)
193 {
194     metaData_.callerType = callerType;
195 }
196 
SetTraceReuseUnlockResultMode(uint32_t reuseUnlockResultMode)197 void ContextCallbackImpl::SetTraceReuseUnlockResultMode(uint32_t reuseUnlockResultMode)
198 {
199     metaData_.reuseUnlockResultMode = reuseUnlockResultMode;
200 }
201 
SetTraceReuseUnlockResultDuration(uint64_t reuseUnlockResultDuration)202 void ContextCallbackImpl::SetTraceReuseUnlockResultDuration(uint64_t reuseUnlockResultDuration)
203 {
204     metaData_.reuseUnlockResultDuration = reuseUnlockResultDuration;
205 }
206 
SetTraceIsBackgroundApplication(bool isBackgroundApplication)207 void ContextCallbackImpl::SetTraceIsBackgroundApplication(bool isBackgroundApplication)
208 {
209     metaData_.isBackgroundApplication = isBackgroundApplication;
210 }
211 
SetCleaner(Context::ContextStopCallback callback)212 void ContextCallbackImpl::SetCleaner(Context::ContextStopCallback callback)
213 {
214     stopCallback_ = callback;
215 }
216 
GetIamCallback()217 sptr<IamCallbackInterface> ContextCallbackImpl::GetIamCallback()
218 {
219     return iamCallback_;
220 }
221 
GetCallerName()222 std::string ContextCallbackImpl::GetCallerName()
223 {
224     if (metaData_.callerName.has_value()) {
225         return metaData_.callerName.value();
226     }
227     return "";
228 }
229 
GetInstance()230 ContextCallbackNotifyListener &ContextCallbackNotifyListener::GetInstance()
231 {
232     static ContextCallbackNotifyListener contextCallbackNotifyListener;
233     return contextCallbackNotifyListener;
234 }
235 
AddNotifier(const Notify & notify)236 void ContextCallbackNotifyListener::AddNotifier(const Notify &notify)
237 {
238     notifierList_.emplace_back(notify);
239 }
240 
Process(const MetaData & metaData,TraceFlag flag)241 void ContextCallbackNotifyListener::Process(const MetaData &metaData, TraceFlag flag)
242 {
243     for (const auto &notify : notifierList_) {
244         if (notify != nullptr) {
245             notify(metaData, flag);
246         }
247     }
248 }
249 
NewInstance(sptr<IamCallbackInterface> iamCallback,OperationType operationType)250 std::shared_ptr<ContextCallback> ContextCallback::NewInstance(sptr<IamCallbackInterface> iamCallback,
251     OperationType operationType)
252 {
253     if (iamCallback == nullptr) {
254         IAM_LOGE("iam callback is nullptr, parameter is invalid");
255         return nullptr;
256     }
257     return UserIam::Common::MakeShared<ContextCallbackImpl>(iamCallback, operationType);
258 }
259 
260 class IamDummyCallback : public IamCallbackInterface, public NoCopyable {
261 public:
262     explicit IamDummyCallback() = default;
263     ~IamDummyCallback() override = default;
OnResult(int32_t result,const Attributes & extraInfo)264     void OnResult(int32_t result, const Attributes &extraInfo) override
265     {
266         static_cast<void>(result);
267         static_cast<void>(extraInfo);
268     }
OnAcquireInfo(int32_t module,int32_t acquireInfo,const Attributes & extraInfo)269     void OnAcquireInfo(int32_t module, int32_t acquireInfo, const Attributes &extraInfo) override
270     {
271         static_cast<void>(module);
272         static_cast<void>(acquireInfo);
273         static_cast<void>(extraInfo);
274     }
AsObject()275     sptr<IRemoteObject> AsObject() override
276     {
277         sptr<IRemoteObject> tmp(nullptr);
278         return tmp;
279     }
280 };
281 
NewDummyInstance(OperationType operationType)282 std::shared_ptr<ContextCallback> ContextCallback::NewDummyInstance(OperationType operationType)
283 {
284     sptr<IamCallbackInterface> iamDummyCallback(new (std::nothrow) IamDummyCallback());
285     if (iamDummyCallback == nullptr) {
286         IAM_LOGE("iamDummyCallback is nullptr");
287         return nullptr;
288     }
289     return UserIam::Common::MakeShared<ContextCallbackImpl>(iamDummyCallback, operationType);
290 }
291 } // namespace UserAuth
292 } // namespace UserIam
293 } // namespace OHOS