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 CJsonUnique dcapJson = CreateJsonString(item.c_str());
87 AddObjToArray(dcapsJson.get(), dcapJson.get());
88 }
89 CJsonUnique nativeAclsJson = CreateJsonArray();
90 for (const auto& item : tokenInfo.nativeAcls) {
91 CJsonUnique nativeAclJson = CreateJsonString(item.c_str());
92 AddObjToArray(nativeAclsJson.get(), nativeAclJson.get());
93 }
94 CJsonUnique nativeTokenJson = CreateJson();
95 AddStringToJson(nativeTokenJson, "processName", tokenInfo.processName);
96 AddIntToJson(nativeTokenJson, "apl", tokenInfo.apl);
97 AddUnsignedIntToJson(nativeTokenJson, "version", tokenInfo.ver);
98 AddUnsignedIntToJson(nativeTokenJson, "tokenId", tokenInfo.tokenID);
99 AddUnsignedIntToJson(nativeTokenJson, "tokenAttr", tokenInfo.tokenAttr);
100 AddObjToJson(nativeTokenJson, "dcaps", dcapsJson);
101 AddObjToJson(nativeTokenJson, "nativeAcls", nativeAclsJson);
102 AddObjToJson(nativeTokenJson, "permState", permStatesJson);
103 return nativeTokenJson;
104 }
105
ToPermStateJson(CJson * permStateJson,const PermissionStatus & state)106 void BaseRemoteCommand::ToPermStateJson(CJson* permStateJson, const PermissionStatus& state)
107 {
108 AddStringToJson(permStateJson, "permissionName", state.permissionName);
109 AddIntToJson(permStateJson, "grantStatus", state.grantStatus);
110 AddUnsignedIntToJson(permStateJson, "grantFlag", state.grantFlag);
111 }
112
ToHapTokenInfosJson(const HapTokenInfoForSync & tokenInfo)113 CJsonUnique BaseRemoteCommand::ToHapTokenInfosJson(const HapTokenInfoForSync& tokenInfo)
114 {
115 CJsonUnique permStatesJson = CreateJsonArray();
116 for (const auto& permState : tokenInfo.permStateList) {
117 CJsonUnique permStateJson = CreateJson();
118 ToPermStateJson(permStateJson.get(), permState);
119 AddObjToArray(permStatesJson, permStateJson);
120 }
121 CJsonUnique hapTokensJson = CreateJson();
122 AddIntToJson(hapTokensJson, JSON_VERSION, tokenInfo.baseInfo.ver);
123 AddUnsignedIntToJson(hapTokensJson, JSON_TOKENID, tokenInfo.baseInfo.tokenID);
124 AddUnsignedIntToJson(hapTokensJson, JSON_TOKEN_ATTR, tokenInfo.baseInfo.tokenAttr);
125 AddIntToJson(hapTokensJson, JSON_USERID, tokenInfo.baseInfo.userID);
126 AddStringToJson(hapTokensJson, JSON_BUNDLE_NAME, tokenInfo.baseInfo.bundleName);
127 AddIntToJson(hapTokensJson, JSON_INST_INDEX, tokenInfo.baseInfo.instIndex);
128 AddIntToJson(hapTokensJson, JSON_DLP_TYPE, tokenInfo.baseInfo.dlpType);
129 AddObjToJson(hapTokensJson, "permState", permStatesJson);
130 return hapTokensJson;
131 }
132
FromHapTokenBasicInfoJson(const CJson * hapTokenJson,HapTokenInfo & hapTokenBasicInfo)133 void BaseRemoteCommand::FromHapTokenBasicInfoJson(const CJson* hapTokenJson,
134 HapTokenInfo& hapTokenBasicInfo)
135 {
136 int32_t ver;
137 GetIntFromJson(hapTokenJson, JSON_VERSION, ver);
138 hapTokenBasicInfo.ver = (char)ver;
139 GetUnsignedIntFromJson(hapTokenJson, JSON_TOKENID, hapTokenBasicInfo.tokenID);
140 GetUnsignedIntFromJson(hapTokenJson, JSON_TOKEN_ATTR, hapTokenBasicInfo.tokenAttr);
141 GetIntFromJson(hapTokenJson, JSON_USERID, hapTokenBasicInfo.userID);
142 GetStringFromJson(hapTokenJson, JSON_BUNDLE_NAME, hapTokenBasicInfo.bundleName);
143 GetIntFromJson(hapTokenJson, JSON_INST_INDEX, hapTokenBasicInfo.instIndex);
144 GetIntFromJson(hapTokenJson, JSON_DLP_TYPE, hapTokenBasicInfo.dlpType);
145 }
146
FromPermStateListJson(const CJson * hapTokenJson,std::vector<PermissionStatus> & permStateList)147 void BaseRemoteCommand::FromPermStateListJson(const CJson* hapTokenJson,
148 std::vector<PermissionStatus>& permStateList)
149 {
150 CJson* jsonObjTmp = GetArrayFromJson(hapTokenJson, "permState");
151 if (jsonObjTmp != nullptr) {
152 int len = cJSON_GetArraySize(jsonObjTmp);
153 for (int i = 0; i < len; i++) {
154 CJson* permissionJson = cJSON_GetArrayItem(jsonObjTmp, i);
155 PermissionStatus permission;
156 if (!GetStringFromJson(permissionJson, "permissionName", permission.permissionName)) {
157 continue;
158 }
159 if (!GetIntFromJson(permissionJson, "grantStatus", permission.grantStatus)) {
160 continue;
161 }
162 if (!GetUnsignedIntFromJson(permissionJson, "grantFlag", permission.grantFlag)) {
163 continue;
164 }
165 permStateList.emplace_back(permission);
166 }
167 }
168 }
169
FromHapTokenInfoJson(const CJson * hapTokenJson,HapTokenInfoForSync & hapTokenInfo)170 void BaseRemoteCommand::FromHapTokenInfoJson(const CJson* hapTokenJson,
171 HapTokenInfoForSync& hapTokenInfo)
172 {
173 FromHapTokenBasicInfoJson(hapTokenJson, hapTokenInfo.baseInfo);
174 if (hapTokenInfo.baseInfo.tokenID == 0) {
175 LOGE(ATM_DOMAIN, ATM_TAG, "Hap token basic info is error.");
176 return;
177 }
178 FromPermStateListJson(hapTokenJson, hapTokenInfo.permStateList);
179 }
180
FromNativeTokenInfoJson(const CJson * nativeTokenJson,NativeTokenInfoBase & nativeTokenInfo)181 void BaseRemoteCommand::FromNativeTokenInfoJson(const CJson* nativeTokenJson,
182 NativeTokenInfoBase& nativeTokenInfo)
183 {
184 GetStringFromJson(nativeTokenJson, "processName", nativeTokenInfo.processName);
185 int32_t apl;
186 GetIntFromJson(nativeTokenJson, "apl", apl);
187 if (DataValidator::IsAplNumValid(apl)) {
188 nativeTokenInfo.apl = static_cast<ATokenAplEnum>(apl);
189 }
190 int32_t ver;
191 GetIntFromJson(nativeTokenJson, JSON_VERSION, ver);
192 nativeTokenInfo.ver = (char)ver;
193 GetUnsignedIntFromJson(nativeTokenJson, "tokenId", nativeTokenInfo.tokenID);
194 GetUnsignedIntFromJson(nativeTokenJson, "tokenAttr", nativeTokenInfo.tokenAttr);
195
196 CJson* dcapsJson = GetArrayFromJson(nativeTokenJson, "dcaps");
197 if (dcapsJson != nullptr) {
198 CJson* dcap = nullptr;
199 std::vector<std::string> dcaps;
200 cJSON_ArrayForEach(dcap, dcapsJson) {
201 std::string item = cJSON_GetStringValue(dcap);
202 dcaps.push_back(item);
203 }
204 nativeTokenInfo.dcap = dcaps;
205 }
206 CJson* nativeAclsJson = GetArrayFromJson(nativeTokenJson, "nativeAcls");
207 if (nativeAclsJson != nullptr) {
208 CJson* acl = nullptr;
209 std::vector<std::string> nativeAcls;
210 cJSON_ArrayForEach(acl, nativeAclsJson) {
211 std::string item = cJSON_GetStringValue(acl);
212 nativeAcls.push_back(item);
213 }
214 nativeTokenInfo.nativeAcls = nativeAcls;
215 }
216 FromPermStateListJson(nativeTokenJson, nativeTokenInfo.permStateList);
217 }
218 } // namespace AccessToken
219 } // namespace Security
220 } // namespace OHOS
221