diff --git a/services/native/file_access_service/include/file_access_service.h b/services/native/file_access_service/include/file_access_service.h index 8682da5637ce244fe6754d788063cec4ceb5dcfd..48b76608d458ba62f545975d02566d801f0457df 100644 --- a/services/native/file_access_service/include/file_access_service.h +++ b/services/native/file_access_service/include/file_access_service.h @@ -205,7 +205,7 @@ protected: const std::shared_ptr &info = nullptr) override; int32_t CleanAllNotify(Uri uri, const std::shared_ptr &info) override; int32_t OnChange(Uri uri, NotifyType notifyType) override; - int32_t GetExensionProxy(const std::shared_ptr &info, + int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override; private: @@ -228,6 +228,8 @@ private: int32_t UnregisterNotifyImpl(Uri uri, const sptr &observer, const std::shared_ptr &info = nullptr); int32_t CleanAllNotifyImpl(Uri uri, const std::shared_ptr &info); + int32_t GetExtensionProxyImpl(const std::shared_ptr &info, + sptr &extensionProxy); int32_t OperateObsNode(Uri &uri, bool notifyForDescendants, uint32_t code, const std::shared_ptr &info); void CleanRelativeObserver(const sptr &observer); diff --git a/services/native/file_access_service/include/file_access_service_proxy.h b/services/native/file_access_service/include/file_access_service_proxy.h index 4f932036256d250a446f473f03477b9135a8f12e..0b85fde2992219d8f44e9b9a10aa6a8d60d83765 100644 --- a/services/native/file_access_service/include/file_access_service_proxy.h +++ b/services/native/file_access_service/include/file_access_service_proxy.h @@ -33,7 +33,7 @@ public: const std::shared_ptr &info) override; int32_t UnregisterNotify(Uri uri, const sptr &observer, const std::shared_ptr &info) override; - int32_t GetExensionProxy(const std::shared_ptr &info, + int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override; class ServiceProxyLoadCallback : public SystemAbilityLoadCallbackStub { diff --git a/services/native/file_access_service/include/file_access_service_stub.h b/services/native/file_access_service/include/file_access_service_stub.h index cc01c4e4a61276b4911a2957fadac016d09ec619..c3128a7af24492e4a99e20ad5cd79e286292b850 100644 --- a/services/native/file_access_service/include/file_access_service_stub.h +++ b/services/native/file_access_service/include/file_access_service_stub.h @@ -37,7 +37,7 @@ private: ErrCode CmdOnChange(MessageParcel &data, MessageParcel &reply); ErrCode CmdRegisterNotify(MessageParcel &data, MessageParcel &reply); ErrCode CmdUnregisterNotify(MessageParcel &data, MessageParcel &reply); - ErrCode CmdGetExensionProxy(MessageParcel &data, MessageParcel &reply); + ErrCode CmdGetExtensionProxy(MessageParcel &data, MessageParcel &reply); bool CheckCallingPermission(const std::string &permission); using RequestFuncType = int (FileAccessServiceStub::*)(MessageParcel &data, MessageParcel &reply); std::map stubFuncMap_; diff --git a/services/native/file_access_service/include/ifile_access_service_base.h b/services/native/file_access_service/include/ifile_access_service_base.h index fc0c44d262b61c444bfcc563881e521ddee114c7..2137f8c74931cbd300d43339d598f53508a70142 100644 --- a/services/native/file_access_service/include/ifile_access_service_base.h +++ b/services/native/file_access_service/include/ifile_access_service_base.h @@ -36,7 +36,7 @@ protected: virtual int32_t UnregisterNotify(Uri uri, const sptr &observer, const std::shared_ptr &info) = 0; //Get exension proxy by SA - virtual int32_t GetExensionProxy(const std::shared_ptr &info, + virtual int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) = 0; }; } // namespace FileAccessFwk diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index abbe5a48e85722c2a2c2853f76bab88f24939d04..ed3fca8e9fd390bf7b664bc2aa9366376ed80e20 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -184,7 +184,7 @@ sptr FileAccessService::ConnectExtension(Uri &uri, const sha return iterator->second; } sptr extensionProxy; - int32_t ret = GetExensionProxy(info, extensionProxy); + int32_t ret = GetExtensionProxyImpl(info, extensionProxy); if (ret != ERR_OK || extensionProxy == nullptr) { return nullptr; } @@ -263,6 +263,12 @@ static void convertUris(Uri uri, std::vector &uris) } } +static Uri GetOriginalUri(string uriStr) +{ + size_t uriIndex = uriStr.find(FILE_SCHEME); + return Uri(uriStr.substr(uriIndex)); +} + int32_t FileAccessService::RegisterNotify(Uri uri, bool notifyForDescendants, const sptr &observer, const std::shared_ptr &info) { @@ -291,7 +297,6 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u auto haveCodeIter = find_if(obsNode->obsCodeList_.begin(), obsNode->obsCodeList_.end(), [code](const uint32_t &listCode) { return code == listCode; }); if (haveCodeIter != obsNode->obsCodeList_.end()) { - obsManager_.get(code)->UnRef(); if (obsNode->needChildNote_ == notifyForDescendants) { HILOG_DEBUG("Register same uri and same callback and same notifyForDescendants"); return ERR_OK; @@ -301,16 +306,17 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u HILOG_DEBUG("Register same uri and same callback but need modify notifyForDescendants"); return ERR_OK; } + obsManager_.get(code)->Ref(); obsNode->obsCodeList_.push_back(code); return ERR_OK; } - - auto extensionProxy = ConnectExtension(uri, info); + auto originalUri = GetOriginalUri(uriStr); + auto extensionProxy = ConnectExtension(originalUri, info); if (extensionProxy == nullptr) { HILOG_ERROR("Creator get invalid fileExtProxy"); return E_CONNECT; } - extensionProxy->StartWatcher(uri); + extensionProxy->StartWatcher(originalUri); obsNode = make_shared(notifyForDescendants); // add new node relations. for (auto &[comUri, node] : relationshipMap_) { @@ -334,7 +340,6 @@ int32_t FileAccessService::RegisterNotifyImpl(Uri uri, bool notifyForDescendants { UserAccessTracer trace; trace.Start("RegisterNotifyImpl"); - std::string token = IPCSkeleton::ResetCallingIdentity(); shared_ptr obsContext = make_shared(observer); // find if obsManager_ has this callback. uint32_t code = obsManager_.getId([obsContext](const shared_ptr &afterContext) { @@ -342,13 +347,9 @@ int32_t FileAccessService::RegisterNotifyImpl(Uri uri, bool notifyForDescendants }); if (code == HolderManager>::CODE_CAN_NOT_FIND) { // this is new callback, save this context - obsContext->Ref(); code = obsManager_.save(obsContext); auto object = obsContext->obs_->AsObject(); object->AddDeathRecipient(observerDeathRecipient_); - } else { - // this callback is already in manager, add ref. - obsManager_.get(code)->Ref(); } return OperateObsNode(uri, notifyForDescendants, code, info); } @@ -413,8 +414,7 @@ int32_t FileAccessService::CleanAllNotifyImpl(Uri uri, const std::shared_ptrIsValid()) { obsManager_.release(code); } - - size_t uriIndex = uriStr.find("file://"); - Uri originalUri(uriStr.substr(uriIndex)); + auto originalUri = GetOriginalUri(uriStr); auto extensionProxy = ConnectExtension(originalUri, info); if (extensionProxy == nullptr) { HILOG_ERROR("Creator get invalid fileExtProxy"); @@ -621,7 +619,7 @@ void FileAccessService::InitTimer() unLoadTimer_->start(); } -int32_t FileAccessService::GetExensionProxy(const std::shared_ptr &info, +int32_t FileAccessService::GetExtensionProxyImpl(const std::shared_ptr &info, sptr &extensionProxy) { sptr fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection()); @@ -641,5 +639,14 @@ int32_t FileAccessService::GetExensionProxy(const std::shared_ptr &info, + sptr &extensionProxy) +{ + if (IsUnused()) { + unLoadTimer_->reset(); + } + return GetExtensionProxyImpl(info, extensionProxy); +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_service_proxy.cpp b/services/native/file_access_service/src/file_access_service_proxy.cpp index 83b679ac4454ea299207e08699e13b29c2fba89b..cc7b23b3efeea18c399f2d887e566827bf3057d7 100644 --- a/services/native/file_access_service/src/file_access_service_proxy.cpp +++ b/services/native/file_access_service/src/file_access_service_proxy.cpp @@ -112,6 +112,13 @@ void FileAccessServiceProxy::InvaildInstance() serviceProxy_ = nullptr; } +static int GetUserId() +{ + int uid = IPCSkeleton::GetCallingUid(); + int userId = uid / OHOS::AppExecFwk::Constants::BASE_USER_RANGE; + return userId; +} + int32_t FileAccessServiceProxy::OnChange(Uri uri, NotifyType notifyType) { UserAccessTracer trace; @@ -122,7 +129,8 @@ int32_t FileAccessServiceProxy::OnChange(Uri uri, NotifyType notifyType) return E_IPCS; } - if (!data.WriteParcelable(&uri)) { + Uri tempUri(UID_TAG + std::to_string(GetUserId()) + uri.ToString()); + if (!data.WriteParcelable(&tempUri)) { HILOG_ERROR("fail to WriteParcelable uri"); return E_IPCS; } @@ -161,7 +169,8 @@ int32_t FileAccessServiceProxy::RegisterNotify(Uri uri, bool notifyForDescendant return E_IPCS; } - if (!data.WriteParcelable(&uri)) { + Uri tempUri(UID_TAG + std::to_string(GetUserId()) + uri.ToString()); + if (!data.WriteParcelable(&tempUri)) { HILOG_ERROR("fail to WriteParcelable uri"); return E_IPCS; } @@ -235,7 +244,8 @@ int32_t FileAccessServiceProxy::UnregisterNotify(Uri uri, const sptr &info, +int32_t FileAccessServiceProxy::GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) { UserAccessTracer trace; - trace.Start("GetExensionProxy"); + trace.Start("GetExtensionProxy"); MessageParcel data; if (!data.WriteInterfaceToken(FileAccessServiceProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); @@ -306,7 +316,7 @@ int32_t FileAccessServiceProxy::GetExensionProxy(const std::shared_ptr connectExtensionInfo = std::make_shared(); if (!connectExtensionInfo->ReadFromParcel(data)) { HILOG_ERROR("fail to read info"); @@ -201,9 +201,9 @@ ErrCode FileAccessServiceStub::CmdGetExensionProxy(MessageParcel &data, MessageP } sptr extensionProxy; - int ret = GetExensionProxy(connectExtensionInfo, extensionProxy); + int ret = GetExtensionProxy(connectExtensionInfo, extensionProxy); if (!reply.WriteInt32(ret) || extensionProxy == nullptr) { - HILOG_ERROR("fail to GetExensionProxy"); + HILOG_ERROR("fail to GetExtensionProxy"); return E_IPCS; } if (!reply.WriteRemoteObject(extensionProxy->AsObject())) { diff --git a/test/unittest/file_access_service_proxy_test.cpp b/test/unittest/file_access_service_proxy_test.cpp index ba767902d0afb69996763f9fcd9c069e1276a4d6..350d3a8481a9c7f1a8a630c5b9e9f2e3ecdc5758 100644 --- a/test/unittest/file_access_service_proxy_test.cpp +++ b/test/unittest/file_access_service_proxy_test.cpp @@ -367,57 +367,57 @@ HWTEST_F(FileAccessServiceProxyTest, file_access_service_proxy_UnregisterNotify_ } /** - * @tc.number: user_file_service_file_access_service_proxy_GetExensionProxy_0000 - * @tc.name: file_access_service_proxy_GetExensionProxy_0000 - * @tc.desc: Test function of GetExensionProxy interface for ERROR. + * @tc.number: user_file_service_file_access_service_proxy_GetExtensionProxy_0000 + * @tc.name: file_access_service_proxy_GetExtensionProxy_0000 + * @tc.desc: Test function of GetExtensionProxy interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 3 * @tc.require: issuesI8Y05B */ -HWTEST_F(FileAccessServiceProxyTest, file_access_service_proxy_GetExensionProxy_0000, testing::ext::TestSize.Level1) +HWTEST_F(FileAccessServiceProxyTest, file_access_service_proxy_GetExtensionProxy_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileAccessServiceProxyTest-begin file_access_service_proxy_GetExensionProxy_0000"; + GTEST_LOG_(INFO) << "FileAccessServiceProxyTest-begin file_access_service_proxy_GetExtensionProxy_0000"; try { shared_ptr proxy = make_shared(impl); shared_ptr info = nullptr; sptr extensionProxy = nullptr; EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(false)); - auto result = proxy->GetExensionProxy(info, extensionProxy); + auto result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_GETINFO); info = make_shared(); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(false)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(E_URIS)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_URIS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) .WillOnce(Return(false)); EXPECT_CALL(*insMoc, Int()).WillOnce(Return(ERR_OK)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(ERR_OK)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, ERR_OK); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) .WillOnce(Return(true)); EXPECT_CALL(*insMoc, Int()).WillOnce(Return(E_IPCS)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(ERR_OK)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) .WillOnce(Return(true)); EXPECT_CALL(*insMoc, Int()).WillOnce(Return(ERR_OK)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(ERR_OK)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); } catch (...) { GTEST_LOG_(ERROR) << "FileAccessServiceProxyTest occurs an exception."; } - GTEST_LOG_(INFO) << "FileAccessServiceProxyTest-end file_access_service_proxy_GetExensionProxy_0000"; + GTEST_LOG_(INFO) << "FileAccessServiceProxyTest-end file_access_service_proxy_GetExtensionProxy_0000"; } } \ No newline at end of file diff --git a/test/unittest/mock/file_access_service_mock.h b/test/unittest/mock/file_access_service_mock.h index 1bdfc31700d753689369745579e08e5a0a4bfb4f..c14d4a65edb94b2f5266a065a3fca9173bf7e2e9 100644 --- a/test/unittest/mock/file_access_service_mock.h +++ b/test/unittest/mock/file_access_service_mock.h @@ -28,7 +28,7 @@ public: const sptr &observer, const std::shared_ptr &info)); MOCK_METHOD3(UnregisterNotify, int32_t(Uri uri, const sptr &observer, const std::shared_ptr &info)); - MOCK_METHOD2(GetExensionProxy, int32_t(const std::shared_ptr &info, + MOCK_METHOD2(GetExtensionProxy, int32_t(const std::shared_ptr &info, sptr &extensionProxy)); MOCK_METHOD0(AsObject, sptr()); MOCK_METHOD2(CleanAllNotify, int32_t(Uri uri, const std::shared_ptr &info));