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