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 028db28fd05391fb4e0377454cec26da7d7ff619..b2e3f60854de68e182c753851213a73a39e3e975 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 abb67856f88738767342bbd647da208bb80dba79..3f63bc9e2f4e529c8e11cf8695cef1fb87ed3391 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 01f406645492c33a65a8f0502f9226c2a6e0aec7..8367ddab6b864e8de6dedf020bf608be7dc6bd56 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 44e3bbbf243715485b3360b9a37f7ae3fc2c57e9..17b286a2363beace893bac5b23eadec18c9a2387 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 d789fc1cce8bacf0dc45ae3cc3ff7868b73ca75d..7b8b3a481295dab3042d6545b2358a3ae33e6c01 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 dc3435c959b788865fad9e64de7a57d458a3d0a0..aa050697254512cda64b4d0c648ac8679b7ecdaa 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 ada47b7d4e23adb10bdc8a553d1193a9a585cc83..cd2bef8dde1db0ffc514357f2b6148fbefb456ea 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 f69f08f4566f0b4b3a93b5f2f235b35a816aced5..5276bf19254b72c185b16441c181e0d12482b522 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 4674b64f3d08eacacc8eb121af9a0ba19879e2ec..ef8313958edd6d6e21fb948328b232cb995bb199 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 60fa286072766f92bd63f3e3808fe8381dcedbfd..f996b5726585bad878609ce613150fdde1e70a76 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 6ea2a3968e3528e981ac38466a5978b8db0dc13c..c01a4e1b8a57ac43be8fa73d6f7b574c0f444df4 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 30f1c313cfd0ff66bca604af9e936c2eaa1d9053..c6b3a9da2a965aab8469d925f1935565ebd1e689 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 f78293794d23fad00bdc20559606ab63b592ff6c..dcba7d6ced23a2a5acf58ac6231c3ad415b44a7f 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 f27c4f2e7ee538cbf0de70929a31eefa38794aba..91b8180eb2576a070ce6057080d7d8c006c28eb9 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 bb0becc4b3f0f03de39def0087393f531bf467c6..1c5ef7e28e71d94778509b9191aa5b67d9ae52c6 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 6f7154104aef09332541f14649311564db4ea814..43d3a88cef7ee32f4528fd8b43e80665f7473a0d 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 02e54bf10df0a8b7f924c9c0309dc9929ebd618d..edca67515fa1caa3040c35574b75c562cf78545f 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 8e14337bfba2e3533af7235fe69662547b9eb0a8..d0bee404edea7825859f1e34b7cd92c948c62c1e 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 1259d220d0a6a26014870bd490c84651b26c8032..2e3f1587fab95f2ea922f197ca817f9809dae6e0 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 8cc0df6fc2a3f927387ba28d4d689f7ce3498c0b..a1819299aebf422eb5c91c80090bb0679d54fce0 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 80ae1b77937da155a9901c99578451b7a6620ac4..d80121b58457c71ac18b5242d47075135136c553 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 3508f6a5b38a854039576ffaea6776f4c90e149e..17b025120c184293af69b0a2d3204d2c474aa85c 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 978bf021d1b5389a5eb6940fa333f46290758b93..445efbca525c8f97ee9964273442b4aba0f4f33a 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 fc544daf8731209ff11cfe1e7b94bc21b7d01ffd..cba0a7c5d3ef149f1b79ff86785e9d7a8367b52c 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 b22e5eb7e36dc329a6b9f0c717a47fb077a7c675..cb5a33440733a5b5f975b55cbe80464604f8d615 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 8977b0e25f37d7f3223eb478de5c8ca888d973d4..9183dfc472ae38732769182f59324409684c74e2 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