1 /*
2 * Copyright (c) 2023 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 #define LOG_TAG "DataShareServiceImpl"
17
18 #include "data_share_service_impl.h"
19
20 #include <cstdint>
21 #include <utility>
22
23 #include "accesstoken_kit.h"
24 #include "account/account_delegate.h"
25 #include "app_connect_manager.h"
26 #include "common_event_manager.h"
27 #include "common_event_support.h"
28 #include "data_ability_observer_interface.h"
29 #include "data_share_profile_config.h"
30 #include "dataobs_mgr_client.h"
31 #include "datashare_errno.h"
32 #include "datashare_radar_reporter.h"
33 #include "device_manager_adapter.h"
34 #include "datashare_template.h"
35 #include "directory/directory_manager.h"
36 #include "eventcenter/event_center.h"
37 #include "extension_connect_adaptor.h"
38 #include "dump/dump_manager.h"
39 #include "extension_ability_manager.h"
40 #include "hap_token_info.h"
41 #include "if_system_ability_manager.h"
42 #include "ipc_skeleton.h"
43 #include "iservice_registry.h"
44 #include "log_print.h"
45 #include "metadata/auto_launch_meta_data.h"
46 #include "metadata/meta_data_manager.h"
47 #include "matching_skills.h"
48 #include "permit_delegate.h"
49 #include "rdb_helper.h"
50 #include "scheduler_manager.h"
51 #include "subscriber_managers/published_data_subscriber_manager.h"
52 #include "sys_event_subscriber.h"
53 #include "system_ability_definition.h"
54 #include "system_ability_status_change_stub.h"
55 #include "template_data.h"
56 #include "utils/anonymous.h"
57 #include "xcollie.h"
58
59 namespace OHOS::DataShare {
60 using FeatureSystem = DistributedData::FeatureSystem;
61 using DumpManager = OHOS::DistributedData::DumpManager;
62 using ProviderInfo = DataProviderConfig::ProviderInfo;
63 using namespace OHOS::DistributedData;
64 __attribute__((used)) DataShareServiceImpl::Factory DataShareServiceImpl::factory_;
65 class DataShareServiceImpl::SystemAbilityStatusChangeListener
66 : public SystemAbilityStatusChangeStub {
67 public:
SystemAbilityStatusChangeListener()68 SystemAbilityStatusChangeListener()
69 {
70 }
71 ~SystemAbilityStatusChangeListener() = default;
72 void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override;
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)73 void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override
74 {
75 }
76 };
77
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)78 void DataShareServiceImpl::SystemAbilityStatusChangeListener::OnAddSystemAbility(
79 int32_t systemAbilityId, const std::string &deviceId)
80 {
81 if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
82 return;
83 }
84 ZLOGI("Common event service start. saId:%{public}d", systemAbilityId);
85 InitSubEvent();
86 }
87
Factory()88 DataShareServiceImpl::Factory::Factory()
89 {
90 FeatureSystem::GetInstance().RegisterCreator("data_share", []() {
91 return std::make_shared<DataShareServiceImpl>();
92 });
93 staticActs_ = std::make_shared<DataShareStatic>();
94 FeatureSystem::GetInstance().RegisterStaticActs("data_share", staticActs_);
95 }
96
~Factory()97 DataShareServiceImpl::Factory::~Factory() {}
98
Insert(const std::string & uri,const DataShareValuesBucket & valuesBucket)99 int32_t DataShareServiceImpl::Insert(const std::string &uri, const DataShareValuesBucket &valuesBucket)
100 {
101 ZLOGD("Insert enter.");
102 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
103 HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
104 if (GetSilentProxyStatus(uri, false) != E_OK) {
105 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
106 return ERROR;
107 }
108 auto callBack = [&uri, &valuesBucket, this](ProviderInfo &providerInfo,
109 DistributedData::StoreMetaData &metaData, std::shared_ptr<DBDelegate> dbDelegate) -> int32_t {
110 auto ret = dbDelegate->Insert(providerInfo.tableName, valuesBucket);
111 if (ret > 0) {
112 NotifyChange(uri);
113 RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.currentUserId, metaData);
114 }
115 return ret;
116 };
117 return Execute(uri, "", IPCSkeleton::GetCallingTokenID(), false, callBack);
118 }
119
InsertEx(const std::string & uri,const std::string & extUri,const DataShareValuesBucket & valuesBucket)120 std::pair<int32_t, int32_t> DataShareServiceImpl::InsertEx(const std::string &uri, const std::string &extUri,
121 const DataShareValuesBucket &valuesBucket)
122 {
123 ZLOGD("InsertEx enter.");
124 XCollie xcollie(__FUNCTION__, HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
125 if (GetSilentProxyStatus(uri, false) != E_OK) {
126 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
127 return std::make_pair(ERROR, 0);
128 }
129 auto callBack = [&uri, &valuesBucket, this](ProviderInfo &providerInfo, DistributedData::StoreMetaData &metaData,
130 std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
131 auto [errCode, ret] = dbDelegate->InsertEx(providerInfo.tableName, valuesBucket);
132 if (errCode == E_OK && ret > 0) {
133 NotifyChange(uri);
134 RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.currentUserId, metaData);
135 }
136 return std::make_pair(errCode, ret);
137 };
138 return ExecuteEx(uri, extUri, IPCSkeleton::GetCallingTokenID(), false, callBack);
139 }
140
NotifyChange(const std::string & uri)141 bool DataShareServiceImpl::NotifyChange(const std::string &uri)
142 {
143 RadarReporter::RadarReport report(RadarReporter::NOTIFY_OBSERVER_DATA_CHANGE,
144 RadarReporter::NOTIFY_DATA_CHANGE, __FUNCTION__);
145 auto obsMgrClient = AAFwk::DataObsMgrClient::GetInstance();
146 if (obsMgrClient == nullptr) {
147 ZLOGE("obsMgrClient is nullptr");
148 report.SetError(RadarReporter::DATA_OBS_EMPTY_ERROR);
149 return false;
150 }
151
152 ErrCode ret = obsMgrClient->NotifyChange(Uri(uri));
153 if (ret != ERR_OK) {
154 ZLOGE("obsMgrClient->NotifyChange error return %{public}d", ret);
155 report.SetError(RadarReporter::NOTIFY_ERROR);
156 return false;
157 }
158 return true;
159 }
160
Update(const std::string & uri,const DataSharePredicates & predicate,const DataShareValuesBucket & valuesBucket)161 int32_t DataShareServiceImpl::Update(const std::string &uri,
162 const DataSharePredicates &predicate, const DataShareValuesBucket &valuesBucket)
163 {
164 ZLOGD("Update enter.");
165 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
166 HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
167 if (GetSilentProxyStatus(uri, false) != E_OK) {
168 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
169 return ERROR;
170 }
171 auto callBack = [&uri, &predicate, &valuesBucket, this](ProviderInfo &providerInfo,
172 DistributedData::StoreMetaData &metaData, std::shared_ptr<DBDelegate> dbDelegate) -> int32_t {
173 auto ret = dbDelegate->Update(providerInfo.tableName, predicate, valuesBucket);
174 if (ret > 0) {
175 NotifyChange(uri);
176 RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.currentUserId, metaData);
177 }
178 return ret;
179 };
180 return Execute(uri, "", IPCSkeleton::GetCallingTokenID(), false, callBack);
181 }
182
UpdateEx(const std::string & uri,const std::string & extUri,const DataSharePredicates & predicate,const DataShareValuesBucket & valuesBucket)183 std::pair<int32_t, int32_t> DataShareServiceImpl::UpdateEx(const std::string &uri, const std::string &extUri,
184 const DataSharePredicates &predicate, const DataShareValuesBucket &valuesBucket)
185 {
186 ZLOGD("UpdateEx enter.");
187 XCollie xcollie(__FUNCTION__, HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
188 if (GetSilentProxyStatus(uri, false) != E_OK) {
189 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
190 return std::make_pair(ERROR, 0);
191 }
192 auto callBack = [&uri, &predicate, &valuesBucket, this](ProviderInfo &providerInfo,
193 DistributedData::StoreMetaData &metaData,
194 std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
195 auto [errCode, ret] = dbDelegate->UpdateEx(providerInfo.tableName, predicate, valuesBucket);
196 if (errCode == E_OK && ret > 0) {
197 NotifyChange(uri);
198 RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.currentUserId, metaData);
199 }
200 return std::make_pair(errCode, ret);
201 };
202 return ExecuteEx(uri, extUri, IPCSkeleton::GetCallingTokenID(), false, callBack);
203 }
204
Delete(const std::string & uri,const DataSharePredicates & predicate)205 int32_t DataShareServiceImpl::Delete(const std::string &uri, const DataSharePredicates &predicate)
206 {
207 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
208 HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
209 if (GetSilentProxyStatus(uri, false) != E_OK) {
210 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
211 return ERROR;
212 }
213 auto callBack = [&uri, &predicate, this](ProviderInfo &providerInfo,
214 DistributedData::StoreMetaData &metaData, std::shared_ptr<DBDelegate> dbDelegate) -> int32_t {
215 auto ret = dbDelegate->Delete(providerInfo.tableName, predicate);
216 if (ret > 0) {
217 NotifyChange(uri);
218 RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.currentUserId, metaData);
219 }
220 return ret;
221 };
222 return Execute(uri, "", IPCSkeleton::GetCallingTokenID(), false, callBack);
223 }
224
DeleteEx(const std::string & uri,const std::string & extUri,const DataSharePredicates & predicate)225 std::pair<int32_t, int32_t> DataShareServiceImpl::DeleteEx(const std::string &uri, const std::string &extUri,
226 const DataSharePredicates &predicate)
227 {
228 XCollie xcollie(__FUNCTION__, HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
229 if (GetSilentProxyStatus(uri, false) != E_OK) {
230 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
231 return std::make_pair(ERROR, 0);
232 }
233 auto callBack = [&uri, &predicate, this](ProviderInfo &providerInfo, DistributedData::StoreMetaData &metaData,
234 std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
235 auto [errCode, ret] = dbDelegate->DeleteEx(providerInfo.tableName, predicate);
236 if (errCode == E_OK && ret > 0) {
237 NotifyChange(uri);
238 RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.currentUserId, metaData);
239 }
240 return std::make_pair(errCode, ret);
241 };
242 return ExecuteEx(uri, extUri, IPCSkeleton::GetCallingTokenID(), false, callBack);
243 }
244
Query(const std::string & uri,const std::string & extUri,const DataSharePredicates & predicates,const std::vector<std::string> & columns,int & errCode)245 std::shared_ptr<DataShareResultSet> DataShareServiceImpl::Query(const std::string &uri, const std::string &extUri,
246 const DataSharePredicates &predicates, const std::vector<std::string> &columns, int &errCode)
247 {
248 ZLOGD("Query enter.");
249 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
250 HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
251 if (GetSilentProxyStatus(uri, false) != E_OK) {
252 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
253 return nullptr;
254 }
255 std::shared_ptr<DataShareResultSet> resultSet;
256 auto callingPid = IPCSkeleton::GetCallingPid();
257 auto callBack = [&uri, &predicates, &columns, &resultSet, &callingPid](ProviderInfo &providerInfo,
258 DistributedData::StoreMetaData &, std::shared_ptr<DBDelegate> dbDelegate) -> int32_t {
259 auto [err, result] = dbDelegate->Query(providerInfo.tableName,
260 predicates, columns, callingPid);
261 resultSet = std::move(result);
262 return err;
263 };
264 errCode = Execute(uri, extUri, IPCSkeleton::GetCallingTokenID(), true, callBack);
265 return resultSet;
266 }
267
AddTemplate(const std::string & uri,const int64_t subscriberId,const Template & tplt)268 int32_t DataShareServiceImpl::AddTemplate(const std::string &uri, const int64_t subscriberId, const Template &tplt)
269 {
270 auto context = std::make_shared<Context>(uri);
271 TemplateId tpltId;
272 tpltId.subscriberId_ = subscriberId;
273 if (!GetCallerBundleName(tpltId.bundleName_)) {
274 ZLOGE("get bundleName error, %{public}s", DistributedData::Anonymous::Change(uri).c_str());
275 return ERROR;
276 }
277 ZLOGI("Add template, uri %{private}s, subscriberId %{public}" PRIi64 ", bundleName %{public}s,"
278 "predicates size %{public}zu.",
279 uri.c_str(), subscriberId, tpltId.bundleName_.c_str(), tplt.predicates_.size());
280 return templateStrategy_.Execute(context, [&uri, &tpltId, &tplt, &context]() -> int32_t {
281 auto result = TemplateManager::GetInstance().Add(
282 Key(uri, tpltId.subscriberId_, tpltId.bundleName_), context->currentUserId, tplt);
283 RdbSubscriberManager::GetInstance().Emit(context->uri, tpltId.subscriberId_, context);
284 return result;
285 });
286 }
287
DelTemplate(const std::string & uri,const int64_t subscriberId)288 int32_t DataShareServiceImpl::DelTemplate(const std::string &uri, const int64_t subscriberId)
289 {
290 auto context = std::make_shared<Context>(uri);
291 TemplateId tpltId;
292 tpltId.subscriberId_ = subscriberId;
293 if (!GetCallerBundleName(tpltId.bundleName_)) {
294 ZLOGE("get bundleName error, %{public}s", DistributedData::Anonymous::Change(uri).c_str());
295 return ERROR;
296 }
297 ZLOGI("Delete template, uri %{private}s, subscriberId %{public}" PRIi64 ", bundleName %{public}s.",
298 DistributedData::Anonymous::Change(uri).c_str(), subscriberId, tpltId.bundleName_.c_str());
299 return templateStrategy_.Execute(context, [&uri, &tpltId, &context]() -> int32_t {
300 return TemplateManager::GetInstance().Delete(
301 Key(uri, tpltId.subscriberId_, tpltId.bundleName_), context->currentUserId);
302 });
303 }
304
GetCallerBundleName(std::string & bundleName)305 bool DataShareServiceImpl::GetCallerBundleName(std::string &bundleName)
306 {
307 auto tokenId = IPCSkeleton::GetCallingTokenID();
308 auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
309 if (type == Security::AccessToken::TOKEN_NATIVE) {
310 return true;
311 }
312 if (type != Security::AccessToken::TOKEN_HAP) {
313 return false;
314 }
315 Security::AccessToken::HapTokenInfo tokenInfo;
316 auto result = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
317 if (result != Security::AccessToken::RET_SUCCESS) {
318 ZLOGE("token:0x%{public}x, result:%{public}d", tokenId, result);
319 return false;
320 }
321 bundleName = tokenInfo.bundleName;
322 return true;
323 }
324
Publish(const Data & data,const std::string & bundleNameOfProvider)325 std::vector<OperationResult> DataShareServiceImpl::Publish(const Data &data, const std::string &bundleNameOfProvider)
326 {
327 std::vector<OperationResult> results;
328 std::vector<PublishedDataKey> publishedData;
329 std::string callerBundleName;
330 if (!GetCallerBundleName(callerBundleName)) {
331 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
332 return results;
333 }
334 int32_t userId = -1;
335 PublishedData::ClearAging();
336 for (const auto &item : data.datas_) {
337 auto context = std::make_shared<Context>(item.key_);
338 context->version = data.version_;
339 context->callerBundleName = callerBundleName;
340 context->calledBundleName = bundleNameOfProvider;
341 int32_t result = publishStrategy_.Execute(context, item);
342 results.emplace_back(item.key_, result);
343 if (result != E_OK) {
344 ZLOGE("publish error, key is %{public}s", DistributedData::Anonymous::Change(item.key_).c_str());
345 continue;
346 }
347 publishedData.emplace_back(context->uri, context->calledBundleName, item.subscriberId_);
348 userId = context->currentUserId;
349 }
350 if (!publishedData.empty()) {
351 PublishedDataSubscriberManager::GetInstance().Emit(publishedData, userId, callerBundleName);
352 PublishedDataSubscriberManager::GetInstance().SetObserversNotifiedOnEnabled(publishedData);
353 }
354 return results;
355 }
356
GetData(const std::string & bundleNameOfProvider,int & errorCode)357 Data DataShareServiceImpl::GetData(const std::string &bundleNameOfProvider, int &errorCode)
358 {
359 std::string callerBundleName;
360 if (!GetCallerBundleName(callerBundleName)) {
361 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
362 return Data();
363 }
364 auto context = std::make_shared<Context>();
365 context->callerBundleName = callerBundleName;
366 context->calledBundleName = bundleNameOfProvider;
367 return getDataStrategy_.Execute(context, errorCode);
368 }
369
SubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & id,const sptr<IDataProxyRdbObserver> observer)370 std::vector<OperationResult> DataShareServiceImpl::SubscribeRdbData(
371 const std::vector<std::string> &uris, const TemplateId &id, const sptr<IDataProxyRdbObserver> observer)
372 {
373 std::vector<OperationResult> results;
374 for (const auto &uri : uris) {
375 auto context = std::make_shared<Context>(uri);
376 results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &observer, &context, this]() {
377 return RdbSubscriberManager::GetInstance().Add(
378 Key(context->uri, id.subscriberId_, id.bundleName_), observer, context, binderInfo_.executors);
379 }));
380 }
381 return results;
382 }
383
UnsubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & id)384 std::vector<OperationResult> DataShareServiceImpl::UnsubscribeRdbData(
385 const std::vector<std::string> &uris, const TemplateId &id)
386 {
387 std::vector<OperationResult> results;
388 for (const auto &uri : uris) {
389 auto context = std::make_shared<Context>(uri);
390 results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &context]() {
391 return RdbSubscriberManager::GetInstance().Delete(
392 Key(context->uri, id.subscriberId_, id.bundleName_), context->callerTokenId);
393 }));
394 }
395 return results;
396 }
397
EnableRdbSubs(const std::vector<std::string> & uris,const TemplateId & id)398 std::vector<OperationResult> DataShareServiceImpl::EnableRdbSubs(
399 const std::vector<std::string> &uris, const TemplateId &id)
400 {
401 std::vector<OperationResult> results;
402 for (const auto &uri : uris) {
403 auto context = std::make_shared<Context>(uri);
404 results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &context]() {
405 return RdbSubscriberManager::GetInstance().Enable(
406 Key(context->uri, id.subscriberId_, id.bundleName_), context);
407 }));
408 }
409 return results;
410 }
411
DisableRdbSubs(const std::vector<std::string> & uris,const TemplateId & id)412 std::vector<OperationResult> DataShareServiceImpl::DisableRdbSubs(
413 const std::vector<std::string> &uris, const TemplateId &id)
414 {
415 std::vector<OperationResult> results;
416 for (const auto &uri : uris) {
417 auto context = std::make_shared<Context>(uri);
418 results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &context]() {
419 return RdbSubscriberManager::GetInstance().Disable(
420 Key(context->uri, id.subscriberId_, id.bundleName_), context->callerTokenId);
421 }));
422 }
423 return results;
424 }
425
SubscribePublishedData(const std::vector<std::string> & uris,const int64_t subscriberId,const sptr<IDataProxyPublishedDataObserver> observer)426 std::vector<OperationResult> DataShareServiceImpl::SubscribePublishedData(const std::vector<std::string> &uris,
427 const int64_t subscriberId, const sptr<IDataProxyPublishedDataObserver> observer)
428 {
429 std::vector<OperationResult> results;
430 std::string callerBundleName;
431 if (!GetCallerBundleName(callerBundleName)) {
432 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
433 return results;
434 }
435 std::vector<PublishedDataKey> publishedKeys;
436 int32_t result;
437 int32_t userId;
438 for (const auto &uri : uris) {
439 auto context = std::make_shared<Context>(uri);
440 PublishedDataKey key(uri, callerBundleName, subscriberId);
441 context->callerBundleName = callerBundleName;
442 context->calledBundleName = key.bundleName;
443 result = subscribeStrategy_.Execute(context, [&subscriberId, &observer, &context]() {
444 return PublishedDataSubscriberManager::GetInstance().Add(
445 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), observer,
446 context->callerTokenId);
447 });
448 results.emplace_back(uri, result);
449 if (result == E_OK) {
450 publishedKeys.emplace_back(context->uri, context->callerBundleName, subscriberId);
451 if (binderInfo_.executors != nullptr) {
452 binderInfo_.executors->Execute([context, subscriberId]() {
453 PublishedData::UpdateTimestamp(
454 context->uri, context->calledBundleName, subscriberId, context->currentUserId);
455 });
456 }
457 userId = context->currentUserId;
458 }
459 }
460 if (!publishedKeys.empty()) {
461 PublishedDataSubscriberManager::GetInstance().Emit(publishedKeys, userId, callerBundleName, observer);
462 }
463 return results;
464 }
465
UnsubscribePublishedData(const std::vector<std::string> & uris,const int64_t subscriberId)466 std::vector<OperationResult> DataShareServiceImpl::UnsubscribePublishedData(const std::vector<std::string> &uris,
467 const int64_t subscriberId)
468 {
469 std::vector<OperationResult> results;
470 std::string callerBundleName;
471 if (!GetCallerBundleName(callerBundleName)) {
472 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
473 return results;
474 }
475 for (const auto &uri : uris) {
476 auto context = std::make_shared<Context>(uri);
477 PublishedDataKey key(uri, callerBundleName, subscriberId);
478 context->callerBundleName = callerBundleName;
479 context->calledBundleName = key.bundleName;
480 results.emplace_back(uri, subscribeStrategy_.Execute(context, [&subscriberId, &context, this]() {
481 auto result = PublishedDataSubscriberManager::GetInstance().Delete(
482 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), context->callerTokenId);
483 if (result == E_OK && binderInfo_.executors != nullptr) {
484 binderInfo_.executors->Execute([context, subscriberId]() {
485 PublishedData::UpdateTimestamp(
486 context->uri, context->calledBundleName, subscriberId, context->currentUserId);
487 });
488 }
489 return result;
490 }));
491 }
492 return results;
493 }
494
EnablePubSubs(const std::vector<std::string> & uris,const int64_t subscriberId)495 std::vector<OperationResult> DataShareServiceImpl::EnablePubSubs(const std::vector<std::string> &uris,
496 const int64_t subscriberId)
497 {
498 std::vector<OperationResult> results;
499 std::string callerBundleName;
500 if (!GetCallerBundleName(callerBundleName)) {
501 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
502 return results;
503 }
504 std::vector<PublishedDataKey> publishedKeys;
505 int32_t result;
506 int32_t userId = -1;
507 for (const auto &uri : uris) {
508 auto context = std::make_shared<Context>(uri);
509 PublishedDataKey key(uri, callerBundleName, subscriberId);
510 context->callerBundleName = callerBundleName;
511 context->calledBundleName = key.bundleName;
512 result = subscribeStrategy_.Execute(context, [&subscriberId, &context]() {
513 return PublishedDataSubscriberManager::GetInstance().Enable(
514 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), context->callerTokenId);
515 });
516 if (result == E_OK && binderInfo_.executors != nullptr) {
517 binderInfo_.executors->Execute([context, subscriberId]() {
518 PublishedData::UpdateTimestamp(
519 context->uri, context->calledBundleName, subscriberId, context->currentUserId);
520 });
521 }
522 results.emplace_back(uri, result);
523 if (result == E_OK) {
524 PublishedDataKey pKey(context->uri, context->callerBundleName, subscriberId);
525 if (PublishedDataSubscriberManager::GetInstance().IsNotifyOnEnabled(pKey, context->callerTokenId)) {
526 publishedKeys.emplace_back(pKey);
527 }
528 userId = context->currentUserId;
529 }
530 }
531 if (!publishedKeys.empty()) {
532 PublishedDataSubscriberManager::GetInstance().Emit(publishedKeys, userId, callerBundleName);
533 }
534 return results;
535 }
536
DisablePubSubs(const std::vector<std::string> & uris,const int64_t subscriberId)537 std::vector<OperationResult> DataShareServiceImpl::DisablePubSubs(const std::vector<std::string> &uris,
538 const int64_t subscriberId)
539 {
540 std::vector<OperationResult> results;
541 std::string callerBundleName;
542 if (!GetCallerBundleName(callerBundleName)) {
543 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
544 return results;
545 }
546 for (const auto &uri : uris) {
547 auto context = std::make_shared<Context>(uri);
548 PublishedDataKey key(uri, callerBundleName, subscriberId);
549 context->callerBundleName = callerBundleName;
550 context->calledBundleName = key.bundleName;
551 results.emplace_back(uri, subscribeStrategy_.Execute(context, [&subscriberId, &context, this]() {
552 auto result = PublishedDataSubscriberManager::GetInstance().Disable(
553 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), context->callerTokenId);
554 if (result == E_OK && binderInfo_.executors != nullptr) {
555 binderInfo_.executors->Execute([context, subscriberId]() {
556 PublishedData::UpdateTimestamp(
557 context->uri, context->calledBundleName, subscriberId, context->currentUserId);
558 });
559 }
560 return result;
561 }));
562 }
563 return results;
564 }
565
566 enum DataShareKvStoreType : int32_t {
567 DATA_SHARE_SINGLE_VERSION = 0,
568 DISTRIBUTED_TYPE_BUTT
569 };
570
OnBind(const BindInfo & binderInfo)571 int32_t DataShareServiceImpl::OnBind(const BindInfo &binderInfo)
572 {
573 binderInfo_ = binderInfo;
574 const std::string accountId = DistributedKv::AccountDelegate::GetInstance()->GetCurrentAccountId();
575 const auto userId = DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(binderInfo.selfTokenId);
576 DistributedData::StoreMetaData saveMeta;
577 saveMeta.appType = "default";
578 saveMeta.storeId = "data_share_data_";
579 saveMeta.isAutoSync = false;
580 saveMeta.isBackup = false;
581 saveMeta.isEncrypt = false;
582 saveMeta.bundleName = binderInfo.selfName;
583 saveMeta.appId = binderInfo.selfName;
584 saveMeta.user = std::to_string(userId);
585 saveMeta.account = accountId;
586 saveMeta.tokenId = binderInfo.selfTokenId;
587 saveMeta.securityLevel = DistributedKv::SecurityLevel::S1;
588 saveMeta.area = DistributedKv::Area::EL1;
589 saveMeta.uid = IPCSkeleton::GetCallingUid();
590 saveMeta.storeType = DATA_SHARE_SINGLE_VERSION;
591 saveMeta.dataDir = DistributedData::DirectoryManager::GetInstance().GetStorePath(saveMeta);
592 KvDBDelegate::GetInstance(false, saveMeta.dataDir, binderInfo.executors);
593 SchedulerManager::GetInstance().SetExecutorPool(binderInfo.executors);
594 ExtensionAbilityManager::GetInstance().SetExecutorPool(binderInfo.executors);
595 DBDelegate::SetExecutorPool(binderInfo.executors);
596 SubscribeCommonEvent();
597 SubscribeTimeChanged();
598 SubscribeChange();
599 ZLOGI("end");
600 return E_OK;
601 }
602
SubscribeCommonEvent()603 void DataShareServiceImpl::SubscribeCommonEvent()
604 {
605 sptr<ISystemAbilityManager> systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
606 if (systemManager == nullptr) {
607 ZLOGE("System mgr is nullptr");
608 return;
609 }
610 sptr<SystemAbilityStatusChangeListener> callback(new SystemAbilityStatusChangeListener());
611 systemManager->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, callback);
612 }
613
SubscribeChange()614 void DataShareServiceImpl::SubscribeChange()
615 {
616 EventCenter::GetInstance().Subscribe(RemoteChangeEvent::RDB_META_SAVE, [this](const Event &event) {
617 auto &evt = static_cast<const RemoteChangeEvent &>(event);
618 auto dataInfo = evt.GetDataInfo();
619 SaveLaunchInfo(dataInfo.bundleName, dataInfo.userId, dataInfo.deviceId);
620 });
621 EventCenter::GetInstance().Subscribe(RemoteChangeEvent::DATA_CHANGE, [this](const Event &event) {
622 AutoLaunch(event);
623 });
624 }
625
SaveLaunchInfo(const std::string & bundleName,const std::string & userId,const std::string & deviceId)626 void DataShareServiceImpl::SaveLaunchInfo(const std::string &bundleName, const std::string &userId,
627 const std::string &deviceId)
628 {
629 std::map<std::string, ProfileInfo> profileInfos;
630 if (!DataShareProfileConfig::GetProfileInfo(bundleName, std::stoi(userId), profileInfos)) {
631 ZLOGE("Get profileInfo failed.");
632 return;
633 }
634 if (profileInfos.empty()) {
635 return;
636 }
637 StoreMetaData meta = MakeMetaData(bundleName, userId, deviceId);
638 for (auto &[uri, value] : profileInfos) {
639 if (uri.find(EXT_URI_SCHEMA) == std::string::npos) {
640 continue;
641 }
642 std::string extUri = uri;
643 extUri.insert(strlen(EXT_URI_SCHEMA), "/");
644 if (value.launchInfos.empty()) {
645 meta.storeId = "";
646 AutoLaunchMetaData autoLaunchMetaData = {};
647 std::vector<std::string> tempDatas = {};
648 autoLaunchMetaData.datas.emplace(extUri, tempDatas);
649 autoLaunchMetaData.launchForCleanData = value.launchForCleanData;
650 MetaDataManager::GetInstance().SaveMeta(meta.GetAutoLaunchKey(), autoLaunchMetaData, true);
651 ZLOGI("without launchInfos, save meta end, bundleName = %{public}s.", bundleName.c_str());
652 continue;
653 }
654 for (const auto &launchInfo : value.launchInfos) {
655 AutoLaunchMetaData autoLaunchMetaData = {};
656 autoLaunchMetaData.datas.emplace(extUri, launchInfo.tableNames);
657 autoLaunchMetaData.launchForCleanData = value.launchForCleanData;
658 meta.storeId = launchInfo.storeId;
659 MetaDataManager::GetInstance().SaveMeta(meta.GetAutoLaunchKey(), autoLaunchMetaData, true);
660 }
661 }
662 }
663
AllowCleanDataLaunchApp(const Event & event,bool launchForCleanData)664 bool DataShareServiceImpl::AllowCleanDataLaunchApp(const Event &event, bool launchForCleanData)
665 {
666 auto &evt = static_cast<const RemoteChangeEvent &>(event);
667 auto dataInfo = evt.GetDataInfo();
668 // 1 means CLOUD_DATA_CLEAN
669 if (dataInfo.changeType == 1) {
670 return launchForCleanData; // Applications can be started by default
671 }
672 return true;
673 }
674
AutoLaunch(const Event & event)675 void DataShareServiceImpl::AutoLaunch(const Event &event)
676 {
677 auto &evt = static_cast<const RemoteChangeEvent &>(event);
678 auto dataInfo = evt.GetDataInfo();
679 StoreMetaData meta = MakeMetaData(dataInfo.bundleName, dataInfo.userId, dataInfo.deviceId, dataInfo.storeId);
680 AutoLaunchMetaData autoLaunchMetaData;
681 if (!MetaDataManager::GetInstance().LoadMeta(std::move(meta.GetAutoLaunchKey()), autoLaunchMetaData, true)) {
682 meta.storeId = "";
683 if (!MetaDataManager::GetInstance().LoadMeta(std::move(meta.GetAutoLaunchKey()), autoLaunchMetaData, true)) {
684 ZLOGE("NO autoLaunch meta without storeId, bundleName = %{public}s", dataInfo.bundleName.c_str());
685 return;
686 }
687 }
688 if (autoLaunchMetaData.datas.empty() || !AllowCleanDataLaunchApp(event, autoLaunchMetaData.launchForCleanData)) {
689 return;
690 }
691 for (const auto &[uri, metaTables] : autoLaunchMetaData.datas) {
692 if (dataInfo.tables.empty() && dataInfo.changeType == 1) {
693 ZLOGI("Start to connect extension, bundleName = %{public}s", dataInfo.bundleName.c_str());
694 AAFwk::WantParams wantParams;
695 ExtensionConnectAdaptor::TryAndWait(uri, dataInfo.bundleName, wantParams);
696 return;
697 }
698 for (const auto &table : dataInfo.tables) {
699 if (std::find(metaTables.begin(), metaTables.end(), table) != metaTables.end()) {
700 ZLOGI("Find table, start to connect extension, bundleName = %{public}s", dataInfo.bundleName.c_str());
701 AAFwk::WantParams wantParams;
702 ExtensionConnectAdaptor::TryAndWait(uri, dataInfo.bundleName, wantParams);
703 break;
704 }
705 }
706 }
707 }
708
MakeMetaData(const std::string & bundleName,const std::string & userId,const std::string & deviceId,const std::string storeId)709 StoreMetaData DataShareServiceImpl::MakeMetaData(const std::string &bundleName, const std::string &userId,
710 const std::string &deviceId, const std::string storeId)
711 {
712 StoreMetaData meta;
713 meta.user = userId;
714 meta.storeId = storeId;
715 meta.deviceId = deviceId;
716 meta.bundleName = bundleName;
717 return meta;
718 }
719
OnConnectDone()720 void DataShareServiceImpl::OnConnectDone()
721 {
722 std::string callerBundleName;
723 if (!GetCallerBundleName(callerBundleName)) {
724 ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
725 return;
726 }
727 AppConnectManager::Notify(callerBundleName);
728 }
729
OnAppUninstall(const std::string & bundleName,int32_t user,int32_t index)730 int32_t DataShareServiceImpl::DataShareStatic::OnAppUninstall(const std::string &bundleName, int32_t user,
731 int32_t index)
732 {
733 ZLOGI("%{public}s uninstalled", bundleName.c_str());
734 PublishedData::Delete(bundleName, user);
735 PublishedData::ClearAging();
736 TemplateData::Delete(bundleName, user);
737 NativeRdb::RdbHelper::ClearCache();
738 BundleMgrProxy::GetInstance()->Delete(bundleName, user);
739 uint32_t tokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(user, bundleName, index);
740 DBDelegate::EraseStoreCache(tokenId);
741 return E_OK;
742 }
743
OnAppExit(pid_t uid,pid_t pid,uint32_t tokenId,const std::string & bundleName)744 int32_t DataShareServiceImpl::OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &bundleName)
745 {
746 ZLOGI("AppExit uid=%{public}d, pid=%{public}d, tokenId=0x%{public}x, bundleName=%{public}s",
747 uid, pid, tokenId, bundleName.c_str());
748 RdbSubscriberManager::GetInstance().Delete(tokenId);
749 PublishedDataSubscriberManager::GetInstance().Delete(tokenId);
750 return E_OK;
751 }
752
OnAppUpdate(const std::string & bundleName,int32_t user,int32_t index)753 int32_t DataShareServiceImpl::DataShareStatic::OnAppUpdate(const std::string &bundleName, int32_t user,
754 int32_t index)
755 {
756 ZLOGI("%{public}s updated", bundleName.c_str());
757 BundleMgrProxy::GetInstance()->Delete(bundleName, user);
758 std::string prefix = StoreMetaData::GetPrefix(
759 { DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid, std::to_string(user), "default", bundleName });
760 std::vector<StoreMetaData> storeMetaData;
761 MetaDataManager::GetInstance().LoadMeta(prefix, storeMetaData, true);
762 for (auto &meta : storeMetaData) {
763 MetaDataManager::GetInstance().DelMeta(meta.GetAutoLaunchKey(), true);
764 }
765 SaveLaunchInfo(bundleName, std::to_string(user), DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid);
766 return E_OK;
767 }
768
OnClearAppStorage(const std::string & bundleName,int32_t user,int32_t index,int32_t tokenId)769 int32_t DataShareServiceImpl::DataShareStatic::OnClearAppStorage(const std::string &bundleName,
770 int32_t user, int32_t index, int32_t tokenId)
771 {
772 ZLOGI("ClearAppStorage user=%{public}d, index=%{public}d, token:0x%{public}x, bundleName=%{public}s",
773 user, index, tokenId, bundleName.c_str());
774 DBDelegate::EraseStoreCache(tokenId);
775 return E_OK;
776 }
777
OnAppUninstall(const std::string & bundleName,int32_t user,int32_t index)778 int32_t DataShareServiceImpl::OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index)
779 {
780 ZLOGI("AppUninstall user=%{public}d, index=%{public}d, bundleName=%{public}s",
781 user, index, bundleName.c_str());
782 BundleMgrProxy::GetInstance()->Delete(bundleName, user);
783 return E_OK;
784 }
785
OnAppUpdate(const std::string & bundleName,int32_t user,int32_t index)786 int32_t DataShareServiceImpl::OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index)
787 {
788 ZLOGI("AppUpdate user=%{public}d, index=%{public}d, bundleName=%{public}s",
789 user, index, bundleName.c_str());
790 BundleMgrProxy::GetInstance()->Delete(bundleName, user);
791 return E_OK;
792 }
793
NotifyObserver(const std::string & uri)794 void DataShareServiceImpl::NotifyObserver(const std::string &uri)
795 {
796 ZLOGD("%{private}s try notified", uri.c_str());
797 auto context = std::make_shared<Context>(uri);
798 if (!GetCallerBundleName(context->callerBundleName)) {
799 ZLOGE("get bundleName error, %{private}s", uri.c_str());
800 return;
801 }
802 auto ret = rdbNotifyStrategy_.Execute(context);
803 if (ret) {
804 ZLOGI("%{private}s start notified", uri.c_str());
805 RdbSubscriberManager::GetInstance().Emit(uri, context);
806 }
807 }
808
SubscribeTimeChanged()809 bool DataShareServiceImpl::SubscribeTimeChanged()
810 {
811 ZLOGD("start");
812 EventFwk::MatchingSkills matchingSkills;
813 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_TIME_CHANGED);
814 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_TIMEZONE_CHANGED);
815 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
816 subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
817 timerReceiver_ = std::make_shared<TimerReceiver>(subscribeInfo);
818 auto result = EventFwk::CommonEventManager::SubscribeCommonEvent(timerReceiver_);
819 if (!result) {
820 ZLOGE("SubscribeCommonEvent err");
821 }
822 return result;
823 }
824
OnReceiveEvent(const EventFwk::CommonEventData & eventData)825 void DataShareServiceImpl::TimerReceiver::OnReceiveEvent(const EventFwk::CommonEventData &eventData)
826 {
827 AAFwk::Want want = eventData.GetWant();
828 std::string action = want.GetAction();
829 ZLOGI("action:%{public}s.", action.c_str());
830 if (action == EventFwk::CommonEventSupport::COMMON_EVENT_TIME_CHANGED
831 || action == EventFwk::CommonEventSupport::COMMON_EVENT_TIMEZONE_CHANGED) {
832 SchedulerManager::GetInstance().ReExecuteAll();
833 }
834 }
835
TimerReceiver(const EventFwk::CommonEventSubscribeInfo & subscriberInfo)836 DataShareServiceImpl::TimerReceiver::TimerReceiver(const EventFwk::CommonEventSubscribeInfo &subscriberInfo)
837 : CommonEventSubscriber(subscriberInfo)
838 {
839 }
840
RegisterDataShareServiceInfo()841 void DataShareServiceImpl::RegisterDataShareServiceInfo()
842 {
843 DumpManager::Config serviceInfoConfig;
844 serviceInfoConfig.fullCmd = "--feature-info";
845 serviceInfoConfig.abbrCmd = "-f";
846 serviceInfoConfig.dumpName = "FEATURE_INFO";
847 serviceInfoConfig.dumpCaption = { "| Display all the service statistics" };
848 DumpManager::GetInstance().AddConfig("FEATURE_INFO", serviceInfoConfig);
849 }
850
RegisterHandler()851 void DataShareServiceImpl::RegisterHandler()
852 {
853 Handler handler =
854 std::bind(&DataShareServiceImpl::DumpDataShareServiceInfo, this, std::placeholders::_1, std::placeholders::_2);
855 DumpManager::GetInstance().AddHandler("FEATURE_INFO", uintptr_t(this), handler);
856 }
857
DumpDataShareServiceInfo(int fd,std::map<std::string,std::vector<std::string>> & params)858 void DataShareServiceImpl::DumpDataShareServiceInfo(int fd, std::map<std::string, std::vector<std::string>> ¶ms)
859 {
860 (void)params;
861 std::string info;
862 dprintf(fd, "-------------------------------------DataShareServiceInfo------------------------------\n%s\n",
863 info.c_str());
864 }
865
OnInitialize()866 int32_t DataShareServiceImpl::OnInitialize()
867 {
868 RegisterDataShareServiceInfo();
869 RegisterHandler();
870 SetServiceReady();
871 ZLOGI("Init dataShare service end");
872 return 0;
873 }
874
~DataShareServiceImpl()875 DataShareServiceImpl::~DataShareServiceImpl()
876 {
877 DumpManager::GetInstance().RemoveHandler("FEATURE_INFO", uintptr_t(this));
878 }
879
EnableSilentProxy(const std::string & uri,bool enable)880 int32_t DataShareServiceImpl::EnableSilentProxy(const std::string &uri, bool enable)
881 {
882 uint32_t callerTokenId = IPCSkeleton::GetCallingTokenID();
883 bool ret = dataShareSilentConfig_.EnableSilentProxy(callerTokenId, uri, enable);
884 if (!ret) {
885 ZLOGE("Enable silent proxy err, %{public}s", URIUtils::Anonymous(uri).c_str());
886 return ERROR;
887 }
888 return E_OK;
889 }
890
GetSilentProxyStatus(const std::string & uri,bool isCreateHelper)891 int32_t DataShareServiceImpl::GetSilentProxyStatus(const std::string &uri, bool isCreateHelper)
892 {
893 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
894 HiviewDFX::XCOLLIE_FLAG_LOG | HiviewDFX::XCOLLIE_FLAG_RECOVERY);
895 uint32_t callerTokenId = IPCSkeleton::GetCallingTokenID();
896 if (isCreateHelper) {
897 auto errCode = GetBMSAndMetaDataStatus(uri, callerTokenId);
898 if (errCode != E_OK) {
899 ZLOGE("BMS or metaData not ready to complete, token:0x%{public}x, uri:%{public}s",
900 callerTokenId, URIUtils::Anonymous(uri).c_str());
901 return errCode;
902 }
903 }
904 int32_t currentUserId = DistributedKv::AccountDelegate::GetInstance()->GetUserByToken(callerTokenId);
905 UriInfo uriInfo;
906 if (!URIUtils::GetInfoFromURI(uri, uriInfo)) {
907 return E_OK;
908 }
909 std::string calledBundleName = uriInfo.bundleName;
910 uint32_t calledTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(currentUserId, calledBundleName, 0);
911 if (calledTokenId == 0) {
912 calledTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(0, calledBundleName, 0);
913 }
914 auto success = dataShareSilentConfig_.IsSilentProxyEnable(calledTokenId, currentUserId, calledBundleName, uri);
915 if (!success) {
916 ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
917 return E_SILENT_PROXY_DISABLE;
918 }
919 return E_OK;
920 }
921
RegisterObserver(const std::string & uri,const sptr<OHOS::IRemoteObject> & remoteObj)922 int32_t DataShareServiceImpl::RegisterObserver(const std::string &uri,
923 const sptr<OHOS::IRemoteObject> &remoteObj)
924 {
925 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
926 HiviewDFX::XCOLLIE_FLAG_LOG);
927 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
928 DataProviderConfig providerConfig(uri, callerTokenId);
929 auto [errCode, providerInfo] = providerConfig.GetProviderInfo();
930 if (errCode != E_OK) {
931 ZLOGE("ProviderInfo failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s", callerTokenId,
932 errCode, URIUtils::Anonymous(providerInfo.uri).c_str());
933 }
934 if (!providerInfo.allowEmptyPermission && providerInfo.readPermission.empty()) {
935 ZLOGE("reject permission, tokenId:0x%{public}x, uri:%{public}s",
936 callerTokenId, URIUtils::Anonymous(uri).c_str());
937 }
938 if (!providerInfo.readPermission.empty() &&
939 !PermitDelegate::VerifyPermission(providerInfo.readPermission, callerTokenId)) {
940 ZLOGE("Permission denied! token:0x%{public}x, permission:%{public}s, uri:%{public}s",
941 callerTokenId, providerInfo.readPermission.c_str(),
942 URIUtils::Anonymous(providerInfo.uri).c_str());
943 }
944 auto obServer = iface_cast<AAFwk::IDataAbilityObserver>(remoteObj);
945 if (obServer == nullptr) {
946 ZLOGE("ObServer is nullptr, uri: %{public}s", URIUtils::Anonymous(uri).c_str());
947 return ERR_INVALID_VALUE;
948 }
949 auto obsMgrClient = AAFwk::DataObsMgrClient::GetInstance();
950 if (obsMgrClient == nullptr) {
951 return ERROR;
952 }
953 return obsMgrClient->RegisterObserver(Uri(uri), obServer);
954 }
955
UnregisterObserver(const std::string & uri,const sptr<OHOS::IRemoteObject> & remoteObj)956 int32_t DataShareServiceImpl::UnregisterObserver(const std::string &uri,
957 const sptr<OHOS::IRemoteObject> &remoteObj)
958 {
959 XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
960 HiviewDFX::XCOLLIE_FLAG_LOG);
961 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
962 DataProviderConfig providerConfig(uri, callerTokenId);
963 auto [errCode, providerInfo] = providerConfig.GetProviderInfo();
964 if (errCode != E_OK) {
965 ZLOGE("ProviderInfo failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s", callerTokenId,
966 errCode, URIUtils::Anonymous(providerInfo.uri).c_str());
967 }
968 if (!providerInfo.allowEmptyPermission && providerInfo.readPermission.empty()) {
969 ZLOGE("reject permission, tokenId:0x%{public}x, uri:%{public}s",
970 callerTokenId, URIUtils::Anonymous(uri).c_str());
971 }
972 if (!providerInfo.readPermission.empty() &&
973 !PermitDelegate::VerifyPermission(providerInfo.readPermission, callerTokenId)) {
974 ZLOGE("Permission denied! token:0x%{public}x, permission:%{public}s, uri:%{public}s",
975 callerTokenId, providerInfo.readPermission.c_str(),
976 URIUtils::Anonymous(providerInfo.uri).c_str());
977 }
978 auto obsMgrClient = AAFwk::DataObsMgrClient::GetInstance();
979 if (obsMgrClient == nullptr) {
980 return ERROR;
981 }
982 auto obServer = iface_cast<AAFwk::IDataAbilityObserver>(remoteObj);
983 if (obServer == nullptr) {
984 ZLOGE("ObServer is nullptr, uri: %{public}s", URIUtils::Anonymous(uri).c_str());
985 return ERR_INVALID_VALUE;
986 }
987 return obsMgrClient->UnregisterObserver(Uri(uri), obServer);
988 }
989
Execute(const std::string & uri,const std::string & extUri,const int32_t tokenId,bool isRead,ExecuteCallback callback)990 int32_t DataShareServiceImpl::Execute(const std::string &uri, const std::string &extUri, const int32_t tokenId,
991 bool isRead, ExecuteCallback callback)
992 {
993 DataProviderConfig providerConfig(uri, tokenId);
994 auto [errCode, providerInfo] = providerConfig.GetProviderInfo();
995 if (errCode != E_OK) {
996 ZLOGE("Provider failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s", tokenId,
997 errCode, URIUtils::Anonymous(providerInfo.uri).c_str());
998 RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_GET_SUPPLIER,
999 RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::SUPPLIER_ERROR);
1000 return errCode;
1001 }
1002 std::string permission = isRead ? providerInfo.readPermission : providerInfo.writePermission;
1003 if (!permission.empty() && !PermitDelegate::VerifyPermission(permission, tokenId)) {
1004 ZLOGE("Permission denied! token:0x%{public}x, permission:%{public}s, uri:%{public}s",
1005 tokenId, permission.c_str(), URIUtils::Anonymous(providerInfo.uri).c_str());
1006 RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_PERMISSION,
1007 RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::PERMISSION_DENIED_ERROR);
1008 return ERROR_PERMISSION_DENIED;
1009 }
1010 DataShareDbConfig dbConfig;
1011 std::string extensionUri = extUri;
1012 if (extensionUri.empty()) {
1013 extensionUri = providerInfo.extensionUri;
1014 }
1015 DataShareDbConfig::DbConfig config {providerInfo.uri, extensionUri, providerInfo.bundleName,
1016 providerInfo.storeName, providerInfo.backup,
1017 providerInfo.singleton ? 0 : providerInfo.currentUserId, providerInfo.hasExtension};
1018 auto [code, metaData, dbDelegate] = dbConfig.GetDbConfig(config);
1019 if (code != E_OK) {
1020 ZLOGE("Get dbConfig fail,bundleName:%{public}s,tableName:%{public}s,tokenId:0x%{public}x, uri:%{public}s",
1021 providerInfo.bundleName.c_str(), providerInfo.tableName.c_str(), tokenId,
1022 URIUtils::Anonymous(providerInfo.uri).c_str());
1023 return code;
1024 }
1025 return callback(providerInfo, metaData, dbDelegate);
1026 }
1027
ExecuteEx(const std::string & uri,const std::string & extUri,const int32_t tokenId,bool isRead,ExecuteCallbackEx callback)1028 std::pair<int32_t, int32_t> DataShareServiceImpl::ExecuteEx(const std::string &uri, const std::string &extUri,
1029 const int32_t tokenId, bool isRead, ExecuteCallbackEx callback)
1030 {
1031 DataProviderConfig providerConfig(uri, tokenId);
1032 auto [errCode, providerInfo] = providerConfig.GetProviderInfo();
1033 if (errCode != E_OK) {
1034 ZLOGE("Provider failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s", tokenId,
1035 errCode, URIUtils::Anonymous(providerInfo.uri).c_str());
1036 RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_GET_SUPPLIER,
1037 RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::SUPPLIER_ERROR);
1038 return std::make_pair(E_DATA_SUPPLIER_ERROR, 0);
1039 }
1040 std::string permission = isRead ? providerInfo.readPermission : providerInfo.writePermission;
1041 if (!permission.empty() && !PermitDelegate::VerifyPermission(permission, tokenId)) {
1042 ZLOGE("Permission denied! token:0x%{public}x, permission:%{public}s, uri:%{public}s",
1043 tokenId, permission.c_str(), URIUtils::Anonymous(providerInfo.uri).c_str());
1044 RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_PERMISSION,
1045 RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::PERMISSION_DENIED_ERROR);
1046 return std::make_pair(ERROR_PERMISSION_DENIED, 0);
1047 }
1048 DataShareDbConfig dbConfig;
1049 std::string extensionUri = extUri;
1050 if (extensionUri.empty()) {
1051 extensionUri = providerInfo.extensionUri;
1052 }
1053 DataShareDbConfig::DbConfig config {providerInfo.uri, extensionUri, providerInfo.bundleName,
1054 providerInfo.storeName, providerInfo.backup,
1055 providerInfo.singleton ? 0 : providerInfo.currentUserId, providerInfo.hasExtension};
1056 auto [code, metaData, dbDelegate] = dbConfig.GetDbConfig(config);
1057 if (code != E_OK) {
1058 ZLOGE("Get dbConfig fail,bundleName:%{public}s,tableName:%{public}s,tokenId:0x%{public}x, uri:%{public}s",
1059 providerInfo.bundleName.c_str(), providerInfo.tableName.c_str(), tokenId,
1060 URIUtils::Anonymous(providerInfo.uri).c_str());
1061 return std::make_pair(code, 0);
1062 }
1063 return callback(providerInfo, metaData, dbDelegate);
1064 }
1065
GetBMSAndMetaDataStatus(const std::string & uri,const int32_t tokenId)1066 int32_t DataShareServiceImpl::GetBMSAndMetaDataStatus(const std::string &uri, const int32_t tokenId)
1067 {
1068 DataProviderConfig calledConfig(uri, tokenId);
1069 auto [errCode, calledInfo] = calledConfig.GetProviderInfo();
1070 if (errCode == E_URI_NOT_EXIST) {
1071 ZLOGE("Create helper invalid uri, token:0x%{public}x, uri:%{public}s", tokenId,
1072 URIUtils::Anonymous(calledInfo.uri).c_str());
1073 return E_OK;
1074 }
1075 if (errCode != E_OK) {
1076 ZLOGE("CalledInfo failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s", tokenId,
1077 errCode, URIUtils::Anonymous(calledInfo.uri).c_str());
1078 return errCode;
1079 }
1080 DataShareDbConfig dbConfig;
1081 auto [code, metaData] = dbConfig.GetMetaData(calledInfo.uri, calledInfo.bundleName,
1082 calledInfo.storeName, calledInfo.singleton ? 0 : calledInfo.currentUserId, calledInfo.hasExtension);
1083 if (code != E_OK) {
1084 ZLOGE("Get metaData fail,bundleName:%{public}s,tableName:%{public}s,tokenId:0x%{public}x, uri:%{public}s",
1085 calledInfo.bundleName.c_str(), calledInfo.tableName.c_str(), tokenId,
1086 URIUtils::Anonymous(calledInfo.uri).c_str());
1087 return E_METADATA_NOT_EXISTS;
1088 }
1089 return E_OK;
1090 }
1091
InitSubEvent()1092 void DataShareServiceImpl::InitSubEvent()
1093 {
1094 EventFwk::MatchingSkills matchingSkills;
1095 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED);
1096 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
1097 subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1098 auto sysEventSubscriber = std::make_shared<SysEventSubscriber>(subscribeInfo);
1099 if (!EventFwk::CommonEventManager::SubscribeCommonEvent(sysEventSubscriber)) {
1100 ZLOGE("Subscribe sys event failed.");
1101 }
1102 if (BundleMgrProxy::GetInstance()->CheckBMS() != nullptr) {
1103 sysEventSubscriber->OnBMSReady();
1104 }
1105 }
1106 } // namespace OHOS::DataShare
1107