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