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>> &params)
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