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