• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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