185d2f8c5Sopenharmony_ci/* 285d2f8c5Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 385d2f8c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 485d2f8c5Sopenharmony_ci * you may not use this file except in compliance with the License. 585d2f8c5Sopenharmony_ci * You may obtain a copy of the License at 685d2f8c5Sopenharmony_ci * 785d2f8c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 885d2f8c5Sopenharmony_ci * 985d2f8c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1085d2f8c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1185d2f8c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1285d2f8c5Sopenharmony_ci * See the License for the specific language governing permissions and 1385d2f8c5Sopenharmony_ci * limitations under the License. 1485d2f8c5Sopenharmony_ci */ 1585d2f8c5Sopenharmony_ci 1685d2f8c5Sopenharmony_ci#include "trace.h" 1785d2f8c5Sopenharmony_ci 1885d2f8c5Sopenharmony_ci#include <cinttypes> 1985d2f8c5Sopenharmony_ci#include <sstream> 2085d2f8c5Sopenharmony_ci#include "auth_event_listener_manager.h" 2185d2f8c5Sopenharmony_ci#include "iam_logger.h" 2285d2f8c5Sopenharmony_ci#include "iam_time.h" 2385d2f8c5Sopenharmony_ci 2485d2f8c5Sopenharmony_ci#define LOG_TAG "USER_AUTH_SA" 2585d2f8c5Sopenharmony_ci 2685d2f8c5Sopenharmony_ciusing namespace OHOS::UserIam::UserAuth; 2785d2f8c5Sopenharmony_ci 2885d2f8c5Sopenharmony_cinamespace OHOS { 2985d2f8c5Sopenharmony_cinamespace UserIam { 3085d2f8c5Sopenharmony_cinamespace UserAuth { 3185d2f8c5Sopenharmony_ciTrace Trace::trace; 3285d2f8c5Sopenharmony_ci 3385d2f8c5Sopenharmony_ciTrace::Trace() 3485d2f8c5Sopenharmony_ci{ 3585d2f8c5Sopenharmony_ci ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessCredChangeEvent); 3685d2f8c5Sopenharmony_ci ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessCredManagerEvent); 3785d2f8c5Sopenharmony_ci ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessUserAuthEvent); 3885d2f8c5Sopenharmony_ci ContextCallbackNotifyListener::GetInstance().AddNotifier(ProcessUserAuthFwkEvent); 3985d2f8c5Sopenharmony_ci} 4085d2f8c5Sopenharmony_ci 4185d2f8c5Sopenharmony_ciTrace::~Trace() 4285d2f8c5Sopenharmony_ci{ 4385d2f8c5Sopenharmony_ci} 4485d2f8c5Sopenharmony_ci 4585d2f8c5Sopenharmony_civoid Trace::ProcessCredChangeEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag) 4685d2f8c5Sopenharmony_ci{ 4785d2f8c5Sopenharmony_ci static_cast<void>(flag); 4885d2f8c5Sopenharmony_ci if (!(metaData.operationType == TRACE_ADD_CREDENTIAL || 4985d2f8c5Sopenharmony_ci metaData.operationType == TRACE_DELETE_CREDENTIAL || 5085d2f8c5Sopenharmony_ci metaData.operationType == TRACE_UPDATE_CREDENTIAL || 5185d2f8c5Sopenharmony_ci metaData.operationType == TRACE_DELETE_USER || 5285d2f8c5Sopenharmony_ci metaData.operationType == TRACE_ENFORCE_DELETE_USER || 5385d2f8c5Sopenharmony_ci metaData.operationType == TRACE_DELETE_REDUNDANCY)) { 5485d2f8c5Sopenharmony_ci return; 5585d2f8c5Sopenharmony_ci } 5685d2f8c5Sopenharmony_ci UserCredChangeTrace securityInfo = {}; 5785d2f8c5Sopenharmony_ci if (metaData.callerName.has_value()) { 5885d2f8c5Sopenharmony_ci securityInfo.callerName = metaData.callerName.value(); 5985d2f8c5Sopenharmony_ci } 6085d2f8c5Sopenharmony_ci if (metaData.requestContextId.has_value()) { 6185d2f8c5Sopenharmony_ci securityInfo.requestContextId = metaData.requestContextId.value(); 6285d2f8c5Sopenharmony_ci } 6385d2f8c5Sopenharmony_ci if (metaData.userId.has_value()) { 6485d2f8c5Sopenharmony_ci securityInfo.userId = metaData.userId.value(); 6585d2f8c5Sopenharmony_ci } 6685d2f8c5Sopenharmony_ci if (metaData.authType.has_value()) { 6785d2f8c5Sopenharmony_ci securityInfo.authType = metaData.authType.value(); 6885d2f8c5Sopenharmony_ci } 6985d2f8c5Sopenharmony_ci securityInfo.operationType = metaData.operationType; 7085d2f8c5Sopenharmony_ci securityInfo.operationResult = metaData.operationResult; 7185d2f8c5Sopenharmony_ci uint64_t timeSpan = static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(metaData.endTime - 7285d2f8c5Sopenharmony_ci metaData.startTime).count()); 7385d2f8c5Sopenharmony_ci securityInfo.timeSpan = timeSpan; 7485d2f8c5Sopenharmony_ci ReportSecurityCredChange(securityInfo); 7585d2f8c5Sopenharmony_ci IAM_LOGI("start to process cred change event"); 7685d2f8c5Sopenharmony_ci} 7785d2f8c5Sopenharmony_ci 7885d2f8c5Sopenharmony_civoid Trace::ProcessCredManagerEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag) 7985d2f8c5Sopenharmony_ci{ 8085d2f8c5Sopenharmony_ci static_cast<void>(flag); 8185d2f8c5Sopenharmony_ci if (!(metaData.operationType == TRACE_ADD_CREDENTIAL || 8285d2f8c5Sopenharmony_ci metaData.operationType == TRACE_DELETE_CREDENTIAL || 8385d2f8c5Sopenharmony_ci metaData.operationType == TRACE_UPDATE_CREDENTIAL || 8485d2f8c5Sopenharmony_ci metaData.operationType == TRACE_DELETE_USER || 8585d2f8c5Sopenharmony_ci metaData.operationType == TRACE_ENFORCE_DELETE_USER)) { 8685d2f8c5Sopenharmony_ci return; 8785d2f8c5Sopenharmony_ci } 8885d2f8c5Sopenharmony_ci UserCredManagerTrace info = {}; 8985d2f8c5Sopenharmony_ci if (metaData.callerName.has_value()) { 9085d2f8c5Sopenharmony_ci info.callerName = metaData.callerName.value(); 9185d2f8c5Sopenharmony_ci } 9285d2f8c5Sopenharmony_ci if (metaData.userId.has_value()) { 9385d2f8c5Sopenharmony_ci info.userId = metaData.userId.value(); 9485d2f8c5Sopenharmony_ci } 9585d2f8c5Sopenharmony_ci if (metaData.authType.has_value()) { 9685d2f8c5Sopenharmony_ci info.authType = metaData.authType.value(); 9785d2f8c5Sopenharmony_ci } 9885d2f8c5Sopenharmony_ci info.operationType = metaData.operationType; 9985d2f8c5Sopenharmony_ci info.operationResult = metaData.operationResult; 10085d2f8c5Sopenharmony_ci ReportBehaviorCredManager(info); 10185d2f8c5Sopenharmony_ci IAM_LOGI("start to process cred manager event"); 10285d2f8c5Sopenharmony_ci} 10385d2f8c5Sopenharmony_ci 10485d2f8c5Sopenharmony_civoid Trace::CopyMetaDataToTraceInfo(const ContextCallbackNotifyListener::MetaData &metaData, UserAuthTrace &info) 10585d2f8c5Sopenharmony_ci{ 10685d2f8c5Sopenharmony_ci if (metaData.callerName.has_value()) { 10785d2f8c5Sopenharmony_ci info.callerName = metaData.callerName.value(); 10885d2f8c5Sopenharmony_ci } 10985d2f8c5Sopenharmony_ci if (metaData.sdkVersion.has_value()) { 11085d2f8c5Sopenharmony_ci info.sdkVersion = metaData.sdkVersion.value(); 11185d2f8c5Sopenharmony_ci } 11285d2f8c5Sopenharmony_ci if (metaData.atl.has_value()) { 11385d2f8c5Sopenharmony_ci info.atl = metaData.atl.value(); 11485d2f8c5Sopenharmony_ci } 11585d2f8c5Sopenharmony_ci if (metaData.authType.has_value() && metaData.operationResult == SUCCESS) { 11685d2f8c5Sopenharmony_ci info.authType = metaData.authType.value(); 11785d2f8c5Sopenharmony_ci } 11885d2f8c5Sopenharmony_ci if (metaData.userId.has_value()) { 11985d2f8c5Sopenharmony_ci info.userId = metaData.userId.value(); 12085d2f8c5Sopenharmony_ci } 12185d2f8c5Sopenharmony_ci if (metaData.callerType.has_value()) { 12285d2f8c5Sopenharmony_ci info.callerType = metaData.callerType.value(); 12385d2f8c5Sopenharmony_ci } 12485d2f8c5Sopenharmony_ci info.authResult = metaData.operationResult; 12585d2f8c5Sopenharmony_ci info.authtimeSpan = static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(metaData.endTime - 12685d2f8c5Sopenharmony_ci metaData.startTime).count()); 12785d2f8c5Sopenharmony_ci if (metaData.authWidgetType.has_value()) { 12885d2f8c5Sopenharmony_ci info.authWidgetType = metaData.authWidgetType.value(); 12985d2f8c5Sopenharmony_ci } 13085d2f8c5Sopenharmony_ci if (metaData.reuseUnlockResultMode.has_value()) { 13185d2f8c5Sopenharmony_ci info.reuseUnlockResultMode = metaData.reuseUnlockResultMode.value(); 13285d2f8c5Sopenharmony_ci } 13385d2f8c5Sopenharmony_ci if (metaData.reuseUnlockResultDuration.has_value()) { 13485d2f8c5Sopenharmony_ci info.reuseUnlockResultDuration = metaData.reuseUnlockResultDuration.value(); 13585d2f8c5Sopenharmony_ci } 13685d2f8c5Sopenharmony_ci if (metaData.isRemoteAuth.has_value()) { 13785d2f8c5Sopenharmony_ci info.isRemoteAuth = metaData.isRemoteAuth.value(); 13885d2f8c5Sopenharmony_ci } 13985d2f8c5Sopenharmony_ci if (metaData.remoteUdid.has_value()) { 14085d2f8c5Sopenharmony_ci info.remoteUdid = metaData.remoteUdid.value(); 14185d2f8c5Sopenharmony_ci } 14285d2f8c5Sopenharmony_ci if (metaData.localUdid.has_value()) { 14385d2f8c5Sopenharmony_ci info.localUdid = metaData.localUdid.value(); 14485d2f8c5Sopenharmony_ci } 14585d2f8c5Sopenharmony_ci if (metaData.connectionName.has_value()) { 14685d2f8c5Sopenharmony_ci info.connectionName = metaData.connectionName.value(); 14785d2f8c5Sopenharmony_ci } 14885d2f8c5Sopenharmony_ci if (metaData.authFinishReason.has_value()) { 14985d2f8c5Sopenharmony_ci info.authFinishReason = metaData.authFinishReason.value(); 15085d2f8c5Sopenharmony_ci } 15185d2f8c5Sopenharmony_ci if (metaData.isBackgroundApplication.has_value()) { 15285d2f8c5Sopenharmony_ci info.isBackgroundApplication = metaData.isBackgroundApplication.value(); 15385d2f8c5Sopenharmony_ci } 15485d2f8c5Sopenharmony_ci} 15585d2f8c5Sopenharmony_ci 15685d2f8c5Sopenharmony_civoid Trace::ProcessUserAuthEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag) 15785d2f8c5Sopenharmony_ci{ 15885d2f8c5Sopenharmony_ci if (!(metaData.operationType == TRACE_AUTH_USER_ALL || 15985d2f8c5Sopenharmony_ci metaData.operationType == TRACE_AUTH_USER_BEHAVIOR) || 16085d2f8c5Sopenharmony_ci (flag == TRACE_FLAG_NO_NEED_BEHAVIOR)) { 16185d2f8c5Sopenharmony_ci return; 16285d2f8c5Sopenharmony_ci } 16385d2f8c5Sopenharmony_ci UserAuthTrace info = {}; 16485d2f8c5Sopenharmony_ci CopyMetaDataToTraceInfo(metaData, info); 16585d2f8c5Sopenharmony_ci ReportUserAuth(info); 16685d2f8c5Sopenharmony_ci if (info.authResult == SUCCESS) { 16785d2f8c5Sopenharmony_ci AuthEventListenerManager::GetInstance().OnNotifyAuthSuccessEvent(info.userId, 16885d2f8c5Sopenharmony_ci static_cast<AuthType>(info.authType), info.callerType, info.callerName); 16985d2f8c5Sopenharmony_ci } 17085d2f8c5Sopenharmony_ci IAM_LOGI("start to process user auth event"); 17185d2f8c5Sopenharmony_ci} 17285d2f8c5Sopenharmony_ci 17385d2f8c5Sopenharmony_civoid Trace::ProcessUserAuthFwkEvent(const ContextCallbackNotifyListener::MetaData &metaData, TraceFlag flag) 17485d2f8c5Sopenharmony_ci{ 17585d2f8c5Sopenharmony_ci static_cast<void>(flag); 17685d2f8c5Sopenharmony_ci if (!(metaData.operationType == TRACE_AUTH_USER_ALL || 17785d2f8c5Sopenharmony_ci metaData.operationType == TRACE_AUTH_USER_SECURITY)) { 17885d2f8c5Sopenharmony_ci return; 17985d2f8c5Sopenharmony_ci } 18085d2f8c5Sopenharmony_ci UserAuthFwkTrace securityInfo = {}; 18185d2f8c5Sopenharmony_ci if (metaData.callerName.has_value()) { 18285d2f8c5Sopenharmony_ci securityInfo.callerName = metaData.callerName.value(); 18385d2f8c5Sopenharmony_ci } 18485d2f8c5Sopenharmony_ci if (metaData.requestContextId.has_value()) { 18585d2f8c5Sopenharmony_ci securityInfo.requestContextId = metaData.requestContextId.value(); 18685d2f8c5Sopenharmony_ci } 18785d2f8c5Sopenharmony_ci if (metaData.authContextId.has_value()) { 18885d2f8c5Sopenharmony_ci securityInfo.authContextId = metaData.authContextId.value(); 18985d2f8c5Sopenharmony_ci } 19085d2f8c5Sopenharmony_ci if (metaData.atl.has_value()) { 19185d2f8c5Sopenharmony_ci securityInfo.atl = metaData.atl.value(); 19285d2f8c5Sopenharmony_ci } 19385d2f8c5Sopenharmony_ci if (metaData.authType.has_value()) { 19485d2f8c5Sopenharmony_ci securityInfo.authType = metaData.authType.value(); 19585d2f8c5Sopenharmony_ci } 19685d2f8c5Sopenharmony_ci if (metaData.isRemoteAuth.has_value()) { 19785d2f8c5Sopenharmony_ci securityInfo.isRemoteAuth = metaData.isRemoteAuth.value(); 19885d2f8c5Sopenharmony_ci } 19985d2f8c5Sopenharmony_ci if (metaData.remoteUdid.has_value()) { 20085d2f8c5Sopenharmony_ci securityInfo.remoteUdid = metaData.remoteUdid.value(); 20185d2f8c5Sopenharmony_ci } 20285d2f8c5Sopenharmony_ci if (metaData.localUdid.has_value()) { 20385d2f8c5Sopenharmony_ci securityInfo.localUdid = metaData.localUdid.value(); 20485d2f8c5Sopenharmony_ci } 20585d2f8c5Sopenharmony_ci if (metaData.connectionName.has_value()) { 20685d2f8c5Sopenharmony_ci securityInfo.connectionName = metaData.connectionName.value(); 20785d2f8c5Sopenharmony_ci } 20885d2f8c5Sopenharmony_ci if (metaData.authFinishReason.has_value()) { 20985d2f8c5Sopenharmony_ci securityInfo.authFinishReason = metaData.authFinishReason.value(); 21085d2f8c5Sopenharmony_ci } 21185d2f8c5Sopenharmony_ci securityInfo.authResult = metaData.operationResult; 21285d2f8c5Sopenharmony_ci uint64_t timeSpan = static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(metaData.endTime - 21385d2f8c5Sopenharmony_ci metaData.startTime).count()); 21485d2f8c5Sopenharmony_ci securityInfo.authtimeSpan = timeSpan; 21585d2f8c5Sopenharmony_ci ReportSecurityUserAuthFwk(securityInfo); 21685d2f8c5Sopenharmony_ci IAM_LOGI("start to process user auth fwk event"); 21785d2f8c5Sopenharmony_ci} 21885d2f8c5Sopenharmony_ci} // namespace UserAuth 21985d2f8c5Sopenharmony_ci} // namespace UserIam 22085d2f8c5Sopenharmony_ci} // namespace OHOS