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