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
16 #include "datashare_stub_impl.h"
17
18 #include "accesstoken_kit.h"
19 #include "datashare_log.h"
20 #include "datashare_string_utils.h"
21 #include "ipc_skeleton.h"
22
23 namespace OHOS {
24 namespace DataShare {
25 using OHOS::Security::AccessToken::AccessTokenKit;
26
27 constexpr int DEFAULT_NUMBER = -1;
28 constexpr int PERMISSION_ERROR_NUMBER = -2;
GetOwner()29 std::shared_ptr<JsDataShareExtAbility> DataShareStubImpl::GetOwner()
30 {
31 if (extension_ == nullptr) {
32 LOG_ERROR("extension_ is nullptr.");
33 }
34 return extension_;
35 }
36
CheckCallingPermission(const std::string & permission)37 bool DataShareStubImpl::CheckCallingPermission(const std::string &permission)
38 {
39 if (!permission.empty() && AccessTokenKit::VerifyAccessToken(IPCSkeleton::GetCallingTokenID(), permission)
40 != AppExecFwk::Constants::PERMISSION_GRANTED) {
41 LOG_ERROR("permission not granted.");
42 return false;
43 }
44 return true;
45 }
46
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)47 std::vector<std::string> DataShareStubImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
48 {
49 CallingInfo info;
50 GetCallingInfo(info);
51 std::vector<std::string> ret;
52 auto client = sptr<DataShareStubImpl>(this);
53 auto extension = client->GetOwner();
54 if (extension == nullptr) {
55 return ret;
56 }
57 std::function<void()> syncTaskFunc = [extension, info, uri, mimeTypeFilter]() {
58 extension->SetCallingInfo(info);
59 extension->GetFileTypes(uri, mimeTypeFilter);
60 };
61 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
62 if (extension == nullptr) {
63 return false;
64 }
65 extension->GetResult(ret);
66 return extension->GetRecvReply();
67 };
68 std::lock_guard<std::mutex> lock(mutex_);
69 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
70 return ret;
71 }
72
OpenFile(const Uri & uri,const std::string & mode)73 int DataShareStubImpl::OpenFile(const Uri &uri, const std::string &mode)
74 {
75 CallingInfo info;
76 GetCallingInfo(info);
77 auto client = sptr<DataShareStubImpl>(this);
78 auto extension = client->GetOwner();
79 if (extension == nullptr) {
80 return DEFAULT_NUMBER;
81 }
82 int ret = -1;
83 std::function<void()> syncTaskFunc = [extension, info, uri, mode]() {
84 extension->SetCallingInfo(info);
85 extension->OpenFile(uri, mode);
86 };
87 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
88 if (extension == nullptr) {
89 return false;
90 }
91 extension->GetResult(ret);
92 return extension->GetRecvReply();
93 };
94 std::lock_guard<std::mutex> lock(mutex_);
95 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
96 return ret;
97 }
98
OpenRawFile(const Uri & uri,const std::string & mode)99 int DataShareStubImpl::OpenRawFile(const Uri &uri, const std::string &mode)
100 {
101 CallingInfo info;
102 GetCallingInfo(info);
103 auto client = sptr<DataShareStubImpl>(this);
104 auto extension = client->GetOwner();
105 if (extension == nullptr) {
106 return DEFAULT_NUMBER;
107 }
108
109 std::shared_ptr<int> ret = std::make_shared<int>(-1);
110 std::function<void()> syncTaskFunc = [extension, ret, info, uri, mode]() {
111 extension->SetCallingInfo(info);
112 *ret = extension->OpenRawFile(uri, mode);
113 };
114 std::lock_guard<std::mutex> lock(mutex_);
115 uvQueue_->SyncCall(syncTaskFunc);
116 return *ret;
117 }
118
Insert(const Uri & uri,const DataShareValuesBucket & value)119 int DataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucket &value)
120 {
121 CallingInfo info;
122 GetCallingInfo(info);
123
124 auto client = sptr<DataShareStubImpl>(this);
125 auto extension = client->GetOwner();
126 if (extension == nullptr) {
127 return DEFAULT_NUMBER;
128 }
129
130 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
131 LOG_ERROR("Check calling permission failed.");
132 return PERMISSION_ERROR_NUMBER;
133 }
134
135 int ret = 0;
136 std::function<void()> syncTaskFunc = [extension, info, uri, value]() {
137 extension->SetCallingInfo(info);
138 extension->Insert(uri, value);
139 };
140 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
141 if (extension == nullptr) {
142 return false;
143 }
144 extension->GetResult(ret);
145 return extension->GetRecvReply();
146 };
147 std::lock_guard<std::mutex> lock(mutex_);
148 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
149 return ret;
150 }
151
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)152 int DataShareStubImpl::Update(const Uri &uri, const DataSharePredicates &predicates,
153 const DataShareValuesBucket &value)
154 {
155 CallingInfo info;
156 GetCallingInfo(info);
157
158 auto client = sptr<DataShareStubImpl>(this);
159 auto extension = client->GetOwner();
160 if (extension == nullptr) {
161 return DEFAULT_NUMBER;
162 }
163
164 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
165 LOG_ERROR("Check calling permission failed.");
166 return PERMISSION_ERROR_NUMBER;
167 }
168
169 int ret = 0;
170 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, value]() {
171 extension->SetCallingInfo(info);
172 extension->Update(uri, predicates, value);
173 };
174 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
175 if (extension == nullptr) {
176 return false;
177 }
178 extension->GetResult(ret);
179 return extension->GetRecvReply();
180 };
181 std::lock_guard<std::mutex> lock(mutex_);
182 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
183 return ret;
184 }
185
BatchUpdate(const UpdateOperations & operations,std::vector<BatchUpdateResult> & results)186 int DataShareStubImpl::BatchUpdate(const UpdateOperations &operations, std::vector<BatchUpdateResult> &results)
187 {
188 CallingInfo info;
189 GetCallingInfo(info);
190 auto client = sptr<DataShareStubImpl>(this);
191 auto extension = client->GetOwner();
192 if (extension == nullptr) {
193 return DEFAULT_NUMBER;
194 }
195 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
196 LOG_ERROR("Check calling permission failed.");
197 return PERMISSION_ERROR_NUMBER;
198 }
199 std::shared_ptr<int> ret = std::make_shared<int>(0);
200 std::function<void()> syncTaskFunc = [extension, ret, operations, info]() {
201 extension->SetCallingInfo(info);
202 std::vector<BatchUpdateResult> tmp;
203 *ret = extension->BatchUpdate(operations, tmp);
204 };
205 std::function<bool()> getRetFunc = [&results, extension]() -> bool {
206 if (extension == nullptr) {
207 return false;
208 }
209 extension->GetResult(results);
210 return extension->GetRecvReply();
211 };
212 std::lock_guard<std::mutex> lock(mutex_);
213 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
214 return *ret;
215 }
216
Delete(const Uri & uri,const DataSharePredicates & predicates)217 int DataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates &predicates)
218 {
219 CallingInfo info;
220 GetCallingInfo(info);
221
222 auto client = sptr<DataShareStubImpl>(this);
223 auto extension = client->GetOwner();
224 if (extension == nullptr) {
225 return DEFAULT_NUMBER;
226 }
227
228 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
229 LOG_ERROR("Check calling permission failed.");
230 return PERMISSION_ERROR_NUMBER;
231 }
232
233 int ret = 0;
234 std::function<void()> syncTaskFunc = [extension, info, uri, predicates]() {
235 extension->SetCallingInfo(info);
236 extension->Delete(uri, predicates);
237 };
238 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
239 if (extension == nullptr) {
240 return false;
241 }
242 extension->GetResult(ret);
243 return extension->GetRecvReply();
244 };
245 std::lock_guard<std::mutex> lock(mutex_);
246 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
247 return ret;
248 }
249
InsertEx(const Uri & uri,const DataShareValuesBucket & value)250 std::pair<int32_t, int32_t> DataShareStubImpl::InsertEx(const Uri &uri, const DataShareValuesBucket &value)
251 {
252 CallingInfo info;
253 GetCallingInfo(info);
254
255 auto client = sptr<DataShareStubImpl>(this);
256 auto extension = client->GetOwner();
257 if (extension == nullptr) {
258 return std::make_pair(DATA_SHARE_ERROR, 0);
259 }
260
261 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
262 LOG_ERROR("Check calling permission failed.");
263 return std::make_pair(PERMISSION_ERROR_NUMBER, 0);
264 }
265
266 int ret = 0;
267 std::function<void()> syncTaskFunc = [extension, info, uri, value]() {
268 extension->SetCallingInfo(info);
269 extension->Insert(uri, value);
270 };
271 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
272 if (extension == nullptr) {
273 return false;
274 }
275 extension->GetResult(ret);
276 return extension->GetRecvReply();
277 };
278 std::lock_guard<std::mutex> lock(mutex_);
279 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
280 return std::make_pair(E_OK, ret);
281 }
282
UpdateEx(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)283 std::pair<int32_t, int32_t> DataShareStubImpl::UpdateEx(const Uri &uri, const DataSharePredicates &predicates,
284 const DataShareValuesBucket &value)
285 {
286 CallingInfo info;
287 GetCallingInfo(info);
288
289 auto client = sptr<DataShareStubImpl>(this);
290 auto extension = client->GetOwner();
291 if (extension == nullptr) {
292 return std::make_pair(DATA_SHARE_ERROR, 0);
293 }
294
295 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
296 LOG_ERROR("Check calling permission failed.");
297 return std::make_pair(PERMISSION_ERROR_NUMBER, 0);
298 }
299
300 int ret = 0;
301 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, value]() {
302 extension->SetCallingInfo(info);
303 extension->Update(uri, predicates, value);
304 };
305 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
306 if (extension == nullptr) {
307 return false;
308 }
309 extension->GetResult(ret);
310 return extension->GetRecvReply();
311 };
312 std::lock_guard<std::mutex> lock(mutex_);
313 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
314 return std::make_pair(E_OK, ret);
315 }
316
DeleteEx(const Uri & uri,const DataSharePredicates & predicates)317 std::pair<int32_t, int32_t> DataShareStubImpl::DeleteEx(const Uri &uri, const DataSharePredicates &predicates)
318 {
319 CallingInfo info;
320 GetCallingInfo(info);
321
322 auto client = sptr<DataShareStubImpl>(this);
323 auto extension = client->GetOwner();
324 if (extension == nullptr) {
325 return std::make_pair(DATA_SHARE_ERROR, 0);
326 }
327
328 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
329 LOG_ERROR("Check calling permission failed.");
330 return std::make_pair(PERMISSION_ERROR_NUMBER, 0);
331 }
332
333 int ret = 0;
334 std::function<void()> syncTaskFunc = [extension, info, uri, predicates]() {
335 extension->SetCallingInfo(info);
336 extension->Delete(uri, predicates);
337 };
338 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
339 if (extension == nullptr) {
340 return false;
341 }
342 extension->GetResult(ret);
343 return extension->GetRecvReply();
344 };
345 std::lock_guard<std::mutex> lock(mutex_);
346 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
347 return std::make_pair(E_OK, ret);
348 }
349
Query(const Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,DatashareBusinessError & businessError)350 std::shared_ptr<DataShareResultSet> DataShareStubImpl::Query(const Uri &uri,
351 const DataSharePredicates &predicates, std::vector<std::string> &columns, DatashareBusinessError &businessError)
352 {
353 CallingInfo info;
354 GetCallingInfo(info);
355 std::shared_ptr<DataShareResultSet> resultSet = nullptr;
356 auto client = sptr<DataShareStubImpl>(this);
357 auto extension = client->GetOwner();
358 if (extension == nullptr) {
359 return resultSet;
360 }
361
362 if (!CheckCallingPermission(extension->abilityInfo_->readPermission)) {
363 LOG_ERROR("Check calling permission failed.");
364 return resultSet;
365 }
366
367 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, columns]() mutable {
368 extension->SetCallingInfo(info);
369 DatashareBusinessError businessErr;
370 extension->Query(uri, predicates, columns, businessErr);
371 };
372 std::function<bool()> getRetFunc = [extension, &resultSet, &businessError]() -> bool {
373 if (extension == nullptr) {
374 return false;
375 }
376 auto isRecvReply = extension->GetRecvReply();
377 extension->GetResultSet(resultSet);
378 extension->GetBusinessError(businessError);
379 return isRecvReply;
380 };
381 std::lock_guard<std::mutex> lock(mutex_);
382 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
383 return resultSet;
384 }
385
GetType(const Uri & uri)386 std::string DataShareStubImpl::GetType(const Uri &uri)
387 {
388 CallingInfo info;
389 GetCallingInfo(info);
390 std::string ret = "";
391 auto client = sptr<DataShareStubImpl>(this);
392 auto extension = client->GetOwner();
393 if (extension == nullptr) {
394 return ret;
395 }
396 std::function<void()> syncTaskFunc = [extension, info, uri]() {
397 if (extension == nullptr) {
398 return;
399 }
400 extension->SetCallingInfo(info);
401 extension->GetType(uri);
402 };
403 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
404 if (extension == nullptr) {
405 return false;
406 }
407 extension->GetResult(ret);
408 return extension->GetRecvReply();
409 };
410 std::lock_guard<std::mutex> lock(mutex_);
411 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
412 return ret;
413 }
414
BatchInsert(const Uri & uri,const std::vector<DataShareValuesBucket> & values)415 int DataShareStubImpl::BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
416 {
417 CallingInfo info;
418 GetCallingInfo(info);
419 auto client = sptr<DataShareStubImpl>(this);
420 auto extension = client->GetOwner();
421 if (extension == nullptr) {
422 return DEFAULT_NUMBER;
423 }
424
425 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
426 LOG_ERROR("Check calling permission failed.");
427 return PERMISSION_ERROR_NUMBER;
428 }
429
430 int ret = 0;
431 std::function<void()> syncTaskFunc = [extension, info, uri, values]() {
432 extension->SetCallingInfo(info);
433 extension->BatchInsert(uri, values);
434 };
435 std::function<bool()> getRetFunc = [extension, &ret]() -> bool {
436 if (extension == nullptr) {
437 return false;
438 }
439 extension->GetResult(ret);
440 return extension->GetRecvReply();
441 };
442 std::lock_guard<std::mutex> lock(mutex_);
443 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
444 return ret;
445 }
446
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)447 bool DataShareStubImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
448 {
449 auto extension = GetOwner();
450 if (extension == nullptr) {
451 return false;
452 }
453 if (!CheckCallingPermission(extension->abilityInfo_->readPermission)) {
454 LOG_ERROR("Register observer check permission failed. uri: %{public}s",
455 DataShareStringUtils::Anonymous(uri.ToString()).c_str());
456 return PERMISSION_ERROR_NUMBER;
457 }
458 return extension->RegisterObserver(uri, dataObserver);
459 }
460
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)461 bool DataShareStubImpl::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
462 {
463 auto extension = GetOwner();
464 if (extension == nullptr) {
465 return false;
466 }
467 if (!CheckCallingPermission(extension->abilityInfo_->readPermission)) {
468 LOG_ERROR("UnRegister observer check permission failed. uri: %{public}s",
469 DataShareStringUtils::Anonymous(uri.ToString()).c_str());
470 return PERMISSION_ERROR_NUMBER;
471 }
472 return extension->UnregisterObserver(uri, dataObserver);
473 }
474
NotifyChange(const Uri & uri)475 bool DataShareStubImpl::NotifyChange(const Uri &uri)
476 {
477 std::shared_ptr<bool> ret = std::make_shared<bool>(false);
478 auto client = sptr<DataShareStubImpl>(this);
479 auto extension = client->GetOwner();
480 if (extension == nullptr) {
481 return *ret;
482 }
483
484 std::function<void()> syncTaskFunc = [extension, ret, uri]() {
485 *ret = extension->NotifyChange(uri);
486 };
487 std::lock_guard<std::mutex> lock(mutex_);
488 uvQueue_->SyncCall(syncTaskFunc);
489 return *ret;
490 }
491
NormalizeUri(const Uri & uri)492 Uri DataShareStubImpl::NormalizeUri(const Uri &uri)
493 {
494 CallingInfo info;
495 GetCallingInfo(info);
496 Uri normalizeUri("");
497 auto client = sptr<DataShareStubImpl>(this);
498 auto extension = client->GetOwner();
499 if (extension == nullptr) {
500 return normalizeUri;
501 }
502
503 std::function<void()> syncTaskFunc = [extension, info, uri]() {
504 extension->SetCallingInfo(info);
505 extension->NormalizeUri(uri);
506 };
507 std::function<bool()> getRetFunc = [extension, &normalizeUri]() -> bool {
508 if (extension == nullptr) {
509 return false;
510 }
511 std::string ret;
512 extension->GetResult(ret);
513 Uri tmp(ret);
514 normalizeUri = tmp;
515 return extension->GetRecvReply();
516 };
517 std::lock_guard<std::mutex> lock(mutex_);
518 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
519 return normalizeUri;
520 }
521
DenormalizeUri(const Uri & uri)522 Uri DataShareStubImpl::DenormalizeUri(const Uri &uri)
523 {
524 CallingInfo info;
525 GetCallingInfo(info);
526 Uri denormalizedUri("");
527 auto client = sptr<DataShareStubImpl>(this);
528 auto extension = client->GetOwner();
529 if (extension == nullptr) {
530 return denormalizedUri;
531 }
532 std::function<void()> syncTaskFunc = [extension, info, uri]() {
533 extension->SetCallingInfo(info);
534 extension->DenormalizeUri(uri);
535 };
536 std::function<bool()> getRetFunc = [extension, &denormalizedUri]() -> bool {
537 if (extension == nullptr) {
538 return false;
539 }
540 std::string ret;
541 extension->GetResult(ret);
542 Uri tmp(ret);
543 denormalizedUri = tmp;
544 return extension->GetRecvReply();
545 };
546 std::lock_guard<std::mutex> lock(mutex_);
547 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
548 return denormalizedUri;
549 }
550
GetCallingInfo(CallingInfo & callingInfo)551 void DataShareStubImpl::GetCallingInfo(CallingInfo& callingInfo)
552 {
553 callingInfo.callingTokenId = GetCallingTokenID();
554 callingInfo.callingPid = GetCallingPid();
555 callingInfo.callingUid = GetCallingUid();
556 }
557 } // namespace DataShare
558 } // namespace OHOS