diff --git a/frameworks/js/napi/vpnext/src/vpn_module_ext.cpp b/frameworks/js/napi/vpnext/src/vpn_module_ext.cpp index ad519e3f1b085d3af7e208dc7dcd115017536f02..9ebab492974ab691bc0667ccff3796a1eabc635b 100644 --- a/frameworks/js/napi/vpnext/src/vpn_module_ext.cpp +++ b/frameworks/js/napi/vpnext/src/vpn_module_ext.cpp @@ -152,6 +152,31 @@ static std::string Replace(std::string s) return s; } + +napi_value ProcessPermissionRequests(napi_env env, const std::string bundleName, const std::string abilityName) +{ + std::string selfAppName; + std::string selfBundleName; + auto getAppNameRes = NetworkVpnClient::GetInstance().GetSelfAppName(selfAppName, selfBundleName); + NETMANAGER_EXT_LOGI("StartVpnExtensionAbility SelfAppName = %{public}s %{public}d", selfAppName.c_str(), + getAppNameRes); + if (bundleName != selfBundleName) { + NETMANAGER_EXT_LOGE("Not allowed to start other bundleName vpn!"); + return CreateRejectedPromise(env); + } + + bool vpnDialogSelect = false; + std::string vpnExtMode = std::to_string(vpnDialogSelect); + int32_t ret = NetDataShareHelperUtilsIface::Query(VPNEXT_MODE_URI, bundleName, vpnExtMode); + if (!g_started || ret != 0 || vpnExtMode != "1") { + g_started = true; + VpnMonitor::GetInstance().ShowVpnDialog(bundleName, abilityName, selfAppName); + NETMANAGER_EXT_LOGE("dataShareHelperUtils Query error, err = %{public}d", ret); + return CreateObserveDataSharePromise(env, bundleName); + } + return nullptr; +} + napi_value StartVpnExtensionAbility(napi_env env, napi_callback_info info) { napi_value thisVal = nullptr; @@ -173,24 +198,12 @@ napi_value StartVpnExtensionAbility(napi_env env, napi_callback_info info) } std::string bundleName = want.GetElement().GetBundleName(); - int32_t rst = NetworkVpnClient::GetInstance().RegisterBundleName(bundleName); - NETMANAGER_EXT_LOGI("VPN RegisterBundleName result = %{public}d", rst); std::string abilityName = want.GetElement().GetAbilityName(); if (abilityName.find(VPN_DIALOG_POSTFIX) == std::string::npos) { NetworkVpnClient::GetInstance().SetSelfVpnPid(); - - bool vpnDialogSelect = false; - std::string vpnExtMode = std::to_string(vpnDialogSelect); - int32_t ret = NetDataShareHelperUtilsIface::Query(VPNEXT_MODE_URI, bundleName, vpnExtMode); - if (!g_started || ret != 0 || vpnExtMode != "1") { - g_started = true; - std::string selfAppName; - auto getAppNameRes = NetworkVpnClient::GetInstance().GetSelfAppName(selfAppName); - NETMANAGER_EXT_LOGI("StartVpnExtensionAbility SelfAppName = %{public}s %{public}d", selfAppName.c_str(), - getAppNameRes); - VpnMonitor::GetInstance().ShowVpnDialog(bundleName, abilityName, selfAppName); - NETMANAGER_EXT_LOGE("dataShareHelperUtils Query error, err = %{public}d", ret); - return CreateObserveDataSharePromise(env, bundleName); + napi_value retVal = ProcessPermissionRequests(env, bundleName, abilityName); + if (retVal != nullptr) { + return retVal; } } auto elem = want.GetElement(); @@ -199,6 +212,10 @@ napi_value StartVpnExtensionAbility(napi_env env, napi_callback_info info) ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility( want, nullptr, accountId, AppExecFwk::ExtensionAbilityType::VPN); NETMANAGER_EXT_LOGI("execute StartVpnExtensionAbility result: %{public}d", err); + if (err == 0) { + int32_t rst = NetworkVpnClient::GetInstance().RegisterBundleName(bundleName, Replace(abilityName)); + NETMANAGER_EXT_LOGI("VPN RegisterBundleName result = %{public}d", rst); + } return CreateResolvedPromise(env); } @@ -222,6 +239,24 @@ napi_value StopVpnExtensionAbility(napi_env env, napi_callback_info info) return CreateRejectedPromise(env); } + std::string bundleName = want.GetElement().GetBundleName(); + std::string selfAppName; + std::string selfBundleName; + auto getAppNameRes = NetworkVpnClient::GetInstance().GetSelfAppName(selfAppName, selfBundleName); + NETMANAGER_EXT_LOGI("StopVpnExtensionAbility SelfAppName = %{public}s %{public}d", selfAppName.c_str(), + getAppNameRes); + if (bundleName != selfBundleName) { + NETMANAGER_EXT_LOGE("Not allowed to stop other bundleName vpn!"); + return CreateRejectedPromise(env); + } + bool vpnDialogSelect = false; + std::string vpnExtMode = std::to_string(vpnDialogSelect); + int32_t ret = NetDataShareHelperUtilsIface::Query(VPNEXT_MODE_URI, bundleName, vpnExtMode); + if (ret != 0 || vpnExtMode != "1") { + NETMANAGER_EXT_LOGE("dataShareHelperUtils Query error, err = %{public}d", ret); + return CreateRejectedPromise(env); + } + ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility( want, nullptr, accountId, AppExecFwk::ExtensionAbilityType::VPN); NETMANAGER_EXT_LOGI("execute StopExtensionAbility result: %{public}d", err); diff --git a/frameworks/native/netvpnclient/src/ipc/networkvpn_service_proxy.cpp b/frameworks/native/netvpnclient/src/ipc/networkvpn_service_proxy.cpp index 1526273fe9c4cc3d2f2ef14b13b0454b00924857..c321d809db1d80da86a5f6384e455b0cf3289531 100644 --- a/frameworks/native/netvpnclient/src/ipc/networkvpn_service_proxy.cpp +++ b/frameworks/native/netvpnclient/src/ipc/networkvpn_service_proxy.cpp @@ -79,7 +79,7 @@ int32_t NetworkVpnServiceProxy::Prepare(bool &isExistVpn, bool &isRun, std::stri return result; } -int32_t NetworkVpnServiceProxy::GetSelfAppName(std::string &selfAppName) +int32_t NetworkVpnServiceProxy::GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) { MessageParcel data; if (!data.WriteInterfaceToken(NetworkVpnServiceProxy::GetDescriptor())) { @@ -93,7 +93,11 @@ int32_t NetworkVpnServiceProxy::GetSelfAppName(std::string &selfAppName) return ret; } if (!reply.ReadString(selfAppName)) { - NETMGR_EXT_LOG_E("IPC ReadString failed"); + NETMGR_EXT_LOG_E("IPC ReadString selfAppName failed"); + return NETMANAGER_EXT_ERR_READ_DATA_FAIL; + } + if (!reply.ReadString(selfBundleName)) { + NETMGR_EXT_LOG_E("IPC ReadString selfBundleName failed"); return NETMANAGER_EXT_ERR_READ_DATA_FAIL; } return ERR_NONE; @@ -494,9 +498,32 @@ int32_t NetworkVpnServiceProxy::CreateVpnConnection(bool isVpnExtCall) return result; } -int32_t NetworkVpnServiceProxy::RegisterBundleName(const std::string &bundleName) +int32_t NetworkVpnServiceProxy::RegisterBundleName(const std::string &bundleName, const std::string &abilityName) { - return NETMANAGER_EXT_SUCCESS; + MessageParcel data; + if (!data.WriteInterfaceToken(NetworkVpnServiceProxy::GetDescriptor())) { + NETMGR_EXT_LOG_E("write interface token failed"); + return NETMANAGER_EXT_ERR_WRITE_DESCRIPTOR_TOKEN_FAIL; + } + if (!data.WriteString(bundleName)) { + NETMGR_EXT_LOG_E("RegisterBundleName write bundleName failed"); + return NETMANAGER_EXT_ERR_WRITE_DATA_FAIL; + } + if (!data.WriteString(abilityName)) { + NETMGR_EXT_LOG_E("RegisterBundleName write abilityName failed"); + return NETMANAGER_EXT_ERR_WRITE_DATA_FAIL; + } + MessageParcel reply; + auto ret = SendRequest(INetworkVpnService::MessageCode::CMD_REGISTER_BUNDLENAME, data, reply); + if (ret != ERR_NONE) { + NETMGR_EXT_LOG_E("SendRequest failed %{public}d", ret); + return ret; + } + int32_t result = NETMANAGER_EXT_ERR_INTERNAL; + if (!reply.ReadInt32(result)) { + return NETMANAGER_EXT_ERR_READ_DATA_FAIL; + } + return result; } int32_t NetworkVpnServiceProxy::FactoryResetVpn() diff --git a/frameworks/native/netvpnclient/src/networkvpn_client.cpp b/frameworks/native/netvpnclient/src/networkvpn_client.cpp index c0f66aac5849d296c6b4e3f70c00ea567fef1eea..a04bf66f5f391aa62f90fdd8ba27dc77d78d6767 100644 --- a/frameworks/native/netvpnclient/src/networkvpn_client.cpp +++ b/frameworks/native/netvpnclient/src/networkvpn_client.cpp @@ -269,7 +269,7 @@ int32_t NetworkVpnClient::CreateVpnConnection(bool isVpnExtCall) return proxy->CreateVpnConnection(isVpnExtCall); } -int32_t NetworkVpnClient::RegisterBundleName(const std::string &bundleName) +int32_t NetworkVpnClient::RegisterBundleName(const std::string &bundleName, const std::string &abilityName) { NETMGR_EXT_LOG_D("VpnClient::RegisterBundleName is %{public}s", bundleName.c_str()); sptr proxy = GetProxy(); @@ -277,7 +277,7 @@ int32_t NetworkVpnClient::RegisterBundleName(const std::string &bundleName) NETMGR_EXT_LOG_E("CreateVpnConnection proxy is nullptr"); return NETMANAGER_EXT_ERR_GET_PROXY_FAIL; } - return proxy->RegisterBundleName(bundleName); + return proxy->RegisterBundleName(bundleName, abilityName); } sptr NetworkVpnClient::GetProxy() @@ -372,14 +372,14 @@ void NetworkVpnClient::multiUserSetUpEvent() } } -int32_t NetworkVpnClient::GetSelfAppName(std::string &selfAppName) +int32_t NetworkVpnClient::GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) { auto proxy = GetProxy(); if (proxy == nullptr) { NETMGR_EXT_LOG_E("GetSelfAppName proxy is nullptr"); return NETMANAGER_EXT_ERR_GET_PROXY_FAIL; } - return proxy->GetSelfAppName(selfAppName); + return proxy->GetSelfAppName(selfAppName, selfBundleName); } int32_t NetworkVpnClient::SetSelfVpnPid() diff --git a/interfaces/innerkits/netvpnclient/include/ipc/i_networkvpn_service.h b/interfaces/innerkits/netvpnclient/include/ipc/i_networkvpn_service.h index c41d5446e4681efe0784416c7da4a18e52cae9e7..d6c6e31406994ac37688b7c9d65ebbaa4e7eee63 100644 --- a/interfaces/innerkits/netvpnclient/include/ipc/i_networkvpn_service.h +++ b/interfaces/innerkits/netvpnclient/include/ipc/i_networkvpn_service.h @@ -71,8 +71,8 @@ public: virtual int32_t UnregisterVpnEvent(const sptr callback) = 0; virtual int32_t CreateVpnConnection(bool isVpnExtCall = false) = 0; virtual int32_t FactoryResetVpn() = 0; - virtual int32_t RegisterBundleName(const std::string &bundleName) = 0; - virtual int32_t GetSelfAppName(std::string &selfAppName) = 0; + virtual int32_t RegisterBundleName(const std::string &bundleName, const std::string &abilityName) = 0; + virtual int32_t GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) = 0; virtual int32_t SetSelfVpnPid() = 0; #ifdef SUPPORT_SYSVPN virtual int32_t SetUpVpn(const sptr &config) = 0; diff --git a/interfaces/innerkits/netvpnclient/include/ipc/networkvpn_service_proxy.h b/interfaces/innerkits/netvpnclient/include/ipc/networkvpn_service_proxy.h index c49b0a946a622e0b3ef99b38e2e778f0806d5064..1f9d967cbbea394a9f72556d14b61cacd8fb0636 100644 --- a/interfaces/innerkits/netvpnclient/include/ipc/networkvpn_service_proxy.h +++ b/interfaces/innerkits/netvpnclient/include/ipc/networkvpn_service_proxy.h @@ -36,8 +36,8 @@ public: int32_t UnregisterVpnEvent(sptr callback) override; int32_t CreateVpnConnection(bool isVpnExtCall = false) override; int32_t FactoryResetVpn() override; - int32_t RegisterBundleName(const std::string &bundleName) override; - int32_t GetSelfAppName(std::string &selfAppName) override; + int32_t RegisterBundleName(const std::string &bundleName, const std::string &abilityName) override; + int32_t GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) override; int32_t SetSelfVpnPid() override; #ifdef SUPPORT_SYSVPN int32_t SetUpVpn(const sptr &config) override; diff --git a/interfaces/innerkits/netvpnclient/include/networkvpn_client.h b/interfaces/innerkits/netvpnclient/include/networkvpn_client.h index 449761ac760ecc23a828bcbf916f8d77093c2949..46f19f6f5830df4f56793cd10a223a23e3cf144c 100644 --- a/interfaces/innerkits/netvpnclient/include/networkvpn_client.h +++ b/interfaces/innerkits/netvpnclient/include/networkvpn_client.h @@ -209,9 +209,9 @@ public: * close the tunfd of vpn interface and unregister VpnEvent. */ void multiUserSetUpEvent(); - int32_t RegisterBundleName(const std::string &bundleName); + int32_t RegisterBundleName(const std::string &bundleName, const std::string &abilityName); - int32_t GetSelfAppName(std::string &selfAppName); + int32_t GetSelfAppName(std::string &selfAppName, std::string &selfBundleName); int32_t SetSelfVpnPid(); diff --git a/services/vpnmanager/include/networkvpn_service.h b/services/vpnmanager/include/networkvpn_service.h index 6da5005053044ff1c6706b6bc6fa79c1ea137ae8..5a05ca00f0e31bed95b05918c13b7807aae87f77 100644 --- a/services/vpnmanager/include/networkvpn_service.h +++ b/services/vpnmanager/include/networkvpn_service.h @@ -199,7 +199,7 @@ public: */ int32_t GetAlwaysOnVpn(std::string &pkg); - int32_t GetSelfAppName(std::string &selfAppName) override; + int32_t GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) override; int32_t SetSelfVpnPid() override; @@ -284,7 +284,7 @@ private: sptr netFactoryResetCallback_ = nullptr; public: - int32_t RegisterBundleName(const std::string &bundleName) override; + int32_t RegisterBundleName(const std::string &bundleName, const std::string &abilityName) override; class VpnHapObserver : public AppExecFwk::ApplicationStateObserverStub { public: explicit VpnHapObserver(NetworkVpnService &vpnService) : vpnService_(vpnService){}; diff --git a/services/vpnmanager/src/ipc/networkvpn_service_stub.cpp b/services/vpnmanager/src/ipc/networkvpn_service_stub.cpp index 0303c8b9344f723127093249386e658e31629f67..4ecf8faea7f6b7282575e283e44f54a36c06f1d7 100644 --- a/services/vpnmanager/src/ipc/networkvpn_service_stub.cpp +++ b/services/vpnmanager/src/ipc/networkvpn_service_stub.cpp @@ -365,13 +365,29 @@ int32_t NetworkVpnServiceStub::ReplyFactoryResetVpn(MessageParcel &data, Message int32_t NetworkVpnServiceStub::ReplyRegisterBundleName(MessageParcel &data, MessageParcel &reply) { + std::string bundleName; + if (!data.ReadString(bundleName)) { + NETMGR_EXT_LOG_E("ReplyRegisterBundleName read data failed"); + return NETMANAGER_EXT_ERR_READ_DATA_FAIL; + } + std::string abilityName; + if (!data.ReadString(abilityName)) { + NETMGR_EXT_LOG_E("ReplyRegisterBundleName read data failed"); + return NETMANAGER_EXT_ERR_READ_DATA_FAIL; + } + + int32_t result = RegisterBundleName(bundleName, abilityName); + if (!reply.WriteInt32(result)) { + return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL; + } return NETMANAGER_EXT_SUCCESS; } int32_t NetworkVpnServiceStub::ReplyGetSelfAppName(MessageParcel &data, MessageParcel &reply) { std::string selfAppName; - int32_t result = GetSelfAppName(selfAppName); + std::string selfBundleName; + int32_t result = GetSelfAppName(selfAppName, selfBundleName); if (result != ERR_NONE) { NETMGR_EXT_LOG_E("GetSelfAppName failed on service"); return result; @@ -379,6 +395,9 @@ int32_t NetworkVpnServiceStub::ReplyGetSelfAppName(MessageParcel &data, MessageP if (!reply.WriteString(selfAppName)) { return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL; } + if (!reply.WriteString(selfBundleName)) { + return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL; + } return NETMANAGER_EXT_SUCCESS; } diff --git a/services/vpnmanager/src/networkvpn_service.cpp b/services/vpnmanager/src/networkvpn_service.cpp index 24e43bc69849b65c64e55c56309f354f5c241b4f..8c926515f626a1d9ecd4cba45e82f479db9ef374 100644 --- a/services/vpnmanager/src/networkvpn_service.cpp +++ b/services/vpnmanager/src/networkvpn_service.cpp @@ -1227,19 +1227,29 @@ void NetworkVpnService::ReceiveMessage::OnReceiveEvent(const EventFwk::CommonEve } if (action == EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED) { - std::unique_lock locker(vpnService_.netVpnMutex_); - std::string vpnBundleName = vpnService_.GetBundleName(); - NETMGR_EXT_LOG_D("COMMON_EVENT_PACKAGE_REMOVED, BundleName %{public}s", vpnBundleName.c_str()); - NetDataShareHelperUtilsIface::Delete(VPNEXT_MODE_URI, vpnBundleName); + std::string bundleName = eventData.GetWant().GetElement().GetBundleName(); + NETMGR_EXT_LOG_D("COMMON_EVENT_PACKAGE_REMOVED, BundleName %{public}s", bundleName.c_str()); + NetDataShareHelperUtilsIface::Delete(VPNEXT_MODE_URI, bundleName); } } -int32_t NetworkVpnService::RegisterBundleName(const std::string &bundleName) +int32_t NetworkVpnService::RegisterBundleName(const std::string &bundleName, const std::string &abilityName) { - return 0; + if (bundleName.empty() || abilityName.empty()) { + return NETMANAGER_EXT_ERR_PARAMETER_ERROR; + } + + std::vector list = {bundleName, bundleName + VPN_EXTENSION_LABEL}; + auto regRet = + Singleton::GetInstance().RegisterApplicationStateObserver(vpnHapObserver_, list); + NETMGR_EXT_LOG_I("RegisterBundleName RegisterApplicationStateObserver ret = %{public}d", regRet); + + currentVpnBundleName_ = bundleName; + currentVpnAbilityName_.emplace_back(abilityName); + return NETMANAGER_EXT_SUCCESS; } -int32_t NetworkVpnService::GetSelfAppName(std::string &selfAppName) +int32_t NetworkVpnService::GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) { std::string bundleName; auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); @@ -1278,6 +1288,7 @@ int32_t NetworkVpnService::GetSelfAppName(std::string &selfAppName) } NETMGR_EXT_LOG_I("StartVpnExtensionAbility bundleResourceInfo.label %{public}s", bundleResourceInfo.label.c_str()); selfAppName = bundleResourceInfo.label; + selfBundleName = bundleName; return NETMANAGER_EXT_SUCCESS; } diff --git a/test/netmanager_ext_mock_test/mock_networkvpn_service_stub_test.h b/test/netmanager_ext_mock_test/mock_networkvpn_service_stub_test.h index acf7ce443b7667060f9f5dbe4c0a362ffdb05274..8e5898981cc65b4c553b7be41e1d57de9e5378c4 100644 --- a/test/netmanager_ext_mock_test/mock_networkvpn_service_stub_test.h +++ b/test/netmanager_ext_mock_test/mock_networkvpn_service_stub_test.h @@ -110,12 +110,12 @@ public: return 0; } - int32_t RegisterBundleName(const std::string &bundleName) override + int32_t RegisterBundleName(const std::string &bundleName, const std::string &abilityName) override { return 0; } - int32_t GetSelfAppName(std::string &selfAppName) override + int32_t GetSelfAppName(std::string &selfAppName, std::string &selfBundleName) override { return 0; } diff --git a/test/vpnmanager/unittest/sys_vpn_manager_test/networkvpn_service_test.cpp b/test/vpnmanager/unittest/sys_vpn_manager_test/networkvpn_service_test.cpp index 13e89c5490fd8e949731c92b1f88bfe773b5fd8b..a24c258b07e8e0665343aabe1cfa9066a2c6f45f 100644 --- a/test/vpnmanager/unittest/sys_vpn_manager_test/networkvpn_service_test.cpp +++ b/test/vpnmanager/unittest/sys_vpn_manager_test/networkvpn_service_test.cpp @@ -462,7 +462,8 @@ HWTEST_F(NetworkVpnServiceTest, RegisterBundleName001, TestSize.Level1) instance_->OnRemoveSystemAbility(systemAbilityId, deviceId); std::string bundleName = "vpntest"; - EXPECT_EQ(instance_->RegisterBundleName(bundleName), NETMANAGER_EXT_SUCCESS); + std::string abilityName = "vpnAbility"; + EXPECT_EQ(instance_->RegisterBundleName(bundleName, abilityName), NETMANAGER_EXT_SUCCESS); } HWTEST_F(NetworkVpnServiceTest, OnExtensionStateChanged001, TestSize.Level1) diff --git a/test/vpnmanager/unittest/vpn_manager_test/networkvpn_client_test.cpp b/test/vpnmanager/unittest/vpn_manager_test/networkvpn_client_test.cpp index c36143d294c291ee8e5af681b5ca3f7aad8ad3e8..b1d88e82cfb604d7d67c6e99bcc34ba2ec52721b 100644 --- a/test/vpnmanager/unittest/vpn_manager_test/networkvpn_client_test.cpp +++ b/test/vpnmanager/unittest/vpn_manager_test/networkvpn_client_test.cpp @@ -181,7 +181,8 @@ HWTEST_F(NetworkVpnClientTest, NetworkVpnClientBranch001, TestSize.Level1) HWTEST_F(NetworkVpnClientTest, RegisterBundleName001, TestSize.Level1) { std::string bundleName = "com.test.test"; - auto ret = networkVpnClient_.RegisterBundleName(bundleName); + std::string abilityName = "vpnAbility"; + auto ret = networkVpnClient_.RegisterBundleName(bundleName, abilityName); EXPECT_EQ(ret, NETMANAGER_EXT_SUCCESS); }