1 /*
2 * Copyright (c) 2023 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 #define LOG_TAG "CloudServiceStub"
16 #include "cloud_service_stub.h"
17
18 #include "cloud/cloud_config_manager.h"
19 #include "cloud_types_util.h"
20 #include "ipc_skeleton.h"
21 #include "log_print.h"
22 #include "permission/permission_validator.h"
23 #include "rdb_types.h"
24 #include "tokenid_kit.h"
25 #include "utils/anonymous.h"
26 namespace OHOS::CloudData {
27 using namespace DistributedData;
28 using namespace OHOS::Security::AccessToken;
29 const CloudServiceStub::Handler CloudServiceStub::HANDLERS[TRANS_BUTT] = {
30 &CloudServiceStub::OnEnableCloud,
31 &CloudServiceStub::OnDisableCloud,
32 &CloudServiceStub::OnChangeAppSwitch,
33 &CloudServiceStub::OnClean,
34 &CloudServiceStub::OnNotifyDataChange,
35 &CloudServiceStub::OnNotifyChange,
36 &CloudServiceStub::OnQueryStatistics,
37 &CloudServiceStub::OnQueryLastSyncInfo,
38 &CloudServiceStub::OnSetGlobalCloudStrategy,
39 &CloudServiceStub::OnAllocResourceAndShare,
40 &CloudServiceStub::OnShare,
41 &CloudServiceStub::OnUnshare,
42 &CloudServiceStub::OnExit,
43 &CloudServiceStub::OnChangePrivilege,
44 &CloudServiceStub::OnQuery,
45 &CloudServiceStub::OnQueryByInvitation,
46 &CloudServiceStub::OnConfirmInvitation,
47 &CloudServiceStub::OnChangeConfirmation,
48 &CloudServiceStub::OnSetCloudStrategy,
49 };
50
OnRemoteRequest(uint32_t code,OHOS::MessageParcel & data,OHOS::MessageParcel & reply)51 int CloudServiceStub::OnRemoteRequest(uint32_t code, OHOS::MessageParcel &data, OHOS::MessageParcel &reply)
52 {
53 ZLOGI("code:%{public}u callingPid:%{public}u", code, IPCSkeleton::GetCallingPid());
54 std::u16string local = CloudServiceStub::GetDescriptor();
55 std::u16string remote = data.ReadInterfaceToken();
56 if (local != remote) {
57 ZLOGE("local is not equal to remote");
58 return -1;
59 }
60
61 if (TRANS_HEAD > code || code >= TRANS_BUTT || HANDLERS[code] == nullptr) {
62 ZLOGE("not support code:%{public}u, BUTT:%{public}d", code, TRANS_BUTT);
63 return -1;
64 }
65
66 if (((code >= TRANS_CONFIG_HEAD && code < TRANS_CONFIG_BUTT) ||
67 (code >= TRANS_SHARE_HEAD && code < TRANS_SHARE_BUTT)) &&
68 !TokenIdKit::IsSystemAppByFullTokenID(IPCSkeleton::GetCallingFullTokenID())) {
69 ZLOGE("permission denied! code:%{public}u", code);
70 auto result = static_cast<int32_t>(PERMISSION_DENIED);
71 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
72 }
73
74 if (code >= TRANS_CONFIG_HEAD && code < TRANS_CONFIG_BUTT &&
75 !DistributedKv::PermissionValidator::GetInstance().IsCloudConfigPermit(IPCSkeleton::GetCallingTokenID())) {
76 ZLOGE("cloud config permission denied! code:%{public}u, BUTT:%{public}d", code, TRANS_BUTT);
77 auto result = static_cast<int32_t>(CLOUD_CONFIG_PERMISSION_DENIED);
78 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
79 }
80 return (this->*HANDLERS[code])(data, reply);
81 }
82
OnEnableCloud(MessageParcel & data,MessageParcel & reply)83 int32_t CloudServiceStub::OnEnableCloud(MessageParcel &data, MessageParcel &reply)
84 {
85 std::string id;
86 std::map<std::string, int32_t> switches;
87 if (!ITypesUtil::Unmarshal(data, id, switches)) {
88 ZLOGE("Unmarshal id:%{public}s", Anonymous::Change(id).c_str());
89 return IPC_STUB_INVALID_DATA_ERR;
90 }
91 std::map<std::string, int32_t> localSwitches;
92 for (const auto &[bundle, status] : switches) {
93 localSwitches.insert_or_assign(CloudConfigManager::GetInstance().ToLocal(bundle), status);
94 }
95 auto result = EnableCloud(id, localSwitches);
96 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
97 }
98
OnDisableCloud(MessageParcel & data,MessageParcel & reply)99 int32_t CloudServiceStub::OnDisableCloud(MessageParcel &data, MessageParcel &reply)
100 {
101 std::string id;
102 if (!ITypesUtil::Unmarshal(data, id)) {
103 ZLOGE("Unmarshal id:%{public}s", Anonymous::Change(id).c_str());
104 return IPC_STUB_INVALID_DATA_ERR;
105 }
106 auto result = DisableCloud(id);
107 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
108 }
109
OnChangeAppSwitch(MessageParcel & data,MessageParcel & reply)110 int32_t CloudServiceStub::OnChangeAppSwitch(MessageParcel &data, MessageParcel &reply)
111 {
112 std::string id;
113 std::string bundleName;
114 int32_t appSwitch = SWITCH_OFF;
115 if (!ITypesUtil::Unmarshal(data, id, bundleName, appSwitch)) {
116 ZLOGE("Unmarshal id:%{public}s", Anonymous::Change(id).c_str());
117 return IPC_STUB_INVALID_DATA_ERR;
118 }
119 auto result = ChangeAppSwitch(id, CloudConfigManager::GetInstance().ToLocal(bundleName), appSwitch);
120 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
121 }
122
OnClean(MessageParcel & data,MessageParcel & reply)123 int32_t CloudServiceStub::OnClean(MessageParcel &data, MessageParcel &reply)
124 {
125 std::string id;
126 std::map<std::string, int32_t> actions;
127 if (!ITypesUtil::Unmarshal(data, id, actions)) {
128 ZLOGE("Unmarshal id:%{public}s", Anonymous::Change(id).c_str());
129 return IPC_STUB_INVALID_DATA_ERR;
130 }
131 std::map<std::string, int32_t> localActions;
132 for (const auto &[bundle, action] : actions) {
133 localActions.insert_or_assign(CloudConfigManager::GetInstance().ToLocal(bundle), action);
134 }
135 auto result = Clean(id, localActions);
136 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
137 }
138
OnNotifyDataChange(MessageParcel & data,MessageParcel & reply)139 int32_t CloudServiceStub::OnNotifyDataChange(MessageParcel &data, MessageParcel &reply)
140 {
141 std::string id;
142 std::string bundleName;
143 if (!ITypesUtil::Unmarshal(data, id, bundleName)) {
144 ZLOGE("Unmarshal id:%{public}s", Anonymous::Change(id).c_str());
145 return IPC_STUB_INVALID_DATA_ERR;
146 }
147 auto result = NotifyDataChange(id, CloudConfigManager::GetInstance().ToLocal(bundleName));
148 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
149 }
150
OnQueryLastSyncInfo(MessageParcel & data,MessageParcel & reply)151 int32_t CloudServiceStub::OnQueryLastSyncInfo(MessageParcel &data, MessageParcel &reply)
152 {
153 std::string id;
154 std::string bundleName;
155 std::string storeId;
156 if (!ITypesUtil::Unmarshal(data, id, bundleName, storeId)) {
157 ZLOGE("Unmarshal id:%{public}s, bundleName:%{public}s, storeId:%{public}s", Anonymous::Change(id).c_str(),
158 bundleName.c_str(), Anonymous::Change(storeId).c_str());
159 return IPC_STUB_INVALID_DATA_ERR;
160 }
161 auto [status, results] = QueryLastSyncInfo(id, bundleName, storeId);
162 return ITypesUtil::Marshal(reply, status, results) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
163 }
164
OnSetGlobalCloudStrategy(MessageParcel & data,MessageParcel & reply)165 int32_t CloudServiceStub::OnSetGlobalCloudStrategy(MessageParcel &data, MessageParcel &reply)
166 {
167 Strategy strategy;
168 std::vector<CommonType::Value> values;
169 if (!ITypesUtil::Unmarshal(data, strategy, values)) {
170 ZLOGE("Unmarshal strategy:%{public}d, values size:%{public}zu", strategy, values.size());
171 return IPC_STUB_INVALID_DATA_ERR;
172 }
173 auto status = SetGlobalCloudStrategy(strategy, values);
174 return ITypesUtil::Marshal(reply, status) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
175 }
176
OnAllocResourceAndShare(MessageParcel & data,MessageParcel & reply)177 int32_t CloudServiceStub::OnAllocResourceAndShare(MessageParcel &data, MessageParcel &reply)
178 {
179 std::string storeId;
180 DistributedRdb::PredicatesMemo predicatesMemo;
181 std::vector<std::string> columns;
182 std::vector<Participant> participants;
183 if (!ITypesUtil::Unmarshal(data, storeId, predicatesMemo, columns, participants)) {
184 ZLOGE("Unmarshal storeId:%{public}s", Anonymous::Change(storeId).c_str());
185 return IPC_STUB_INVALID_DATA_ERR;
186 }
187 auto [status, resultSet] = AllocResourceAndShare(storeId, predicatesMemo, columns, participants);
188 return ITypesUtil::Marshal(reply, status, resultSet) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
189 }
190
OnNotifyChange(MessageParcel & data,MessageParcel & reply)191 int32_t CloudServiceStub::OnNotifyChange(MessageParcel &data, MessageParcel &reply)
192 {
193 std::string eventId;
194 std::string extraData;
195 int32_t userId;
196 if (!ITypesUtil::Unmarshal(data, eventId, extraData, userId)) {
197 ZLOGE("Unmarshal eventId:%{public}s", Anonymous::Change(eventId).c_str());
198 return IPC_STUB_INVALID_DATA_ERR;
199 }
200 auto result = NotifyDataChange(eventId, extraData, userId);
201 return ITypesUtil::Marshal(reply, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
202 }
203
OnQueryStatistics(MessageParcel & data,MessageParcel & reply)204 int32_t CloudServiceStub::OnQueryStatistics(MessageParcel &data, MessageParcel &reply)
205 {
206 std::string id;
207 std::string bundleName;
208 std::string storeId;
209 if (!ITypesUtil::Unmarshal(data, id, bundleName, storeId)) {
210 ZLOGE("Unmarshal id:%{public}s", Anonymous::Change(id).c_str());
211 return IPC_STUB_INVALID_DATA_ERR;
212 }
213 auto result = QueryStatistics(id, bundleName, storeId);
214 return ITypesUtil::Marshal(reply, result.first, result.second) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
215 }
216
OnShare(MessageParcel & data,MessageParcel & reply)217 int32_t CloudServiceStub::OnShare(MessageParcel &data, MessageParcel &reply)
218 {
219 std::string sharingRes;
220 Participants participants;
221 if (!ITypesUtil::Unmarshal(data, sharingRes, participants)) {
222 ZLOGE("Unmarshal sharingRes:%{public}s", Anonymous::Change(sharingRes).c_str());
223 return IPC_STUB_INVALID_DATA_ERR;
224 }
225 Results results;
226 auto status = Share(sharingRes, participants, results);
227 return ITypesUtil::Marshal(reply, status, results) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
228 }
229
OnUnshare(MessageParcel & data,MessageParcel & reply)230 int32_t CloudServiceStub::OnUnshare(MessageParcel &data, MessageParcel &reply)
231 {
232 std::string sharingRes;
233 Participants participants;
234 if (!ITypesUtil::Unmarshal(data, sharingRes, participants)) {
235 ZLOGE("Unmarshal sharingRes:%{public}s", Anonymous::Change(sharingRes).c_str());
236 return IPC_STUB_INVALID_DATA_ERR;
237 }
238 Results results;
239 auto status = Unshare(sharingRes, participants, results);
240 return ITypesUtil::Marshal(reply, status, results) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
241 }
242
OnExit(MessageParcel & data,MessageParcel & reply)243 int32_t CloudServiceStub::OnExit(MessageParcel &data, MessageParcel &reply)
244 {
245 std::string sharingRes;
246 if (!ITypesUtil::Unmarshal(data, sharingRes)) {
247 ZLOGE("Unmarshal sharingRes:%{public}s", Anonymous::Change(sharingRes).c_str());
248 return IPC_STUB_INVALID_DATA_ERR;
249 }
250 std::pair<int32_t, std::string> result;
251 auto status = Exit(sharingRes, result);
252 return ITypesUtil::Marshal(reply, status, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
253 }
254
OnChangePrivilege(MessageParcel & data,MessageParcel & reply)255 int32_t CloudServiceStub::OnChangePrivilege(MessageParcel &data, MessageParcel &reply)
256 {
257 std::string sharingRes;
258 Participants participants;
259 if (!ITypesUtil::Unmarshal(data, sharingRes, participants)) {
260 ZLOGE("Unmarshal sharingRes:%{public}s", Anonymous::Change(sharingRes).c_str());
261 return IPC_STUB_INVALID_DATA_ERR;
262 }
263 Results results;
264 auto status = ChangePrivilege(sharingRes, participants, results);
265 return ITypesUtil::Marshal(reply, status, results) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
266 }
267
OnQuery(MessageParcel & data,MessageParcel & reply)268 int32_t CloudServiceStub::OnQuery(MessageParcel &data, MessageParcel &reply)
269 {
270 std::string sharingRes;
271 if (!ITypesUtil::Unmarshal(data, sharingRes)) {
272 ZLOGE("Unmarshal sharingRes:%{public}s", Anonymous::Change(sharingRes).c_str());
273 return IPC_STUB_INVALID_DATA_ERR;
274 }
275 QueryResults results;
276 auto status = Query(sharingRes, results);
277 return ITypesUtil::Marshal(reply, status, results) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
278 }
279
OnQueryByInvitation(MessageParcel & data,MessageParcel & reply)280 int32_t CloudServiceStub::OnQueryByInvitation(MessageParcel &data, MessageParcel &reply)
281 {
282 std::string invitation;
283 if (!ITypesUtil::Unmarshal(data, invitation)) {
284 ZLOGE("Unmarshal invitation:%{public}s", Anonymous::Change(invitation).c_str());
285 return IPC_STUB_INVALID_DATA_ERR;
286 }
287 QueryResults results;
288 auto status = QueryByInvitation(invitation, results);
289 return ITypesUtil::Marshal(reply, status, results) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
290 }
291
OnConfirmInvitation(MessageParcel & data,MessageParcel & reply)292 int32_t CloudServiceStub::OnConfirmInvitation(MessageParcel &data, MessageParcel &reply)
293 {
294 std::string invitation;
295 int32_t confirmation;
296 if (!ITypesUtil::Unmarshal(data, invitation, confirmation)) {
297 ZLOGE("Unmarshal invitation:%{public}s", Anonymous::Change(invitation).c_str());
298 return IPC_STUB_INVALID_DATA_ERR;
299 }
300 std::tuple<int32_t, std::string, std::string> result;
301 auto status = ConfirmInvitation(invitation, confirmation, result);
302 return ITypesUtil::Marshal(reply, status, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
303 }
304
OnChangeConfirmation(MessageParcel & data,MessageParcel & reply)305 int32_t CloudServiceStub::OnChangeConfirmation(MessageParcel &data, MessageParcel &reply)
306 {
307 std::string sharingRes;
308 int32_t confirmation;
309 if (!ITypesUtil::Unmarshal(data, sharingRes, confirmation)) {
310 ZLOGE("Unmarshal sharingRes:%{public}s", Anonymous::Change(sharingRes).c_str());
311 return IPC_STUB_INVALID_DATA_ERR;
312 }
313 std::pair<int32_t, std::string> result;
314 auto status = ChangeConfirmation(sharingRes, confirmation, result);
315 return ITypesUtil::Marshal(reply, status, result) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
316 }
317
OnSetCloudStrategy(MessageParcel & data,MessageParcel & reply)318 int32_t CloudServiceStub::OnSetCloudStrategy(MessageParcel &data, MessageParcel &reply)
319 {
320 Strategy strategy;
321 std::vector<CommonType::Value> values;
322 if (!ITypesUtil::Unmarshal(data, strategy, values)) {
323 ZLOGE("Unmarshal strategy:%{public}d, values size:%{public}zu", strategy, values.size());
324 return IPC_STUB_INVALID_DATA_ERR;
325 }
326 auto status = SetCloudStrategy(strategy, values);
327 return ITypesUtil::Marshal(reply, status) ? ERR_NONE : IPC_STUB_WRITE_PARCEL_ERR;
328 }
329 } // namespace OHOS::CloudData