From 91cd4f664c7dbe92c88b62c357705698718e5e87 Mon Sep 17 00:00:00 2001 From: yuwenze Date: Fri, 10 Feb 2023 05:50:04 +0000 Subject: [PATCH] add uri permission Signed-off-by: yuwenze Change-Id: Ia4e487609c554b938d830e13c210d0d04534954b --- .../napi/uri_permission/js_uri_perm_mgr.cpp | 71 ----------- .../native/appkit/app/application_impl.cpp | 23 ---- interfaces/inner_api/uri_permission/BUILD.gn | 1 + .../uri_permission_manager_interface.h | 2 +- .../src/uri_permission_manager_client.cpp | 1 - .../kits/native/appkit/app/application_impl.h | 2 - .../include/ability_manager_service.h | 4 - services/abilitymgr/include/ability_record.h | 11 +- .../abilitymgr/include/mission_list_manager.h | 2 +- .../src/ability_manager_service.cpp | 83 ------------- services/abilitymgr/src/ability_record.cpp | 61 ++++++++-- .../src/implicit_start_processor.cpp | 10 +- .../abilitymgr/src/mission_list_manager.cpp | 5 +- services/appmgr/src/app_mgr_service_inner.cpp | 7 -- services/sa_profile/183.xml | 2 +- services/uripermmgr/BUILD.gn | 2 + .../uri_permission_manager_stub_impl.h | 14 ++- .../src/uri_permission_manager_service.cpp | 3 + .../src/uri_permission_manager_stub_impl.cpp | 110 ++++++++++++++---- .../abilitymanagerserviced_fuzzer.cpp | 2 - .../abilitymanagerservicefirst_fuzzer.cpp | 2 - .../uripermissionmanager_fuzzer/BUILD.gn | 1 + .../ability_manager_service_test/BUILD.gn | 1 - .../ability_manager_service_test.cpp | 55 --------- .../ability_record_test.cpp | 96 ++++++++++++++- .../application_impl_test.cpp | 77 ------------ 26 files changed, 267 insertions(+), 381 deletions(-) diff --git a/frameworks/js/napi/uri_permission/js_uri_perm_mgr.cpp b/frameworks/js/napi/uri_permission/js_uri_perm_mgr.cpp index 028db28fd05..b2e3f60854d 100644 --- a/frameworks/js/napi/uri_permission/js_uri_perm_mgr.cpp +++ b/frameworks/js/napi/uri_permission/js_uri_perm_mgr.cpp @@ -33,75 +33,6 @@ public: HILOG_INFO("JsUriPermMgr::Finalizer is called"); std::unique_ptr(static_cast(data)); } - - static NativeValue* VerifyUriPermission(NativeEngine* engine, NativeCallbackInfo* info) - { - JsUriPermMgr* me = CheckParamsAndGetThis(engine, info); - return (me != nullptr) ? me->OnVerifyUriPermission(*engine, *info) : nullptr; - } - -private: - NativeValue* OnVerifyUriPermission(NativeEngine& engine, NativeCallbackInfo& info) - { - HILOG_DEBUG("OnVerifyUriPermission is called"); - constexpr int32_t argCount = 5; - if (info.argc > argCount) { - HILOG_ERROR("Too many parameters"); - ThrowTooFewParametersError(engine); - return engine.CreateUndefined(); - } - std::vector> args; - for (size_t i = 0; i < info.argc; ++i) { - args.emplace_back(engine.CreateReference(info.argv[i], 1)); - } - - constexpr int32_t argCountThree = 3; - AsyncTask::CompleteCallback complete = - [args, argCountThree](NativeEngine& engine, AsyncTask& task, int32_t status) { - constexpr int32_t argCountFour = 4; - if (args.size() != argCountThree && args.size() != argCountFour) { - HILOG_ERROR("Wrong number of parameters."); - task.Reject(engine, CreateJsError(engine, -1, "Wrong number of parameters.")); - return; - } - - std::string uriStr; - if (!ConvertFromJsValue(engine, args[0]->Get(), uriStr)) { - HILOG_ERROR("%{public}s called, the first parameter is invalid.", __func__); - task.Reject(engine, CreateJsError(engine, -1, "uri conversion failed.")); - return; - } - - int flag = 0; - if (!ConvertFromJsValue(engine, args[1]->Get(), flag)) { - HILOG_ERROR("%{public}s called, the second parameter is invalid.", __func__); - task.Reject(engine, CreateJsError(engine, -1, "flag conversion failed.")); - return; - } - - int accessTokenId = 0; - constexpr int32_t index = 2; - if (!ConvertFromJsValue(engine, args[index]->Get(), accessTokenId)) { - HILOG_ERROR("%{public}s called, the third parameter is invalid.", __func__); - task.Reject(engine, CreateJsError(engine, -1, "accessTokenId conversion failed.")); - return; - } - - Uri uri(uriStr); - if (AAFwk::UriPermissionManagerClient::GetInstance()->VerifyUriPermission(uri, flag, accessTokenId)) { - task.Resolve(engine, CreateJsValue(engine, 0)); - } else { - task.Reject(engine, CreateJsError(engine, -1, "The app doesn't have the uri permission!")); - } - }; - - NativeValue* lastParam = (info.argc == argCountThree) ? nullptr : info.argv[argCountThree]; - NativeValue* result = nullptr; - AsyncTask::Schedule("JsUriPermMgr::OnVerifyUriPermission", - engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result)); - HILOG_DEBUG("OnVerifyUriPermission is called end"); - return result; - } }; NativeValue* CreateJsUriPermMgr(NativeEngine* engine, NativeValue* exportObj) @@ -121,8 +52,6 @@ NativeValue* CreateJsUriPermMgr(NativeEngine* engine, NativeValue* exportObj) std::unique_ptr jsUriPermMgr = std::make_unique(); object->SetNativePointer(jsUriPermMgr.release(), JsUriPermMgr::Finalizer, nullptr); - const char *moduleName = "JsUriPermMgr"; - BindNativeFunction(*engine, *object, "verifyUriPermission", moduleName, JsUriPermMgr::VerifyUriPermission); return engine->CreateUndefined(); } } // namespace AbilityRuntime diff --git a/frameworks/native/appkit/app/application_impl.cpp b/frameworks/native/appkit/app/application_impl.cpp index abb67856f88..3f63bc9e2f4 100644 --- a/frameworks/native/appkit/app/application_impl.cpp +++ b/frameworks/native/appkit/app/application_impl.cpp @@ -105,7 +105,6 @@ bool ApplicationImpl::PerformTerminate() if (curState_ == APP_STATE_BACKGROUND && application_ != nullptr) { application_->OnTerminate(); curState_ = APP_STATE_TERMINATED; - RemoveUriPermission(); return true; } HILOG_ERROR("ApplicationImpl::performTerminate error! curState is %{public}d", curState_); @@ -126,28 +125,6 @@ void ApplicationImpl::PerformTerminateStrong() return; } application_->OnTerminate(); - RemoveUriPermission(); -} - -void ApplicationImpl::RemoveUriPermission() -{ - if (application_ == nullptr) { - HILOG_ERROR("ApplicationImpl::RemoveUriPermission: invalid application_."); - return; - } - - auto appContext = application_->GetAppContext(); - if (!appContext) { - HILOG_ERROR("ApplicationImpl::RemoveUriPermission: Get appliction context failed."); - return; - } - auto appInfo = appContext->GetApplicationInfo(); - if (!appInfo) { - HILOG_ERROR("ApplicationImpl::RemoveUriPermission: Get appliction info failed."); - return; - } - auto uriPermMgrClient = AAFwk::UriPermissionManagerClient::GetInstance(); - uriPermMgrClient->RemoveUriPermission(appInfo->accessTokenId); } /** diff --git a/interfaces/inner_api/uri_permission/BUILD.gn b/interfaces/inner_api/uri_permission/BUILD.gn index 01f40664549..8367ddab6b8 100644 --- a/interfaces/inner_api/uri_permission/BUILD.gn +++ b/interfaces/inner_api/uri_permission/BUILD.gn @@ -42,6 +42,7 @@ ohos_shared_library("uri_permission_mgr") { "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", "samgr:samgr_proxy", + "storage_service:storage_manager_sa_proxy", ] subsystem_name = "ability" diff --git a/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h b/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h index 44e3bbbf243..17b286a2363 100644 --- a/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h +++ b/interfaces/inner_api/uri_permission/include/uri_permission_manager_interface.h @@ -24,7 +24,7 @@ namespace OHOS { namespace AAFwk { class IUriPermissionManager : public IRemoteBroker { public: - DECLARE_INTERFACE_DESCRIPTOR(u"ohos.aafwk.UriPermissionManager"); + DECLARE_INTERFACE_DESCRIPTOR(u"ohos.ability.UriPermissionManager"); /** * @brief Authorize the uri permission of fromTokenId to targetTokenId. diff --git a/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp b/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp index d789fc1cce8..7b8b3a48129 100644 --- a/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp +++ b/interfaces/inner_api/uri_permission/src/uri_permission_manager_client.cpp @@ -54,7 +54,6 @@ void UriPermissionManagerClient::RemoveUriPermission(const Security::AccessToken sptr UriPermissionManagerClient::ConnectUriPermService() { - return nullptr; HILOG_DEBUG("UriPermissionManagerClient::ConnectUriPermService is called."); std::lock_guard lock(mutex_); if (uriPermMgr_ == nullptr) { diff --git a/interfaces/kits/native/appkit/app/application_impl.h b/interfaces/kits/native/appkit/app/application_impl.h index dc3435c959b..aa050697254 100644 --- a/interfaces/kits/native/appkit/app/application_impl.h +++ b/interfaces/kits/native/appkit/app/application_impl.h @@ -141,8 +141,6 @@ private: int recordId_; std::shared_ptr application_ = nullptr; - void RemoveUriPermission(); - DISALLOW_COPY_AND_MOVE(ApplicationImpl); }; } // namespace AppExecFwk diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index ada47b7d4e2..cd2bef8dde1 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -733,8 +733,6 @@ public: bool IsAbilityControllerStartById(int32_t missionId); - void GrantUriPermission(const Want &want, int32_t validUserId, uint32_t targetTokenId); - bool IsComponentInterceptionStart(const Want &want, const sptr &callerToken, int requestCode, int componentStatus, AbilityRequest &request); @@ -1067,8 +1065,6 @@ private: std::map dumpsysFuncMap_; int CheckStaticCfgPermission(AppExecFwk::AbilityInfo &abilityInfo); - void GrantUriPermission(const Want &want, int32_t validUserId); - bool VerifyUriPermission(const AbilityRequest &abilityRequest, const Want &want); bool GetValidDataAbilityUri(const std::string &abilityInfoUri, std::string &adjustUri); diff --git a/services/abilitymgr/include/ability_record.h b/services/abilitymgr/include/ability_record.h index f69f08f4566..5276bf19254 100644 --- a/services/abilitymgr/include/ability_record.h +++ b/services/abilitymgr/include/ability_record.h @@ -203,6 +203,7 @@ struct AbilityRequest { int callerUid = -1; AbilityCallType callType = AbilityCallType::INVALID_TYPE; sptr callerToken = nullptr; + uint32_t callerAccessTokenId = -1; sptr connect = nullptr; std::shared_ptr startSetting = nullptr; @@ -824,6 +825,7 @@ public: void SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack); std::shared_ptr GetOtherMissionStackAbilityRecord() const; void SetOtherMissionStackAbilityRecord(const std::shared_ptr &abilityRecord); + void RemoveUriPermission() const; protected: void SendEvent(uint32_t msg, uint32_t timeOut); @@ -842,8 +844,8 @@ private: */ void GetAbilityTypeString(std::string &typeStr); void OnSchedulerDied(const wptr &remote); - void GrantUriPermission(const Want &want); - int GetCurrentAccountId(); + void GrantUriPermission(const Want &want, int32_t userId, uint32_t targetTokenId) const; + int32_t GetCurrentAccountId() const; /** * add system ability caller record @@ -856,6 +858,10 @@ private: void HandleDlpAttached(); void HandleDlpClosed(); + inline void SetCallerAccessTokenId(uint32_t callerAccessTokenId) + { + callerAccessTokenId_ = callerAccessTokenId; + } #ifdef SUPPORT_GRAPHICS std::shared_ptr GetWantFromMission() const; @@ -979,6 +985,7 @@ private: std::shared_ptr startingWindowBg_ = nullptr; #endif + uint32_t callerAccessTokenId_ = -1; bool isNeedBackToOtherMissionStack_ = false; std::weak_ptr otherMissionStackAbilityRecord_; // who starts this ability record by SA }; diff --git a/services/abilitymgr/include/mission_list_manager.h b/services/abilitymgr/include/mission_list_manager.h index 4674b64f3d0..ef8313958ed 100644 --- a/services/abilitymgr/include/mission_list_manager.h +++ b/services/abilitymgr/include/mission_list_manager.h @@ -50,7 +50,7 @@ public: * @param abilityRequest, the request of the service ability to start. * @return Returns ERR_OK on success, others on failure. */ - int StartAbility(const AbilityRequest &abilityRequest); + int StartAbility(AbilityRequest &abilityRequest); /** * MinimizeAbility, minimize the special ability. diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 60fa2860727..f996b572658 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -501,7 +501,6 @@ int AbilityManagerService::StartAbilityInner(const Want &want, const sptrGetBundleInfo(bundleName, bundleFlag, bundleInfo, validUserId))) { - HILOG_ERROR("Get bundle info failed."); - return; - } - - auto targetTokenId = bundleInfo.applicationInfo.accessTokenId; - GrantUriPermission(want, validUserId, targetTokenId); -} - -void AbilityManagerService::GrantUriPermission(const Want &want, int32_t validUserId, uint32_t targetTokenId) -{ - auto bms = GetBundleManager(); - CHECK_POINTER_IS_NULLPTR(bms); - auto uriStr = want.GetUri().ToString(); - auto uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM); - uriVec.emplace_back(uriStr); - auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance(); - auto fromTokenId = IPCSkeleton::GetCallingTokenID(); - AppExecFwk::ExtensionAbilityInfo info; - for (auto str : uriVec) { - if (!IN_PROCESS_CALL(bms->QueryExtensionAbilityInfoByUri(str, validUserId, info))) { - HILOG_WARN("Not found ExtensionAbilityInfo according to the uri."); - continue; - } - if (info.type != AppExecFwk::ExtensionAbilityType::FILESHARE) { - HILOG_WARN("The upms only open to FILESHARE. The type is %{public}u.", info.type); - HILOG_WARN("BundleName: %{public}s, AbilityName: %{public}s.", info.bundleName.c_str(), info.name.c_str()); - continue; - } - if (fromTokenId != info.applicationInfo.accessTokenId) { - HILOG_WARN("Only the uri of this application can be authorized."); - continue; - } - - Uri uri(str); - IN_PROCESS_CALL_WITHOUT_RET(upmClient->GrantUriPermission(uri, want.GetFlags(), fromTokenId, targetTokenId)); - } -} - int AbilityManagerService::TerminateAbility(const sptr &token, int resultCode, const Want *resultWant) { auto abilityRecord = Token::GetAbilityRecordByToken(token); @@ -1664,11 +1606,6 @@ int AbilityManagerService::ConnectLocalAbility(const Want &want, const int32_t u return ERR_STATIC_CFG_PERMISSION; } - if (!VerifyUriPermission(abilityRequest, want)) { - HILOG_ERROR("The uri has not granted."); - return ERR_INVALID_OPERATION; - } - auto type = abilityInfo.type; if (type != AppExecFwk::AbilityType::SERVICE && type != AppExecFwk::AbilityType::EXTENSION) { HILOG_ERROR("Connect ability failed, target ability is not Service."); @@ -4985,26 +4922,6 @@ bool AbilityManagerService::IsNeedTimeoutForTest(const std::string &abilityName, return false; } -bool AbilityManagerService::VerifyUriPermission(const AbilityRequest &abilityRequest, const Want &want) -{ - if (abilityRequest.abilityInfo.extensionAbilityType != AppExecFwk::ExtensionAbilityType::FILESHARE) { - HILOG_DEBUG("Only FILESHARE need to Verify uri permission."); - return true; - } - auto uriStr = want.GetUri().ToString(); - auto uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM); - uriVec.emplace_back(uriStr); - auto targetTokenId = IPCSkeleton::GetCallingTokenID(); - auto uriPermMgrClient = AAFwk::UriPermissionManagerClient::GetInstance(); - for (auto str : uriVec) { - Uri uri(str); - if (uriPermMgrClient->VerifyUriPermission(uri, want.GetFlags(), targetTokenId)) { - return true; - } - } - return false; -} - bool AbilityManagerService::GetValidDataAbilityUri(const std::string &abilityInfoUri, std::string &adjustUri) { // note: do not use abilityInfo.uri directly, need check uri first. diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index 6ea2a3968e3..c01a4e1b8a5 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -28,6 +28,7 @@ #include "connection_state_manager.h" #include "hitrace_meter.h" #include "image_source.h" +#include "in_process_call_wrapper.h" #include "errors.h" #include "event_report.h" #include "hilog_wrapper.h" @@ -170,6 +171,7 @@ std::shared_ptr AbilityRecord::CreateAbilityRecord(const AbilityR CHECK_POINTER_AND_RETURN(abilityRecord, nullptr); abilityRecord->SetUid(abilityRequest.uid); abilityRecord->SetAppIndex(abilityRequest.want.GetIntParam(DLP_INDEX, 0)); + abilityRecord->SetCallerAccessTokenId(abilityRequest.callerAccessTokenId); if (!abilityRecord->Init()) { HILOG_ERROR("failed to init new ability record"); return nullptr; @@ -236,7 +238,7 @@ int AbilityRecord::LoadAbility() HILOG_ERROR("Root launcher restart is out of max count."); return ERR_INVALID_VALUE; } - + if (isRestarting_) { restartTime_ = AbilityUtil::SystemTimeMillis(); } @@ -292,6 +294,7 @@ void AbilityRecord::ForegroundAbility(uint32_t sceneFlag) CHECK_POINTER(lifecycleDeal_); SendEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, AbilityManagerService::FOREGROUND_TIMEOUT); + GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId); // schedule active after updating AbilityState and sending timeout message to avoid ability async callback // earlier than above actions. @@ -1269,8 +1272,8 @@ void AbilityRecord::SendResult() std::lock_guard guard(lock_); CHECK_POINTER(scheduler_); CHECK_POINTER(result_); + GrantUriPermission(result_->resultWant_, GetCurrentAccountId(), applicationInfo_.accessTokenId); scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_); - GrantUriPermission(result_->resultWant_); // reset result to avoid send result next time result_.reset(); } @@ -1751,6 +1754,7 @@ void AbilityRecord::OnSchedulerDied(const wptr &remote) return; } + RemoveUriPermission(); if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) { auto schedulerObject = scheduler_->AsObject(); if (schedulerObject != nullptr) { @@ -2040,6 +2044,7 @@ void AbilityRecord::CallRequest() const HILOG_INFO("Call Request."); CHECK_POINTER(scheduler_); + GrantUriPermission(want_, GetCurrentAccountId(), applicationInfo_.accessTokenId); // Async call request scheduler_->CallRequest(); } @@ -2195,20 +2200,52 @@ void AbilityRecord::DumpAbilityInfoDone(std::vector &infos) dumpCondition_.notify_all(); } -void AbilityRecord::GrantUriPermission(const Want &want) +void AbilityRecord::GrantUriPermission(const Want &want, int32_t userId, uint32_t targetTokenId) const { - HILOG_DEBUG("AbilityRecord::GrantUriPermission is called."); - auto flags = want.GetFlags(); - if (flags & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) { - HILOG_INFO("Want to grant r/w permission of the uri"); - auto targetTokenId = abilityInfo_.applicationInfo.accessTokenId; - auto abilityMgr = DelayedSingleton::GetInstance(); - if (abilityMgr) { - abilityMgr->GrantUriPermission(want, GetCurrentAccountId(), targetTokenId); + if ((want.GetFlags() & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) == 0) { + HILOG_WARN("Do not call uriPermissionMgr."); + return; + } + + auto bms = AbilityUtil::GetBundleManager(); + CHECK_POINTER_IS_NULLPTR(bms); + auto&& uriVec = want.GetStringArrayParam(AbilityConfig::PARAMS_STREAM); + HILOG_DEBUG("GrantUriPermission uriVec size: %{public}u", uriVec.size()); + auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance(); + auto bundleFlag = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO; + auto fromTokenId = IPCSkeleton::GetCallingTokenID(); + for (auto&& str : uriVec) { + Uri uri(str); + auto&& scheme = uri.GetScheme(); + HILOG_INFO("uri scheme is %{public}s.", scheme.c_str()); + // only support file scheme + if (scheme != "file") { + HILOG_WARN("only support file uri."); + continue; } + auto&& authority = uri.GetAuthority(); + HILOG_INFO("uri authority is %{public}s.", authority.c_str()); + AppExecFwk::BundleInfo uriBundleInfo; + if (!IN_PROCESS_CALL(bms->GetBundleInfo(authority, bundleFlag, uriBundleInfo, userId))) { + HILOG_WARN("To fail to get bundle info according to uri."); + continue; + } + if (uriBundleInfo.applicationInfo.accessTokenId != fromTokenId && + uriBundleInfo.applicationInfo.accessTokenId != callerAccessTokenId_) { + HILOG_ERROR("the uri does not belong to caller."); + continue; + } + IN_PROCESS_CALL_WITHOUT_RET(upmClient->GrantUriPermission(uri, want.GetFlags(), + callerAccessTokenId_, targetTokenId)); } } +void AbilityRecord::RemoveUriPermission() const +{ + auto upmClient = AAFwk::UriPermissionManagerClient::GetInstance(); + upmClient->RemoveUriPermission(applicationInfo_.accessTokenId); +} + void AbilityRecord::HandleDlpAttached() { if (abilityInfo_.bundleName == DLP_BUNDLE_NAME) { @@ -2231,7 +2268,7 @@ void AbilityRecord::HandleDlpClosed() } } -int AbilityRecord::GetCurrentAccountId() +int32_t AbilityRecord::GetCurrentAccountId() const { std::vector osActiveAccountIds; ErrCode ret = DelayedSingleton::GetInstance()-> diff --git a/services/abilitymgr/src/implicit_start_processor.cpp b/services/abilitymgr/src/implicit_start_processor.cpp index 30f1c313cfd..c6b3a9da2a9 100644 --- a/services/abilitymgr/src/implicit_start_processor.cpp +++ b/services/abilitymgr/src/implicit_start_processor.cpp @@ -67,13 +67,13 @@ int ImplicitStartProcessor::ImplicitStartAbility(AbilityRequest &request, int32_ return ret; } - auto startAbilityTask = [imp = shared_from_this(), request, userId, - identity = IPCSkeleton::ResetCallingIdentity()](const std::string& bundle, const std::string& abilityName) { + auto identity = IPCSkeleton::ResetCallingIdentity(); + auto startAbilityTask = [imp = shared_from_this(), request, userId, identity] + (const std::string& bundle, const std::string& abilityName) mutable { HILOG_INFO("implicit start ability call back."); - auto oldIdentity = identity; // reset calling indentity - IPCSkeleton::SetCallingIdentity(oldIdentity); + IPCSkeleton::SetCallingIdentity(identity); AAFwk::Want targetWant = request.want; targetWant.SetElementName(bundle, abilityName); @@ -99,6 +99,8 @@ int ImplicitStartProcessor::ImplicitStartAbility(AbilityRequest &request, int32_ HILOG_INFO("ImplicitQueryInfos success, Multiple apps to choose."); Want want = sysDialogScheduler->GetSelectorDialogWant(dialogAppInfos, request.want); auto abilityMgr = DelayedSingleton::GetInstance(); + // reset calling indentity + IPCSkeleton::SetCallingIdentity(identity); return abilityMgr->StartAbility(want); } diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index f78293794d2..dcba7d6ced2 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -71,7 +71,7 @@ void MissionListManager::Init() DelayedSingleton::GetInstance()->Init(userId_); } -int MissionListManager::StartAbility(const AbilityRequest &abilityRequest) +int MissionListManager::StartAbility(AbilityRequest &abilityRequest) { std::lock_guard guard(managerLock_); if (IsReachToLimitLocked(abilityRequest)) { @@ -100,6 +100,7 @@ int MissionListManager::StartAbility(const AbilityRequest &abilityRequest) element.c_str(), AbilityRecord::ConvertAbilityState(state).c_str()); } + abilityRequest.callerAccessTokenId = IPCSkeleton::GetCallingTokenID(); return StartAbility(currentTopAbility, callerAbility, abilityRequest); } @@ -1293,6 +1294,7 @@ int MissionListManager::TerminateAbilityLocked(const std::shared_ptrSendResultToCallers(); + abilityRecord->RemoveUriPermission(); // 1. if the ability was foreground, first should find wether there is other ability foreground if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) { @@ -1807,6 +1809,7 @@ void MissionListManager::OnTimeOut(uint32_t msgId, int64_t eventId) return; } HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId, abilityRecord->GetAbilityInfo().name.c_str()); + abilityRecord->RemoveUriPermission(); #ifdef SUPPORT_GRAPHICS if (abilityRecord->IsStartingWindow()) { diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index f27c4f2e7ee..91b8180eb25 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -1537,13 +1537,6 @@ void AppMgrServiceInner::ClearAppRunningData(const std::shared_ptrGetApplicationInfo(); - if (appInfo && upmClient) { - upmClient->RemoveUriPermission(appInfo->accessTokenId); - } appRecord->SetProcessChangeReason(ProcessChangeReason::REASON_REMOTE_DIED); for (const auto &item : appRecord->GetAbilities()) { diff --git a/services/sa_profile/183.xml b/services/sa_profile/183.xml index bb0becc4b3f..1c5ef7e28e7 100644 --- a/services/sa_profile/183.xml +++ b/services/sa_profile/183.xml @@ -20,7 +20,7 @@ libupms.z.so - false + true false 1 diff --git a/services/uripermmgr/BUILD.gn b/services/uripermmgr/BUILD.gn index 6f7154104ae..43d3a88cef7 100644 --- a/services/uripermmgr/BUILD.gn +++ b/services/uripermmgr/BUILD.gn @@ -51,6 +51,7 @@ ohos_shared_library("libupms") { "ipc:ipc_core", "safwk:system_ability_fwk", "samgr:samgr_proxy", + "storage_service:storage_manager_sa_proxy", ] subsystem_name = "ability" @@ -79,6 +80,7 @@ ohos_shared_library("libupms_static") { "ipc:ipc_core", "safwk:system_ability_fwk", "samgr:samgr_proxy", + "storage_service:storage_manager_sa_proxy", ] subsystem_name = "ability" diff --git a/services/uripermmgr/include/uri_permission_manager_stub_impl.h b/services/uripermmgr/include/uri_permission_manager_stub_impl.h index 02e54bf10df..edca67515fa 100644 --- a/services/uripermmgr/include/uri_permission_manager_stub_impl.h +++ b/services/uripermmgr/include/uri_permission_manager_stub_impl.h @@ -20,6 +20,8 @@ #include #include "bundlemgr/bundle_mgr_interface.h" +#include "foundation/filemanagement/storage_service/services/storage_manager/include/ipc/storage_manager_proxy.h" +#include "istorage_manager.h" #include "uri.h" #include "uri_permission_manager_stub.h" @@ -48,13 +50,15 @@ public: private: sptr ConnectBundleManager(); + sptr ConnectStorageManager(); int GetCurrentAccountId(); - void ClearProxy(); + void ClearBMSProxy(); + void ClearSMProxy(); - class BMSDeathRecipient : public IRemoteObject::DeathRecipient { + class BMSOrSMDeathRecipient : public IRemoteObject::DeathRecipient { public: - explicit BMSDeathRecipient(const ClearProxyCallback &proxy) : proxy_(proxy) {} - ~BMSDeathRecipient() = default; + explicit BMSOrSMDeathRecipient(const ClearProxyCallback &proxy) : proxy_(proxy) {} + ~BMSOrSMDeathRecipient() = default; virtual void OnRemoteDied([[maybe_unused]] const wptr& remote) override; private: @@ -65,7 +69,9 @@ private: std::map> uriMap_; std::mutex mutex_; std::mutex bmsMutex_; + std::mutex storageMutex_; sptr bundleManager_ = nullptr; + sptr storageManager_ = nullptr; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/uripermmgr/src/uri_permission_manager_service.cpp b/services/uripermmgr/src/uri_permission_manager_service.cpp index 8e14337bfba..d0bee404ede 100644 --- a/services/uripermmgr/src/uri_permission_manager_service.cpp +++ b/services/uripermmgr/src/uri_permission_manager_service.cpp @@ -23,6 +23,9 @@ namespace OHOS { namespace AAFwk { +const bool REGISTER_RESULT = + SystemAbility::MakeAndRegisterAbility(DelayedSingleton::GetInstance().get()); + UriPermissionManagerService::UriPermissionManagerService() : SystemAbility(URI_PERMISSION_MGR_SERVICE_ID, true) {} UriPermissionManagerService::~UriPermissionManagerService() diff --git a/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp b/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp index 1259d220d0a..2e3f1587fab 100644 --- a/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp +++ b/services/uripermmgr/src/uri_permission_manager_stub_impl.cpp @@ -29,13 +29,12 @@ namespace OHOS { namespace AAFwk { const int32_t DEFAULT_USER_ID = 0; +using TokenId = Security::AccessToken::AccessTokenID; void UriPermissionManagerStubImpl::GrantUriPermission(const Uri &uri, unsigned int flag, - const Security::AccessToken::AccessTokenID fromTokenId, const Security::AccessToken::AccessTokenID targetTokenId) + const TokenId fromTokenId, const TokenId targetTokenId) { - auto callerTokenId = IPCSkeleton::GetCallingTokenID(); - HILOG_DEBUG("callerTokenId : %{public}u", callerTokenId); - auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerTokenId); + auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID()); if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) { HILOG_DEBUG("caller tokenType is not native, verify failure."); return; @@ -52,12 +51,21 @@ void UriPermissionManagerStubImpl::GrantUriPermission(const Uri &uri, unsigned i tmpFlag = Want::FLAG_AUTH_READ_URI_PERMISSION; } + auto storageMgrProxy = ConnectStorageManager(); + if (storageMgrProxy == nullptr) { + HILOG_ERROR("ConnectStorageManager failed"); + return; + } auto uriStr = uri.ToString(); + auto ret = storageMgrProxy->CreateShareFile(uriStr, targetTokenId, tmpFlag); + if (ret != 0 && ret != -EEXIST) { + HILOG_ERROR("storageMgrProxy failed to CreateShareFile."); + return; + } std::lock_guard guard(mutex_); auto search = uriMap_.find(uriStr); GrantInfo info = { tmpFlag, fromTokenId, targetTokenId }; if (search == uriMap_.end()) { - HILOG_INFO("uri is not exist, add uri and GrantInfo to map."); std::list infoList = { info }; uriMap_.emplace(uriStr, infoList); return; @@ -65,14 +73,14 @@ void UriPermissionManagerStubImpl::GrantUriPermission(const Uri &uri, unsigned i auto& infoList = search->second; for (auto& item : infoList) { if (item.fromTokenId == fromTokenId && item.targetTokenId == targetTokenId) { - if ((tmpFlag & Want::FLAG_AUTH_WRITE_URI_PERMISSION) != 0) { + if ((tmpFlag & item.flag) == 0) { + HILOG_INFO("Update uri r/w permission."); item.flag = tmpFlag; } HILOG_INFO("uri permission has granted, not to grant again."); return; } } - HILOG_DEBUG("uri is exist, add GrantInfo to list."); infoList.emplace_back(info); } @@ -129,23 +137,38 @@ bool UriPermissionManagerStubImpl::VerifyUriPermission(const Uri &uri, unsigned return false; } -void UriPermissionManagerStubImpl::RemoveUriPermission(const Security::AccessToken::AccessTokenID tokenId) +void UriPermissionManagerStubImpl::RemoveUriPermission(const TokenId tokenId) { - std::lock_guard guard(mutex_); - for (auto iter = uriMap_.begin(); iter != uriMap_.end();) { - auto& list = iter->second; - for (auto it = list.begin(); it != list.end(); it++) { - if (it->targetTokenId == tokenId) { - HILOG_INFO("Erase an info form list."); - list.erase(it); - break; + HILOG_DEBUG("Start to remove uri permission."); + std::vector uriList; + { + std::lock_guard guard(mutex_); + for (auto iter = uriMap_.begin(); iter != uriMap_.end();) { + auto& list = iter->second; + for (auto it = list.begin(); it != list.end(); it++) { + if (it->targetTokenId == tokenId) { + HILOG_INFO("Erase an info form list."); + list.erase(it); + uriList.emplace_back(iter->first); + break; + } + } + if (list.size() == 0) { + uriMap_.erase(iter++); + } else { + iter++; } } - if (list.size() == 0) { - uriMap_.erase(iter++); - } else { - iter++; - } + } + + auto storageMgrProxy = ConnectStorageManager(); + if (storageMgrProxy == nullptr) { + HILOG_ERROR("ConnectStorageManager failed"); + return; + } + + if (!uriList.empty()) { + storageMgrProxy->DeleteShareFile(tokenId, uriList); } } @@ -169,24 +192,61 @@ sptr UriPermissionManagerStubImpl::ConnectBundleManager( const auto& onClearProxyCallback = [self](const wptr& remote) { auto impl = self.lock(); if (impl && impl->bundleManager_ == remote) { - impl->ClearProxy(); + impl->ClearBMSProxy(); } }; - sptr recipient(new BMSDeathRecipient(onClearProxyCallback)); + sptr recipient(new BMSOrSMDeathRecipient(onClearProxyCallback)); bundleManager_->AsObject()->AddDeathRecipient(recipient); } HILOG_DEBUG("%{public}s end.", __func__); return bundleManager_; } -void UriPermissionManagerStubImpl::ClearProxy() +sptr UriPermissionManagerStubImpl::ConnectStorageManager() +{ + std::lock_guard lock(storageMutex_); + if (storageManager_ == nullptr) { + auto systemAbilityMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (!systemAbilityMgr) { + HILOG_ERROR("Failed to get SystemAbilityManager."); + return nullptr; + } + + auto remoteObj = systemAbilityMgr->GetSystemAbility(STORAGE_MANAGER_MANAGER_ID); + if (!remoteObj || (storageManager_ = iface_cast(remoteObj)) == nullptr) { + HILOG_ERROR("Failed to get storage manager."); + return nullptr; + } + auto self = weak_from_this(); + const auto& onClearProxyCallback = [self](const wptr& remote) { + auto impl = self.lock(); + if (impl && impl->storageManager_ == remote) { + impl->ClearSMProxy(); + } + }; + sptr recipient(new BMSOrSMDeathRecipient(onClearProxyCallback)); + storageManager_->AsObject()->AddDeathRecipient(recipient); + } + HILOG_DEBUG("%{public}s end.", __func__); + return storageManager_; +} + +void UriPermissionManagerStubImpl::ClearBMSProxy() { HILOG_DEBUG("%{public}s is called.", __func__); std::lock_guard lock(bmsMutex_); bundleManager_ = nullptr; } -void UriPermissionManagerStubImpl::BMSDeathRecipient::OnRemoteDied([[maybe_unused]] const wptr& remote) +void UriPermissionManagerStubImpl::ClearSMProxy() +{ + HILOG_DEBUG("%{public}s is called.", __func__); + std::lock_guard lock(bmsMutex_); + storageManager_ = nullptr; +} + +void UriPermissionManagerStubImpl::BMSOrSMDeathRecipient::OnRemoteDied( + [[maybe_unused]] const wptr& remote) { if (proxy_) { HILOG_DEBUG("%{public}s, bms stub died.", __func__); diff --git a/test/fuzztest/abilitymanagerserviced_fuzzer/abilitymanagerserviced_fuzzer.cpp b/test/fuzztest/abilitymanagerserviced_fuzzer/abilitymanagerserviced_fuzzer.cpp index 8cc0df6fc2a..a1819299aeb 100755 --- a/test/fuzztest/abilitymanagerserviced_fuzzer/abilitymanagerserviced_fuzzer.cpp +++ b/test/fuzztest/abilitymanagerserviced_fuzzer/abilitymanagerserviced_fuzzer.cpp @@ -66,8 +66,6 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size) // fuzz for AbilityManagerService auto abilityms = std::make_shared(); abilityms->IsNeedTimeoutForTest(stringParam, stringParam); - AbilityRequest abilityRequest; - abilityms->VerifyUriPermission(abilityRequest, *want); abilityms->GetValidDataAbilityUri(stringParam, stringParam); return true; diff --git a/test/fuzztest/abilitymanagerservicefirst_fuzzer/abilitymanagerservicefirst_fuzzer.cpp b/test/fuzztest/abilitymanagerservicefirst_fuzzer/abilitymanagerservicefirst_fuzzer.cpp index 80ae1b77937..d80121b5845 100755 --- a/test/fuzztest/abilitymanagerservicefirst_fuzzer/abilitymanagerservicefirst_fuzzer.cpp +++ b/test/fuzztest/abilitymanagerservicefirst_fuzzer/abilitymanagerservicefirst_fuzzer.cpp @@ -103,8 +103,6 @@ bool DoSomethingInterestingWithMyAPI(const char* data, size_t size) abilityms->ReportEventToSuspendManager(abilityInfo); abilityms->StartExtensionAbility(*want, token, int32Param, extensionType); abilityms->StopExtensionAbility(*want, token, int32Param, extensionType); - abilityms->GrantUriPermission(*want, int32Param); - abilityms->GrantUriPermission(*want, int32Param, uint32Param); abilityms->TerminateAbility(token, intParam, want); abilityms->CloseAbility(token, intParam, want); abilityms->TerminateAbilityWithFlag(token, intParam, want, boolParam); diff --git a/test/fuzztest/uripermissionmanager_fuzzer/BUILD.gn b/test/fuzztest/uripermissionmanager_fuzzer/BUILD.gn index 3508f6a5b38..17b025120c1 100644 --- a/test/fuzztest/uripermissionmanager_fuzzer/BUILD.gn +++ b/test/fuzztest/uripermissionmanager_fuzzer/BUILD.gn @@ -51,6 +51,7 @@ ohos_fuzztest("UriPermissionManagerFuzzTest") { "ipc:ipc_core", "safwk:system_ability_fwk", "samgr:samgr_proxy", + "storage_service:storage_manager_sa_proxy", ] } diff --git a/test/unittest/ability_manager_service_test/BUILD.gn b/test/unittest/ability_manager_service_test/BUILD.gn index 978bf021d1b..445efbca525 100755 --- a/test/unittest/ability_manager_service_test/BUILD.gn +++ b/test/unittest/ability_manager_service_test/BUILD.gn @@ -29,7 +29,6 @@ ohos_unittest("ability_manager_service_test") { "${distributedschedule_path}/samgr/adapter/interfaces/innerkits/include/", "${ability_runtime_innerkits_path}/app_manager/include/appmgr", "${ability_runtime_test_path}/mock/frameworks_kits_ability_native_test/include", - "//foundation/ability/ability_runtime/interfaces/inner_api/uri_permission/include", "//foundation/resourceschedule/background_task_mgr/services/transient_task/include", "//foundation/arkui/ace_engine/frameworks", "//foundation/resourceschedule/resource_schedule_service/ressched/interfaces/innerkits/ressched_client/include", diff --git a/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp b/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp index fc544daf873..cba0a7c5d3e 100755 --- a/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp +++ b/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp @@ -547,42 +547,6 @@ HWTEST_F(AbilityManagerServiceTest, StopExtensionAbility_001, TestSize.Level1) HILOG_INFO("AbilityManagerServiceTest StopExtensionAbility_001 end"); } -/* - * Feature: AbilityManagerService - * Function: GrantUriPermission - * SubFunction: NA - * FunctionPoints: AbilityManagerService GrantUriPermission - */ -HWTEST_F(AbilityManagerServiceTest, GrantUriPermission_001, TestSize.Level1) -{ - HILOG_INFO("AbilityManagerServiceTest GrantUriPermission_001 start"); - Want want; - want.SetFlags(4); - abilityMs_->GrantUriPermission(want, 100); - - want.SetFlags(1); - abilityMs_->GrantUriPermission(want, 100); - HILOG_INFO("AbilityManagerServiceTest GrantUriPermission_001 end"); -} - -/* - * Feature: AbilityManagerService - * Function: GrantUriPermission - * SubFunction: NA - * FunctionPoints: AbilityManagerService GrantUriPermission - */ -HWTEST_F(AbilityManagerServiceTest, GrantUriPermission_002, TestSize.Level1) -{ - HILOG_INFO("AbilityManagerServiceTest GrantUriPermission_002 start"); - Want want; - want.SetFlags(4); - abilityMs_->GrantUriPermission(want, 100, 1); - - want.SetFlags(1); - abilityMs_->GrantUriPermission(want, 100, 1); - HILOG_INFO("AbilityManagerServiceTest GrantUriPermission_002 end"); -} - /* * Feature: AbilityManagerService * Function: TerminateAbility @@ -2782,25 +2746,6 @@ HWTEST_F(AbilityManagerServiceTest, IsNeedTimeoutForTest_001, TestSize.Level1) HILOG_INFO("AbilityManagerServiceTest IsNeedTimeoutForTest_001 end"); } -/* - * Feature: AbilityManagerService - * Function: VerifyUriPermission - * SubFunction: NA - * FunctionPoints: AbilityManagerService VerifyUriPermission - */ -HWTEST_F(AbilityManagerServiceTest, VerifyUriPermission_001, TestSize.Level1) -{ - HILOG_INFO("AbilityManagerServiceTest VerifyUriPermission_001 start"); - AbilityRequest abilityRequest; - Want want; - abilityRequest.abilityInfo.extensionAbilityType = ExtensionAbilityType::SERVICE; - EXPECT_TRUE(abilityMs_->VerifyUriPermission(abilityRequest, want)); - - abilityRequest.abilityInfo.extensionAbilityType = ExtensionAbilityType::FILESHARE; - EXPECT_FALSE(abilityMs_->VerifyUriPermission(abilityRequest, want)); - HILOG_INFO("AbilityManagerServiceTest VerifyUriPermission_001 end"); -} - /* * Feature: AbilityManagerService * Function: GetValidDataAbilityUri diff --git a/test/unittest/ability_record_test/ability_record_test.cpp b/test/unittest/ability_record_test/ability_record_test.cpp index b22e5eb7e36..cb5a3344073 100644 --- a/test/unittest/ability_record_test/ability_record_test.cpp +++ b/test/unittest/ability_record_test/ability_record_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -2101,8 +2101,100 @@ HWTEST_F(AbilityRecordTest, AbilityRecord_GrantUriPermission_001, TestSize.Level { std::shared_ptr abilityRecord = GetAbilityRecord(); Want want; + int32_t userId = 100; + uint32_t targetTokenId = 1; + abilityRecord->GrantUriPermission(want, userId, targetTokenId); +} + +/* + * Feature: AbilityRecord + * Function: GrantUriPermission + * SubFunction: GrantUriPermission + * FunctionPoints: NA + * EnvConditions: NA + * CaseDescription: Verify AbilityRecord GrantUriPermission + */ +HWTEST_F(AbilityRecordTest, AbilityRecord_GrantUriPermission_002, TestSize.Level1) +{ + std::shared_ptr abilityRecord = GetAbilityRecord(); + Want want; + want.SetFlags(1); + want.SetUri("datashare://ohos.samples.clock/data/storage/el2/base/haps/entry/files/test_A.txt"); + int32_t userId = 100; + uint32_t targetTokenId = 1; + abilityRecord->GrantUriPermission(want, userId, targetTokenId); +} + +/* + * Feature: AbilityRecord + * Function: GrantUriPermission + * SubFunction: GrantUriPermission + * FunctionPoints: NA + * EnvConditions: NA + * CaseDescription: Verify AbilityRecord GrantUriPermission + */ +HWTEST_F(AbilityRecordTest, AbilityRecord_GrantUriPermission_003, TestSize.Level1) +{ + std::shared_ptr abilityRecord = GetAbilityRecord(); + Want want; + want.SetFlags(1); + want.SetUri("file://com.example.mock/data/storage/el2/base/haps/entry/files/test_A.txt"); + int32_t userId = 100; + uint32_t targetTokenId = 1; + abilityRecord->GrantUriPermission(want, userId, targetTokenId); +} + +/* + * Feature: AbilityRecord + * Function: GrantUriPermission + * SubFunction: GrantUriPermission + * FunctionPoints: NA + * EnvConditions: NA + * CaseDescription: Verify AbilityRecord GrantUriPermission + */ +HWTEST_F(AbilityRecordTest, AbilityRecord_GrantUriPermission_004, TestSize.Level1) +{ + std::shared_ptr abilityRecord = GetAbilityRecord(); + Want want; + want.SetFlags(1); + want.SetUri("file://ohos.samples.clock/data/storage/el2/base/haps/entry/files/test_A.txt"); + int32_t userId = 100; + uint32_t targetTokenId = 1; + abilityRecord->GrantUriPermission(want, userId, targetTokenId); +} + +/* + * Feature: AbilityRecord + * Function: GrantUriPermission + * SubFunction: GrantUriPermission + * FunctionPoints: NA + * EnvConditions: NA + * CaseDescription: Verify AbilityRecord GrantUriPermission + */ +HWTEST_F(AbilityRecordTest, AbilityRecord_GrantUriPermission_005, TestSize.Level1) +{ + std::shared_ptr abilityRecord = GetAbilityRecord(); + uint32_t targetTokenId = 56; + abilityRecord->SetCallerAccessTokenId(targetTokenId); + Want want; want.SetFlags(1); - abilityRecord->GrantUriPermission(want); + want.SetUri("file://ohos.samples.clock/data/storage/el2/base/haps/entry/files/test_A.txt"); + int32_t userId = 100; + abilityRecord->GrantUriPermission(want, userId, targetTokenId); +} + +/* + * Feature: AbilityRecord + * Function: RemoveUriPermission + * SubFunction: RemoveUriPermission + * FunctionPoints: NA + * EnvConditions: NA + * CaseDescription: Verify AbilityRecord RemoveUriPermission + */ +HWTEST_F(AbilityRecordTest, AbilityRecord_RemoveUriPermission_001, TestSize.Level1) +{ + std::shared_ptr abilityRecord = GetAbilityRecord(); + abilityRecord->RemoveUriPermission(); } /* diff --git a/test/unittest/frameworks_kits_appkit_native_test/application_impl_test.cpp b/test/unittest/frameworks_kits_appkit_native_test/application_impl_test.cpp index 8977b0e25f3..9183dfc472a 100644 --- a/test/unittest/frameworks_kits_appkit_native_test/application_impl_test.cpp +++ b/test/unittest/frameworks_kits_appkit_native_test/application_impl_test.cpp @@ -343,83 +343,6 @@ HWTEST_F(ApplicationImplTest, AppExecFwk_ApplicationImpl_PerformTerminateStrong_ GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_PerformTerminateStrong_0200 end"; } -/** - * @tc.number: AppExecFwk_ApplicationImpl_RemoveUriPermission_0100 - * @tc.name: RemoveUriPermission - * @tc.desc: Test RemoveUriPermission is called when GetAppContext is nullptr. - */ -HWTEST_F(ApplicationImplTest, AppExecFwk_ApplicationImpl_RemoveUriPermission_0100, Function | MediumTest | Level1) -{ - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0100 start"; - auto application = std::make_shared(); - applicationImpl_->SetApplication(application); - applicationImpl_->SetState(MockApplication::APP_STATE_CREATE); - EXPECT_NE(applicationImpl_->application_, nullptr); - EXPECT_EQ(applicationImpl_->application_->GetAppContext(), nullptr); - applicationImpl_->RemoveUriPermission(); - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0100 end"; -} - -/** - * @tc.number: AppExecFwk_ApplicationImpl_RemoveUriPermission_0200 - * @tc.name: RemoveUriPermission - * @tc.desc: Test RemoveUriPermission is called when GetApplicationInfo is nullptr. - */ -HWTEST_F(ApplicationImplTest, AppExecFwk_ApplicationImpl_RemoveUriPermission_0200, Function | MediumTest | Level1) -{ - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0200 start"; - auto application = std::make_shared(); - auto contextImpl = std::make_shared(); - auto applicationContext = AbilityRuntime::ApplicationContext::GetInstance(); - applicationContext->AttachContextImpl(contextImpl); - application->SetApplicationContext(applicationContext); - applicationImpl_->SetApplication(application); - applicationImpl_->SetState(MockApplication::APP_STATE_CREATE); - EXPECT_NE(applicationImpl_->application_->GetAppContext(), nullptr); - EXPECT_EQ(applicationImpl_->application_->GetAppContext()->GetApplicationInfo(), nullptr); - applicationImpl_->RemoveUriPermission(); - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0200 end"; -} - -/** - * @tc.number: AppExecFwk_ApplicationImpl_RemoveUriPermission_0300 - * @tc.name: RemoveUriPermission - * @tc.desc: Test RemoveUriPermission normal function call. - */ -HWTEST_F(ApplicationImplTest, AppExecFwk_ApplicationImpl_RemoveUriPermission_0300, Function | MediumTest | Level1) -{ - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0300 start"; - auto application = std::make_shared(); - auto contextImpl = std::make_shared(); - auto applicationContext = AbilityRuntime::ApplicationContext::GetInstance();; - applicationContext->AttachContextImpl(contextImpl); - application->SetApplicationContext(applicationContext); - auto applicationInfo = std::make_shared(); - contextImpl->SetApplicationInfo(applicationInfo); - applicationImpl_->SetApplication(application); - applicationImpl_->SetState(MockApplication::APP_STATE_CREATE); - EXPECT_NE(applicationImpl_->application_, nullptr); - EXPECT_NE(applicationImpl_->application_->GetAppContext()->GetApplicationInfo(), nullptr); - applicationImpl_->RemoveUriPermission(); - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0300 end"; -} - -/** - * @tc.number: AppExecFwk_ApplicationImpl_RemoveUriPermission_0400 - * @tc.name: RemoveUriPermission - * @tc.desc: Test RemoveUriPermission is called when SetApplication is nullptr. - */ -HWTEST_F(ApplicationImplTest, AppExecFwk_ApplicationImpl_RemoveUriPermission_0400, Function | MediumTest | Level1) -{ - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0400 start"; - std::shared_ptr application = nullptr; - applicationImpl_->application_ = application; - applicationImpl_->SetState(MockApplication::APP_STATE_CREATE); - EXPECT_EQ(applicationImpl_->application_, nullptr); - applicationImpl_->RemoveUriPermission(); - GTEST_LOG_(INFO) << "AppExecFwk_ApplicationImpl_RemoveUriPermission_0400 end"; -} - /** * @tc.number: AppExecFwk_ApplicationImpl_SetApplication_0100 * @tc.name: SetApplication -- Gitee