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