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>> ¶ms) {
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>> ¶ms)
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 ¤tUserId, 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