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