1 /*
2 * Copyright (c) 2021-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 <memory>
19
20 #include "accesstoken_dfx_define.h"
21 #include "accesstoken_common_log.h"
22 #include "access_token_error.h"
23 #include "data_validator.h"
24 #include "permission_validator.h"
25 #include "token_field_const.h"
26
27 namespace OHOS {
28 namespace Security {
29 namespace AccessToken {
30
TranslationIntoGenericValues(const PermissionDef & inPermissionDef,GenericValues & outGenericValues)31 int DataTranslator::TranslationIntoGenericValues(const PermissionDef& inPermissionDef, GenericValues& outGenericValues)
32 {
33 outGenericValues.Put(TokenFiledConst::FIELD_PERMISSION_NAME, inPermissionDef.permissionName);
34 outGenericValues.Put(TokenFiledConst::FIELD_BUNDLE_NAME, inPermissionDef.bundleName);
35 outGenericValues.Put(TokenFiledConst::FIELD_GRANT_MODE, inPermissionDef.grantMode);
36 outGenericValues.Put(TokenFiledConst::FIELD_AVAILABLE_LEVEL, inPermissionDef.availableLevel);
37 outGenericValues.Put(TokenFiledConst::FIELD_PROVISION_ENABLE, inPermissionDef.provisionEnable ? 1 : 0);
38 outGenericValues.Put(TokenFiledConst::FIELD_DISTRIBUTED_SCENE_ENABLE,
39 inPermissionDef.distributedSceneEnable ? 1 : 0);
40 outGenericValues.Put(TokenFiledConst::FIELD_LABEL, inPermissionDef.label);
41 outGenericValues.Put(TokenFiledConst::FIELD_LABEL_ID, inPermissionDef.labelId);
42 outGenericValues.Put(TokenFiledConst::FIELD_DESCRIPTION, inPermissionDef.description);
43 outGenericValues.Put(TokenFiledConst::FIELD_DESCRIPTION_ID, inPermissionDef.descriptionId);
44 outGenericValues.Put(TokenFiledConst::FIELD_AVAILABLE_TYPE, inPermissionDef.availableType);
45 outGenericValues.Put(TokenFiledConst::FIELD_KERNEL_EFFECT, inPermissionDef.isKernelEffect ? 1 : 0);
46 outGenericValues.Put(TokenFiledConst::FIELD_HAS_VALUE, inPermissionDef.hasValue ? 1 : 0);
47 return RET_SUCCESS;
48 }
49
TranslationIntoPermissionDef(const GenericValues & inGenericValues,PermissionDef & outPermissionDef)50 int DataTranslator::TranslationIntoPermissionDef(const GenericValues& inGenericValues, PermissionDef& outPermissionDef)
51 {
52 outPermissionDef.permissionName = inGenericValues.GetString(TokenFiledConst::FIELD_PERMISSION_NAME);
53 outPermissionDef.bundleName = inGenericValues.GetString(TokenFiledConst::FIELD_BUNDLE_NAME);
54 outPermissionDef.grantMode = inGenericValues.GetInt(TokenFiledConst::FIELD_GRANT_MODE);
55 int aplNum = inGenericValues.GetInt(TokenFiledConst::FIELD_AVAILABLE_LEVEL);
56 if (!DataValidator::IsAplNumValid(aplNum)) {
57 LOGE(ATM_DOMAIN, ATM_TAG, "Apl is wrong.");
58 return ERR_PARAM_INVALID;
59 }
60 outPermissionDef.availableLevel = static_cast<ATokenAplEnum>(aplNum);
61 outPermissionDef.provisionEnable = (inGenericValues.GetInt(TokenFiledConst::FIELD_PROVISION_ENABLE) == 1);
62 outPermissionDef.distributedSceneEnable =
63 (inGenericValues.GetInt(TokenFiledConst::FIELD_DISTRIBUTED_SCENE_ENABLE) == 1);
64 outPermissionDef.label = inGenericValues.GetString(TokenFiledConst::FIELD_LABEL);
65 outPermissionDef.labelId = inGenericValues.GetInt(TokenFiledConst::FIELD_LABEL_ID);
66 outPermissionDef.description = inGenericValues.GetString(TokenFiledConst::FIELD_DESCRIPTION);
67 outPermissionDef.descriptionId = inGenericValues.GetInt(TokenFiledConst::FIELD_DESCRIPTION_ID);
68 int availableType = inGenericValues.GetInt(TokenFiledConst::FIELD_AVAILABLE_TYPE);
69 outPermissionDef.availableType = static_cast<ATokenAvailableTypeEnum>(availableType);
70 outPermissionDef.isKernelEffect = (inGenericValues.GetInt(TokenFiledConst::FIELD_KERNEL_EFFECT) == 1);
71 outPermissionDef.hasValue = (inGenericValues.GetInt(TokenFiledConst::FIELD_HAS_VALUE) == 1);
72 return RET_SUCCESS;
73 }
74
TranslationIntoGenericValues(const PermissionStatus & inPermissionState,GenericValues & outGenericValues)75 int DataTranslator::TranslationIntoGenericValues(const PermissionStatus& inPermissionState,
76 GenericValues& outGenericValues)
77 {
78 outGenericValues.Put(TokenFiledConst::FIELD_PERMISSION_NAME, inPermissionState.permissionName);
79 outGenericValues.Put(TokenFiledConst::FIELD_DEVICE_ID, "PHONE-001");
80 outGenericValues.Put(TokenFiledConst::FIELD_GRANT_IS_GENERAL, 1);
81 outGenericValues.Put(TokenFiledConst::FIELD_GRANT_STATE, inPermissionState.grantStatus);
82 int32_t grantFlag = static_cast<int32_t>(inPermissionState.grantFlag);
83 outGenericValues.Put(TokenFiledConst::FIELD_GRANT_FLAG, grantFlag);
84 return RET_SUCCESS;
85 }
86
TranslationIntoPermissionStatus(const GenericValues & inGenericValues,PermissionStatus & outPermissionState)87 int DataTranslator::TranslationIntoPermissionStatus(const GenericValues& inGenericValues,
88 PermissionStatus& outPermissionState)
89 {
90 outPermissionState.permissionName = inGenericValues.GetString(TokenFiledConst::FIELD_PERMISSION_NAME);
91 if (!DataValidator::IsPermissionNameValid(outPermissionState.permissionName)) {
92 LOGE(ATM_DOMAIN, ATM_TAG, "Permission name is wrong");
93 (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "PERMISSION_CHECK",
94 HiviewDFX::HiSysEvent::EventType::FAULT, "CODE", LOAD_DATABASE_ERROR,
95 "ERROR_REASON", "permission name error");
96 return ERR_PARAM_INVALID;
97 }
98
99 int grantFlag = (PermissionFlag)inGenericValues.GetInt(TokenFiledConst::FIELD_GRANT_FLAG);
100 if (!PermissionValidator::IsPermissionFlagValid(grantFlag)) {
101 LOGE(ATM_DOMAIN, ATM_TAG, "GrantFlag is wrong");
102 (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "PERMISSION_CHECK",
103 HiviewDFX::HiSysEvent::EventType::FAULT, "CODE", LOAD_DATABASE_ERROR,
104 "ERROR_REASON", "permission grant flag error");
105 return ERR_PARAM_INVALID;
106 }
107 outPermissionState.grantFlag = static_cast<uint32_t>(grantFlag);
108
109 int grantStatus = (PermissionState)inGenericValues.GetInt(TokenFiledConst::FIELD_GRANT_STATE);
110 if (!PermissionValidator::IsGrantStatusValid(grantStatus)) {
111 LOGE(ATM_DOMAIN, ATM_TAG, "GrantStatus is wrong");
112 (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "PERMISSION_CHECK",
113 HiviewDFX::HiSysEvent::EventType::FAULT, "CODE", LOAD_DATABASE_ERROR,
114 "ERROR_REASON", "permission grant status error");
115 return ERR_PARAM_INVALID;
116 }
117 if (static_cast<uint32_t>(grantFlag) & PERMISSION_ALLOW_THIS_TIME) {
118 grantStatus = PERMISSION_DENIED;
119 }
120 outPermissionState.grantStatus = grantStatus;
121
122 return RET_SUCCESS;
123 }
124
TranslationIntoExtendedPermission(const GenericValues & inGenericValues,PermissionWithValue & perm)125 int32_t DataTranslator::TranslationIntoExtendedPermission(
126 const GenericValues& inGenericValues, PermissionWithValue& perm)
127 {
128 perm.permissionName = inGenericValues.GetString(TokenFiledConst::FIELD_PERMISSION_NAME);
129 if (!DataValidator::IsPermissionNameValid(perm.permissionName)) {
130 LOGE(ATM_DOMAIN, ATM_TAG, "Permission name is wrong");
131 (void)HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "PERMISSION_CHECK",
132 HiviewDFX::HiSysEvent::EventType::FAULT, "CODE", LOAD_DATABASE_ERROR,
133 "ERROR_REASON", "permission name error");
134 return ERR_PARAM_INVALID;
135 }
136 perm.value = inGenericValues.GetString(TokenFiledConst::FIELD_VALUE);
137
138 return RET_SUCCESS;
139 }
140 } // namespace AccessToken
141 } // namespace Security
142 } // namespace OHOS
143