• 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 
18 #include "accesstoken_kit.h"
19 #include "datashare_log.h"
20 #include "ipc_skeleton.h"
21 
22 namespace OHOS {
23 namespace DataShare {
24 using OHOS::Security::AccessToken::AccessTokenKit;
25 
26 constexpr int DEFAULT_NUMBER = -1;
27 constexpr int PERMISSION_ERROR_NUMBER = -2;
GetOwner()28 std::shared_ptr<JsDataShareExtAbility> DataShareStubImpl::GetOwner()
29 {
30     if (extension_ == nullptr) {
31         LOG_ERROR("extension_ is nullptr.");
32     }
33     return extension_;
34 }
35 
CheckCallingPermission(const std::string & permission)36 bool DataShareStubImpl::CheckCallingPermission(const std::string &permission)
37 {
38     if (!permission.empty() && AccessTokenKit::VerifyAccessToken(IPCSkeleton::GetCallingTokenID(), permission)
39         != AppExecFwk::Constants::PERMISSION_GRANTED) {
40         LOG_ERROR("permission not granted.");
41         return false;
42     }
43     return true;
44 }
45 
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)46 std::vector<std::string> DataShareStubImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
47 {
48     std::vector<std::string> ret;
49     std::function<void()> syncTaskFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() {
50         auto extension = client->GetOwner();
51         if (extension == nullptr) {
52             return;
53         }
54         ret = extension->GetFileTypes(uri, mimeTypeFilter);
55     };
56     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
57         auto extension = client->GetOwner();
58         if (extension == nullptr) {
59             return false;
60         }
61         extension->GetResult(ret);
62         return (ret.size() != 0);
63     };
64     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
65     return ret;
66 }
67 
OpenFile(const Uri & uri,const std::string & mode)68 int DataShareStubImpl::OpenFile(const Uri &uri, const std::string &mode)
69 {
70     int ret = -1;
71     std::function<void()> syncTaskFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() {
72         auto extension = client->GetOwner();
73         if (extension == nullptr) {
74             return;
75         }
76         ret = extension->OpenFile(uri, mode);
77     };
78     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
79         auto extension = client->GetOwner();
80         if (extension == nullptr) {
81             return false;
82         }
83         extension->GetResult(ret);
84         return (ret != DEFAULT_NUMBER);
85     };
86     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
87     return ret;
88 }
89 
OpenRawFile(const Uri & uri,const std::string & mode)90 int DataShareStubImpl::OpenRawFile(const Uri &uri, const std::string &mode)
91 {
92     int ret = -1;
93     std::function<void()> syncTaskFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() {
94         auto extension = client->GetOwner();
95         if (extension == nullptr) {
96             return;
97         }
98         ret = extension->OpenRawFile(uri, mode);
99     };
100     uvQueue_->SyncCall(syncTaskFunc);
101     return ret;
102 }
103 
Insert(const Uri & uri,const DataShareValuesBucket & value)104 int DataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucket &value)
105 {
106     CallingInfo info;
107     GetCallingInfo(info);
108 
109     auto client = sptr<DataShareStubImpl>(this);
110     auto extension = client->GetOwner();
111     if (extension == nullptr) {
112         return DEFAULT_NUMBER;
113     }
114 
115     if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
116         LOG_ERROR("Check calling permission failed.");
117         return PERMISSION_ERROR_NUMBER;
118     }
119 
120     int ret = 0;
121     std::function<void()> syncTaskFunc = [=, &ret, &extension]() {
122         extension->SetCallingInfo(info);
123         ret = extension->Insert(uri, value);
124     };
125     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
126         auto extension = client->GetOwner();
127         if (extension == nullptr) {
128             return false;
129         }
130         extension->GetResult(ret);
131         return (ret != DEFAULT_NUMBER);
132     };
133     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
134     return ret;
135 }
136 
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)137 int DataShareStubImpl::Update(const Uri &uri, const DataSharePredicates &predicates,
138     const DataShareValuesBucket &value)
139 {
140     CallingInfo info;
141     GetCallingInfo(info);
142 
143     auto client = sptr<DataShareStubImpl>(this);
144     auto extension = client->GetOwner();
145     if (extension == nullptr) {
146         return DEFAULT_NUMBER;
147     }
148 
149     if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
150         LOG_ERROR("Check calling permission failed.");
151         return PERMISSION_ERROR_NUMBER;
152     }
153 
154     int ret = 0;
155     std::function<void()> syncTaskFunc = [=, &ret, &extension]() {
156         extension->SetCallingInfo(info);
157         ret = extension->Update(uri, predicates, value);
158     };
159     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
160         auto extension = client->GetOwner();
161         if (extension == nullptr) {
162             return false;
163         }
164         extension->GetResult(ret);
165         return (ret != DEFAULT_NUMBER);
166     };
167     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
168     return ret;
169 }
170 
Delete(const Uri & uri,const DataSharePredicates & predicates)171 int DataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates &predicates)
172 {
173     CallingInfo info;
174     GetCallingInfo(info);
175 
176     auto client = sptr<DataShareStubImpl>(this);
177     auto extension = client->GetOwner();
178     if (extension == nullptr) {
179         return DEFAULT_NUMBER;
180     }
181 
182     if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
183         LOG_ERROR("Check calling permission failed.");
184         return PERMISSION_ERROR_NUMBER;
185     }
186 
187     int ret = 0;
188     std::function<void()> syncTaskFunc = [=, &ret, &extension]() {
189         extension->SetCallingInfo(info);
190         ret = extension->Delete(uri, predicates);
191     };
192     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
193         auto extension = client->GetOwner();
194         if (extension == nullptr) {
195             return false;
196         }
197         extension->GetResult(ret);
198         return (ret != DEFAULT_NUMBER);
199     };
200     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
201     return ret;
202 }
203 
Query(const Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns)204 std::shared_ptr<DataShareResultSet> DataShareStubImpl::Query(const Uri &uri,
205     const DataSharePredicates &predicates, std::vector<std::string> &columns)
206 {
207     CallingInfo info;
208     GetCallingInfo(info);
209     std::shared_ptr<DataShareResultSet> resultSet = nullptr;
210     auto client = sptr<DataShareStubImpl>(this);
211     auto extension = client->GetOwner();
212     if (extension == nullptr) {
213         return resultSet;
214     }
215 
216     if (!CheckCallingPermission(extension->abilityInfo_->readPermission)) {
217         LOG_ERROR("Check calling permission failed.");
218         return resultSet;
219     }
220 
221     std::function<void()> syncTaskFunc = [=, &columns, &resultSet, &extension]() {
222         resultSet = extension->Query(uri, predicates, columns);
223     };
224     std::function<bool()> getRetFunc = [=, &resultSet, client = sptr<DataShareStubImpl>(this)]() -> bool {
225         auto extension = client->GetOwner();
226         if (extension == nullptr) {
227             return false;
228         }
229         extension->SetCallingInfo(info);
230         extension->GetResult(resultSet);
231         return (resultSet != nullptr);
232     };
233     std::lock_guard<std::mutex> lock(mutex_);
234     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
235     return resultSet;
236 }
237 
GetType(const Uri & uri)238 std::string DataShareStubImpl::GetType(const Uri &uri)
239 {
240     std::string ret = "";
241     std::function<void()> syncTaskFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() {
242         auto extension = client->GetOwner();
243         if (extension == nullptr) {
244             return;
245         }
246         ret = extension->GetType(uri);
247     };
248     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
249         auto extension = client->GetOwner();
250         if (extension == nullptr) {
251             return false;
252         }
253         extension->GetResult(ret);
254         return (ret != "");
255     };
256     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
257     return ret;
258 }
259 
BatchInsert(const Uri & uri,const std::vector<DataShareValuesBucket> & values)260 int DataShareStubImpl::BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
261 {
262     auto client = sptr<DataShareStubImpl>(this);
263     auto extension = client->GetOwner();
264     if (extension == nullptr) {
265         return DEFAULT_NUMBER;
266     }
267 
268     if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
269         LOG_ERROR("Check calling permission failed.");
270         return PERMISSION_ERROR_NUMBER;
271     }
272 
273     int ret = 0;
274     std::function<void()> syncTaskFunc = [=, &ret, &extension]() {
275         auto extension = client->GetOwner();
276         if (extension == nullptr) {
277             return;
278         }
279         ret = extension->BatchInsert(uri, values);
280     };
281     std::function<bool()> getRetFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() -> bool {
282         auto extension = client->GetOwner();
283         if (extension == nullptr) {
284             return false;
285         }
286         extension->GetResult(ret);
287         return (ret != DEFAULT_NUMBER);
288     };
289     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
290     return ret;
291 }
292 
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)293 bool DataShareStubImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
294 {
295     auto extension = GetOwner();
296     if (extension == nullptr) {
297         return false;
298     }
299     return extension->RegisterObserver(uri, dataObserver);
300 }
301 
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)302 bool DataShareStubImpl::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
303 {
304     auto extension = GetOwner();
305     if (extension == nullptr) {
306         return false;
307     }
308     return extension->UnregisterObserver(uri, dataObserver);
309 }
310 
NotifyChange(const Uri & uri)311 bool DataShareStubImpl::NotifyChange(const Uri &uri)
312 {
313     bool ret = false;
314     std::function<void()> syncTaskFunc = [=, &ret, client = sptr<DataShareStubImpl>(this)]() {
315         auto extension = client->GetOwner();
316         if (extension == nullptr) {
317             return;
318         }
319         ret = extension->NotifyChange(uri);
320     };
321     uvQueue_->SyncCall(syncTaskFunc);
322     return ret;
323 }
324 
NormalizeUri(const Uri & uri)325 Uri DataShareStubImpl::NormalizeUri(const Uri &uri)
326 {
327     Uri urivalue("");
328     std::function<void()> syncTaskFunc = [=, &urivalue, client = sptr<DataShareStubImpl>(this)]() {
329         auto extension = client->GetOwner();
330         if (extension == nullptr) {
331             return;
332         }
333         urivalue = extension->NormalizeUri(uri);
334     };
335     std::function<bool()> getRetFunc = [=, &urivalue, client = sptr<DataShareStubImpl>(this)]() -> bool {
336         auto extension = client->GetOwner();
337         if (extension == nullptr) {
338             return false;
339         }
340         std::string ret;
341         extension->GetResult(ret);
342         Uri tmp(ret);
343         urivalue = tmp;
344         return (urivalue.ToString() != "");
345     };
346     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
347     return urivalue;
348 }
349 
DenormalizeUri(const Uri & uri)350 Uri DataShareStubImpl::DenormalizeUri(const Uri &uri)
351 {
352     Uri urivalue("");
353     std::function<void()> syncTaskFunc = [=, &urivalue, client = sptr<DataShareStubImpl>(this)]() {
354         auto extension = client->GetOwner();
355         if (extension == nullptr) {
356             return;
357         }
358         urivalue = extension->DenormalizeUri(uri);
359     };
360     std::function<bool()> getRetFunc = [=, &urivalue, client = sptr<DataShareStubImpl>(this)]() -> bool {
361         auto extension = client->GetOwner();
362         if (extension == nullptr) {
363             return false;
364         }
365         std::string ret;
366         extension->GetResult(ret);
367         Uri tmp(ret);
368         urivalue = tmp;
369         return (urivalue.ToString() != "");
370     };
371     uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
372     return urivalue;
373 }
374 
GetCallingInfo(CallingInfo & callingInfo)375 void DataShareStubImpl::GetCallingInfo(CallingInfo& callingInfo)
376 {
377     callingInfo.callingTokenId = GetCallingTokenID();
378     callingInfo.callingPid = GetCallingPid();
379     callingInfo.callingUid = GetCallingUid();
380 }
381 } // namespace DataShare
382 } // namespace OHOS