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 #include "base_remote_command.h"
16
17 #include "accesstoken_common_log.h"
18 #include "data_validator.h"
19
20 namespace OHOS {
21 namespace Security {
22 namespace AccessToken {
23 namespace {
24 static const std::string JSON_COMMAND_NAME = "commandName";
25 static const std::string JSON_UNIQUEID = "uniqueId";
26 static const std::string JSON_REQUEST_VERSION = "requestVersion";
27 static const std::string JSON_SRC_DEVICEID = "srcDeviceId";
28 static const std::string JSON_SRC_DEVICE_LEVEL = "srcDeviceLevel";
29 static const std::string JSON_DST_DEVICEID = "dstDeviceId";
30 static const std::string JSON_DST_DEVICE_LEVEL = "dstDeviceLevel";
31 static const std::string JSON_STATUS_CODE = "statusCode";
32 static const std::string JSON_MESSAGE = "message";
33 static const std::string JSON_RESPONSE_VERSION = "responseVersion";
34 static const std::string JSON_RESPONSE_DEVICEID = "responseDeviceId";
35 static const std::string JSON_VERSION = "version";
36 static const std::string JSON_TOKENID = "tokenID";
37 static const std::string JSON_TOKEN_ATTR = "tokenAttr";
38 static const std::string JSON_USERID = "userID";
39 static const std::string JSON_BUNDLE_NAME = "bundleName";
40 static const std::string JSON_INST_INDEX = "instIndex";
41 static const std::string JSON_DLP_TYPE = "dlpType";
42 }
43
FromRemoteProtocolJson(const CJson * jsonObject)44 void BaseRemoteCommand::FromRemoteProtocolJson(const CJson* jsonObject)
45 {
46 GetStringFromJson(jsonObject, JSON_COMMAND_NAME, remoteProtocol_.commandName);
47 GetStringFromJson(jsonObject, JSON_UNIQUEID, remoteProtocol_.uniqueId);
48 GetIntFromJson(jsonObject, JSON_REQUEST_VERSION, remoteProtocol_.requestVersion);
49 GetStringFromJson(jsonObject, JSON_SRC_DEVICEID, remoteProtocol_.srcDeviceId);
50 GetStringFromJson(jsonObject, JSON_SRC_DEVICE_LEVEL, remoteProtocol_.srcDeviceLevel);
51 GetStringFromJson(jsonObject, JSON_DST_DEVICEID, remoteProtocol_.dstDeviceId);
52 GetStringFromJson(jsonObject, JSON_DST_DEVICE_LEVEL, remoteProtocol_.dstDeviceLevel);
53 GetIntFromJson(jsonObject, JSON_STATUS_CODE, remoteProtocol_.statusCode);
54 GetStringFromJson(jsonObject, JSON_MESSAGE, remoteProtocol_.message);
55 GetIntFromJson(jsonObject, JSON_RESPONSE_VERSION, remoteProtocol_.responseVersion);
56 GetStringFromJson(jsonObject, JSON_RESPONSE_DEVICEID, remoteProtocol_.responseDeviceId);
57 }
58
ToRemoteProtocolJson()59 CJsonUnique BaseRemoteCommand::ToRemoteProtocolJson()
60 {
61 CJsonUnique j = CreateJson();
62 AddStringToJson(j, "commandName", remoteProtocol_.commandName);
63 AddStringToJson(j, "uniqueId", remoteProtocol_.uniqueId);
64 AddIntToJson(j, "requestVersion", remoteProtocol_.requestVersion);
65 AddStringToJson(j, "srcDeviceId", remoteProtocol_.srcDeviceId);
66 AddStringToJson(j, "srcDeviceLevel", remoteProtocol_.srcDeviceLevel);
67 AddStringToJson(j, "dstDeviceId", remoteProtocol_.dstDeviceId);
68 AddStringToJson(j, "dstDeviceLevel", remoteProtocol_.dstDeviceLevel);
69 AddIntToJson(j, "statusCode", remoteProtocol_.statusCode);
70 AddStringToJson(j, "message", remoteProtocol_.message);
71 AddIntToJson(j, "responseVersion", remoteProtocol_.responseVersion);
72 AddStringToJson(j, "responseDeviceId", remoteProtocol_.responseDeviceId);
73 return j;
74 }
75
ToNativeTokenInfoJson(const NativeTokenInfoBase & tokenInfo)76 CJsonUnique BaseRemoteCommand::ToNativeTokenInfoJson(const NativeTokenInfoBase& tokenInfo)
77 {
78 CJsonUnique permStatesJson = CreateJsonArray();
79 for (const auto& permState : tokenInfo.permStateList) {
80 CJsonUnique permStateJson = CreateJson();
81 ToPermStateJson(permStateJson.get(), permState);
82 AddObjToArray(permStatesJson, permStateJson);
83 }
84 CJsonUnique DcapsJson = CreateJsonArray();
85 for (const auto& item : tokenInfo.dcap) {
86 cJSON *tmpObj = cJSON_CreateString(item.c_str());
87 AddObjToArray(DcapsJson.get(), tmpObj);
88 cJSON_Delete(tmpObj);
89 tmpObj = nullptr;
90 }
91 CJsonUnique NativeAclsJson = CreateJsonArray();
92 for (const auto& item : tokenInfo.nativeAcls) {
93 cJSON *tmpObj = cJSON_CreateString(item.c_str());
94 AddObjToArray(NativeAclsJson.get(), tmpObj);
95 cJSON_Delete(tmpObj);
96 tmpObj = nullptr;
97 }
98 CJsonUnique nativeTokenJson = CreateJson();
99 AddStringToJson(nativeTokenJson, "processName", tokenInfo.processName);
100 AddIntToJson(nativeTokenJson, "apl", tokenInfo.apl);
101 AddUnsignedIntToJson(nativeTokenJson, "version", tokenInfo.ver);
102 AddUnsignedIntToJson(nativeTokenJson, "tokenId", tokenInfo.tokenID);
103 AddUnsignedIntToJson(nativeTokenJson, "tokenAttr", tokenInfo.tokenAttr);
104 AddObjToJson(nativeTokenJson, "dcaps", DcapsJson);
105 AddObjToJson(nativeTokenJson, "nativeAcls", NativeAclsJson);
106 AddObjToJson(nativeTokenJson, "permState", permStatesJson);
107 return nativeTokenJson;
108 }
109
ToPermStateJson(cJSON * permStateJson,const PermissionStatus & state)110 void BaseRemoteCommand::ToPermStateJson(cJSON* permStateJson, const PermissionStatus& state)
111 {
112 AddStringToJson(permStateJson, "permissionName", state.permissionName);
113 AddIntToJson(permStateJson, "grantStatus", state.grantStatus);
114 AddUnsignedIntToJson(permStateJson, "grantFlag", state.grantFlag);
115 }
116
ToHapTokenInfosJson(const HapTokenInfoForSync & tokenInfo)117 CJsonUnique BaseRemoteCommand::ToHapTokenInfosJson(const HapTokenInfoForSync& tokenInfo)
118 {
119 CJsonUnique permStatesJson = CreateJsonArray();
120 for (const auto& permState : tokenInfo.permStateList) {
121 CJsonUnique permStateJson = CreateJson();
122 ToPermStateJson(permStateJson.get(), permState);
123 AddObjToArray(permStatesJson, permStateJson);
124 }
125 CJsonUnique hapTokensJson = CreateJson();
126 AddIntToJson(hapTokensJson, JSON_VERSION, tokenInfo.baseInfo.ver);
127 AddUnsignedIntToJson(hapTokensJson, JSON_TOKENID, tokenInfo.baseInfo.tokenID);
128 AddUnsignedIntToJson(hapTokensJson, JSON_TOKEN_ATTR, tokenInfo.baseInfo.tokenAttr);
129 AddIntToJson(hapTokensJson, JSON_USERID, tokenInfo.baseInfo.userID);
130 AddStringToJson(hapTokensJson, JSON_BUNDLE_NAME, tokenInfo.baseInfo.bundleName);
131 AddIntToJson(hapTokensJson, JSON_INST_INDEX, tokenInfo.baseInfo.instIndex);
132 AddIntToJson(hapTokensJson, JSON_DLP_TYPE, tokenInfo.baseInfo.dlpType);
133 AddObjToJson(hapTokensJson, "permState", permStatesJson);
134 return hapTokensJson;
135 }
136
FromHapTokenBasicInfoJson(const cJSON * hapTokenJson,HapTokenInfo & hapTokenBasicInfo)137 void BaseRemoteCommand::FromHapTokenBasicInfoJson(const cJSON* hapTokenJson,
138 HapTokenInfo& hapTokenBasicInfo)
139 {
140 int32_t ver;
141 GetIntFromJson(hapTokenJson, JSON_VERSION, ver);
142 hapTokenBasicInfo.ver = (char)ver;
143 GetUnsignedIntFromJson(hapTokenJson, JSON_TOKENID, hapTokenBasicInfo.tokenID);
144 GetUnsignedIntFromJson(hapTokenJson, JSON_TOKEN_ATTR, hapTokenBasicInfo.tokenAttr);
145 GetIntFromJson(hapTokenJson, JSON_USERID, hapTokenBasicInfo.userID);
146 GetStringFromJson(hapTokenJson, JSON_BUNDLE_NAME, hapTokenBasicInfo.bundleName);
147 GetIntFromJson(hapTokenJson, JSON_INST_INDEX, hapTokenBasicInfo.instIndex);
148 GetIntFromJson(hapTokenJson, JSON_DLP_TYPE, hapTokenBasicInfo.dlpType);
149 }
150
FromPermStateListJson(const cJSON * hapTokenJson,std::vector<PermissionStatus> & permStateList)151 void BaseRemoteCommand::FromPermStateListJson(const cJSON* hapTokenJson,
152 std::vector<PermissionStatus>& permStateList)
153 {
154 cJSON *jsonObjTmp = GetArrayFromJson(hapTokenJson, "permState");
155 if (jsonObjTmp != nullptr) {
156 int len = cJSON_GetArraySize(jsonObjTmp);
157 for (int i = 0; i < len; i++) {
158 cJSON *permissionJson = cJSON_GetArrayItem(jsonObjTmp, i);
159 PermissionStatus permission;
160 if (!GetStringFromJson(permissionJson, "permissionName", permission.permissionName)) {
161 continue;
162 }
163 if (!GetIntFromJson(permissionJson, "grantStatus", permission.grantStatus)) {
164 continue;
165 }
166 if (!GetUnsignedIntFromJson(permissionJson, "grantFlag", permission.grantFlag)) {
167 continue;
168 }
169 permStateList.emplace_back(permission);
170 }
171 }
172 }
173
FromHapTokenInfoJson(const cJSON * hapTokenJson,HapTokenInfoForSync & hapTokenInfo)174 void BaseRemoteCommand::FromHapTokenInfoJson(const cJSON* hapTokenJson,
175 HapTokenInfoForSync& hapTokenInfo)
176 {
177 FromHapTokenBasicInfoJson(hapTokenJson, hapTokenInfo.baseInfo);
178 if (hapTokenInfo.baseInfo.tokenID == 0) {
179 LOGE(ATM_DOMAIN, ATM_TAG, "Hap token basic info is error.");
180 return;
181 }
182 FromPermStateListJson(hapTokenJson, hapTokenInfo.permStateList);
183 }
184
FromNativeTokenInfoJson(const cJSON * nativeTokenJson,NativeTokenInfoBase & nativeTokenInfo)185 void BaseRemoteCommand::FromNativeTokenInfoJson(const cJSON* nativeTokenJson,
186 NativeTokenInfoBase& nativeTokenInfo)
187 {
188 GetStringFromJson(nativeTokenJson, "processName", nativeTokenInfo.processName);
189 int32_t apl;
190 GetIntFromJson(nativeTokenJson, "apl", apl);
191 if (DataValidator::IsAplNumValid(apl)) {
192 nativeTokenInfo.apl = static_cast<ATokenAplEnum>(apl);
193 }
194 int32_t ver;
195 GetIntFromJson(nativeTokenJson, JSON_VERSION, ver);
196 nativeTokenInfo.ver = (char)ver;
197 GetUnsignedIntFromJson(nativeTokenJson, "tokenId", nativeTokenInfo.tokenID);
198 GetUnsignedIntFromJson(nativeTokenJson, "tokenAttr", nativeTokenInfo.tokenAttr);
199
200 cJSON *dcapsJson = GetArrayFromJson(nativeTokenJson, "dcaps");
201 if (dcapsJson != nullptr) {
202 CJson *dcap = nullptr;
203 std::vector<std::string> dcaps;
204 cJSON_ArrayForEach(dcap, dcapsJson) {
205 std::string item = cJSON_GetStringValue(dcap);
206 dcaps.push_back(item);
207 }
208 nativeTokenInfo.dcap = dcaps;
209 }
210 cJSON *nativeAclsJson = GetArrayFromJson(nativeTokenJson, "nativeAcls");
211 if (nativeAclsJson != nullptr) {
212 CJson *acl = nullptr;
213 std::vector<std::string> nativeAcls;
214 cJSON_ArrayForEach(acl, nativeAclsJson) {
215 std::string item = cJSON_GetStringValue(acl);
216 nativeAcls.push_back(item);
217 }
218 nativeTokenInfo.nativeAcls = nativeAcls;
219 }
220 FromPermStateListJson(nativeTokenJson, nativeTokenInfo.permStateList);
221 }
222 } // namespace AccessToken
223 } // namespace Security
224 } // namespace OHOS
225