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 "data_translator.h"
17
18 #include "active_change_response_info.h"
19 #include "constant.h"
20 #include "data_validator.h"
21 #include "privacy_field_const.h"
22 #include "time_util.h"
23
24 namespace OHOS {
25 namespace Security {
26 namespace AccessToken {
27 namespace {
28 static const int64_t LATEST_RECORD_TIME = 7 * Constant::ONE_DAY_MILLISECONDS;
29 }
TranslationIntoGenericValues(const PermissionUsedRequest & request,GenericValues & andGenericValues)30 int32_t DataTranslator::TranslationIntoGenericValues(const PermissionUsedRequest& request,
31 GenericValues& andGenericValues)
32 {
33 int64_t begin = request.beginTimeMillis;
34 int64_t end = request.endTimeMillis;
35
36 if ((begin < 0) || (end < 0) || (begin > end)) {
37 return Constant::FAILURE;
38 }
39
40 if (begin == 0 && end == 0) {
41 int64_t beginTime = TimeUtil::GetCurrentTimestamp() - LATEST_RECORD_TIME;
42 begin = (beginTime < 0) ? 0 : beginTime;
43 end = TimeUtil::GetCurrentTimestamp();
44 }
45
46 if (begin != 0) {
47 andGenericValues.Put(PrivacyFiledConst::FIELD_TIMESTAMP_BEGIN, begin);
48 }
49 if (end != 0) {
50 andGenericValues.Put(PrivacyFiledConst::FIELD_TIMESTAMP_END, end);
51 }
52
53 PermissionUsageFlagEnum flag = request.flag;
54
55 if (!DataValidator::IsPermissionUsedFlagValid(flag)) {
56 return Constant::FAILURE;
57 }
58
59 if (flag == FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_LOCKED) {
60 andGenericValues.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, static_cast<int32_t>(PERM_ACTIVE_IN_LOCKED));
61 } else if (flag == FLAG_PERMISSION_USAGE_SUMMARY_IN_SCREEN_UNLOCKED) {
62 andGenericValues.Put(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS, static_cast<int32_t>(PERM_ACTIVE_IN_UNLOCKED));
63 } else if (flag == FLAG_PERMISSION_USAGE_SUMMARY_IN_APP_BACKGROUND) {
64 andGenericValues.Put(PrivacyFiledConst::FIELD_STATUS, static_cast<int32_t>(PERM_ACTIVE_IN_BACKGROUND));
65 } else if (flag == FLAG_PERMISSION_USAGE_SUMMARY_IN_APP_FOREGROUND) {
66 andGenericValues.Put(PrivacyFiledConst::FIELD_STATUS, static_cast<int32_t>(PERM_ACTIVE_IN_FOREGROUND));
67 }
68
69 return Constant::SUCCESS;
70 }
71
TranslationGenericValuesIntoPermissionUsedRecord(const GenericValues & inGenericValues,PermissionUsedRecord & permissionRecord)72 int32_t DataTranslator::TranslationGenericValuesIntoPermissionUsedRecord(const GenericValues& inGenericValues,
73 PermissionUsedRecord& permissionRecord)
74 {
75 int32_t accessCount = inGenericValues.GetInt(PrivacyFiledConst::FIELD_ACCESS_COUNT);
76 int32_t rejectCount = inGenericValues.GetInt(PrivacyFiledConst::FIELD_REJECT_COUNT);
77 std::string permission;
78 int32_t opCode = inGenericValues.GetInt(PrivacyFiledConst::FIELD_OP_CODE);
79 if (!Constant::TransferOpcodeToPermission(opCode, permission)) {
80 return Constant::FAILURE;
81 }
82
83 int64_t timestamp = inGenericValues.GetInt64(PrivacyFiledConst::FIELD_TIMESTAMP);
84 permissionRecord.permissionName = permission;
85
86 if (accessCount != 0) {
87 permissionRecord.accessCount = accessCount;
88 permissionRecord.lastAccessTime = timestamp;
89 permissionRecord.lastAccessDuration = inGenericValues.GetInt64(PrivacyFiledConst::FIELD_ACCESS_DURATION);
90 }
91
92 if (rejectCount != 0) {
93 permissionRecord.rejectCount = rejectCount;
94 permissionRecord.lastRejectTime = timestamp;
95 }
96
97 if (inGenericValues.GetInt(PrivacyFiledConst::FIELD_FLAG) == 0) {
98 return Constant::SUCCESS;
99 }
100
101 UsedRecordDetail detail;
102 detail.status = inGenericValues.GetInt(PrivacyFiledConst::FIELD_STATUS);
103 int32_t lockScreenStatus = inGenericValues.GetInt(PrivacyFiledConst::FIELD_LOCKSCREEN_STATUS);
104 detail.lockScreenStatus = lockScreenStatus == VariantValue::DEFAULT_VALUE ?
105 LockScreenStatusChangeType::PERM_ACTIVE_IN_UNLOCKED : lockScreenStatus;
106 if (permissionRecord.lastAccessTime > 0) {
107 detail.timestamp = permissionRecord.lastAccessTime;
108 detail.accessDuration = inGenericValues.GetInt64(PrivacyFiledConst::FIELD_ACCESS_DURATION);
109 detail.count = accessCount;
110 permissionRecord.accessRecords.emplace_back(detail);
111 }
112 if (permissionRecord.lastRejectTime > 0) {
113 detail.timestamp = permissionRecord.lastRejectTime;
114 detail.count = rejectCount;
115 permissionRecord.rejectRecords.emplace_back(detail);
116 }
117 return Constant::SUCCESS;
118 }
119 } // namespace AccessToken
120 } // namespace Security
121 } // namespace OHOS