• 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 "account/account_delegate.h"
24 #include "app_connect_manager.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "concurrent_task_client.h"
28 #include "config_factory.h"
29 #include "data_ability_observer_interface.h"
30 #include "data_share_profile_config.h"
31 #include "dataobs_mgr_client.h"
32 #include "datashare_errno.h"
33 #include "datashare_radar_reporter.h"
34 #include "device_manager_adapter.h"
35 #include "datashare_template.h"
36 #include "directory/directory_manager.h"
37 #include "eventcenter/event_center.h"
38 #include "extension_connect_adaptor.h"
39 #include "dump/dump_manager.h"
40 #include "extension_ability_manager.h"
41 #include "hap_token_info.h"
42 #include "hiview_adapter.h"
43 #include "if_system_ability_manager.h"
44 #include "ipc_skeleton.h"
45 #include "iservice_registry.h"
46 #include "log_print.h"
47 #include "common/utils.h"
48 #include "metadata/auto_launch_meta_data.h"
49 #include "metadata/meta_data_manager.h"
50 #include "matching_skills.h"
51 #include "permit_delegate.h"
52 #include "rdb_helper.h"
53 #include "scheduler_manager.h"
54 #include "subscriber_managers/published_data_subscriber_manager.h"
55 #include "sys_event_subscriber.h"
56 #include "system_ability_definition.h"
57 #include "system_ability_status_change_stub.h"
58 #include "task_executor.h"
59 #include "template_data.h"
60 #include "utils/anonymous.h"
61 #include "xcollie.h"
62 #include "log_debug.h"
63 #include "dataproxy_handle_common.h"
64 #include "proxy_data_manager.h"
65 #include "datashare_observer.h"
66 #include "subscriber_managers/proxy_data_subscriber_manager.h"
67 
68 namespace OHOS::DataShare {
69 using FeatureSystem = DistributedData::FeatureSystem;
70 using DumpManager = OHOS::DistributedData::DumpManager;
71 using ProviderInfo = DataProviderConfig::ProviderInfo;
72 using namespace OHOS::DistributedData;
73 __attribute__((used)) DataShareServiceImpl::Factory DataShareServiceImpl::factory_;
74 // decimal base
75 static constexpr int DECIMAL_BASE = 10;
76 DataShareServiceImpl::BindInfo DataShareServiceImpl::binderInfo_;
77 class DataShareServiceImpl::SystemAbilityStatusChangeListener
78     : public SystemAbilityStatusChangeStub {
79 public:
SystemAbilityStatusChangeListener()80     SystemAbilityStatusChangeListener()
81     {
82     }
83     ~SystemAbilityStatusChangeListener() = default;
84     void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override;
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)85     void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override
86     {
87     }
88 };
89 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)90 void DataShareServiceImpl::SystemAbilityStatusChangeListener::OnAddSystemAbility(
91     int32_t systemAbilityId, const std::string &deviceId)
92 {
93     ZLOGI("saId:%{public}d", systemAbilityId);
94     if (systemAbilityId == COMMON_EVENT_SERVICE_ID) {
95         InitSubEvent();
96     } else if (systemAbilityId == CONCURRENT_TASK_SERVICE_ID) {
97         std::unordered_map<std::string, std::string> payload;
98         // get current thread pid
99         payload["pid"] = std::to_string(getpid());
100         // request qos auth for current pid
101         OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().RequestAuth(payload);
102     }
103     return;
104 }
105 
Factory()106 DataShareServiceImpl::Factory::Factory()
107 {
108     FeatureSystem::GetInstance().RegisterCreator("data_share", []() {
109         return std::make_shared<DataShareServiceImpl>();
110     });
111     staticActs_ = std::make_shared<DataShareStatic>();
112     FeatureSystem::GetInstance().RegisterStaticActs("data_share", staticActs_);
113 }
114 
~Factory()115 DataShareServiceImpl::Factory::~Factory() {}
116 
InsertEx(const std::string & uri,const std::string & extUri,const DataShareValuesBucket & valuesBucket)117 std::pair<int32_t, int32_t> DataShareServiceImpl::InsertEx(const std::string &uri, const std::string &extUri,
118     const DataShareValuesBucket &valuesBucket)
119 {
120     std::string func = __FUNCTION__;
121     XCollie xcollie(func, XCollie::XCOLLIE_LOG | XCollie::XCOLLIE_RECOVERY);
122     if (GetSilentProxyStatus(uri, false) != E_OK) {
123         ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
124         return std::make_pair(ERROR, 0);
125     }
126     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
127     auto callBack = [&uri, &valuesBucket, this, &callingTokenId, &func](ProviderInfo &providerInfo,
128         DistributedData::StoreMetaData &metaData,
129         std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
130         TimeoutReport timeoutReport({providerInfo.bundleName, providerInfo.moduleName, providerInfo.storeName, func,
131             callingTokenId}, true);
132         auto [errCode, ret] = dbDelegate->InsertEx(providerInfo.tableName, valuesBucket);
133         if (errCode == E_OK && ret > 0) {
134             NotifyChange(uri, providerInfo.visitedUserId);
135             RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.visitedUserId, metaData);
136         }
137         if (errCode != E_OK) {
138             ReportExcuteFault(callingTokenId, providerInfo, errCode, func);
139         }
140         timeoutReport.Report();
141         return std::make_pair(errCode, ret);
142     };
143     return ExecuteEx(uri, extUri, IPCSkeleton::GetCallingTokenID(), false, callBack);
144 }
145 
NotifyChange(const std::string & uri,int32_t userId)146 bool DataShareServiceImpl::NotifyChange(const std::string &uri, int32_t userId)
147 {
148     RadarReporter::RadarReport report(RadarReporter::NOTIFY_OBSERVER_DATA_CHANGE,
149         RadarReporter::NOTIFY_DATA_CHANGE, __FUNCTION__);
150     auto obsMgrClient = AAFwk::DataObsMgrClient::GetInstance();
151     if (obsMgrClient == nullptr) {
152         ZLOGE("obsMgrClient is nullptr");
153         report.SetError(RadarReporter::DATA_OBS_EMPTY_ERROR);
154         return false;
155     }
156     ErrCode ret = obsMgrClient->NotifyChange(Uri(uri), userId);
157     if (ret != ERR_OK) {
158         ZLOGE("obsMgrClient->NotifyChange error return %{public}d", ret);
159         report.SetError(RadarReporter::NOTIFY_ERROR);
160         return false;
161     }
162     return true;
163 }
164 
UpdateEx(const std::string & uri,const std::string & extUri,const DataSharePredicates & predicate,const DataShareValuesBucket & valuesBucket)165 std::pair<int32_t, int32_t> DataShareServiceImpl::UpdateEx(const std::string &uri, const std::string &extUri,
166     const DataSharePredicates &predicate, const DataShareValuesBucket &valuesBucket)
167 {
168     std::string func = __FUNCTION__;
169     XCollie xcollie(func, XCollie::XCOLLIE_LOG | XCollie::XCOLLIE_RECOVERY);
170     if (GetSilentProxyStatus(uri, false) != E_OK) {
171         ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
172         return std::make_pair(ERROR, 0);
173     }
174     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
175     auto callBack = [&uri, &predicate, &valuesBucket, this, &callingTokenId, &func](ProviderInfo &providerInfo,
176         DistributedData::StoreMetaData &metaData,
177         std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
178         TimeoutReport timeoutReport({providerInfo.bundleName, providerInfo.moduleName, providerInfo.storeName, func,
179             callingTokenId}, true);
180         auto [errCode, ret] = dbDelegate->UpdateEx(providerInfo.tableName, predicate, valuesBucket);
181         if (errCode == E_OK && ret > 0) {
182             NotifyChange(uri, providerInfo.visitedUserId);
183             RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.visitedUserId, metaData);
184         }
185         if (errCode != E_OK) {
186             ReportExcuteFault(callingTokenId, providerInfo, errCode, func);
187         }
188         timeoutReport.Report();
189         return std::make_pair(errCode, ret);
190     };
191     return ExecuteEx(uri, extUri, callingTokenId, false, callBack);
192 }
193 
DeleteEx(const std::string & uri,const std::string & extUri,const DataSharePredicates & predicate)194 std::pair<int32_t, int32_t> DataShareServiceImpl::DeleteEx(const std::string &uri, const std::string &extUri,
195     const DataSharePredicates &predicate)
196 {
197     std::string func = __FUNCTION__;
198     XCollie xcollie(func, XCollie::XCOLLIE_LOG | XCollie::XCOLLIE_RECOVERY);
199     if (GetSilentProxyStatus(uri, false) != E_OK) {
200         ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
201         return std::make_pair(ERROR, 0);
202     }
203     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
204     auto callBack = [&uri, &predicate, this, &callingTokenId, &func](ProviderInfo &providerInfo,
205         DistributedData::StoreMetaData &metaData,
206         std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
207         TimeoutReport timeoutReport({providerInfo.bundleName, providerInfo.moduleName, providerInfo.storeName, func,
208             callingTokenId}, true);
209         auto [errCode, ret] = dbDelegate->DeleteEx(providerInfo.tableName, predicate);
210         if (errCode == E_OK && ret > 0) {
211             NotifyChange(uri, providerInfo.visitedUserId);
212             RdbSubscriberManager::GetInstance().Emit(uri, providerInfo.visitedUserId, metaData);
213         }
214         if (errCode != E_OK) {
215             ReportExcuteFault(callingTokenId, providerInfo, errCode, func);
216         }
217         timeoutReport.Report();
218         return std::make_pair(errCode, ret);
219     };
220     return ExecuteEx(uri, extUri, callingTokenId, false, callBack);
221 }
222 
Query(const std::string & uri,const std::string & extUri,const DataSharePredicates & predicates,const std::vector<std::string> & columns,int & errCode)223 std::shared_ptr<DataShareResultSet> DataShareServiceImpl::Query(const std::string &uri, const std::string &extUri,
224     const DataSharePredicates &predicates, const std::vector<std::string> &columns, int &errCode)
225 {
226     std::string func = __FUNCTION__;
227     XCollie xcollie(std::string(LOG_TAG) + "::" + func,
228                     XCollie::XCOLLIE_LOG | XCollie::XCOLLIE_RECOVERY);
229     if (GetSilentProxyStatus(uri, false) != E_OK) {
230         ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
231         return nullptr;
232     }
233     std::shared_ptr<DataShareResultSet> resultSet;
234     auto callingPid = IPCSkeleton::GetCallingPid();
235     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
236     auto callBack = [&uri, &predicates, &columns, &resultSet, &callingPid, &callingTokenId, &func, this]
237         (ProviderInfo &providerInfo, DistributedData::StoreMetaData &,
238         std::shared_ptr<DBDelegate> dbDelegate) -> std::pair<int32_t, int32_t> {
239         TimeoutReport timeoutReport({providerInfo.bundleName, providerInfo.moduleName, providerInfo.storeName, func,
240             callingTokenId}, true);
241         auto [err, result] = dbDelegate->Query(providerInfo.tableName,
242             predicates, columns, callingPid, callingTokenId);
243         if (err != E_OK) {
244             ReportExcuteFault(callingTokenId, providerInfo, err, func);
245         }
246         resultSet = std::move(result);
247         timeoutReport.Report();
248         return std::make_pair(err, E_OK);
249     };
250     auto [errVal, status] = ExecuteEx(uri, extUri, callingTokenId, true, callBack);
251     errCode = errVal;
252     return resultSet;
253 }
254 
AddTemplate(const std::string & uri,const int64_t subscriberId,const Template & tplt)255 int32_t DataShareServiceImpl::AddTemplate(const std::string &uri, const int64_t subscriberId, const Template &tplt)
256 {
257     auto context = std::make_shared<Context>(uri);
258     TemplateId tpltId;
259     tpltId.subscriberId_ = subscriberId;
260     if (!GetCallerBundleName(tpltId.bundleName_)) {
261         ZLOGE("get bundleName error, %{public}s", URIUtils::Anonymous(uri).c_str());
262         return ERROR;
263     }
264     ZLOGI("Add template, uri %{private}s, subscriberId %{public}" PRIi64 ", bundleName %{public}s,"
265           "predicates size %{public}zu.",
266         uri.c_str(), subscriberId, tpltId.bundleName_.c_str(), tplt.predicates_.size());
267     return templateStrategy_.Execute(context, [&uri, &tpltId, &tplt, &context]() -> int32_t {
268         auto result = TemplateManager::GetInstance().Add(
269             Key(uri, tpltId.subscriberId_, tpltId.bundleName_), context->visitedUserId, tplt);
270         RdbSubscriberManager::GetInstance().Emit(context->uri, tpltId.subscriberId_, tpltId.bundleName_, context);
271         return result;
272     });
273 }
274 
DelTemplate(const std::string & uri,const int64_t subscriberId)275 int32_t DataShareServiceImpl::DelTemplate(const std::string &uri, const int64_t subscriberId)
276 {
277     auto context = std::make_shared<Context>(uri);
278     TemplateId tpltId;
279     tpltId.subscriberId_ = subscriberId;
280     if (!GetCallerBundleName(tpltId.bundleName_)) {
281         ZLOGE("get bundleName error, %{public}s", URIUtils::Anonymous(uri).c_str());
282         return ERROR;
283     }
284     ZLOGI("Delete template, uri %{private}s, subscriberId %{public}" PRIi64 ", bundleName %{public}s.",
285         URIUtils::Anonymous(uri).c_str(), subscriberId, tpltId.bundleName_.c_str());
286     return templateStrategy_.Execute(context, [&uri, &tpltId, &context]() -> int32_t {
287         return TemplateManager::GetInstance().Delete(
288             Key(uri, tpltId.subscriberId_, tpltId.bundleName_), context->visitedUserId);
289     });
290 }
291 
GetCallerBundleName(std::string & bundleName)292 bool DataShareServiceImpl::GetCallerBundleName(std::string &bundleName)
293 {
294     auto tokenId = IPCSkeleton::GetCallingTokenID();
295     auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
296     if (type == Security::AccessToken::TOKEN_NATIVE) {
297         return true;
298     }
299     if (type != Security::AccessToken::TOKEN_HAP) {
300         return false;
301     }
302     Security::AccessToken::HapTokenInfo tokenInfo;
303     auto result = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
304     if (result != Security::AccessToken::RET_SUCCESS) {
305         ZLOGE("token:0x%{public}x, result:%{public}d", tokenId, result);
306         return false;
307     }
308     bundleName = tokenInfo.bundleName;
309     return true;
310 }
311 
GetCallerInfo(std::string & bundleName,int32_t & appIndex)312 std::pair<bool, Security::AccessToken::ATokenTypeEnum> DataShareServiceImpl::GetCallerInfo(
313     std::string &bundleName, int32_t &appIndex)
314 {
315     auto tokenId = IPCSkeleton::GetCallingTokenID();
316     auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
317     if (type == Security::AccessToken::TOKEN_NATIVE) {
318         return std::make_pair(true, type);
319     }
320     if (type != Security::AccessToken::TOKEN_HAP) {
321         return std::make_pair(false, type);
322     }
323     Security::AccessToken::HapTokenInfo tokenInfo;
324     auto result = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
325     if (result != Security::AccessToken::RET_SUCCESS) {
326         ZLOGE("token:0x%{public}x, result:%{public}d", tokenId, result);
327         return std::make_pair(false, type);
328     }
329     bundleName = tokenInfo.bundleName;
330     appIndex = tokenInfo.instIndex;
331     return std::make_pair(true, type);
332 }
333 
Publish(const Data & data,const std::string & bundleNameOfProvider)334 std::vector<OperationResult> DataShareServiceImpl::Publish(const Data &data, const std::string &bundleNameOfProvider)
335 {
336     std::vector<OperationResult> results;
337     std::vector<PublishedDataKey> publishedData;
338     std::string callerBundleName;
339     if (!GetCallerBundleName(callerBundleName)) {
340         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
341         return results;
342     }
343     int32_t userId = -1;
344     PublishedData::ClearAging();
345     for (const auto &item : data.datas_) {
346         auto context = std::make_shared<Context>(item.key_);
347         context->version = data.version_;
348         context->callerBundleName = callerBundleName;
349         context->calledBundleName = bundleNameOfProvider;
350         int32_t result = publishStrategy_.Execute(context, item);
351         results.emplace_back(item.key_, result);
352         if (result != E_OK) {
353             ZLOGE("publish error, key is %{public}s", URIUtils::Anonymous(item.key_).c_str());
354             continue;
355         }
356         publishedData.emplace_back(context->uri, context->calledBundleName, item.subscriberId_);
357         userId = context->visitedUserId;
358     }
359     if (!publishedData.empty()) {
360         PublishedDataSubscriberManager::GetInstance().Emit(publishedData, userId, callerBundleName);
361         PublishedDataSubscriberManager::GetInstance().SetObserversNotifiedOnEnabled(publishedData);
362     }
363     return results;
364 }
365 
GetData(const std::string & bundleNameOfProvider,int & errorCode)366 Data DataShareServiceImpl::GetData(const std::string &bundleNameOfProvider, int &errorCode)
367 {
368     std::string callerBundleName;
369     if (!GetCallerBundleName(callerBundleName)) {
370         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
371         return Data();
372     }
373     auto context = std::make_shared<Context>();
374     context->callerBundleName = callerBundleName;
375     context->calledBundleName = bundleNameOfProvider;
376     return getDataStrategy_.Execute(context, errorCode);
377 }
378 
SubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & id,const sptr<IDataProxyRdbObserver> observer)379 std::vector<OperationResult> DataShareServiceImpl::SubscribeRdbData(
380     const std::vector<std::string> &uris, const TemplateId &id, const sptr<IDataProxyRdbObserver> observer)
381 {
382     std::vector<OperationResult> results;
383     for (const auto &uri : uris) {
384         auto context = std::make_shared<Context>(uri);
385         results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &observer, &context, this]() {
386             return RdbSubscriberManager::GetInstance().Add(
387                 Key(context->uri, id.subscriberId_, id.bundleName_),
388                 observer, context, binderInfo_.executors);
389         }));
390     }
391     return results;
392 }
393 
UnsubscribeRdbData(const std::vector<std::string> & uris,const TemplateId & id)394 std::vector<OperationResult> DataShareServiceImpl::UnsubscribeRdbData(
395     const std::vector<std::string> &uris, const TemplateId &id)
396 {
397     std::vector<OperationResult> results;
398     for (const auto &uri : uris) {
399         auto context = std::make_shared<Context>(uri);
400         results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &context]() {
401             return RdbSubscriberManager::GetInstance().Delete(
402                 Key(context->uri, id.subscriberId_, id.bundleName_), context->callerTokenId);
403         }));
404     }
405     return results;
406 }
407 
EnableRdbSubs(const std::vector<std::string> & uris,const TemplateId & id)408 std::vector<OperationResult> DataShareServiceImpl::EnableRdbSubs(
409     const std::vector<std::string> &uris, const TemplateId &id)
410 {
411     std::vector<OperationResult> results;
412     for (const auto &uri : uris) {
413         auto context = std::make_shared<Context>(uri);
414         results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &context]() {
415             return RdbSubscriberManager::GetInstance().Enable(
416                 Key(context->uri, id.subscriberId_, id.bundleName_), context);
417         }));
418     }
419     return results;
420 }
421 
DisableRdbSubs(const std::vector<std::string> & uris,const TemplateId & id)422 std::vector<OperationResult> DataShareServiceImpl::DisableRdbSubs(
423     const std::vector<std::string> &uris, const TemplateId &id)
424 {
425     std::vector<OperationResult> results;
426     for (const auto &uri : uris) {
427         auto context = std::make_shared<Context>(uri);
428         results.emplace_back(uri, subscribeStrategy_.Execute(context, [&id, &context]() {
429             return RdbSubscriberManager::GetInstance().Disable(
430                 Key(context->uri, id.subscriberId_, id.bundleName_), context->callerTokenId);
431         }));
432     }
433     return results;
434 }
435 
SubscribePublishedData(const std::vector<std::string> & uris,const int64_t subscriberId,const sptr<IDataProxyPublishedDataObserver> observer)436 std::vector<OperationResult> DataShareServiceImpl::SubscribePublishedData(const std::vector<std::string> &uris,
437     const int64_t subscriberId, const sptr<IDataProxyPublishedDataObserver> observer)
438 {
439     std::vector<OperationResult> results;
440     std::string callerBundleName;
441     if (!GetCallerBundleName(callerBundleName)) {
442         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
443         return results;
444     }
445     std::vector<PublishedDataKey> publishedKeys;
446     int32_t result;
447     int32_t userId;
448     for (const auto &uri : uris) {
449         auto context = std::make_shared<Context>(uri);
450         PublishedDataKey key(uri, callerBundleName, subscriberId);
451         context->callerBundleName = callerBundleName;
452         context->calledBundleName = key.bundleName;
453         result = subscribeStrategy_.Execute(context, [&subscriberId, &observer, &context]() {
454             return PublishedDataSubscriberManager::GetInstance().Add(
455                 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), observer,
456                 context->callerTokenId, context->visitedUserId);
457         });
458         results.emplace_back(uri, result);
459         if (result == E_OK) {
460             publishedKeys.emplace_back(context->uri, context->callerBundleName, subscriberId);
461             if (binderInfo_.executors != nullptr) {
462                 binderInfo_.executors->Execute([context, subscriberId]() {
463                     PublishedData::UpdateTimestamp(
464                         context->uri, context->calledBundleName, subscriberId, context->visitedUserId);
465                 });
466             }
467             userId = context->visitedUserId;
468         }
469     }
470     if (!publishedKeys.empty()) {
471         PublishedDataSubscriberManager::GetInstance().Emit(publishedKeys, userId, callerBundleName, observer);
472     }
473     return results;
474 }
475 
UnsubscribePublishedData(const std::vector<std::string> & uris,const int64_t subscriberId)476 std::vector<OperationResult> DataShareServiceImpl::UnsubscribePublishedData(const std::vector<std::string> &uris,
477     const int64_t subscriberId)
478 {
479     std::vector<OperationResult> results;
480     std::string callerBundleName;
481     if (!GetCallerBundleName(callerBundleName)) {
482         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
483         return results;
484     }
485     for (const auto &uri : uris) {
486         auto context = std::make_shared<Context>(uri);
487         PublishedDataKey key(uri, callerBundleName, subscriberId);
488         context->callerBundleName = callerBundleName;
489         context->calledBundleName = key.bundleName;
490         results.emplace_back(uri, subscribeStrategy_.Execute(context, [&subscriberId, &context, this]() {
491             auto result = PublishedDataSubscriberManager::GetInstance().Delete(
492                 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), context->callerTokenId);
493             if (result == E_OK && binderInfo_.executors != nullptr) {
494                 binderInfo_.executors->Execute([context, subscriberId]() {
495                     PublishedData::UpdateTimestamp(
496                         context->uri, context->calledBundleName, subscriberId, context->visitedUserId);
497                 });
498             }
499             return result;
500         }));
501     }
502     return results;
503 }
504 
EnablePubSubs(const std::vector<std::string> & uris,const int64_t subscriberId)505 std::vector<OperationResult> DataShareServiceImpl::EnablePubSubs(const std::vector<std::string> &uris,
506     const int64_t subscriberId)
507 {
508     std::vector<OperationResult> results;
509     std::string callerBundleName;
510     if (!GetCallerBundleName(callerBundleName)) {
511         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
512         return results;
513     }
514     std::vector<PublishedDataKey> publishedKeys;
515     int32_t result;
516     int32_t userId = -1;
517     for (const auto &uri : uris) {
518         auto context = std::make_shared<Context>(uri);
519         PublishedDataKey key(uri, callerBundleName, subscriberId);
520         context->callerBundleName = callerBundleName;
521         context->calledBundleName = key.bundleName;
522         result = subscribeStrategy_.Execute(context, [&subscriberId, &context]() {
523             return PublishedDataSubscriberManager::GetInstance().Enable(
524                 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), context->callerTokenId);
525         });
526         if (result == E_OK && binderInfo_.executors != nullptr) {
527             binderInfo_.executors->Execute([context, subscriberId]() {
528                 PublishedData::UpdateTimestamp(
529                     context->uri, context->calledBundleName, subscriberId, context->visitedUserId);
530             });
531         }
532         results.emplace_back(uri, result);
533         if (result == E_OK) {
534             PublishedDataKey pKey(context->uri, context->callerBundleName, subscriberId);
535             if (PublishedDataSubscriberManager::GetInstance().IsNotifyOnEnabled(pKey, context->callerTokenId)) {
536                 publishedKeys.emplace_back(pKey);
537             }
538             userId = context->visitedUserId;
539         }
540     }
541     if (!publishedKeys.empty()) {
542         PublishedDataSubscriberManager::GetInstance().Emit(publishedKeys, userId, callerBundleName);
543     }
544     return results;
545 }
546 
DisablePubSubs(const std::vector<std::string> & uris,const int64_t subscriberId)547 std::vector<OperationResult> DataShareServiceImpl::DisablePubSubs(const std::vector<std::string> &uris,
548     const int64_t subscriberId)
549 {
550     std::vector<OperationResult> results;
551     std::string callerBundleName;
552     if (!GetCallerBundleName(callerBundleName)) {
553         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
554         return results;
555     }
556     for (const auto &uri : uris) {
557         auto context = std::make_shared<Context>(uri);
558         PublishedDataKey key(uri, callerBundleName, subscriberId);
559         context->callerBundleName = callerBundleName;
560         context->calledBundleName = key.bundleName;
561         results.emplace_back(uri, subscribeStrategy_.Execute(context, [&subscriberId, &context, this]() {
562             auto result =  PublishedDataSubscriberManager::GetInstance().Disable(
563                 PublishedDataKey(context->uri, context->callerBundleName, subscriberId), context->callerTokenId);
564             if (result == E_OK && binderInfo_.executors != nullptr) {
565                 binderInfo_.executors->Execute([context, subscriberId]() {
566                     PublishedData::UpdateTimestamp(
567                         context->uri, context->calledBundleName, subscriberId, context->visitedUserId);
568                 });
569             }
570             return result;
571         }));
572     }
573     return results;
574 }
575 
576 enum DataShareKvStoreType : int32_t {
577     DATA_SHARE_SINGLE_VERSION = 0,
578     DISTRIBUTED_TYPE_BUTT
579 };
580 
OnBind(const BindInfo & binderInfo)581 int32_t DataShareServiceImpl::OnBind(const BindInfo &binderInfo)
582 {
583     binderInfo_ = binderInfo;
584     const std::string accountId = AccountDelegate::GetInstance()->GetCurrentAccountId();
585     const auto userId = AccountDelegate::GetInstance()->GetUserByToken(binderInfo.selfTokenId);
586     DistributedData::StoreMetaData saveMeta;
587     saveMeta.appType = "default";
588     saveMeta.storeId = "data_share_data_";
589     saveMeta.isAutoSync = false;
590     saveMeta.isBackup = false;
591     saveMeta.isEncrypt = false;
592     saveMeta.bundleName =  binderInfo.selfName;
593     saveMeta.appId = binderInfo.selfName;
594     saveMeta.user = std::to_string(userId);
595     saveMeta.account = accountId;
596     saveMeta.tokenId = binderInfo.selfTokenId;
597     saveMeta.securityLevel = DistributedKv::SecurityLevel::S1;
598     saveMeta.area = DistributedKv::Area::EL1;
599     saveMeta.uid = IPCSkeleton::GetCallingUid();
600     saveMeta.storeType = DATA_SHARE_SINGLE_VERSION;
601     saveMeta.dataDir = DistributedData::DirectoryManager::GetInstance().GetStorePath(saveMeta);
602     KvDBDelegate::GetInstance(saveMeta.dataDir, binderInfo.executors);
603     SchedulerManager::GetInstance().SetExecutorPool(binderInfo.executors);
604     NativeRdb::TaskExecutor::GetInstance().SetExecutor(binderInfo.executors);
605     ExtensionAbilityManager::GetInstance().SetExecutorPool(binderInfo.executors);
606     DBDelegate::SetExecutorPool(binderInfo.executors);
607     HiViewAdapter::GetInstance().SetThreadPool(binderInfo.executors);
608     SubscribeCommonEvent();
609     SubscribeConcurrentTask();
610     SubscribeTimeChanged();
611     SubscribeChange();
612     ZLOGI("end");
613     return E_OK;
614 }
615 
SubscribeCommonEvent()616 void DataShareServiceImpl::SubscribeCommonEvent()
617 {
618     sptr<ISystemAbilityManager> systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
619     if (systemManager == nullptr) {
620         ZLOGE("System mgr is nullptr");
621         return;
622     }
623     sptr<SystemAbilityStatusChangeListener> callback(new (std::nothrow)SystemAbilityStatusChangeListener());
624     if (callback == nullptr) {
625         ZLOGE("new SystemAbilityStatusChangeListener failed! no memory");
626         return;
627     }
628     systemManager->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, callback);
629 }
630 
SubscribeConcurrentTask()631 void DataShareServiceImpl::SubscribeConcurrentTask()
632 {
633     sptr<ISystemAbilityManager> systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
634     if (systemManager == nullptr) {
635         ZLOGE("System mgr is nullptr");
636         return;
637     }
638     sptr<SystemAbilityStatusChangeListener> callback(new (std::nothrow)SystemAbilityStatusChangeListener());
639     if (callback == nullptr) {
640         ZLOGE("new SystemAbilityStatusChangeListener failed! no memory");
641         return;
642     }
643     systemManager->SubscribeSystemAbility(CONCURRENT_TASK_SERVICE_ID, callback);
644 }
645 
SubscribeChange()646 void DataShareServiceImpl::SubscribeChange()
647 {
648     EventCenter::GetInstance().Subscribe(RemoteChangeEvent::RDB_META_SAVE, [this](const Event &event) {
649         auto &evt = static_cast<const RemoteChangeEvent &>(event);
650         auto dataInfo = evt.GetDataInfo();
651         SaveLaunchInfo(dataInfo.bundleName, dataInfo.userId, dataInfo.deviceId);
652     });
653     EventCenter::GetInstance().Subscribe(RemoteChangeEvent::DATA_CHANGE, [this](const Event &event) {
654         AutoLaunch(event);
655     });
656 }
657 
SaveLaunchInfo(const std::string & bundleName,const std::string & userId,const std::string & deviceId)658 void DataShareServiceImpl::SaveLaunchInfo(const std::string &bundleName, const std::string &userId,
659     const std::string &deviceId)
660 {
661     std::map<std::string, ProfileInfo> profileInfos;
662     char *endptr = nullptr;
663     errno = 0;
664     long userIdLong = strtol(userId.c_str(), &endptr, DECIMAL_BASE);
665     if (endptr == nullptr || endptr == userId.c_str() || *endptr != '\0') {
666         ZLOGE("UserId:%{public}s is invalid", userId.c_str());
667         return;
668     }
669     if (errno == ERANGE || userIdLong >= INT32_MAX || userIdLong <= INT32_MIN) {
670         ZLOGE("UserId:%{public}s is out of range", userId.c_str());
671         return;
672     }
673     int32_t currentUserId = static_cast<int32_t>(userIdLong);
674     if (!DataShareProfileConfig::GetProfileInfo(bundleName, currentUserId, profileInfos)) {
675         ZLOGE("Get profileInfo failed.");
676         return;
677     }
678     if (profileInfos.empty()) {
679         return;
680     }
681     for (auto &[uri, value] : profileInfos) {
682         if (uri.find(EXT_URI_SCHEMA) == std::string::npos) {
683             continue;
684         }
685         std::string extUri = uri;
686         extUri.insert(strlen(EXT_URI_SCHEMA), "/");
687         StoreMetaData meta = MakeMetaData(bundleName, userId, deviceId);
688         if (value.launchInfos.empty()) {
689             meta.storeId = "";
690             AutoLaunchMetaData autoLaunchMetaData = {};
691             std::vector<std::string> tempData = {};
692             autoLaunchMetaData.datas.emplace(extUri, tempData);
693             autoLaunchMetaData.launchForCleanData = value.launchForCleanData;
694             MetaDataManager::GetInstance().SaveMeta(meta.GetAutoLaunchKey(), autoLaunchMetaData, true);
695             ZLOGI("Without launchInfos, save meta end, bundleName = %{public}s.", bundleName.c_str());
696             continue;
697         }
698         for (const auto &launchInfo : value.launchInfos) {
699             AutoLaunchMetaData autoLaunchMetaData = {};
700             autoLaunchMetaData.datas.emplace(extUri, launchInfo.tableNames);
701             autoLaunchMetaData.launchForCleanData = value.launchForCleanData;
702             meta.storeId = launchInfo.storeId;
703             MetaDataManager::GetInstance().SaveMeta(meta.GetAutoLaunchKey(), autoLaunchMetaData, true);
704         }
705     }
706 }
707 
AllowCleanDataLaunchApp(const Event & event,bool launchForCleanData)708 bool DataShareServiceImpl::AllowCleanDataLaunchApp(const Event &event, bool launchForCleanData)
709 {
710     auto &evt = static_cast<const RemoteChangeEvent &>(event);
711     auto dataInfo = evt.GetDataInfo();
712     // 1 means CLOUD_DATA_CLEAN
713     if (dataInfo.changeType == 1) {
714         return launchForCleanData; // Applications can be started by default
715     }
716     return true;
717 }
718 
AutoLaunch(const Event & event)719 void DataShareServiceImpl::AutoLaunch(const Event &event)
720 {
721     auto &evt = static_cast<const RemoteChangeEvent &>(event);
722     auto dataInfo = evt.GetDataInfo();
723     StoreMetaData meta = MakeMetaData(dataInfo.bundleName, dataInfo.userId, dataInfo.deviceId, dataInfo.storeId);
724     AutoLaunchMetaData autoLaunchMetaData;
725     if (!MetaDataManager::GetInstance().LoadMeta(std::move(meta.GetAutoLaunchKey()), autoLaunchMetaData, true)) {
726         meta.storeId = "";
727         if (!MetaDataManager::GetInstance().LoadMeta(std::move(meta.GetAutoLaunchKey()), autoLaunchMetaData, true)) {
728             ZLOGE("No launch meta without storeId, bundleName = %{public}s.", dataInfo.bundleName.c_str());
729             return;
730         }
731     }
732     if (autoLaunchMetaData.datas.empty() || !AllowCleanDataLaunchApp(event, autoLaunchMetaData.launchForCleanData)) {
733         return;
734     }
735     for (const auto &[uri, metaTables] : autoLaunchMetaData.datas) {
736         if (dataInfo.tables.empty() && dataInfo.changeType == 1) {
737             ZLOGI("Start to connect extension, bundlename = %{public}s.", dataInfo.bundleName.c_str());
738             AAFwk::WantParams wantParams;
739             ExtensionConnectAdaptor::TryAndWait(uri, dataInfo.bundleName, wantParams);
740             return;
741         }
742         for (const auto &table : dataInfo.tables) {
743             if (std::find(metaTables.begin(), metaTables.end(), table) != metaTables.end()) {
744                 ZLOGI("Find table, start to connect extension, bundlename = %{public}s.", dataInfo.bundleName.c_str());
745                 AAFwk::WantParams wantParams;
746                 ExtensionConnectAdaptor::TryAndWait(uri, dataInfo.bundleName, wantParams);
747                 break;
748             }
749         }
750     }
751 }
752 
MakeMetaData(const std::string & bundleName,const std::string & userId,const std::string & deviceId,const std::string storeId)753 StoreMetaData DataShareServiceImpl::MakeMetaData(const std::string &bundleName, const std::string &userId,
754     const std::string &deviceId, const std::string storeId)
755 {
756     StoreMetaData meta;
757     meta.user = userId;
758     meta.storeId = storeId;
759     meta.deviceId = deviceId;
760     meta.bundleName = bundleName;
761     return meta;
762 }
763 
OnConnectDone()764 void DataShareServiceImpl::OnConnectDone()
765 {
766     std::string callerBundleName;
767     if (!GetCallerBundleName(callerBundleName)) {
768         ZLOGE("get bundleName error, %{public}s", callerBundleName.c_str());
769         return;
770     }
771     AppConnectManager::Notify(callerBundleName);
772 }
773 
OnAppUninstall(const std::string & bundleName,int32_t user,int32_t index)774 int32_t DataShareServiceImpl::DataShareStatic::OnAppUninstall(const std::string &bundleName, int32_t user,
775     int32_t index)
776 {
777     ZLOGI("%{public}s uninstalled", bundleName.c_str());
778     PublishedData::Delete(bundleName, user);
779     PublishedData::ClearAging();
780     TemplateData::Delete(bundleName, user);
781     NativeRdb::RdbHelper::ClearCache();
782     BundleMgrProxy::GetInstance()->Delete(bundleName, user, index);
783     uint32_t tokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(user, bundleName, index);
784     DBDelegate::EraseStoreCache(tokenId);
785     return E_OK;
786 }
787 
OnAppExit(pid_t uid,pid_t pid,uint32_t tokenId,const std::string & bundleName)788 int32_t DataShareServiceImpl::OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &bundleName)
789 {
790     ZLOGI("AppExit uid=%{public}d, pid=%{public}d, tokenId=0x%{public}x, bundleName=%{public}s",
791         uid, pid, tokenId, bundleName.c_str());
792     RdbSubscriberManager::GetInstance().Delete(tokenId, pid);
793     PublishedDataSubscriberManager::GetInstance().Delete(tokenId, pid);
794     return E_OK;
795 }
796 
OnAppUpdate(const std::string & bundleName,int32_t user,int32_t index)797 int32_t DataShareServiceImpl::DataShareStatic::OnAppUpdate(const std::string &bundleName, int32_t user,
798     int32_t index)
799 {
800     ZLOGI("%{public}s updated", bundleName.c_str());
801     BundleMgrProxy::GetInstance()->Delete(bundleName, user, index);
802     std::string prefix = StoreMetaData::GetPrefix(
803         { DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid, std::to_string(user), "default", bundleName });
804     std::vector<StoreMetaData> storeMetaData;
805     MetaDataManager::GetInstance().LoadMeta(prefix, storeMetaData, true);
806     for (auto &meta : storeMetaData) {
807         MetaDataManager::GetInstance().DelMeta(meta.GetAutoLaunchKey(), true);
808     }
809     SaveLaunchInfo(bundleName, std::to_string(user), DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid);
810     return E_OK;
811 }
812 
UpdateLaunchInfo()813 void DataShareServiceImpl::UpdateLaunchInfo()
814 {
815     DataShareConfig *config = ConfigFactory::GetInstance().GetDataShareConfig();
816     if (config == nullptr) {
817         ZLOGE("DataShareConfig is nullptr");
818         return;
819     }
820 
821     ZLOGI("UpdateLaunchInfo begin.");
822     for (auto &bundleName : config->updateLaunchNames) {
823         std::string prefix = StoreMetaData::GetPrefix(
824             { DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid });
825         std::vector<StoreMetaData> storeMetaData;
826         MetaDataManager::GetInstance().LoadMeta(prefix, storeMetaData, true);
827         std::vector<StoreMetaData> updateMetaData;
828         for (auto &meta : storeMetaData) {
829             if (meta.bundleName != bundleName) {
830                 continue;
831             }
832             updateMetaData.push_back(meta);
833         }
834         for (auto &meta : updateMetaData) {
835             MetaDataManager::GetInstance().DelMeta(meta.GetAutoLaunchKey(), true);
836         }
837         for (auto &meta : updateMetaData) {
838             BundleMgrProxy::GetInstance()->Delete(bundleName, atoi(meta.user.c_str()), 0);
839             SaveLaunchInfo(meta.bundleName, meta.user, DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid);
840         }
841         ZLOGI("update bundleName %{public}s, size:%{public}zu.", bundleName.c_str(), storeMetaData.size());
842     }
843 }
844 
OnClearAppStorage(const std::string & bundleName,int32_t user,int32_t index,int32_t tokenId)845 int32_t DataShareServiceImpl::DataShareStatic::OnClearAppStorage(const std::string &bundleName,
846     int32_t user, int32_t index, int32_t tokenId)
847 {
848     ZLOGI("ClearAppStorage user=%{public}d, index=%{public}d, token:0x%{public}x, bundleName=%{public}s",
849         user, index, tokenId, bundleName.c_str());
850     DBDelegate::EraseStoreCache(tokenId);
851     return E_OK;
852 }
853 
OnAppUninstall(const std::string & bundleName,int32_t user,int32_t index)854 int32_t DataShareServiceImpl::OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index)
855 {
856     ZLOGI("AppUninstall user=%{public}d, index=%{public}d, bundleName=%{public}s",
857         user, index, bundleName.c_str());
858     BundleMgrProxy::GetInstance()->Delete(bundleName, user, index);
859     return E_OK;
860 }
861 
OnAppUpdate(const std::string & bundleName,int32_t user,int32_t index)862 int32_t DataShareServiceImpl::OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index)
863 {
864     ZLOGI("AppUpdate user=%{public}d, index=%{public}d, bundleName=%{public}s",
865         user, index, bundleName.c_str());
866     BundleMgrProxy::GetInstance()->Delete(bundleName, user, index);
867     return E_OK;
868 }
869 
NotifyObserver(const std::string & uri)870 void DataShareServiceImpl::NotifyObserver(const std::string &uri)
871 {
872     auto anonymous = URIUtils::Anonymous(uri);
873     ZLOGD_MACRO("%{private}s try notified", anonymous.c_str());
874     auto context = std::make_shared<Context>(uri);
875     if (!GetCallerBundleName(context->callerBundleName)) {
876         ZLOGE("get bundleName error, %{private}s", anonymous.c_str());
877         return;
878     }
879     auto ret = rdbNotifyStrategy_.Execute(context);
880     if (ret) {
881         ZLOGI("%{private}s start notified", anonymous.c_str());
882         RdbSubscriberManager::GetInstance().Emit(uri, context);
883     }
884 }
885 
SubscribeTimeChanged()886 bool DataShareServiceImpl::SubscribeTimeChanged()
887 {
888     ZLOGD_MACRO("start");
889     EventFwk::MatchingSkills matchingSkills;
890     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_TIME_CHANGED);
891     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_TIMEZONE_CHANGED);
892     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
893     subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
894     timerReceiver_ = std::make_shared<TimerReceiver>(subscribeInfo);
895     auto result = EventFwk::CommonEventManager::SubscribeCommonEvent(timerReceiver_);
896     if (!result) {
897         ZLOGE("SubscribeCommonEvent err");
898     }
899     return result;
900 }
901 
OnReceiveEvent(const EventFwk::CommonEventData & eventData)902 void DataShareServiceImpl::TimerReceiver::OnReceiveEvent(const EventFwk::CommonEventData &eventData)
903 {
904     AAFwk::Want want = eventData.GetWant();
905     std::string action = want.GetAction();
906     ZLOGI("action:%{public}s.", action.c_str());
907     if (action == EventFwk::CommonEventSupport::COMMON_EVENT_TIME_CHANGED
908         || action == EventFwk::CommonEventSupport::COMMON_EVENT_TIMEZONE_CHANGED) {
909         SchedulerManager::GetInstance().ReExecuteAll();
910     }
911 }
912 
TimerReceiver(const EventFwk::CommonEventSubscribeInfo & subscriberInfo)913 DataShareServiceImpl::TimerReceiver::TimerReceiver(const EventFwk::CommonEventSubscribeInfo &subscriberInfo)
914     : CommonEventSubscriber(subscriberInfo)
915 {
916 }
917 
RegisterDataShareServiceInfo()918 void DataShareServiceImpl::RegisterDataShareServiceInfo()
919 {
920     DumpManager::Config serviceInfoConfig;
921     serviceInfoConfig.fullCmd = "--feature-info";
922     serviceInfoConfig.abbrCmd = "-f";
923     serviceInfoConfig.dumpName = "FEATURE_INFO";
924     serviceInfoConfig.dumpCaption = { "| Display all the service statistics" };
925     DumpManager::GetInstance().AddConfig("FEATURE_INFO", serviceInfoConfig);
926 }
927 
RegisterHandler()928 void DataShareServiceImpl::RegisterHandler()
929 {
930     Handler handler = [] (int fd, std::map<std::string, std::vector<std::string>> &params) {
931         DumpDataShareServiceInfo(fd, params);
932     };
933     DumpManager::GetInstance().AddHandler("FEATURE_INFO", uintptr_t(this), handler);
934 }
935 
DumpDataShareServiceInfo(int fd,std::map<std::string,std::vector<std::string>> & params)936 void DataShareServiceImpl::DumpDataShareServiceInfo(int fd, std::map<std::string, std::vector<std::string>> &params)
937 {
938     (void)params;
939     std::string info;
940     dprintf(fd, "-------------------------------------DataShareServiceInfo------------------------------\n%s\n",
941         info.c_str());
942 }
943 
OnInitialize()944 int32_t DataShareServiceImpl::OnInitialize()
945 {
946     RegisterDataShareServiceInfo();
947     RegisterHandler();
948     SetServiceReady();
949     ZLOGI("Init dataShare service end");
950     return 0;
951 }
952 
~DataShareServiceImpl()953 DataShareServiceImpl::~DataShareServiceImpl()
954 {
955     DumpManager::GetInstance().RemoveHandler("FEATURE_INFO", uintptr_t(this));
956 }
957 
EnableSilentProxy(const std::string & uri,bool enable)958 int32_t DataShareServiceImpl::EnableSilentProxy(const std::string &uri, bool enable)
959 {
960     uint32_t callerTokenId = IPCSkeleton::GetCallingTokenID();
961     bool ret = dataShareSilentConfig_.EnableSilentProxy(callerTokenId, uri, enable);
962     if (!ret) {
963         ZLOGE("Enable silent proxy err, %{public}s", URIUtils::Anonymous(uri).c_str());
964         return ERROR;
965     }
966     return E_OK;
967 }
968 
GetSilentProxyStatus(const std::string & uri,bool isCreateHelper)969 int32_t DataShareServiceImpl::GetSilentProxyStatus(const std::string &uri, bool isCreateHelper)
970 {
971     XCollie xcollie(std::string(LOG_TAG) + "::" + std::string(__FUNCTION__),
972                     XCollie::XCOLLIE_LOG | XCollie::XCOLLIE_RECOVERY);
973     uint32_t callerTokenId = IPCSkeleton::GetCallingTokenID();
974     if (isCreateHelper) {
975         auto errCode = GetBMSAndMetaDataStatus(uri, callerTokenId);
976         if (errCode != E_OK) {
977             ZLOGE("BMS or metaData not ready to complete, token:0x%{public}x, uri:%{public}s",
978                 callerTokenId, URIUtils::Anonymous(uri).c_str());
979             return errCode;
980         }
981     }
982     int32_t currentUserId = AccountDelegate::GetInstance()->GetUserByToken(callerTokenId);
983     UriInfo uriInfo;
984     // GetInfoFromUri will first perform a four-part URI check. Only if the URI contains more than four parts
985     // is it necessary to continue to check the SilentProxyEnable status. The URI part length is used as an
986     // indicator to determine whether the SilentProxyEnable status needs to be checked.
987     if (!URIUtils::GetInfoFromURI(uri, uriInfo)) {
988         return E_OK;
989     }
990     std::string calledBundleName = uriInfo.bundleName;
991     int32_t appIndex = 0;
992     if (!URIUtils::GetAppIndexFromProxyURI(uri, appIndex)) {
993         return E_APPINDEX_INVALID;
994     }
995     uint32_t calledTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(
996         currentUserId, calledBundleName, appIndex);
997     if (calledTokenId == 0) {
998         calledTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(0, calledBundleName, 0);
999     }
1000     auto success = dataShareSilentConfig_.IsSilentProxyEnable(calledTokenId, currentUserId, calledBundleName, uri);
1001     if (!success) {
1002         ZLOGW("silent proxy disable, %{public}s", URIUtils::Anonymous(uri).c_str());
1003         return E_SILENT_PROXY_DISABLE;
1004     }
1005     return E_OK;
1006 }
1007 
RegisterObserver(const std::string & uri,const sptr<OHOS::IRemoteObject> & remoteObj)1008 int32_t DataShareServiceImpl::RegisterObserver(const std::string &uri,
1009     const sptr<OHOS::IRemoteObject> &remoteObj)
1010 {
1011     return ERROR;
1012 }
1013 
UnregisterObserver(const std::string & uri,const sptr<OHOS::IRemoteObject> & remoteObj)1014 int32_t DataShareServiceImpl::UnregisterObserver(const std::string &uri,
1015     const sptr<OHOS::IRemoteObject> &remoteObj)
1016 {
1017     return ERROR;
1018 }
1019 
GetCallerBundleInfo(BundleInfo & callerBundleInfo)1020 bool DataShareServiceImpl::GetCallerBundleInfo(BundleInfo &callerBundleInfo)
1021 {
1022     GetCallerInfo(callerBundleInfo.bundleName, callerBundleInfo.appIndex);
1023     callerBundleInfo.userId = AccountDelegate::GetInstance()->GetUserByToken(IPCSkeleton::GetCallingTokenID());
1024     callerBundleInfo.tokenId = IPCSkeleton::GetCallingTokenID();
1025     auto [ret, callerAppIdentifier] = BundleMgrProxy::GetInstance()->GetCallerAppIdentifier(
1026         callerBundleInfo.bundleName, callerBundleInfo.userId);
1027     if (ret != 0) {
1028         ZLOGE("Get caller appIdentifier failed, callerBundleName is %{public}s", callerBundleInfo.bundleName.c_str());
1029         return false;
1030     }
1031     callerBundleInfo.appIdentifier = callerAppIdentifier;
1032     return true;
1033 }
1034 
PublishProxyData(const std::vector<DataShareProxyData> & proxyDatas,const DataProxyConfig & proxyConfig)1035 std::vector<DataProxyResult> DataShareServiceImpl::PublishProxyData(const std::vector<DataShareProxyData> &proxyDatas,
1036     const DataProxyConfig &proxyConfig)
1037 {
1038     std::vector<DataProxyResult> result;
1039     BundleInfo callerBundleInfo;
1040     if (!GetCallerBundleInfo(callerBundleInfo)) {
1041         ZLOGE("get callerBundleInfo failed");
1042         return result;
1043     }
1044     std::vector<ProxyDataKey> keys;
1045     std::map<DataShareObserver::ChangeType, std::vector<DataShareProxyData>> datas;
1046     for (const auto &data : proxyDatas) {
1047         DataShareObserver::ChangeType type;
1048         auto ret = PublishedProxyData::Upsert(data, callerBundleInfo, type);
1049         result.emplace_back(data.uri_, static_cast<DataProxyErrorCode>(ret));
1050         if (ret == SUCCESS &&
1051             (type == DataShareObserver::ChangeType::INSERT || type == DataShareObserver::ChangeType::UPDATE)) {
1052             keys.emplace_back(data.uri_, callerBundleInfo.bundleName);
1053             datas[type].emplace_back(data);
1054         }
1055     }
1056     ProxyDataSubscriberManager::GetInstance().Emit(keys, datas, callerBundleInfo.userId);
1057     return result;
1058 }
1059 
DeleteProxyData(const std::vector<std::string> & uris,const DataProxyConfig & proxyConfig)1060 std::vector<DataProxyResult> DataShareServiceImpl::DeleteProxyData(const std::vector<std::string> &uris,
1061     const DataProxyConfig &proxyConfig)
1062 {
1063     std::vector<DataProxyResult> result;
1064     BundleInfo callerBundleInfo;
1065     if (!GetCallerBundleInfo(callerBundleInfo)) {
1066         ZLOGE("get callerBundleInfo failed");
1067         return result;
1068     }
1069     std::vector<ProxyDataKey> keys;
1070     std::map<DataShareObserver::ChangeType, std::vector<DataShareProxyData>> datas;
1071     for (const auto &uri : uris) {
1072         DataShareProxyData oldProxyData;
1073         DataShareObserver::ChangeType type;
1074         auto ret = PublishedProxyData::Delete(uri, callerBundleInfo, oldProxyData, type);
1075         result.emplace_back(uri, static_cast<DataProxyErrorCode>(ret));
1076         if (ret == SUCCESS && type == DataShareObserver::ChangeType::DELETE) {
1077             keys.emplace_back(uri, callerBundleInfo.bundleName);
1078             datas[type].emplace_back(oldProxyData);
1079         }
1080     }
1081     ProxyDataSubscriberManager::GetInstance().Emit(keys, datas, callerBundleInfo.userId);
1082     return result;
1083 }
1084 
GetProxyData(const std::vector<std::string> & uris,const DataProxyConfig & proxyConfig)1085 std::vector<DataProxyGetResult> DataShareServiceImpl::GetProxyData(const std::vector<std::string> &uris,
1086     const DataProxyConfig &proxyConfig)
1087 {
1088     std::vector<DataProxyGetResult> result;
1089     BundleInfo callerBundleInfo;
1090     if (!GetCallerBundleInfo(callerBundleInfo)) {
1091         ZLOGE("get callerBundleInfo failed");
1092         return result;
1093     }
1094     for (const auto &uri : uris) {
1095         DataShareProxyData proxyData;
1096         auto ret = PublishedProxyData::Query(uri, callerBundleInfo, proxyData);
1097         result.emplace_back(uri, static_cast<DataProxyErrorCode>(ret), proxyData.value_, proxyData.allowList_);
1098     }
1099     return result;
1100 }
1101 
SubscribeProxyData(const std::vector<std::string> & uris,const DataProxyConfig & proxyConfig,const sptr<IProxyDataObserver> observer)1102 std::vector<DataProxyResult> DataShareServiceImpl::SubscribeProxyData(const std::vector<std::string> &uris,
1103     const DataProxyConfig &proxyConfig, const sptr<IProxyDataObserver> observer)
1104 {
1105     std::vector<DataProxyResult> results = {};
1106     BundleInfo callerBundleInfo;
1107     if (!GetCallerBundleInfo(callerBundleInfo)) {
1108         ZLOGE("get callerBundleInfo failed");
1109         return results;
1110     }
1111     for (const auto &uri : uris) {
1112         DataShareProxyData proxyData;
1113         DataProxyErrorCode ret =
1114             static_cast<DataProxyErrorCode>(PublishedProxyData::Query(uri, callerBundleInfo, proxyData));
1115         if (ret == SUCCESS) {
1116             ret = ProxyDataSubscriberManager::GetInstance().Add(
1117                 ProxyDataKey(uri, callerBundleInfo.bundleName), observer, callerBundleInfo.bundleName,
1118                 callerBundleInfo.appIdentifier, callerBundleInfo.userId);
1119         }
1120         results.emplace_back(uri, ret);
1121     }
1122     return results;
1123 }
1124 
UnsubscribeProxyData(const std::vector<std::string> & uris,const DataProxyConfig & proxyConfig)1125 std::vector<DataProxyResult> DataShareServiceImpl::UnsubscribeProxyData(const std::vector<std::string> &uris,
1126     const DataProxyConfig &proxyConfig)
1127 {
1128     std::string bundleName;
1129     GetCallerBundleName(bundleName);
1130     int32_t userId = AccountDelegate::GetInstance()->GetUserByToken(IPCSkeleton::GetCallingTokenID());
1131     std::vector<DataProxyResult> result = {};
1132     for (const auto &uri : uris) {
1133         auto ret = ProxyDataSubscriberManager::GetInstance().Delete(ProxyDataKey(uri, bundleName), userId);
1134         result.emplace_back(uri, ret);
1135     }
1136     return result;
1137 }
1138 
VerifyAcrossAccountsPermission(int32_t currentUserId,int32_t visitedUserId,const std::string & acrossAccountsPermission,uint32_t callerTokenId)1139 bool DataShareServiceImpl::VerifyAcrossAccountsPermission(int32_t currentUserId, int32_t visitedUserId,
1140     const std::string &acrossAccountsPermission, uint32_t callerTokenId)
1141 {
1142     // if it's SA, or visit itself, no need to verify permission
1143     if (currentUserId == 0 || currentUserId == visitedUserId) {
1144         return true;
1145     }
1146     return PermitDelegate::VerifyPermission(acrossAccountsPermission, callerTokenId);
1147 }
1148 
ExecuteEx(const std::string & uri,const std::string & extUri,const int32_t tokenId,bool isRead,ExecuteCallbackEx callback)1149 std::pair<int32_t, int32_t> DataShareServiceImpl::ExecuteEx(const std::string &uri, const std::string &extUri,
1150     const int32_t tokenId, bool isRead, ExecuteCallbackEx callback)
1151 {
1152     DataProviderConfig providerConfig(uri, tokenId);
1153     auto [errCode, providerInfo] = providerConfig.GetProviderInfo();
1154     if (errCode != E_OK) {
1155         ZLOGE("Provider failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s,visitedUserId:%{public}d", tokenId,
1156             errCode, URIUtils::Anonymous(providerInfo.uri).c_str(), providerInfo.visitedUserId);
1157         RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_GET_SUPPLIER,
1158             RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::SUPPLIER_ERROR);
1159         return std::make_pair(errCode, 0);
1160     }
1161     // when HAP interacts across users, it needs to check across users permission
1162     if (!VerifyAcrossAccountsPermission(providerInfo.currentUserId, providerInfo.visitedUserId,
1163         providerInfo.acrossAccountsPermission, tokenId)) {
1164         ZLOGE("Across accounts permission denied! token:0x%{public}x, uri:%{public}s, current user:%{public}d,"
1165             "visited user:%{public}d", tokenId, URIUtils::Anonymous(providerInfo.uri).c_str(),
1166             providerInfo.currentUserId, providerInfo.visitedUserId);
1167         RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_PERMISSION,
1168             RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::PERMISSION_DENIED_ERROR);
1169         return std::make_pair(ERROR_PERMISSION_DENIED, 0);
1170     }
1171     if (!CheckAllowList(providerInfo.currentUserId, tokenId, providerInfo.allowLists)) {
1172         ZLOGE("CheckAllowList failed, permission denied! token:0x%{public}x, uri:%{public}s",
1173             tokenId, URIUtils::Anonymous(providerInfo.uri).c_str());
1174         return std::make_pair(ERROR_PERMISSION_DENIED, 0);
1175     }
1176     std::string permission = isRead ? providerInfo.readPermission : providerInfo.writePermission;
1177     if (!VerifyPermission(providerInfo.bundleName, permission, providerInfo.isFromExtension, tokenId)) {
1178         ZLOGE("Permission denied! token:0x%{public}x, permission:%{public}s,isFromExtension:%{public}d,uri:%{public}s",
1179             tokenId, permission.c_str(), providerInfo.isFromExtension, URIUtils::Anonymous(providerInfo.uri).c_str());
1180         RADAR_REPORT(__FUNCTION__, RadarReporter::SILENT_ACCESS, RadarReporter::PROXY_PERMISSION,
1181             RadarReporter::FAILED, RadarReporter::ERROR_CODE, RadarReporter::PERMISSION_DENIED_ERROR);
1182         return std::make_pair(ERROR_PERMISSION_DENIED, 0);
1183     }
1184     DataShareDbConfig dbConfig;
1185     std::string extensionUri = extUri;
1186     if (extensionUri.empty()) {
1187         extensionUri = providerInfo.extensionUri;
1188     }
1189     DataShareDbConfig::DbConfig config {providerInfo.uri, extensionUri, providerInfo.bundleName,
1190         providerInfo.storeName, providerInfo.backup, providerInfo.singleton ? 0 : providerInfo.visitedUserId,
1191         providerInfo.appIndex, providerInfo.hasExtension};
1192     auto [code, metaData, dbDelegate] = dbConfig.GetDbConfig(config);
1193     if (code != E_OK) {
1194         ZLOGE("Get dbConfig fail,bundleName:%{public}s,tableName:%{public}s,tokenId:0x%{public}x, uri:%{public}s",
1195             providerInfo.bundleName.c_str(), StringUtils::GeneralAnonymous(providerInfo.tableName).c_str(), tokenId,
1196             URIUtils::Anonymous(providerInfo.uri).c_str());
1197         return std::make_pair(code, 0);
1198     }
1199     return callback(providerInfo, metaData, dbDelegate);
1200 }
1201 
CheckAllowList(const uint32_t & currentUserId,const uint32_t & callerTokenId,const std::vector<AllowList> & allowLists)1202 bool DataShareServiceImpl::CheckAllowList(const uint32_t &currentUserId, const uint32_t &callerTokenId,
1203     const std::vector<AllowList> &allowLists)
1204 {
1205     if (allowLists.empty()) {
1206         return true;
1207     }
1208     std::string callerBundleName;
1209     int32_t callerAppIndex = 0;
1210     auto [success, type] = GetCallerInfo(callerBundleName, callerAppIndex);
1211     if (!success) {
1212         ZLOGE("Get caller info failed, token:0x%{public}x", callerTokenId);
1213         return false;
1214     }
1215     // SA calling
1216     if (type == Security::AccessToken::TOKEN_NATIVE) {
1217         return true;
1218     }
1219 
1220     auto [ret, callerAppIdentifier] = BundleMgrProxy::GetInstance()->GetCallerAppIdentifier(
1221         callerBundleName, currentUserId);
1222     if (ret != 0) {
1223         ZLOGE("Get caller appIdentifier failed, callerBundleName is %{public}s", callerBundleName.c_str());
1224         return false;
1225     }
1226 
1227     for (auto const& allowList : allowLists) {
1228         if (callerAppIdentifier == allowList.appIdentifier) {
1229             if (callerAppIndex != 0 && allowList.onlyMain) {
1230                 ZLOGE("Provider only allow main application!");
1231                 return false;
1232             }
1233             return true;
1234         }
1235     }
1236     return false;
1237 }
1238 
GetBMSAndMetaDataStatus(const std::string & uri,const int32_t tokenId)1239 int32_t DataShareServiceImpl::GetBMSAndMetaDataStatus(const std::string &uri, const int32_t tokenId)
1240 {
1241     DataProviderConfig calledConfig(uri, tokenId);
1242     auto [errCode, calledInfo] = calledConfig.GetProviderInfo();
1243     if (errCode == E_URI_NOT_EXIST) {
1244         ZLOGE("Create helper invalid uri, token:0x%{public}x, uri:%{public}s", tokenId,
1245               URIUtils::Anonymous(calledInfo.uri).c_str());
1246         return E_OK;
1247     }
1248     if (errCode != E_OK) {
1249         ZLOGE("CalledInfo failed! token:0x%{public}x,ret:%{public}d,uri:%{public}s", tokenId,
1250             errCode, URIUtils::Anonymous(calledInfo.uri).c_str());
1251         return errCode;
1252     }
1253     DataShareDbConfig dbConfig;
1254     DataShareDbConfig::DbConfig dbArg;
1255     dbArg.uri = calledInfo.uri;
1256     dbArg.bundleName = calledInfo.bundleName;
1257     dbArg.storeName = calledInfo.storeName;
1258     dbArg.userId = calledInfo.singleton ? 0 : calledInfo.visitedUserId;
1259     dbArg.hasExtension = calledInfo.hasExtension;
1260     dbArg.appIndex = calledInfo.appIndex;
1261     auto [code, metaData] = dbConfig.GetMetaData(dbArg);
1262     if (code != E_OK) {
1263         ZLOGE("Get metaData fail,bundleName:%{public}s,tableName:%{public}s,tokenId:0x%{public}x, uri:%{public}s",
1264             calledInfo.bundleName.c_str(), StringUtils::GeneralAnonymous(calledInfo.tableName).c_str(), tokenId,
1265             URIUtils::Anonymous(calledInfo.uri).c_str());
1266         return E_METADATA_NOT_EXISTS;
1267     }
1268     return E_OK;
1269 }
1270 
InitSubEvent()1271 void DataShareServiceImpl::InitSubEvent()
1272 {
1273     static std::atomic<bool> alreadySubscribe = false;
1274     bool except = false;
1275     if (!alreadySubscribe.compare_exchange_strong(except, true)) {
1276         return;
1277     }
1278     EventFwk::MatchingSkills matchingSkills;
1279     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED);
1280     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);
1281     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED);
1282     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
1283     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
1284     subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1285     auto sysEventSubscriber = std::make_shared<SysEventSubscriber>(subscribeInfo, binderInfo_.executors);
1286     if (!EventFwk::CommonEventManager::SubscribeCommonEvent(sysEventSubscriber)) {
1287         ZLOGE("Subscribe sys event failed.");
1288         alreadySubscribe = false;
1289     }
1290     if (BundleMgrProxy::GetInstance()->CheckBMS() != nullptr) {
1291         sysEventSubscriber->OnBMSReady();
1292     }
1293 }
1294 
OnUserChange(uint32_t code,const std::string & user,const std::string & account)1295 int32_t DataShareServiceImpl::OnUserChange(uint32_t code, const std::string &user, const std::string &account)
1296 {
1297     ZLOGI("code:%{public}d, user:%{public}s, account:%{public}s", code, user.c_str(),
1298         Anonymous::Change(account).c_str());
1299     switch (code) {
1300         case static_cast<uint32_t>(AccountStatus::DEVICE_ACCOUNT_DELETE):
1301         case static_cast<uint32_t>(AccountStatus::DEVICE_ACCOUNT_STOPPED): {
1302             std::vector<int32_t> users;
1303             AccountDelegate::GetInstance()->QueryUsers(users);
1304             std::set<int32_t> userIds(users.begin(), users.end());
1305             userIds.insert(0);
1306             DBDelegate::Close([&userIds](const std::string &userId) {
1307                 if (userIds.count(atoi(userId.c_str())) == 0) {
1308                     ZLOGW("Illegal use of database by user %{public}s", userId.c_str());
1309                     return true;
1310                 }
1311                 return false;
1312             });
1313             break;
1314         }
1315         case static_cast<uint32_t>(AccountStatus::DEVICE_ACCOUNT_STOPPING):
1316             DBDelegate::Close([&user](const std::string &userId) {
1317                 return user == userId;
1318             });
1319             break;
1320         default:
1321             break;
1322     }
1323     return E_OK;
1324 }
1325 
ReportExcuteFault(uint32_t callingTokenId,DataProviderConfig::ProviderInfo & providerInfo,int32_t errCode,std::string & func)1326 void DataShareServiceImpl::ReportExcuteFault(uint32_t callingTokenId, DataProviderConfig::ProviderInfo &providerInfo,
1327     int32_t errCode, std::string &func)
1328 {
1329     std::string appendix = "callingName:" + HiViewFaultAdapter::GetCallingName(callingTokenId).first;
1330     DataShareFaultInfo faultInfo = {HiViewFaultAdapter::curdFailed, providerInfo.bundleName, providerInfo.moduleName,
1331         providerInfo.storeName, func, errCode, appendix};
1332     HiViewFaultAdapter::ReportDataFault(faultInfo);
1333 }
1334 
VerifyPermission(const std::string & bundleName,const std::string & permission,bool isFromExtension,const int32_t tokenId)1335 bool DataShareServiceImpl::VerifyPermission(const std::string &bundleName, const std::string &permission,
1336     bool isFromExtension, const int32_t tokenId)
1337 {
1338     // Provider from extension, allows empty permissions, not configured to allow access.
1339     if (isFromExtension) {
1340         if (!permission.empty() && !PermitDelegate::VerifyPermission(permission, tokenId)) {
1341             return false;
1342         }
1343     } else {
1344         Security::AccessToken::HapTokenInfo tokenInfo;
1345         // Provider from ProxyData, which does not allow empty permissions and cannot be access without configured
1346         if (permission.empty()) {
1347             auto result = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
1348             if (result == Security::AccessToken::RET_SUCCESS && tokenInfo.bundleName == bundleName) {
1349                 return true;
1350             }
1351             ZLOGE("Permission denied! token:0x%{public}x, bundleName:%{public}s", tokenId, bundleName.c_str());
1352             return false;
1353         }
1354         // If the permission is NO_PERMISSION, access is also allowed
1355         if (permission != NO_PERMISSION && !PermitDelegate::VerifyPermission(permission, tokenId)) {
1356             return false;
1357         }
1358     }
1359     return true;
1360 }
1361 } // namespace OHOS::DataShare
1362