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