1 /*
2 * Copyright (c) 2021-2024 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 #include "dataobs_mgr_service.h"
16
17 #include <functional>
18 #include <memory>
19 #include <string>
20 #include <unistd.h>
21
22 #include "ability_connect_callback_stub.h"
23 #include "ability_manager_interface.h"
24 #include "ability_manager_proxy.h"
25 #include "accesstoken_kit.h"
26 #include "dataobs_mgr_errors.h"
27 #include "data_share_permission.h"
28 #include "datashare_log.h"
29 #include "dataobs_mgr_inner_common.h"
30 #include "datashare_errno.h"
31 #include "hilog_tag_wrapper.h"
32 #include "if_system_ability_manager.h"
33 #include "in_process_call_wrapper.h"
34 #include "ipc_skeleton.h"
35 #include "iservice_registry.h"
36 #include "os_account_manager.h"
37 #include "system_ability_definition.h"
38 #include "tokenid_kit.h"
39 #include "common_utils.h"
40 #include "securec.h"
41 #ifdef SCENE_BOARD_ENABLE
42 #include "window_manager_lite.h"
43 #else
44 #include "window_manager.h"
45 #endif
46
47 namespace OHOS {
48 namespace AAFwk {
49 using namespace DataShare;
50 static constexpr const char *DIALOG_APP = "com.ohos.pasteboarddialog";
51 static constexpr const char *PROGRESS_ABILITY = "PasteboardProgressAbility";
52 static constexpr const char *PROMPT_TEXT = "PromptText_PasteBoard_Local";
53 static constexpr const char *NO_PERMISSION = "noPermission";
54
55 const bool REGISTER_RESULT =
56 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<DataObsMgrService>::GetInstance().get());
57
DataObsMgrService()58 DataObsMgrService::DataObsMgrService()
59 : SystemAbility(DATAOBS_MGR_SERVICE_SA_ID, true),
60 state_(DataObsServiceRunningState::STATE_NOT_START)
61 {
62 dataObsMgrInner_ = std::make_shared<DataObsMgrInner>();
63 dataObsMgrInnerExt_ = std::make_shared<DataObsMgrInnerExt>();
64 dataObsMgrInnerPref_ = std::make_shared<DataObsMgrInnerPref>();
65 }
66
~DataObsMgrService()67 DataObsMgrService::~DataObsMgrService()
68 {}
69
OnStart()70 void DataObsMgrService::OnStart()
71 {
72 if (state_ == DataObsServiceRunningState::STATE_RUNNING) {
73 TAG_LOGI(AAFwkTag::DBOBSMGR, "dms started");
74 return;
75 }
76 if (!Init()) {
77 TAG_LOGE(AAFwkTag::DBOBSMGR, "init failed");
78 return;
79 }
80 state_ = DataObsServiceRunningState::STATE_RUNNING;
81 /* Publish service maybe failed, so we need call this function at the last,
82 * so it can't affect the TDD test program */
83 if (!Publish(DelayedSingleton<DataObsMgrService>::GetInstance().get())) {
84 TAG_LOGE(AAFwkTag::DBOBSMGR, "publish init failed");
85 return;
86 }
87
88 TAG_LOGI(AAFwkTag::DBOBSMGR, "dms called");
89 }
90
Init()91 bool DataObsMgrService::Init()
92 {
93 handler_ = TaskHandlerWrap::GetFfrtHandler();
94 return true;
95 }
96
OnStop()97 void DataObsMgrService::OnStop()
98 {
99 TAG_LOGI(AAFwkTag::DBOBSMGR, "stop");
100 handler_.reset();
101 state_ = DataObsServiceRunningState::STATE_NOT_START;
102 }
103
QueryServiceState() const104 DataObsServiceRunningState DataObsMgrService::QueryServiceState() const
105 {
106 return state_;
107 }
108
ConstructObserverNode(sptr<IDataAbilityObserver> dataObserver,int32_t userId,uint32_t tokenId)109 std::pair<bool, struct ObserverNode> DataObsMgrService::ConstructObserverNode(sptr<IDataAbilityObserver> dataObserver,
110 int32_t userId, uint32_t tokenId)
111 {
112 if (userId == -1) {
113 userId = GetCallingUserId(tokenId);
114 }
115 if (userId == -1) {
116 // return false, tokenId default 0
117 return std::make_pair(false, ObserverNode(dataObserver, userId, 0));
118 }
119 return std::make_pair(true, ObserverNode(dataObserver, userId, tokenId));
120 }
121
GetCallingUserId(uint32_t tokenId)122 int32_t DataObsMgrService::GetCallingUserId(uint32_t tokenId)
123 {
124 auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
125 if (type == Security::AccessToken::TOKEN_NATIVE || type == Security::AccessToken::TOKEN_SHELL) {
126 return 0;
127 } else {
128 Security::AccessToken::HapTokenInfo tokenInfo;
129 auto result = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
130 if (result != Security::AccessToken::RET_SUCCESS) {
131 TAG_LOGE(AAFwkTag::DBOBSMGR, "token:0x%{public}x, result:%{public}d", tokenId, result);
132 return -1;
133 }
134 return tokenInfo.userID;
135 }
136 }
137
GetDataMgrServiceUid()138 int32_t DataObsMgrService::GetDataMgrServiceUid()
139 {
140 static std::atomic_int32_t ddmsUid = 0;
141 if (ddmsUid != 0) {
142 return ddmsUid;
143 }
144 auto manager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
145 if (manager == nullptr) {
146 TAG_LOGE(AAFwkTag::DBOBSMGR, "get system ability manager failed");
147 return 0;
148 }
149 SystemProcessInfo systemProcessInfo;
150 auto ret = manager->GetSystemProcessInfo(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, systemProcessInfo);
151 if (ret != 0) {
152 TAG_LOGE(AAFwkTag::DBOBSMGR, "GetSystemProcessInfo failed, err %{public}d", ret);
153 return 0;
154 }
155 ddmsUid = systemProcessInfo.uid;
156 return ddmsUid;
157 }
158
IsSystemApp(uint32_t tokenId,uint64_t fullTokenId)159 bool DataObsMgrService::IsSystemApp(uint32_t tokenId, uint64_t fullTokenId)
160 {
161 Security::AccessToken::ATokenTypeEnum tokenType =
162 Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
163 if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) {
164 return false;
165 }
166 // IsSystemAppByFullTokenID here is not IPC
167 if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(fullTokenId)) {
168 TAG_LOGE(AAFwkTag::DBOBSMGR, "Not system app, token:%{public}" PRIx64 "", fullTokenId);
169 return false;
170 }
171 return true;
172 }
173
IsDataMgrService(uint32_t tokenId,int32_t uid)174 bool DataObsMgrService::IsDataMgrService(uint32_t tokenId, int32_t uid)
175 {
176 Security::AccessToken::ATokenTypeEnum tokenType =
177 Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
178 if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
179 return false;
180 }
181 int32_t ddmsUid = GetDataMgrServiceUid();
182 if (uid != ddmsUid) {
183 TAG_LOGE(AAFwkTag::DBOBSMGR, "request not from DataMgr, uid %{public}d, DataMgr %{public}d", uid, ddmsUid);
184 return false;
185 }
186 return true;
187 }
188
IsCallingPermissionValid(DataObsOption & opt)189 bool DataObsMgrService::IsCallingPermissionValid(DataObsOption &opt)
190 {
191 if (opt.IsSystem()) {
192 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
193 uint64_t fullTokenId = IPCSkeleton::GetCallingFullTokenID();
194 bool isValid = IsSystemApp(tokenId, fullTokenId);
195 if (!isValid) {
196 TAG_LOGE(AAFwkTag::DBOBSMGR, "CallingPermission invalid, token %{public}d", tokenId);
197 return false;
198 }
199 }
200 return true;
201 }
202
IsCallingPermissionValid(DataObsOption & opt,int32_t userId,int32_t callingUserId)203 bool DataObsMgrService::IsCallingPermissionValid(DataObsOption &opt, int32_t userId, int32_t callingUserId)
204 {
205 if (callingUserId < 0) {
206 TAG_LOGE(AAFwkTag::DBOBSMGR, "invalid userId %{public}d", callingUserId);
207 return false;
208 }
209 bool acrossUser = false;
210 if (userId == DATAOBS_DEFAULT_CURRENT_USER || userId == callingUserId) {
211 acrossUser = false;
212 } else {
213 acrossUser = true;
214 }
215
216 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
217 uint64_t fullTokenId = IPCSkeleton::GetCallingFullTokenID();
218 int32_t uid = IPCSkeleton::GetCallingUid();
219 bool isValid = true;
220 if (acrossUser) {
221 isValid = IsSystemApp(tokenId, fullTokenId) || IsDataMgrService(tokenId, uid);
222 } else if (opt.IsSystem()) {
223 isValid = IsSystemApp(tokenId, fullTokenId);
224 }
225 if (!isValid) {
226 TAG_LOGE(AAFwkTag::DBOBSMGR, "CallingPermission invalid, token %{public}d, from %{public}d to %{public}d",
227 tokenId, callingUserId, userId);
228 return false;
229 }
230 return true;
231 }
232
FormatUri(const std::string & uri)233 std::string FormatUri(const std::string &uri)
234 {
235 auto pos = uri.find_last_of('?');
236 if (pos == std::string::npos) {
237 return uri;
238 }
239
240 return uri.substr(0, pos);
241 }
242
RegisterObserver(const Uri & uri,sptr<IDataAbilityObserver> dataObserver,int32_t userId,DataObsOption opt)243 int32_t DataObsMgrService::RegisterObserver(const Uri &uri, sptr<IDataAbilityObserver> dataObserver,
244 int32_t userId, DataObsOption opt)
245 {
246 return RegisterObserverInner(uri, dataObserver, userId, opt, false);
247 }
248
RegisterObserverFromExtension(const Uri & uri,sptr<IDataAbilityObserver> dataObserver,int32_t userId,DataObsOption opt)249 int32_t DataObsMgrService::RegisterObserverFromExtension(const Uri &uri, sptr<IDataAbilityObserver> dataObserver,
250 int32_t userId, DataObsOption opt)
251 {
252 return RegisterObserverInner(uri, dataObserver, userId, opt, true);
253 }
254
255 // just hisysevent now
VerifyDataSharePermission(Uri & uri,bool isRead,ObserverInfo & info)256 int32_t DataObsMgrService::VerifyDataSharePermission(Uri &uri, bool isRead, ObserverInfo &info)
257 {
258 std::string uriStr = uri.ToString();
259 uint32_t tokenId = info.tokenId;
260 uint64_t fullTokenId = info.fullTokenId;
261 int ret;
262 bool isExtension = info.isExtension;
263 if (isExtension) {
264 ret = DataShare::DataSharePermission::IsExtensionValid(tokenId, fullTokenId, info.callingUserId);
265 if (ret != DataShare::E_OK) {
266 info.errMsg.append(std::to_string(info.isExtension) + "_IsExtensionValid");
267 TAG_LOGE(AAFwkTag::DBOBSMGR, "IsExtensionValid failed, uri:%{public}s, ret %{public}d,"
268 "fullToken %{public}" PRId64 " msg %{public}s", uriStr.c_str(), ret, fullTokenId, info.errMsg.c_str());
269 DataShare::DataSharePermission::ReportExtensionFault(ret, tokenId, uriStr, info.errMsg);
270 return ret;
271 }
272 }
273 return VerifyDataSharePermissionInner(uri, isRead, info);
274 }
275
VerifyDataSharePermissionInner(Uri & uri,bool isRead,ObserverInfo & info)276 int32_t DataObsMgrService::VerifyDataSharePermissionInner(Uri &uri, bool isRead, ObserverInfo &info)
277 {
278 std::string uriStr = uri.ToString();
279 uint32_t tokenId = info.tokenId;
280 uint64_t fullTokenId = info.fullTokenId;
281 int ret;
282 bool isExtension = info.isExtension;
283 std::tie(ret, info.permission) = DataShare::DataSharePermission::GetUriPermission(uri,
284 info.userId, isRead, isExtension);
285 if (ret != DataShare::E_OK) {
286 info.errMsg.append(std::to_string(info.isExtension) + "_GetUriPermission");
287 TAG_LOGE(AAFwkTag::DBOBSMGR, "GetUriPermission failed, uri:%{public}s, isExtension %{public}d,"
288 "token %{public}d", uriStr.c_str(), isExtension, tokenId);
289 DataShare::DataSharePermission::ReportExtensionFault(ret, tokenId, uriStr, info.errMsg);
290 return ret;
291 }
292 uint32_t verifyToken = isExtension ? info.firstCallerTokenId : tokenId;
293 if (!DataShare::DataSharePermission::VerifyPermission(uri, verifyToken, info.permission, isExtension)) {
294 info.errMsg.append(std::to_string(info.isExtension) + "_VerifyPermission");
295 TAG_LOGE(AAFwkTag::DBOBSMGR, "VerifyPermission failed, uri:%{public}s, isExtension %{public}d,"
296 "token %{public}d", uriStr.c_str(), isExtension, tokenId);
297 DataShare::DataSharePermission::ReportExtensionFault(ret, tokenId, uriStr, info.errMsg);
298 return DataShare::E_DATASHARE_PERMISSION_DENIED;
299 }
300 return 0;
301 }
302
RegisterObserverInner(const Uri & uri,sptr<IDataAbilityObserver> dataObserver,int32_t userId,DataObsOption opt,bool isExtension)303 int32_t DataObsMgrService::RegisterObserverInner(const Uri &uri, sptr<IDataAbilityObserver> dataObserver,
304 int32_t userId, DataObsOption opt, bool isExtension)
305 {
306 if (dataObserver == nullptr) {
307 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObserver, uri:%{public}s",
308 CommonUtils::Anonymous(uri.ToString()).c_str());
309 return DATA_OBSERVER_IS_NULL;
310 }
311
312 if (dataObsMgrInner_ == nullptr) {
313 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObsMgrInner, uri:%{public}s",
314 CommonUtils::Anonymous(uri.ToString()).c_str());
315 return DATAOBS_SERVICE_INNER_IS_NULL;
316 }
317
318 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
319 uint64_t fullTokenId = IPCSkeleton::GetCallingFullTokenID();
320 int32_t callingUserId = GetCallingUserId(tokenId);
321 if (callingUserId < 0) {
322 return DATAOBS_INVALID_USERID;
323 }
324 if (!IsCallingPermissionValid(opt, userId, callingUserId)) {
325 return DATAOBS_NOT_SYSTEM_APP;
326 }
327 // If no user is specified, use current user.
328 if (userId == -1) {
329 userId = callingUserId;
330 }
331 Uri uriTemp = uri;
332 ObserverInfo info(tokenId, fullTokenId, opt.FirstCallerTokenID(), userId, isExtension);
333 info.callingUserId = callingUserId;
334 info.errMsg = __FUNCTION__;
335 VerifyDataSharePermission(uriTemp, true, info);
336
337 auto [success, observerNode] = ConstructObserverNode(dataObserver, userId, tokenId);
338 if (!success) {
339 TAG_LOGE(AAFwkTag::DBOBSMGR, "ConstructObserverNode fail, uri:%{public}s, userId:%{public}d",
340 CommonUtils::Anonymous(uri.ToString()).c_str(), userId);
341 return DATAOBS_INVALID_USERID;
342 }
343 observerNode.permission_ = info.permission;
344 int status;
345 if (const_cast<Uri &>(uri).GetScheme() == SHARE_PREFERENCES) {
346 status = dataObsMgrInnerPref_->HandleRegisterObserver(uri, observerNode);
347 } else {
348 status = dataObsMgrInner_->HandleRegisterObserver(uri, observerNode);
349 }
350
351 if (status != NO_ERROR) {
352 TAG_LOGE(AAFwkTag::DBOBSMGR, "register failed:%{public}d, uri:%{public}s", status,
353 CommonUtils::Anonymous(uri.ToString()).c_str());
354 return status;
355 }
356 return NO_ERROR;
357 }
358
UnregisterObserver(const Uri & uri,sptr<IDataAbilityObserver> dataObserver,int32_t userId,DataObsOption opt)359 int DataObsMgrService::UnregisterObserver(const Uri &uri, sptr<IDataAbilityObserver> dataObserver, int32_t userId,
360 DataObsOption opt)
361 {
362 if (dataObserver == nullptr) {
363 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObserver, uri:%{public}s",
364 CommonUtils::Anonymous(uri.ToString()).c_str());
365 return DATA_OBSERVER_IS_NULL;
366 }
367
368 if (dataObsMgrInner_ == nullptr) {
369 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObsMgrInner, uri:%{public}s",
370 CommonUtils::Anonymous(uri.ToString()).c_str());
371 return DATAOBS_SERVICE_INNER_IS_NULL;
372 }
373 if (!IsCallingPermissionValid(opt)) {
374 return DATAOBS_NOT_SYSTEM_APP;
375 }
376
377 auto tokenId = IPCSkeleton::GetCallingTokenID();
378 auto [success, observerNode] = ConstructObserverNode(dataObserver, userId, tokenId);
379 if (!success) {
380 TAG_LOGE(AAFwkTag::DBOBSMGR, "ConstructObserverNode fail, uri:%{public}s, userId:%{public}d",
381 CommonUtils::Anonymous(uri.ToString()).c_str(), userId);
382 return DATAOBS_INVALID_USERID;
383 }
384 int status;
385 if (const_cast<Uri &>(uri).GetScheme() == SHARE_PREFERENCES) {
386 status = dataObsMgrInnerPref_->HandleUnregisterObserver(uri, observerNode);
387 } else {
388 status = dataObsMgrInner_->HandleUnregisterObserver(uri, observerNode);
389 }
390
391 if (status != NO_ERROR) {
392 TAG_LOGE(AAFwkTag::DBOBSMGR, "unregister failed:%{public}d, uri:%{public}s", status,
393 CommonUtils::Anonymous(uri.ToString()).c_str());
394 return status;
395 }
396 return NO_ERROR;
397 }
398
NotifyChange(const Uri & uri,int32_t userId,DataObsOption opt)399 int DataObsMgrService::NotifyChange(const Uri &uri, int32_t userId, DataObsOption opt)
400 {
401 Uri innerUri = uri;
402 return NotifyChangeInner(innerUri, userId, opt, false);
403 }
404
NotifyChangeFromExtension(const Uri & uri,int32_t userId,DataObsOption opt)405 int DataObsMgrService::NotifyChangeFromExtension(const Uri &uri, int32_t userId, DataObsOption opt)
406 {
407 Uri innerUri = uri;
408 return NotifyChangeInner(innerUri, userId, opt, true);
409 }
410
CheckTrusts(uint32_t consumerToken,uint32_t providerToken)411 int32_t DataObsMgrService::CheckTrusts(uint32_t consumerToken, uint32_t providerToken)
412 {
413 uint32_t token = IPCSkeleton::GetCallingTokenID();
414 uint64_t fullToken = IPCSkeleton::GetCallingFullTokenID();
415 if (!IsSystemApp(token, fullToken)) {
416 return DATAOBS_NOT_SYSTEM_APP;
417 }
418 int ret = DataShare::DataSharePermission::CheckExtensionTrusts(consumerToken, providerToken);
419 return ret;
420 }
421
NotifyChangeInner(Uri & uri,int32_t userId,DataObsOption opt,bool isExtension)422 int32_t DataObsMgrService::NotifyChangeInner(Uri &uri, int32_t userId, DataObsOption opt, bool isExtension)
423 {
424 if (handler_ == nullptr) {
425 TAG_LOGE(AAFwkTag::DBOBSMGR, "null handler, uri:%{public}s", CommonUtils::Anonymous(uri.ToString()).c_str());
426 return DATAOBS_SERVICE_HANDLER_IS_NULL;
427 }
428 if (dataObsMgrInner_ == nullptr || dataObsMgrInnerExt_ == nullptr || dataObsMgrInnerPref_ == nullptr) {
429 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObsMgr,uri:%{public}s", CommonUtils::Anonymous(uri.ToString()).c_str());
430 return DATAOBS_SERVICE_INNER_IS_NULL;
431 }
432 int32_t uid = IPCSkeleton::GetCallingUid();
433 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
434 uint64_t fullTokenId = IPCSkeleton::GetCallingFullTokenID();
435 int32_t callingUserId = GetCallingUserId(tokenId);
436 if (callingUserId < 0) {
437 return DATAOBS_INVALID_USERID;
438 }
439 if (!IsCallingPermissionValid(opt, userId, callingUserId)) {
440 return DATAOBS_NOT_SYSTEM_APP;
441 }
442 // If no user is specified, the current user is notified.
443 if (userId == -1) {
444 userId = callingUserId;
445 }
446 if (uid != GetDataMgrServiceUid()) {
447 ObserverInfo info(tokenId, fullTokenId, opt.FirstCallerTokenID(), userId, isExtension);
448 info.callingUserId = callingUserId;
449 info.errMsg = __FUNCTION__;
450 VerifyDataSharePermission(uri, false, info);
451 }
452 {
453 std::lock_guard<ffrt::mutex> lck(taskCountMutex_);
454 if (taskCount_ >= TASK_COUNT_MAX) {
455 TAG_LOGE(AAFwkTag::DBOBSMGR, "task num reached limit, uri:%{public}s",
456 CommonUtils::Anonymous(uri.ToString()).c_str());
457 return DATAOBS_SERVICE_TASK_LIMMIT;
458 }
459 ++taskCount_;
460 }
461 ChangeInfo changeInfo = { ChangeInfo::ChangeType::OTHER, { uri } };
462 handler_->SubmitTask([this, uri, changeInfo, userId]() {
463 if (const_cast<Uri &>(uri).GetScheme() == SHARE_PREFERENCES) {
464 dataObsMgrInnerPref_->HandleNotifyChange(uri, userId);
465 } else {
466 dataObsMgrInner_->HandleNotifyChange(uri, userId);
467 dataObsMgrInnerExt_->HandleNotifyChange(changeInfo, userId);
468 }
469 std::lock_guard<ffrt::mutex> lck(taskCountMutex_);
470 --taskCount_;
471 });
472 return NO_ERROR;
473 }
474
RegisterObserverExt(const Uri & uri,sptr<IDataAbilityObserver> dataObserver,bool isDescendants,DataObsOption opt)475 Status DataObsMgrService::RegisterObserverExt(const Uri &uri, sptr<IDataAbilityObserver> dataObserver,
476 bool isDescendants, DataObsOption opt)
477 {
478 if (dataObserver == nullptr) {
479 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObserver, uri:%{public}s, isDescendants:%{public}d",
480 CommonUtils::Anonymous(uri.ToString()).c_str(), isDescendants);
481 return DATA_OBSERVER_IS_NULL;
482 }
483
484 if (dataObsMgrInnerExt_ == nullptr) {
485 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObsMgrInner, uri:%{public}s, isDescendants:%{public}d",
486 CommonUtils::Anonymous(uri.ToString()).c_str(), isDescendants);
487 return DATAOBS_SERVICE_INNER_IS_NULL;
488 }
489 if (!IsCallingPermissionValid(opt)) {
490 return DATAOBS_NOT_SYSTEM_APP;
491 }
492
493 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
494 int32_t userId = GetCallingUserId(tokenId);
495 if (userId < 0) {
496 TAG_LOGE(AAFwkTag::DBOBSMGR, "GetCallingUserId fail, uri:%{public}s, userId:%{public}d",
497 CommonUtils::Anonymous(uri.ToString()).c_str(), userId);
498 return DATAOBS_INVALID_USERID;
499 }
500 Uri uriTemp = uri;
501 ObserverInfo info(tokenId, 0, 0, userId, false);
502 info.errMsg = __FUNCTION__;
503 VerifyDataSharePermissionInner(uriTemp, true, info);
504
505 auto innerUri = uri;
506 return dataObsMgrInnerExt_->HandleRegisterObserver(innerUri, dataObserver, info, isDescendants);
507 }
508
UnregisterObserverExt(const Uri & uri,sptr<IDataAbilityObserver> dataObserver,DataObsOption opt)509 Status DataObsMgrService::UnregisterObserverExt(const Uri &uri, sptr<IDataAbilityObserver> dataObserver,
510 DataObsOption opt)
511 {
512 if (dataObserver == nullptr) {
513 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObserver, uri:%{public}s",
514 CommonUtils::Anonymous(uri.ToString()).c_str());
515 return DATA_OBSERVER_IS_NULL;
516 }
517
518 if (dataObsMgrInnerExt_ == nullptr) {
519 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObsMgrInner, uri:%{public}s",
520 CommonUtils::Anonymous(uri.ToString()).c_str());
521 return DATAOBS_SERVICE_INNER_IS_NULL;
522 }
523 if (!IsCallingPermissionValid(opt)) {
524 return DATAOBS_NOT_SYSTEM_APP;
525 }
526
527 auto innerUri = uri;
528 return dataObsMgrInnerExt_->HandleUnregisterObserver(innerUri, dataObserver);
529 }
530
UnregisterObserverExt(sptr<IDataAbilityObserver> dataObserver,DataObsOption opt)531 Status DataObsMgrService::UnregisterObserverExt(sptr<IDataAbilityObserver> dataObserver, DataObsOption opt)
532 {
533 if (dataObserver == nullptr) {
534 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObserver");
535 return DATA_OBSERVER_IS_NULL;
536 }
537
538 if (dataObsMgrInnerExt_ == nullptr) {
539 TAG_LOGE(AAFwkTag::DBOBSMGR, "null dataObsMgrInner");
540 return DATAOBS_SERVICE_INNER_IS_NULL;
541 }
542 if (!IsCallingPermissionValid(opt)) {
543 return DATAOBS_NOT_SYSTEM_APP;
544 }
545
546 return dataObsMgrInnerExt_->HandleUnregisterObserver(dataObserver);
547 }
548
DeepCopyChangeInfo(const ChangeInfo & src,ChangeInfo & dst) const549 Status DataObsMgrService::DeepCopyChangeInfo(const ChangeInfo &src, ChangeInfo &dst) const
550 {
551 dst = src;
552 if (dst.size_ == 0) {
553 return SUCCESS;
554 }
555 dst.data_ = new (std::nothrow) uint8_t[dst.size_];
556 if (dst.data_ == nullptr) {
557 return DATAOBS_SERVICE_INNER_IS_NULL;
558 }
559
560 errno_t ret = memcpy_s(dst.data_, dst.size_, src.data_, src.size_);
561 if (ret != EOK) {
562 delete [] static_cast<uint8_t *>(dst.data_);
563 dst.data_ = nullptr;
564 return DATAOBS_SERVICE_INNER_IS_NULL;
565 }
566 return SUCCESS;
567 }
568
NotifyChangeExt(const ChangeInfo & changeInfo,DataObsOption opt)569 Status DataObsMgrService::NotifyChangeExt(const ChangeInfo &changeInfo, DataObsOption opt)
570 {
571 if (handler_ == nullptr) {
572 TAG_LOGE(AAFwkTag::DBOBSMGR, "null handler");
573 return DATAOBS_SERVICE_HANDLER_IS_NULL;
574 }
575 if (dataObsMgrInner_ == nullptr || dataObsMgrInnerExt_ == nullptr) {
576 LOG_ERROR("dataObsMgrInner_:%{public}d or null dataObsMgrInnerExt", dataObsMgrInner_ == nullptr);
577 return DATAOBS_SERVICE_INNER_IS_NULL;
578 }
579 if (!IsCallingPermissionValid(opt)) {
580 return DATAOBS_NOT_SYSTEM_APP;
581 }
582 auto tokenId = IPCSkeleton::GetCallingTokenID();
583 int userId = GetCallingUserId(tokenId);
584 if (userId == -1) {
585 LOG_ERROR("GetCallingUserId fail, type:%{public}d, userId:%{public}d", changeInfo.changeType_, userId);
586 return DATAOBS_INVALID_USERID;
587 }
588 ChangeInfo changes;
589 Status result = DeepCopyChangeInfo(changeInfo, changes);
590 if (result != SUCCESS) {
591 LOG_ERROR("copy data failed,changeType:%{public}ud,uris num:%{public}zu,null data:%{public}d,size:%{public}ud",
592 changeInfo.changeType_, changeInfo.uris_.size(), changeInfo.data_ == nullptr, changeInfo.size_);
593 return result;
594 }
595 {
596 std::lock_guard<ffrt::mutex> lck(taskCountMutex_);
597 if (taskCount_ >= TASK_COUNT_MAX) {
598 TAG_LOGE(AAFwkTag::DBOBSMGR, "task num maxed, changeType:%{public}ud,"
599 "uris num:%{public}zu, null data:%{public}d, size:%{public}ud",
600 changeInfo.changeType_, changeInfo.uris_.size(), changeInfo.data_ == nullptr, changeInfo.size_);
601 return DATAOBS_SERVICE_TASK_LIMMIT;
602 }
603 ++taskCount_;
604 }
605 handler_->SubmitTask([this, changes, userId, tokenId]() {
606 dataObsMgrInnerExt_->HandleNotifyChange(changes, userId);
607 for (auto &uri : changes.uris_) {
608 ObserverInfo info(tokenId, 0, 0, userId, false);
609 info.errMsg = "NotifyChangeExt";
610 VerifyDataSharePermissionInner(uri, false, info);
611 dataObsMgrInner_->HandleNotifyChange(uri, userId);
612 }
613 delete [] static_cast<uint8_t *>(changes.data_);
614 std::lock_guard<ffrt::mutex> lck(taskCountMutex_);
615 --taskCount_;
616 });
617 return SUCCESS;
618 }
619
GetFocusedAppInfo(int32_t & windowId,sptr<IRemoteObject> & abilityToken) const620 void DataObsMgrService::GetFocusedAppInfo(int32_t &windowId, sptr<IRemoteObject> &abilityToken) const
621 {
622 Rosen::FocusChangeInfo info;
623 #ifdef SCENE_BOARD_ENABLE
624 Rosen::WindowManagerLite::GetInstance().GetFocusWindowInfo(info);
625 #else
626 Rosen::WindowManager::GetInstance().GetFocusWindowInfo(info);
627 #endif
628 windowId = info.windowId_;
629 abilityToken = info.abilityToken_;
630 }
631
GetAbilityManagerService() const632 sptr<IRemoteObject> DataObsMgrService::GetAbilityManagerService() const
633 {
634 auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
635 if (systemAbilityManager == nullptr) {
636 TAG_LOGE(AAFwkTag::DBOBSMGR, "Failed to get ability manager.");
637 return nullptr;
638 }
639 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
640 if (!remoteObject) {
641 TAG_LOGE(AAFwkTag::DBOBSMGR, "Failed to get ability manager service.");
642 return nullptr;
643 }
644 return remoteObject;
645 }
646
NotifyProcessObserver(const std::string & key,const sptr<IRemoteObject> & observer,DataObsOption opt)647 Status DataObsMgrService::NotifyProcessObserver(const std::string &key, const sptr<IRemoteObject> &observer,
648 DataObsOption opt)
649 {
650 if (!IsCallingPermissionValid(opt)) {
651 return DATAOBS_NOT_SYSTEM_APP;
652 }
653 auto remote = GetAbilityManagerService();
654 if (remote == nullptr) {
655 TAG_LOGE(AAFwkTag::DBOBSMGR, "Get ability manager failed.");
656 return DATAOBS_PROXY_INNER_ERR;
657 }
658 auto abilityManager = iface_cast<IAbilityManager>(remote);
659
660 int32_t windowId;
661 sptr<IRemoteObject> callerToken;
662 GetFocusedAppInfo(windowId, callerToken);
663
664 Want want;
665 want.SetElementName(DIALOG_APP, PROGRESS_ABILITY);
666 want.SetAction(PROGRESS_ABILITY);
667 want.SetParam("promptText", std::string(PROMPT_TEXT));
668 want.SetParam("remoteDeviceName", std::string());
669 want.SetParam("progressKey", key);
670 want.SetParam("isRemote", false);
671 want.SetParam("windowId", windowId);
672 want.SetParam("ipcCallback", observer);
673 if (callerToken != nullptr) {
674 want.SetParam("tokenKey", callerToken);
675 } else {
676 TAG_LOGW(AAFwkTag::DBOBSMGR, "CallerToken is nullptr.");
677 }
678
679 int32_t status = IN_PROCESS_CALL(abilityManager->StartAbility(want));
680 if (status != SUCCESS) {
681 TAG_LOGE(AAFwkTag::DBOBSMGR, "ShowProgress fail, status:%{public}d", status);
682 return DATAOBS_PROXY_INNER_ERR;
683 }
684 return SUCCESS;
685 }
686
Dump(int fd,const std::vector<std::u16string> & args)687 int DataObsMgrService::Dump(int fd, const std::vector<std::u16string>& args)
688 {
689 std::string result;
690 Dump(args, result);
691 int ret = dprintf(fd, "%s\n", result.c_str());
692 if (ret < 0) {
693 TAG_LOGE(AAFwkTag::DBOBSMGR, "dprintf error");
694 return DATAOBS_HIDUMP_ERROR;
695 }
696 return SUCCESS;
697 }
698
Dump(const std::vector<std::u16string> & args,std::string & result) const699 void DataObsMgrService::Dump(const std::vector<std::u16string>& args, std::string& result) const
700 {
701 auto size = args.size();
702 if (size == 0) {
703 ShowHelp(result);
704 return;
705 }
706
707 std::string optionKey = Str16ToStr8(args[0]);
708 if (optionKey != "-h") {
709 result.append("error: unkown option.\n");
710 }
711 ShowHelp(result);
712 }
713
ShowHelp(std::string & result) const714 void DataObsMgrService::ShowHelp(std::string& result) const
715 {
716 result.append("Usage:\n")
717 .append("-h ")
718 .append("help text for the tool\n");
719 }
720 } // namespace AAFwk
721 } // namespace OHOS
722