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