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 "trace.h"
17
18 #include <cinttypes>
19 #include <sstream>
20 #include "auth_event_listener_manager.h"
21 #include "iam_logger.h"
22 #include "iam_time.h"
23
24 #define LOG_TAG "USER_AUTH_SA"
25
26 using namespace OHOS::UserIam::UserAuth;
27
28 namespace OHOS {
29 namespace UserIam {
30 namespace UserAuth {
31 Trace Trace::trace;
32
Trace()33 Trace::Trace()
34 {
35 ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessCredChangeEvent);
36 ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessCredManagerEvent);
37 ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessUserAuthEvent);
38 ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessUserAuthFwkEvent);
39 }
40
~Trace()41 Trace::~Trace()
42 {
43 }
44
ProcessCredChangeEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)45 void Trace::ProcessCredChangeEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)
46 {
47 static_cast<void>(flag);
48 if (!(metaData.operationType == TRACE_ADD_CREDENTIAL ||
49 metaData.operationType == TRACE_DELETE_CREDENTIAL ||
50 metaData.operationType == TRACE_UPDATE_CREDENTIAL ||
51 metaData.operationType == TRACE_DELETE_USER ||
52 metaData.operationType == TRACE_ENFORCE_DELETE_USER ||
53 metaData.operationType == TRACE_DELETE_REDUNDANCY)) {
54 return;
55 }
56 UserCredChangeTrace securityInfo = {};
57 if (metaData.callerName.has_value()) {
58 securityInfo.callerName = metaData.callerName.value();
59 }
60 if (metaData.requestContextId.has_value()) {
61 securityInfo.requestContextId = metaData.requestContextId.value();
62 }
63 if (metaData.userId.has_value()) {
64 securityInfo.userId = metaData.userId.value();
65 }
66 if (metaData.authType.has_value()) {
67 securityInfo.authType = metaData.authType.value();
68 }
69 securityInfo.operationType = metaData.operationType;
70 securityInfo.operationResult = metaData.operationResult;
71 uint64_t timeSpan = static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(metaData.endTime -
72 metaData.startTime).count());
73 securityInfo.timeSpan = timeSpan;
74 ReportSecurityCredChange(securityInfo);
75 IAM_LOGI("start to process cred change event");
76 }
77
ProcessCredManagerEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)78 void Trace::ProcessCredManagerEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)
79 {
80 static_cast<void>(flag);
81 if (!(metaData.operationType == TRACE_ADD_CREDENTIAL ||
82 metaData.operationType == TRACE_DELETE_CREDENTIAL ||
83 metaData.operationType == TRACE_UPDATE_CREDENTIAL ||
84 metaData.operationType == TRACE_DELETE_USER ||
85 metaData.operationType == TRACE_ENFORCE_DELETE_USER)) {
86 return;
87 }
88 UserCredManagerTrace info = {};
89 if (metaData.callerName.has_value()) {
90 info.callerName = metaData.callerName.value();
91 }
92 if (metaData.userId.has_value()) {
93 info.userId = metaData.userId.value();
94 }
95 if (metaData.authType.has_value()) {
96 info.authType = metaData.authType.value();
97 }
98 info.operationType = metaData.operationType;
99 info.operationResult = metaData.operationResult;
100 ReportBehaviorCredManager(info);
101 IAM_LOGI("start to process cred manager event");
102 }
103
CopyMetaDataToTraceInfo(const ContextCallbackNotifyListener::MetaData &metaData, UserAuthTrace &info)104 void Trace::CopyMetaDataToTraceInfo(const ContextCallbackNotifyListener::MetaData &metaData, UserAuthTrace &info)
105 {
106 if (metaData.callerName.has_value()) {
107 info.callerName = metaData.callerName.value();
108 }
109 if (metaData.sdkVersion.has_value()) {
110 info.sdkVersion = metaData.sdkVersion.value();
111 }
112 if (metaData.atl.has_value()) {
113 info.atl = metaData.atl.value();
114 }
115 if (metaData.authType.has_value() && metaData.operationResult == SUCCESS) {
116 info.authType = metaData.authType.value();
117 }
118 if (metaData.userId.has_value()) {
119 info.userId = metaData.userId.value();
120 }
121 if (metaData.callerType.has_value()) {
122 info.callerType = metaData.callerType.value();
123 }
124 info.authResult = metaData.operationResult;
125 info.authtimeSpan = static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(metaData.endTime -
126 metaData.startTime).count());
127 if (metaData.authWidgetType.has_value()) {
128 info.authWidgetType = metaData.authWidgetType.value();
129 }
130 if (metaData.reuseUnlockResultMode.has_value()) {
131 info.reuseUnlockResultMode = metaData.reuseUnlockResultMode.value();
132 }
133 if (metaData.reuseUnlockResultDuration.has_value()) {
134 info.reuseUnlockResultDuration = metaData.reuseUnlockResultDuration.value();
135 }
136 if (metaData.isRemoteAuth.has_value()) {
137 info.isRemoteAuth = metaData.isRemoteAuth.value();
138 }
139 if (metaData.remoteUdid.has_value()) {
140 info.remoteUdid = metaData.remoteUdid.value();
141 }
142 if (metaData.localUdid.has_value()) {
143 info.localUdid = metaData.localUdid.value();
144 }
145 if (metaData.connectionName.has_value()) {
146 info.connectionName = metaData.connectionName.value();
147 }
148 if (metaData.authFinishReason.has_value()) {
149 info.authFinishReason = metaData.authFinishReason.value();
150 }
151 if (metaData.isBackgroundApplication.has_value()) {
152 info.isBackgroundApplication = metaData.isBackgroundApplication.value();
153 }
154 }
155
ProcessUserAuthEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)156 void Trace::ProcessUserAuthEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)
157 {
158 if (!(metaData.operationType == TRACE_AUTH_USER_ALL ||
159 metaData.operationType == TRACE_AUTH_USER_BEHAVIOR) ||
160 (flag == TRACE_FLAG_NO_NEED_BEHAVIOR)) {
161 return;
162 }
163 UserAuthTrace info = {};
164 CopyMetaDataToTraceInfo(metaData, info);
165 ReportUserAuth(info);
166 if (info.authResult == SUCCESS) {
167 AuthEventListenerManager::GetInstance().OnNotifyAuthSuccessEvent(info.userId,
168 static_cast<AuthType>(info.authType), info.callerType, info.callerName);
169 }
170 IAM_LOGI("start to process user auth event");
171 }
172
ProcessUserAuthFwkEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)173 void Trace::ProcessUserAuthFwkEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag)
174 {
175 static_cast<void>(flag);
176 if (!(metaData.operationType == TRACE_AUTH_USER_ALL ||
177 metaData.operationType == TRACE_AUTH_USER_SECURITY)) {
178 return;
179 }
180 UserAuthFwkTrace securityInfo = {};
181 if (metaData.callerName.has_value()) {
182 securityInfo.callerName = metaData.callerName.value();
183 }
184 if (metaData.requestContextId.has_value()) {
185 securityInfo.requestContextId = metaData.requestContextId.value();
186 }
187 if (metaData.authContextId.has_value()) {
188 securityInfo.authContextId = metaData.authContextId.value();
189 }
190 if (metaData.atl.has_value()) {
191 securityInfo.atl = metaData.atl.value();
192 }
193 if (metaData.authType.has_value()) {
194 securityInfo.authType = metaData.authType.value();
195 }
196 if (metaData.isRemoteAuth.has_value()) {
197 securityInfo.isRemoteAuth = metaData.isRemoteAuth.value();
198 }
199 if (metaData.remoteUdid.has_value()) {
200 securityInfo.remoteUdid = metaData.remoteUdid.value();
201 }
202 if (metaData.localUdid.has_value()) {
203 securityInfo.localUdid = metaData.localUdid.value();
204 }
205 if (metaData.connectionName.has_value()) {
206 securityInfo.connectionName = metaData.connectionName.value();
207 }
208 if (metaData.authFinishReason.has_value()) {
209 securityInfo.authFinishReason = metaData.authFinishReason.value();
210 }
211 securityInfo.authResult = metaData.operationResult;
212 uint64_t timeSpan = static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(metaData.endTime -
213 metaData.startTime).count());
214 securityInfo.authtimeSpan = timeSpan;
215 ReportSecurityUserAuthFwk(securityInfo);
216 IAM_LOGI("start to process user auth fwk event");
217 }
218 } // namespace UserAuth
219 } // namespace UserIam
220 } // namespace OHOS