• 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 "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