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