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