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