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