1 /*
2 * Copyright (c) 2022-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 #include "uri_permission_manager_stub_impl.h"
17
18 #include "ability_manager_errors.h"
19 #include "accesstoken_kit.h"
20 #include "hilog_wrapper.h"
21 #include "if_system_ability_manager.h"
22 #include "in_process_call_wrapper.h"
23 #include "ipc_skeleton.h"
24 #include "iservice_registry.h"
25 #include "os_account_manager_wrapper.h"
26 #include "parameter.h"
27 #include "permission_constants.h"
28 #include "permission_verification.h"
29 #include "system_ability_definition.h"
30 #include "want.h"
31
32 namespace OHOS {
33 namespace AAFwk {
34 namespace {
35 constexpr int32_t DEFAULT_USER_ID = 0;
36 constexpr int32_t ERR_OK = 0;
37 const char* GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_PARAMETER = "persist.sys.prepare_terminate";
38 constexpr int32_t GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_SIZE = 6;
39 }
40
Init()41 void UriPermissionManagerStubImpl::Init()
42 {
43 uriPermissionRdb_ = std::make_shared<UriPermissionRdb>();
44 InitPersistableUriPermissionConfig();
45 }
46
CheckPersistableUriPermissionProxy(const Uri & uri,uint32_t flag,uint32_t tokenId)47 bool UriPermissionManagerStubImpl::CheckPersistableUriPermissionProxy(const Uri& uri, uint32_t flag, uint32_t tokenId)
48 {
49 // check if caller can grant persistable uri permission
50 auto uriStr = uri.ToString();
51 return uriPermissionRdb_->CheckPersistableUriPermissionProxy(uriStr, flag, tokenId);
52 }
53
VerifyUriPermission(const Uri & uri,uint32_t flag,uint32_t tokenId)54 bool UriPermissionManagerStubImpl::VerifyUriPermission(const Uri &uri, uint32_t flag, uint32_t tokenId)
55 {
56 // verify if tokenId have uri permission of flag, including temporary permission and persistable permission
57 HILOG_DEBUG("VerifyUriPermission called: flag = %{public}i", static_cast<int>(flag));
58 auto uriStr = uri.ToString();
59 bool tempPermission = false;
60 bool perPermission = false;
61 {
62 std::lock_guard<std::mutex> guard(mutex_);
63 auto search = uriMap_.find(uriStr);
64 if (search != uriMap_.end()) {
65 auto& list = search->second;
66 for (auto it = list.begin(); it != list.end(); it++) {
67 bool condition = (it->targetTokenId == tokenId) &&
68 ((it->flag | Want::FLAG_AUTH_READ_URI_PERMISSION) & flag) != 0;
69 if (condition) {
70 HILOG_DEBUG("temporary uri permission exists");
71 tempPermission = true;
72 break;
73 }
74 }
75 }
76 }
77 if (uriPermissionRdb_->CheckPersistableUriPermissionProxy(uriStr, flag, tokenId)) {
78 HILOG_DEBUG("persistable uri permission exists");
79 tempPermission = true;
80 }
81 if (!tempPermission && !perPermission) {
82 HILOG_DEBUG("uri permission not exists");
83 return false;
84 }
85 return true;
86 }
87
GrantUriPermission(const Uri & uri,unsigned int flag,const std::string targetBundleName,int autoremove,int32_t appIndex)88 int UriPermissionManagerStubImpl::GrantUriPermission(const Uri &uri, unsigned int flag,
89 const std::string targetBundleName, int autoremove, int32_t appIndex)
90 {
91 HILOG_DEBUG("CALL: appIndex is %{public}d.", appIndex);
92 // reject sandbox to grant uri permission
93 ConnectManager(appMgr_, APP_MGR_SERVICE_ID);
94 if (appMgr_ == nullptr) {
95 HILOG_ERROR("Get BundleManager failed!");
96 return INNER_ERR;
97 }
98 auto callerPid = IPCSkeleton::GetCallingPid();
99 bool isSandbox = false;
100 auto ret = appMgr_->JudgeSandboxByPid(callerPid, isSandbox);
101 if (ret != ERR_OK) {
102 HILOG_ERROR("JudgeSandboxByPid failed.");
103 return INNER_ERR;
104 }
105 if (isSandbox) {
106 HILOG_ERROR("Sandbox application can not grant URI permission.");
107 return ERR_CODE_GRANT_URI_PERMISSION;
108 }
109
110 if ((flag & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) {
111 HILOG_WARN("UriPermissionManagerStubImpl::GrantUriPermission: The param flag is invalid.");
112 return ERR_CODE_INVALID_URI_FLAG;
113 }
114 Uri uri_inner = uri;
115 auto&& scheme = uri_inner.GetScheme();
116 if (scheme != "file") {
117 HILOG_WARN("only support file uri.");
118 return ERR_CODE_INVALID_URI_TYPE;
119 }
120 auto&& authority = uri_inner.GetAuthority();
121 auto fromTokenId = GetTokenIdByBundleName(authority, 0);
122 auto targetTokenId = GetTokenIdByBundleName(targetBundleName, appIndex);
123 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
124 unsigned int tmpFlag = 0;
125 ret = GetUriPermissionFlag(uri, flag, fromTokenId, targetTokenId, tmpFlag);
126 if (ret != ERR_OK || tmpFlag == 0) {
127 return ret;
128 }
129 // auto remove URI permission for clipboard
130 Security::AccessToken::NativeTokenInfo nativeInfo;
131 Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
132 HILOG_DEBUG("callerprocessName : %{public}s", nativeInfo.processName.c_str());
133 if (nativeInfo.processName == "pasteboard_serv") {
134 autoremove = 1;
135 }
136 return GrantUriPermissionImpl(uri, tmpFlag, fromTokenId, targetTokenId, autoremove);
137 }
138
GetUriPermissionFlag(const Uri & uri,unsigned int flag,uint32_t fromTokenId,uint32_t targetTokenId,unsigned int & newFlag)139 int UriPermissionManagerStubImpl::GetUriPermissionFlag(const Uri &uri, unsigned int flag,
140 uint32_t fromTokenId, uint32_t targetTokenId, unsigned int &newFlag)
141 {
142 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
143 Uri uri_inner = uri;
144 auto&& authority = uri_inner.GetAuthority();
145 bool authorityFlag = authority == "media" || authority == "docs";
146 auto permission = PermissionVerification::GetInstance()->VerifyCallingPermission(
147 AAFwk::PermissionConstants::PERMISSION_PROXY_AUTHORIZATION_URI);
148 newFlag = flag & Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION;
149 if ((flag & Want::FLAG_AUTH_WRITE_URI_PERMISSION) != 0) {
150 newFlag |= Want::FLAG_AUTH_WRITE_URI_PERMISSION;
151 } else {
152 newFlag |= Want::FLAG_AUTH_READ_URI_PERMISSION;
153 }
154 if (!authorityFlag && !permission && (fromTokenId != callerTokenId)) {
155 HILOG_WARN("UriPermissionManagerStubImpl::GrantUriPermission: No permission for proxy authorization uri.");
156 return CHECK_PERMISSION_FAILED;
157 }
158 if (!authorityFlag) {
159 // ignore persistable uri permission flag.
160 newFlag &= (~Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION);
161 return ERR_OK;
162 }
163
164 if (!isGrantPersistableUriPermissionEnable_) {
165 if (!permission) {
166 HILOG_WARN("Do not have persistable uri permission proxy.");
167 return CHECK_PERMISSION_FAILED;
168 }
169 newFlag &= (~Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION);
170 return ERR_OK;
171 }
172
173 if ((newFlag & Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION) == 0 && CheckPersistableUriPermissionProxy(uri,
174 flag, targetTokenId)) {
175 newFlag = 0;
176 HILOG_DEBUG("persistable uri permission has been granted");
177 return ERR_OK;
178 }
179 if (!permission) {
180 if (!CheckPersistableUriPermissionProxy(uri, flag, callerTokenId)) {
181 HILOG_WARN("Do not have persistable uri permission proxy.");
182 return CHECK_PERMISSION_FAILED;
183 }
184 newFlag |= Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION;
185 }
186 return ERR_OK;
187 }
188
AddTempUriPermission(const std::string & uri,unsigned int flag,TokenId fromTokenId,TokenId targetTokenId,int autoremove)189 int UriPermissionManagerStubImpl::AddTempUriPermission(const std::string &uri, unsigned int flag,
190 TokenId fromTokenId, TokenId targetTokenId, int autoremove)
191 {
192 std::lock_guard<std::mutex> guard(mutex_);
193 auto search = uriMap_.find(uri);
194 GrantInfo info = { flag, fromTokenId, targetTokenId, autoremove };
195 if (search == uriMap_.end()) {
196 HILOG_INFO("Insert an uri r/w permission.");
197 std::list<GrantInfo> infoList = { info };
198 uriMap_.emplace(uri, infoList);
199 return ERR_OK;
200 }
201 auto& infoList = search->second;
202 for (auto& item : infoList) {
203 if (item.fromTokenId == fromTokenId && item.targetTokenId == targetTokenId) {
204 HILOG_DEBUG("Item: flag = %{public}i, fromTokenId = %{public}i, targetTokenId = %{public}i,\
205 autoremove = %{public}i", item.flag, item.fromTokenId, item.targetTokenId, item.autoremove);
206 if ((flag & item.flag) == 0) {
207 HILOG_INFO("Update uri r/w permission.");
208 item.flag = flag;
209 }
210 HILOG_INFO("uri permission has granted, not to grant again.");
211 return ERR_OK;
212 }
213 }
214 infoList.emplace_back(info);
215 return ERR_OK;
216 }
217
DeletTempUriPermission(const std::string & uri,uint32_t flag,uint32_t targetTokenId)218 int UriPermissionManagerStubImpl::DeletTempUriPermission(const std::string &uri, uint32_t flag,
219 uint32_t targetTokenId)
220 {
221 if ((flag & Want::FLAG_AUTH_WRITE_URI_PERMISSION) != 0) {
222 flag |= Want::FLAG_AUTH_READ_URI_PERMISSION;
223 }
224 std::lock_guard<std::mutex> guard(mutex_);
225 auto search = uriMap_.find(uri);
226 if (search == uriMap_.end()) {
227 HILOG_DEBUG("uri do not in uri map.");
228 return ERR_OK;
229 }
230 auto& list = search->second;
231 for (auto it = list.begin(); it != list.end(); it++) {
232 if (it->targetTokenId == targetTokenId && (it->flag & flag) != 0) {
233 HILOG_DEBUG("delet the temporary uri permission in uri map.");
234 list.erase(it);
235 break;
236 }
237 }
238 if (list.size() == 0) {
239 uriMap_.erase(search);
240 }
241 return ERR_OK;
242 }
243
GrantUriPermissionImpl(const Uri & uri,unsigned int flag,TokenId fromTokenId,TokenId targetTokenId,int autoremove)244 int UriPermissionManagerStubImpl::GrantUriPermissionImpl(const Uri &uri, unsigned int flag,
245 TokenId fromTokenId, TokenId targetTokenId, int autoremove)
246 {
247 HILOG_INFO("uri = %{private}s, flag = %{public}i, fromTokenId = %{public}i, targetTokenId = %{public}i,\
248 autoremove = %{public}i", uri.ToString().c_str(), flag, fromTokenId, targetTokenId, autoremove);
249 ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
250 if (storageManager_ == nullptr) {
251 HILOG_ERROR("ConnectManager failed");
252 return INNER_ERR;
253 }
254 auto uriStr = uri.ToString();
255 auto ret = storageManager_->CreateShareFile(uriStr, targetTokenId, flag);
256 if (ret != 0 && ret != -EEXIST) {
257 HILOG_ERROR("failed to CreateShareFile.");
258 return INNER_ERR;
259 }
260 // grant persistable uri permission
261 if ((flag & Want::FLAG_AUTH_PERSISTABLE_URI_PERMISSION) != 0) {
262 ret = uriPermissionRdb_->AddGrantInfo(uriStr, flag, fromTokenId, targetTokenId);
263 if (ret == ERR_OK) {
264 // delete temporary uri permission
265 ret = DeletTempUriPermission(uriStr, flag, targetTokenId);
266 }
267 return ret;
268 }
269 // grant temporary uri permission
270 ret = AddTempUriPermission(uriStr, flag, fromTokenId, targetTokenId, autoremove);
271 return ret;
272 }
273
RevokeUriPermission(const TokenId tokenId)274 void UriPermissionManagerStubImpl::RevokeUriPermission(const TokenId tokenId)
275 {
276 HILOG_INFO("Start to remove uri permission.");
277 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
278 Security::AccessToken::NativeTokenInfo nativeInfo;
279 Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
280 HILOG_DEBUG("callerprocessName : %{public}s", nativeInfo.processName.c_str());
281 if (nativeInfo.processName != "foundation") {
282 HILOG_ERROR("RevokeUriPermission can only be called by foundation");
283 return;
284 }
285 std::vector<std::string> uriList;
286 {
287 std::lock_guard<std::mutex> guard(mutex_);
288 for (auto iter = uriMap_.begin(); iter != uriMap_.end();) {
289 auto& list = iter->second;
290 for (auto it = list.begin(); it != list.end(); it++) {
291 if (it->targetTokenId == tokenId && it->autoremove) {
292 HILOG_INFO("Erase an info form list.");
293 list.erase(it);
294 uriList.emplace_back(iter->first);
295 break;
296 }
297 }
298 if (list.size() == 0) {
299 uriMap_.erase(iter++);
300 } else {
301 iter++;
302 }
303 }
304 }
305
306 ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
307 if (storageManager_ == nullptr) {
308 HILOG_ERROR("ConnectManager failed");
309 return;
310 }
311
312 if (!uriList.empty()) {
313 storageManager_->DeleteShareFile(tokenId, uriList);
314 }
315 }
316
RevokeAllUriPermissions(uint32_t tokenId)317 int UriPermissionManagerStubImpl::RevokeAllUriPermissions(uint32_t tokenId)
318 {
319 HILOG_INFO("Start to remove all uri permission for uninstalled app or clear app data.");
320 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
321 Security::AccessToken::NativeTokenInfo nativeInfo;
322 Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(callerTokenId, nativeInfo);
323 if (nativeInfo.processName != "foundation") {
324 HILOG_ERROR("RevokeAllUriPermission can only be called by foundation");
325 return CHECK_PERMISSION_FAILED;
326 }
327 std::map<unsigned int, std::vector<std::string>> uriLists;
328 {
329 std::lock_guard<std::mutex> guard(mutex_);
330 // delte temporary uri permission
331 for (auto iter = uriMap_.begin(); iter != uriMap_.end();) {
332 auto& list = iter->second;
333 for (auto it = list.begin(); it != list.end();) {
334 if (it->targetTokenId == static_cast<uint32_t>(tokenId) ||
335 it->fromTokenId == static_cast<uint32_t>(tokenId)) {
336 HILOG_INFO("Erase an info form list.");
337 uriLists[it->targetTokenId].emplace_back(iter->first);
338 list.erase(it++);
339 } else {
340 it++;
341 }
342 }
343 if (list.size() == 0) {
344 uriMap_.erase(iter++);
345 } else {
346 iter++;
347 }
348 }
349 }
350
351 ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
352 if (storageManager_ == nullptr) {
353 HILOG_ERROR("ConnectStorageManager failed");
354 return INNER_ERR;
355 }
356
357 if (!uriLists.empty()) {
358 for (auto iter = uriLists.begin(); iter != uriLists.end(); iter++) {
359 storageManager_->DeleteShareFile(iter->first, iter->second);
360 }
361 }
362
363 if (!isGrantPersistableUriPermissionEnable_) {
364 return ERR_OK;
365 }
366 // delete persistable uri permission
367 auto ret = uriPermissionRdb_->RemoveGrantInfo(tokenId, storageManager_);
368 return ret;
369 }
370
RevokeUriPermissionManually(const Uri & uri,const std::string bundleName)371 int UriPermissionManagerStubImpl::RevokeUriPermissionManually(const Uri &uri, const std::string bundleName)
372 {
373 HILOG_INFO("Start to remove uri permission manually.");
374 Uri uri_inner = uri;
375 auto uriStr = uri.ToString();
376 auto&& authority = uri_inner.GetAuthority();
377 auto&& scheme = uri_inner.GetScheme();
378 if (scheme != "file") {
379 HILOG_WARN("only support file uri.");
380 return ERR_CODE_INVALID_URI_TYPE;
381 }
382 auto uriTokenId = GetTokenIdByBundleName(authority, 0);
383 auto tokenId = GetTokenIdByBundleName(bundleName, 0);
384 auto callerTokenId = IPCSkeleton::GetCallingTokenID();
385 VerifyUriPermission(uri, Want::FLAG_AUTH_READ_URI_PERMISSION, tokenId);
386 VerifyUriPermission(uri, Want::FLAG_AUTH_WRITE_URI_PERMISSION, tokenId);
387 auto permission = PermissionVerification::GetInstance()->VerifyCallingPermission(
388 AAFwk::PermissionConstants::PERMISSION_PROXY_AUTHORIZATION_URI);
389 bool authorityFlag = authority == "media" || authority == "docs";
390
391 if (!authorityFlag && (uriTokenId != callerTokenId) && (tokenId != callerTokenId)) {
392 HILOG_WARN("UriPermissionManagerStubImpl::RevokeUriPermission: No permission for revoke uri.");
393 return CHECK_PERMISSION_FAILED;
394 }
395
396 if (authorityFlag && !permission && tokenId != callerTokenId) {
397 HILOG_WARN("UriPermissionManagerStubImpl::RevokeUriPermission: No permission for revoke uri.");
398 return CHECK_PERMISSION_FAILED;
399 }
400
401 if (authorityFlag && isGrantPersistableUriPermissionEnable_) {
402 // delete persistable grant info
403 ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
404 if (storageManager_ == nullptr) {
405 HILOG_ERROR("ConnectStorageManager failed");
406 return INNER_ERR;
407 }
408 auto ret = uriPermissionRdb_->RemoveGrantInfo(uriStr, tokenId, storageManager_);
409 if (ret != ERR_OK) {
410 HILOG_ERROR("remove persistable uri permission failed.");
411 return INNER_ERR;
412 }
413 }
414 // delete temporary grant info
415 return DeletTempUriPermissionAndShareFile(uriStr, tokenId);
416 }
417
DeletTempUriPermissionAndShareFile(const std::string & uri,uint32_t targetTokenId)418 int UriPermissionManagerStubImpl::DeletTempUriPermissionAndShareFile(const std::string &uri, uint32_t targetTokenId)
419 {
420 ConnectManager(storageManager_, STORAGE_MANAGER_MANAGER_ID);
421 if (storageManager_ == nullptr) {
422 HILOG_ERROR("ConnectStorageManager failed");
423 return INNER_ERR;
424 }
425 std::vector<std::string> uriList;
426 std::lock_guard<std::mutex> guard(mutex_);
427
428 auto search = uriMap_.find(uri);
429 if (search == uriMap_.end()) {
430 HILOG_INFO("URI does not exist on uri map.");
431 return ERR_OK;
432 }
433 auto& list = search->second;
434 for (auto it = list.begin(); it != list.end(); it++) {
435 if (it->targetTokenId == targetTokenId) {
436 HILOG_INFO("Erase an info form list.");
437 uriList.emplace_back(search->first);
438 if (storageManager_->DeleteShareFile(targetTokenId, uriList) == ERR_OK) {
439 list.erase(it);
440 break;
441 } else {
442 HILOG_ERROR("DeleteShareFile failed");
443 return INNER_ERR;
444 }
445 }
446 }
447 if (list.size() == 0) {
448 uriMap_.erase(search);
449 }
450 return ERR_OK;
451 }
452
453 template<typename T>
ConnectManager(sptr<T> & mgr,int32_t serviceId)454 void UriPermissionManagerStubImpl::ConnectManager(sptr<T> &mgr, int32_t serviceId)
455 {
456 HILOG_DEBUG("Call.");
457 std::lock_guard<std::mutex> lock(mgrMutex_);
458 if (mgr == nullptr) {
459 HILOG_ERROR("mgr is nullptr.");
460 auto systemAbilityMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
461 if (systemAbilityMgr == nullptr) {
462 HILOG_ERROR("Failed to get SystemAbilityManager.");
463 return;
464 }
465
466 auto remoteObj = systemAbilityMgr->GetSystemAbility(serviceId);
467 if (remoteObj == nullptr) {
468 HILOG_ERROR("Failed to get mgr.");
469 return;
470 }
471 HILOG_ERROR("to cast.");
472 mgr = iface_cast<T>(remoteObj);
473 if (mgr == nullptr) {
474 HILOG_ERROR("Failed to cast.");
475 return;
476 }
477 wptr<T> manager = mgr;
478 auto self = weak_from_this();
479 auto onClearProxyCallback = [manager, self](const auto& remote) {
480 auto mgrSptr = manager.promote();
481 auto impl = self.lock();
482 if (impl && mgrSptr && mgrSptr->AsObject() == remote.promote()) {
483 std::lock_guard<std::mutex> lock(impl->mgrMutex_);
484 mgrSptr.clear();
485 }
486 };
487 sptr<ProxyDeathRecipient> recipient(new ProxyDeathRecipient(std::move(onClearProxyCallback)));
488 if (!mgr->AsObject()->AddDeathRecipient(recipient)) {
489 HILOG_ERROR("AddDeathRecipient failed.");
490 }
491 }
492 }
493
GetTokenIdByBundleName(const std::string bundleName,int32_t appIndex)494 uint32_t UriPermissionManagerStubImpl::GetTokenIdByBundleName(const std::string bundleName, int32_t appIndex)
495 {
496 ConnectManager(bundleManager_, BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
497 if (bundleManager_ == nullptr) {
498 HILOG_WARN("Failed to get bms.");
499 return GET_BUNDLE_MANAGER_SERVICE_FAILED;
500 }
501 auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO;
502 AppExecFwk::BundleInfo bundleInfo;
503 auto userId = GetCurrentAccountId();
504 if (appIndex == 0) {
505 if (!IN_PROCESS_CALL(bundleManager_->GetBundleInfo(bundleName, bundleFlag, bundleInfo, userId))) {
506 HILOG_WARN("Failed to get bundle info according to uri.");
507 return GET_BUNDLE_INFO_FAILED;
508 }
509 } else {
510 if (IN_PROCESS_CALL(bundleManager_->GetSandboxBundleInfo(bundleName, appIndex, userId, bundleInfo) != ERR_OK)) {
511 HILOG_WARN("Failed to get bundle info according to appIndex.");
512 return GET_BUNDLE_INFO_FAILED;
513 }
514 }
515 return bundleInfo.applicationInfo.accessTokenId;
516 }
517
OnRemoteDied(const wptr<IRemoteObject> & remote)518 void UriPermissionManagerStubImpl::ProxyDeathRecipient::OnRemoteDied(
519 [[maybe_unused]] const wptr<IRemoteObject>& remote)
520 {
521 if (proxy_) {
522 HILOG_DEBUG("mgr stub died.");
523 proxy_(remote);
524 }
525 }
526
GetCurrentAccountId() const527 int32_t UriPermissionManagerStubImpl::GetCurrentAccountId() const
528 {
529 std::vector<int32_t> osActiveAccountIds;
530 auto ret = DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->
531 QueryActiveOsAccountIds(osActiveAccountIds);
532 if (ret != ERR_OK) {
533 HILOG_ERROR("QueryActiveOsAccountIds failed.");
534 return DEFAULT_USER_ID;
535 }
536 if (osActiveAccountIds.empty()) {
537 HILOG_ERROR("%{public}s, QueryActiveOsAccountIds is empty, no accounts.", __func__);
538 return DEFAULT_USER_ID;
539 }
540
541 return osActiveAccountIds.front();
542 }
543
InitPersistableUriPermissionConfig()544 void UriPermissionManagerStubImpl::InitPersistableUriPermissionConfig()
545 {
546 char value[GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_SIZE] = "false";
547 int retSysParam = GetParameter(GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_PARAMETER, "false", value,
548 GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_SIZE);
549 HILOG_INFO("GrantPersistableUriPermissionEnable, %{public}s value is %{public}s.",
550 GRANT_PERSISTABLE_URI_PERMISSION_ENABLE_PARAMETER, value);
551 if (retSysParam > 0 && !std::strcmp(value, "true")) {
552 isGrantPersistableUriPermissionEnable_ = true;
553 }
554 }
555 } // namespace AAFwk
556 } // namespace OHOS